No desenvolvimento de software, a ofuscação é a prática de criar código-fonte ou código de máquina que é intencionalmente difícil para humanos ou computadores entenderem. Semelhante à ofuscação na linguagem natural, a ofuscação de código pode envolver o uso de formas desnecessariamente indiretas de escrever instruções. Programadores podem ofuscar o código para ocultar o seu propósito, lógica ou valores embutidos. Os principais motivos para fazer isso são evitar violações (software antiviolação), deter a engenharia reversa ou criar um quebra-cabeça ou desafio recreativo para desofuscar o código, um desafio frequentemente incluído em crackmes. Embora a ofuscação possa ser feita manualmente, ela é mais comumente executada usando ofuscadores (obfuscators).
Visão geral A arquitetura e as características de algumas linguagens podem torná-las mais fáceis de ofuscar do que outras. C, C++ e a linguagem de programação Perl são alguns exemplos de linguagens fáceis de ofuscar. Haskell também é bastante ofuscável apesar de ser bem diferente em estrutura. As propriedades que tornam uma linguagem ofuscável não são imediatamente óbvias.
Técnicas Os tipos de ofuscações incluem simples substituição de palavras-chave, o uso ou ausência de espaços em branco para criar efeitos artísticos e programas autogerados ou intensamente compactados. De acordo com Nick Montfort, as técnicas podem incluir:
ofuscação de nomenclatura, que inclui nomear variáveis de uma forma sem sentido ou enganosa; confusão de dados/código/comentários, que inclui fazer com que partes do código real pareçam comentários ou confundir a sintaxe com os dados; dupla codificação, que pode ser a exibição do código em formato de poesia ou formas geométricas interessantes.
Exemplo O exemplo a seguir ilustra a ofuscação simples de um código-fonte. Ambos os programas imprimem a mesma saída, mas a segunda versão é intencionalmente mais difícil de entender. Código claro:
Código ofuscado:
Na versão ofuscada, nomes de variáveis com significado são removidos e expressões aritméticas são reescritas de uma forma menos legível, ainda que preservem o comportamento do programa.
Codificação de payload para evasão de malware A criptografia XOR (Cifra XOR) e a codificação Base64 são dois métodos comuns usados para ocultar malware da detecção de antivírus. Ambos funcionam alterando a forma como o código malicioso aparece em seu formato de arquivo, o que impede que o software de segurança reconheça padrões perigosos. Na ofuscação XOR, um invasor escolhe uma chave secreta e aplica a operação bit a bit XOR ao binário do malware. Isso transforma o executável no que parece ser apenas dados aleatórios. Os nomes das funções na tabela de importação desaparecem, os cabeçalhos PE ficam corrompidos e o arquivo inteiro perde sua estrutura. O payload ofuscado é então embutido em um dropper, que é um executável de aparência normal contendo o malware oculto como um recurso ou seção de dados. Quando um usuário roda o dropper, ele executa a operação XOR novamente com a mesma chave para reconstruir o malware original e, em seguida, o executa diretamente da memória ou o grava no disco antes de executá-lo. Esse processo remove vários indicadores nos quais os softwares antivírus costumam confiar. O cabeçalho MZ, que marca o início de todo executável do Windows, fica completamente obscurecido pela operação XOR. Programas de segurança frequentemente verificam essa assinatura de dois bytes ao procurar por executáveis embutidos. A codificação Base64 alcança resultados semelhantes por meio de um método diferente. Ela converte dados binários em texto ASCII, de modo que um arquivo executável acaba parecendo texto simples em vez de um programa. Pesquisas da Competição de Evasão de Segurança em Aprendizado de Máquina (Machine Learning Security Evasion Competition) de 2020 mostraram que esses métodos podem contornar sistemas de detecção modernos. Os participantes usaram combinações de codificação XOR, codificação Base64 e inserção de código morto (dead code) para evadir todos os três modelos da competição com menos de cinco tentativas por amostra. A detecção baseada em entropia também falhou e, em alguns casos, a codificação Base64 na verdade diminuiu a entropia em comparação com os arquivos de malware originais. A simplicidade dessas técnicas é o que as torna particularmente perigosas. A codificação XOR e Base64 exigem apenas habilidades básicas de programação para serem implementadas, mas provaram ser eficazes contra classificadores avançados de aprendizado de máquina. Isso tem empurrado os pesquisadores de segurança para novas defesas, incluindo ferramentas automatizadas de recuperação de chave XOR e análises mais profundas de recursos embutidos em arquivos executáveis.
Ferramentas automatizadas Existe uma variedade de ferramentas para executar ou auxiliar na ofuscação de código. Elas incluem ferramentas de pesquisa experimentais desenvolvidas por acadêmicos, ferramentas de amadores, produtos comerciais escritos por profissionais e softwares de código aberto. Além disso, existem ferramentas de desofuscação, com o objetivo de reverter o processo de ofuscação. Embora a maioria das soluções comerciais de ofuscação transforme o código-fonte do programa ou o bytecode independente de plataforma, ou seja, código portável (como o usado pelo Java e .NET), algumas também funcionam diretamente em binários compilados.
Alguns exemplos em Python podem ser encontrados nas perguntas frequentes (FAQ) oficiais de programação Python e em outros lugares. O compilador C movfuscator para a arquitetura x86_32 usa apenas a instrução mov com o objetivo de ofuscar.
Recreativo Escrever e ler código-fonte ofuscado pode ser um quebra-cabeça estimulante. Vários concursos de programação premiam o código ofuscado de forma mais criativa, como o International Obfuscated C Code Contest e o Obfuscated Perl Contest. Programas curtos ofuscados em Perl podem ser usados em assinaturas de programadores Perl. Estes são os chamados JAPHs ("Just another Perl hacker").
Criptográfico
Criptógrafos exploraram a ideia de ofuscar código de modo que fazer a engenharia reversa do código seja criptograficamente difícil. Isso é formalizado em muitas propostas de ofuscação de indistinguibilidade, uma primitiva criptográfica que, se fosse possível construir de forma segura, permitiria construir muitos outros tipos de criptografia, incluindo tipos completamente novos que ninguém sabe como fazer. (Uma noção mais forte, a ofuscação de caixa preta, é conhecida por ser impossível no caso geral.)
Desvantagens da ofuscação Embora a ofuscação possa tornar a leitura, a escrita e a engenharia reversa de um programa difíceis e demoradas, ela não necessariamente o tornará impossível. Ela adiciona tempo e complexidade ao processo de compilação (build) para os desenvolvedores. Pode tornar a depuração de problemas (debugging) extremamente difícil após a ofuscação do software. Uma vez que o código não é mais mantido, entusiastas podem querer manter o programa, adicionar modificações (mods) ou entendê-lo melhor. A ofuscação torna difícil para os usuários finais fazerem coisas úteis com o código. Certos tipos de ofuscação (ou seja, código que não é apenas um binário local e faz download de pequenos binários de um servidor web conforme a necessidade) podem degradar o desempenho e/ou exigir conexão constante com a Internet.
Notificação aos usuários sobre código ofuscado Alguns softwares antivírus, como o AVG AntiVirus, também alertam seus usuários quando eles acessam um site com código ofuscado manualmente, já que um dos propósitos da ofuscação pode ser ocultar código malicioso. No entanto, alguns desenvolvedores podem empregar a ofuscação de código com o propósito legítimo de reduzir o tamanho do arquivo ou aumentar a segurança. O usuário médio pode não esperar que seu software antivírus forneça alertas sobre um trecho de código inofensivo, especialmente proveniente de corporações confiáveis, de modo que tal recurso pode, na verdade, dissuadir os usuários de utilizar softwares legítimos. A Mozilla e o Google não permitem extensões de navegador contendo código ofuscado em suas lojas de complementos (add-ons).
Ofuscação e licenças copyleft Tem havido debates sobre se é ilegal contornar as licenças de software copyleft ao liberar o código-fonte em formato ofuscado, como em casos em que o autor está menos disposto a disponibilizar o verdadeiro código-fonte. A questão é abordada na Licença Pública Geral GNU (GPL) ao exigir que a "forma preferencial para fazer modificações" seja disponibilizada. O site do GNU afirma que "O 'código-fonte' ofuscado não é um código-fonte real e não conta como código-fonte."
Descompiladores Um descompilador é uma ferramenta que pode fazer a engenharia reversa do código-fonte a partir de um executável ou biblioteca. Esse processo às vezes é referido como um ataque man-in-the-end (mite), inspirado no tradicional "ataque man-in-the-middle" na criptografia. O código-fonte descompilado geralmente é difícil de ler, contendo nomes aleatórios de funções e variáveis, tipos de variáveis incorretos e lógica que difere do código-fonte original devido a otimizações do compilador.
Ofuscação de modelos A ofuscação de modelos é uma técnica para ocultar a estrutura interna de um modelo de aprendizado de máquina. A ofuscação transforma um modelo em uma caixa preta. Isso é contrário à inteligência artificial explicável. Modelos de ofuscação também podem ser aplicados a dados de treinamento antes de inseri-los no modelo para adicionar ruído aleatório. Isso oculta informações sensíveis sobre as propriedades de indivíduos e grupos de amostras.
Ver também
Referências
Leitura adicional
Ligações externas The International Obfuscated C Code Contest Protecting Java Code Via Code Obfuscation, ACM Crossroads, edição de Primavera de 1998 Can we obfuscate programs? Yury Lifshits. Lecture Notes on Program Obfuscation (Spring'2005) c2:BlackBoxComputation