Proteger o software contra a exploração com um rastro de bits cpa de darpa blogue novos mineiros de bitcoin

Hoje, falaremos sobre um problema difícil no qual estamos trabalhando como parte do programa de Recuperação de Ataque Tolerante a Falhas (CFAR) da DARPA: automaticamente protegendo software de exploits de 0 dia, corrupção de memória e muitos bugs atualmente não descobertos. Você pode estar pensando: “Por que se incomodar? Não posso simplesmente compilar meu código com mitigações de exploração como proteção de pilha, CFG ou CFI? ”Essas atenuações são maravilhosas, mas exigem Código fonte e modificações no processo de construção. Em muitas situações, é impossível ou impraticável alterar o processo de compilação ou alterar o código-fonte do programa. É por isso que nossa solução para o CFAR protege instalações binárias para as quais a fonte não está disponível ou é editável.

O CFAR é muito intuitivo e enganosamente simples. O sistema executa várias versões, ou “variantes”, do software em paralelo, e usa comparações entre essas variantes para identificar quando um ou mais divergiram dos demais no comportamento.


A ideia é semelhante a um sistema de detecção de intrusão que compara o comportamento do programa com variantes de si mesmo executadas em entradas idênticas, em vez de um modelo de comportamento passado. Quando o sistema detecta divergências comportamentais, pode inferir que algo incomum e possivelmente malicioso aconteceu.

Estamos muito animados para falar sobre o CFAR não apenas porque é um problema difícil e relevante, mas porque uma de nossas ferramentas, a McSema, faz parte da versátil solução baseada em LLVM da nossa equipe. Como parte deste post, podemos mostrar exemplos de recursos menos conhecidos do McSema e explicar por que eles foram desenvolvidos. Talvez o mais empolgante de tudo é que vamos mostrar como usar o McSema e o multicompilador UCI para proteger os binários de prateleira exploração. Nossa equipe CFAR

obter bitcoins instantaneamente

O objetivo geral do CFAR é detectar e recuperar falhas no software existente sem afetar a funcionalidade principal. A responsabilidade da nossa equipe era produzir um conjunto ideal de variantes para mitigar e detectar entradas indutoras de falhas. As outras equipes eram responsáveis ​​pelo ambiente de execução especializado, pelo time vermelho e assim por diante. A postagem no blog de Galois sobre o CFAR descreve o programa com mais detalhes.

As variantes devem se comportar de forma idêntica entre si e com o aplicativo original e apresentar uma prova convincente de que o comportamento permanecerá idêntico para todas as entradas válidas. Nossos colegas de equipe desenvolveram transformações e forneceram garantias de equivalência para programas com código fonte disponível. A equipe desenvolveu uma solução baseada em multicompiladores para geração de variantes usando a cadeia de ferramentas Clang / LLVM. O papel de McSema

Temos trabalhado na geração de variantes de programas de software somente binário, porque o código-fonte pode estar indisponível para aplicativos proprietários ou antigos. A cadeia de ferramentas baseada em código-fonte de nossa equipe funciona no nível de representação intermediária (IR) do LLVM. A transformação e fortalecimento de programas no nível de IR nos permite manipular a estrutura do programa sem alterar o código-fonte do programa. Usando o McSema, poderíamos traduzir programas somente binários para o LLVM IR e reutilizar os mesmos componentes para geração de variante somente no nível de origem e binária.

A tradução precisa de programas para o CFAR exigiu que reduzíssemos a diferença entre a semântica no nível da máquina e a semântica no nível do programa. Semântica no nível da máquina são as alterações no estado do processador e da memória causadas por instruções individuais. Semântica no nível do programa (por exemplo, funções, variáveis, exceções e blocos try / catch) são conceitos mais abstratos que representam o comportamento do programa. O McSema foi projetado para ser um tradutor para semânticas em nível de máquina (o nome “McSema” deriva de “semântica de código de máquina”). No entanto, para transformar com precisão as variantes necessárias para o CFAR, a McSema também teria que recuperar a semântica do programa.

O compilador pode colocar as variáveis ​​de função de backup de dados em um dos vários locais. O local mais comum para variáveis ​​de programa é a pilha, uma região de memória feita especificamente para armazenar informações temporárias e facilmente acessível para a função de chamada. Variáveis ​​que o compilador armazena na pilha são chamadas… variáveis ​​de pilha! int sum_of_squares (int a, int b) {

como minar o bitcoins reddit

Quando os atacantes transformam bugs em explorações, eles geralmente dependem de variáveis ​​de pilha em uma ordem específica. O multicompilador pode atenuar essa classe de explorações gerando variantes de programa, em que duas variantes não têm variáveis ​​de pilha na mesma ordem. Queríamos habilitar esse embaralhamento de variáveis ​​de pilha para binários, mas havia um problema: não há conceito de variáveis ​​de pilha no nível de código de máquina (Figura 1). Em vez disso, a pilha é apenas um grande bloco contíguo de memória. A McSema modela fielmente esse comportamento e trata a pilha do programa como um blob indivisível. Isso, é claro, torna impossível embaralhar as variáveis ​​da pilha. Recuperação Variável de Pilha

Primeiro, a McSema identifica os limites de variáveis ​​de pilha durante a desmontagem, através da heurística do desmontador (por exemplo, do IDA Pro) e, quando presente, das informações de depuração baseadas em DWARF. Há pesquisas anteriores sobre a identificação de limites de variáveis ​​de pilha sem tais dicas, que planejamos utilizar no futuro. Em segundo lugar, o McSema tenta identificar quais instruções no programa fazem referência a qual variável de pilha. Cada referência deve ser identificada com precisão ou o programa resultante não funcionará. Finalmente, o McSema cria uma variável de nível LLVM para cada variável de pilha recuperada e reescreve as instruções para fazer referência a essas variáveis ​​de nível LLVM, em vez do bloco de pilha monolítico anterior.

A recuperação da variável de pilha faz parte do processo de recuperação do CFG e é atualmente implementada no código de recuperação do IDAPython CFG (em collect_variable.py). Pode ser invocado através do argumento –recover-stack-vars para mcsema-disass. Por exemplo, veja o código que acompanha este post, que é descrito mais na seção Levantando e diversificando um binário. Variáveis ​​globais

valor de bitcoin

Como a pilha, o McSema trata cada seção de dados como um grande bloco de memória. Uma grande diferença entre as variáveis ​​globais e de pilha é que o McSema sabe onde as variáveis ​​globais começam, porque elas são referenciadas diretamente de vários locais. Infelizmente, isso não é informação suficiente para baralhar o layout da variável global. O McSema também precisa saber onde cada variável termina, o que é mais difícil. Atualmente, confiamos nas informações de depuração do DWARF para identificar tamanhos de variáveis ​​globais, mas esperamos implementar abordagens que funcionem em binários sem informações de DWARF.

Atualmente, a recuperação de variáveis ​​globais é implementada separadamente da recuperação normal do CFG (em var_recovery.py). Esse script cria um CFG “vazio”, preenchido apenas variável global definições. O processo de recuperação CFG normal preencherá o arquivo com o gráfico de fluxo de controle real, fazendo referência às variáveis ​​globais pré-preenchidas. Vamos mostrar um exemplo de usar a recuperação de variáveis ​​globais mais tarde. Levantando e diversificando um binário

No restante deste postagem no blog, Vamos nos referir ao processo de geração de novas variantes de programa através do multicompilador como “diversificação”. Para este exemplo específico, vamos levantar e diversificar um aplicativo C ++ simples que usa manipulação de exceção (incluindo uma cláusula pega-tudo) e variáveis ​​globais. Embora este seja apenas um exemplo simples, a recuperação de semântica de programa deve funcionar em aplicativos grandes e reais: nosso programa de teste padrão é o servidor da Web Apache2.

Vamos rever o que fizemos. É realmente incrível. Começamos construindo um programa C ++ simples que usava exceções e variáveis ​​globais. Em seguida, traduzimos o programa para o bitcode LLVM, identificamos as variáveis ​​stack e global e preservamos o fluxo de controle baseado em exceção. Nós então o transformamos usando o multicompilator e criamos um novo binário diversificado com a mesma funcionalidade do programa original.

Em primeiro lugar, gostaríamos de agradecer à DARPA, sem a qual este trabalho não seria possível, por fornecer financiamento contínuo para o CFAR e outros grandes programas de pesquisa. Gostaríamos também de agradecer aos nossos colegas de equipe – Galois, Immunant e UCI – pelo seu trabalho árduo, criando o multicompiler, transformações, fornecendo garantias de equivalência para variantes e para fazer tudo funcionar em conjunto.

ebay aceita bitcoin

Acreditamos que há um futuro brilhante para o CFAR e tecnologias semelhantes: o número de núcleos disponíveis por máquina continua aumentando, assim como a necessidade de computação segura. Muitos Programas Os pacotes não podem utilizar esses núcleos para desempenho, por isso é natural usar os núcleos de reposição para segurança. McSema, o multicompilador e outras tecnologias CFAR mostram como podemos colocar esses núcleos extras em funcionamento para oferecer garantias de segurança mais fortes.