O caso da ofuscação do código?

47

Quais são os principais motivos para escrever código ofuscado, em termos de um benefício real para as pessoas que desenvolvem o código e para os negócios que executam esse código (se o código em questão é de fato um código comercial)? Existem casos documentados (disponíveis on-line em algum local) que descrevem quando a ofuscação fez mais do que mal? Existem exemplos conhecidos em que, por exemplo, foi comprovado que a ofuscação atrasava significativamente um terceiro mal-intencionado de obter o código? Parece que, assim como arregaçar as janelas do carro, não impedirá que as pessoas as quebrem e roubem o aparelho de som, ofuscar seu código apenas mantém as pessoas honestas honestas.

=========

Fundo:

Esta é uma tentativa de desafiar propositadamente minhas suposições sobre esse tópico.

Sou muito contra o uso de ofuscação de código em geral, mas estou curioso para saber se está faltando alguma coisa. Entendo por que, em casos como JavaScript, a minificação ajuda as coisas a carregar mais rapidamente e tudo (há um benefício funcional real), mas não consigo encontrar uma única razão para a ofuscação do código, com o objetivo de ser um obstáculo descobrir o que uma seção de código / algoritmo faz é realmente eficaz para qualquer finalidade, seja qual for.

Com o código aberto sendo muito popular, a questão parece ser "compartilhar o código ou mantê-lo proprietário?" Quando se trata de código comercial, entendo por que você não pode compartilhar tudo, e você tem a lei do seu lado para combater o roubo.

BTW, se a razão pela qual alguém está escrevendo código ofuscado é "segurança no trabalho", eu acionaria qualquer programador considerado consistente e propositalmente usando ofuscação com o único objetivo de ajudar a manter seus empregos, a menos que eles pudessem mostrar razoavelmente que ele tinha algum benefício comercial. É tão completamente anti-equipe que é ridículo, e aponta para alguém que está mais preocupado em manter seu trabalho por meio de práticas equivocadas e depois em mantê-lo porque eles escrevem um software incrível.

Menciono apenas esse caso específico porque, embora perceba que as pessoas geralmente estão brincando, eu gostaria de impedir qualquer resposta cujo impulso básico é que ofuscar a segurança no emprego por si só é uma boa idéia.

jefflunt
fonte
3
Eu acho que você disse tudo
Paul
6
Simplificando, a ofuscação muda a economia da engenharia reversa do seu código, nada mais.
Mark Booth
Obrigado a todos. Eu certamente vi uma perspectiva diferente sobre isso, graças às suas respostas e comentários detalhados. Existem várias respostas de alta qualidade que falam sobre vários ângulos desse problema. Em vez de premiar uma única pergunta, votei nos meus favoritos.
jefflunt
Você está considerando ou focado no código fonte ou no objeto / código executável ? Por exemplo, o software Gimpel distribui uma versão de sua ferramenta lint no código-fonte C ofuscado, de modo que os clientes, geralmente Unix, podem compilá-lo para executar em qualquer ambiente que desejarem, sem que o Gimpel precise suportar / manter N número de ambientes de destino , incluindo ambientes estranhos ou herdados. Isso é razoavelmente diferente da ofuscação de objeto / executável usada para proteção de cópia ou de dados (por exemplo, cópia ilícita) como uma camada de segurança para atrasar / impedir a engenharia reversa.
mctylr

Respostas:

49

Um caso de uso muito interessante para ofuscação é rastrear a origem de cópias ilícitas. Supondo que a ofuscação seja uma operação relativamente barata, o autor original pode fornecer a cada cliente versões ofuscadas de maneira diferente do aplicativo, se uma cópia ilícita for encontrada, o autor poderá comparar com as versões fornecidas e rastrear a origem da pirataria.

Essa é uma forma de esteganografia , inspirada e na variação dos esquemas criptográficos de "rastreamento de traidores" . Não faço ideia se é comum 1 ou mesmo se é uma boa ideia, mas já a vi aplicada na prática sob os seguintes parâmetros:

  • Mercado nacional altamente competitivo com apenas dois fornecedores,
  • Cerca de 50 implantações cobriram o mercado,
  • O tempo médio de desenvolvimento para os dois aplicativos foi de dois anos (mais ou menos),
  • O tempo médio de ofuscação para a nossa aplicação foi de duas horas,
  • A expectativa de vida útil de ambas as aplicações era de cerca de dez anos.

Obviamente, a lógica era a segurança através da obscuridade e evoluiu no esquema acima mencionado em algum momento 2 . Ambos os fornecedores tiveram acesso ao código binário um do outro, legalmente, e acho óbvio que eram esperadas tentativas de descompilação de ambos. A ofuscação não fez nada em termos de segurança, a longo prazo. Ambos os fornecedores tinham equipes altamente motivadas e talentosas, trabalhando em um mercado extremamente lucrativo e de nicho; no final, nossos produtos eram mais parecidos do que não, e qualquer vantagem competitiva foi obtida por outros meios menos obscuros.

Não posso realmente expandir, porque (a) foi muito cedo na minha carreira e não obtive uma visão clara das decisões de design ou dos resultados do esquema de rastreamento (se houver) e (b) parte do meu envolvimento com o projeto estava sob uma NDA.

Outro caso de uso válido para ofuscação pode ser quando você é de alguma forma legalmente obrigado a enviar seu código a terceiros :

Se sua empresa trabalha com IP para empresas de tecnologia ou está envolvida em casos que envolvem código-fonte de software, você pode ser obrigado a enviar o código-fonte do seu cliente ao USPTO, a um tribunal ou a um terceiro.

Como o código-fonte é considerado um segredo comercial, a maioria das agências reguladoras usa uma regra de "50%". O código-fonte enviado é oculto para que não possa ser usado como está.

IANAL e o link é mais relevante para cópias impressas do código do que para o código de trabalho real, portanto, isso pode ser completamente irrelevante.

Agora, como o Javascript é o exemplo canônico de ofuscação, há um efeito colateral que geralmente não é considerado e que oculta o código malicioso no Javascript ofuscado. Embora haja vantagens definitivas na redução do Javascript 3 , não vejo sentido em ofuscação real e estou feliz por Douglas Crockford concordar comigo :

Finalmente, existe a questão da privacidade do código. Esta é uma causa perdida. Não há transformação que impeça um determinado hacker de entender seu programa. Isso se aplica a todos os programas em todos os idiomas; é obviamente mais verdadeiro com o JavaScript, porque é entregue na forma de código-fonte. O benefício de privacidade proporcionado pela ofuscação é uma ilusão. Se você não deseja que as pessoas vejam seus programas, desconecte seu servidor.

Quanto à ofuscação por "segurança no trabalho", esse é um comportamento que nunca deve passar na revisão de código e, se identificado, não deve ser tolerado. Eu não iria tão longe quanto demitir o culpado no começo, mas os reincidentes definitivamente merecem uma boa surra, pelo menos.

Concluindo, a ofuscação é um exemplo típico de segurança através da obscuridade; seu mérito óbvio é apenas um impedimento e nada mais. Pode haver casos de uso criativo 4 que eu não conheça, mas, em geral, os benefícios são mínimos, na melhor das hipóteses.

1 Depois de escrever isso, descobri a resposta que basicamente descreve o mesmo esquema, por isso pode ser mais comum do que eu pensava.
2 Embora a esteganografia ainda seja segurança através da obscuridade.
3 Minificação ~ removendo espaços em branco e encurtando tokens, não intencionalmente obscurecendo.
4 O Concurso Internacional de Código C Ofuscado conta?

yannis
fonte
"Se você não quer que as pessoas vejam seus programas, desconecte o servidor." - ou use o Software Guard Extensions e confie na Intel.
user253751
40

O caso da ofuscação do código é que ele aumenta a fasquia de terceiros para determinar o que / como o código está funcionando.

No entanto, isso NÃO significa que um desenvolvedor deve sempre escrever código ofuscado.

Veja, este é o pouco que acho que está faltando na sua pergunta: a ofuscação do código (assim como a minificação do JavaScript) não precisa - e não deve - ser feita manualmente pelo desenvolvedor. Da mesma forma, isso também não deve ser armazenado como seus arquivos de origem principais no controle de versão.

A ofuscação do código deve ocorrer como uma etapa de pós-processamento durante a compilação em sua construção de produção. Também existem muitos produtos de terceiros para fazer isso, portanto, quase não há razão para fazer isso internamente.

Por exemplo: Dotfuscator

O IEEE tem um documento sobre a eficácia da ofuscação de código

Os resultados mostram que a renomeação de identificador diminui significativamente a eficiência dos ataques, pelo menos dobrando o tempo necessário para concluir um ataque bem-sucedido (mesmo no pior cenário, ou seja, contra o melhor invasor). Além disso, a ofuscação reduz a diferença entre invasores iniciantes e habilidosos, tornando o último menos eficiente e torna os sistemas mais fáceis de atacar claramente mais semelhantes aos que são intrinsecamente mais difíceis de quebrar.

Ênfase minha.

Dan McGrath
fonte
2
Eu daria este +1, mas o link requer uma assinatura paga à qual nem todos os leitores terão acesso.
mattnz
Sim, isso é o fato infeliz do IEEE que eu não estou totalmente feliz com, mas isso é outro assunto
Dan McGrath
8
Há uma versão em PDF acessível ao público aqui . Eu acho que é bom usar isso, está na página inicial de um dos autores do artigo, Mariano Ceccato.
precisa saber é
Ótima descoberta. Eu o havia pesquisado no Google Scholar, mas não o encontrei. Eu atualizei o link.
precisa saber é o seguinte
1
+1 para "ofuscação de código (como JavaScript minification) não faz - e não deve - ser feito manualmente pelo desenvolvedor"
João Portela
35

Eu participei do desenvolvimento de um MMORPG. Isso envolveu a lógica do servidor e a lógica do cliente. Durante o desenvolvimento do projeto, que durou muitos anos, sempre que consideramos a interface entre o cliente e o servidor, a regra era que o cliente deveria ser tratado pelo servidor o tempo todo, sob a suposição de que ele foi hackeado. Em outras palavras, o servidor teve que ser gravado de tal maneira que não houvesse resposta do cliente que pudesse causar falhas no servidor ou permitir que o cliente trapaceie. Ainda assim, sabia-se desde o início que os hackers inevitavelmente encontravam buracos no sistema e os exploravam para enganar. E depois de um tempo eles fizeram.

Obviamente, antes de enviar o cliente para o grande mundo lá fora, fizemos questão de ofuscá-lo. Acreditamos que a ofuscação teve os seguintes efeitos:

  1. Isso impediu os hackers não especialistas de tentar.
  2. Isso atrasou hackers especializados em conseguir hacks.
  3. Reduziu o número de hacks alcançados por hackers especializados.
  4. Limitou a eficácia dos hacks.
  5. Mais importante: isso fez com que os hackers executassem mais testes com seus clientes invadidos contra nossos servidores antes de obter um hack ativo, o que aumentou as chances de descobri-los procurando atividades irregulares nos logs do servidor.

As contas de jogos de hackers descobertos foram encerradas sem reembolso, o que tornou o negócio de hackers mais caro e menos atraente.

So, due to all of the above, I believe obfuscation had an overall positive effect in our game, and by extension, obfuscation can have an overall positive effect in any piece of software which is liable to get hacked. (For example, software containing copy protection measures.)

Os efeitos que a ofuscação teve na manutenção foram quase nulos. Havia alguns lugares em que alguns programadores inexperientes faziam suposições sobre os nomes dos identificadores (eles estavam usando a reflexão), mas, uma vez resolvidos, tudo estava bem. A etapa de ofuscação acabou de se tornar parte da etapa geral de compilação da versão de produção do jogo; portanto, a maioria de nós, desenvolvedores, nunca teve que se preocupar com isso ou ter algo a ver com isso. Já tínhamos uma ferramenta para visualizar os logs do jogo, então modificamos a ferramenta para usar a tabela de associação (mapeando identificadores ofuscados para identificadores adequados) produzidos pelo ofuscador, a fim de traduzir os logs para nós em tempo real, para nunca mais até tinha que ver algum identificador ofuscado enquanto fazia exames post-mortem com base em registros coletados no campo.

Mike Nakis
fonte
Que efeito isso teve na manutenção?
deworde
2
@deworde Atualizei minha resposta com mais um parágrafo sobre os efeitos da ofuscação na manutenção.
10138 Mike Nakis
@MikeNakis: Darkfall? :-)
Carson63000
@ Carson63000 Sim. (E o LOL do seu avatar - é esse cota de malha e você está empunhando uma espada?) #
5500 Mike Nakis
@MikeNakis: nice! E sim, no avatar - bem, é malha de malha e uma espada de madeira, a empresa em que trabalhei estava produzindo alguns recursos para banners e conseguiu que a equipe se vestisse em vez de contratar modelos. :-)
Carson63000
3

Ler e entender (e obviamente escrever) código ofuscado pode ser um desafio mental interessante. Provavelmente está fora do escopo do que você estava perguntando, mas exemplos como o IOCCC podem ser uma fonte de diversão e horror.

Vatine
fonte
3
Isso realmente deveria ter sido um comentário sobre a pergunta, não uma resposta.
Dan McGrath