
Detecte, analise e identifique de forma única falhas em aplicativos Windows.
Detecte, analise e identifique exclusivamente bugs de aplicações.
Você...
...então o BugId pode ser para você!
Para usar o BugId, baixe e instale o seguinte software:
Se você instalar o Python e o Debugging Tools for Windows com as configurações padrão, o BugId deve ser capaz de rodar sem precisar ajustar nenhuma configuração. Você pode descompactar o BugId em qualquer lugar do seu sistema de arquivos local.
Antes de iniciar o BugId, você deve habilitar o full page heap na aplicação alvo.
Isso pode ser feito por binário, definindo certos Global Flags. A maneira mais fácil de fazer isso é usar o
script pageheap.cmd que acompanha o BugId. Por exemplo, para habilitar o full page heap
para o notepad, execute o seguinte comando:
C:\BugId>pageheap notepad.exe ON
(Observe que este comando deve ser executado em um prompt de comando elevado, com acesso administrativo à máquina).
Para facilitar ainda mais, o pageheap.cmd tem uma lista de aplicações conhecidas. Você
pode habilitar ou desabilitar o full page heap para qualquer uma delas informando seu nome, ex.:
pageheap msie ON habilita o full page heap para o Microsoft Internet Explorer. Use
pageheap /? para obter mais informações sobre os argumentos de linha de comando.
Neste ponto, você pode querer testar se o BugId está funcionando corretamente. Podemos fazer isso
executando uma aplicação no BugId e provocando uma falha para ver se o BugId relata o bug
corretamente. Uma boa aplicação para usar neste teste é o rundll32.exe, que está presente
em todas as instalações do Windows, na sub-pasta system32 da pasta do Windows
(%WinDir%). Ele pode ser usado para carregar qualquer dll encontrada no sistema de arquivos local e chamar
uma função exportada dessa dll com um determinado formato de chamada. Há muitas dlls na
pasta system32 que exportam funções. A maioria dessas funções exportadas espera argumentos
em um formato completamente diferente do que o rundll32 fornecerá, fazendo com que a
aplicação falhe.
Primeiro, devemos ativar o full page heap no rundll32 com o seguinte comando:
C:\BugId>pageheap rundll32.exe ON
Em seguida, iniciaremos o BugId e diremos a ele para iniciar o rundll32 com argumentos que o instruam
a carregar advapi32.dll e chamar CloseThreadWaitChainSession. No momento em que este
texto foi escrito, isso causa uma chamada violação de acesso de ponteiro NULL, que o BugId deve
detectar e relatar.
C:\BugId>BugId.cmd %WinDir%\system32\rundll32.exe -- advapi32 CloseThreadWaitChainSession
Observe que há um -- entre o rundll32.exe e os argumentos passados a ele.
Isso ocorre porque você pode querer fornecer argumentos tanto para o próprio BugId quanto para
a aplicação que deseja testar. Esses dois conjuntos de argumentos devem ser
separados por -- na linha de comando. Tudo antes de -- é tratado pelo
BugId e tudo depois é ignorado pelo BugId, mas passado para a aplicação.
Se tudo estiver correto, a saída do BugId será semelhante a esta:
* Command line: C:\WINDOWS\system32\rundll32.exe advapi32 CloseThreadWaitChainSession
+ Main process 8024/0x1F58 (rundll32.exe): Attached; command line = C:\WINDOWS\system32\rundll32.exe advapi32 CloseThreadWaitChainSession.
,-- A bug was detect in the application ----------------------------------------
| Id @ Location: AVR@NULL a1f.904 @ rundll32.exe!advapi32.dll!WctRemoveEntry
| Description: Access violation while reading memory at 0x0 using a NULL pointer.
| Security impact: Denial of Service
| Version: rundll32.exe 10.0.16299.15 (x64)
| advapi32.DLL 10.0.16299.15 (x64)
| Bug report: AVR@NULL a1f.904 @ rundll32.exe!advapi32.dll!WctRemoveEntry.html (60703 bytes)
'-------------------------------------------------------------------------------
A primeira linha informa a linha de comando que o BugId irá iniciar. A segunda
linha informa que isso fez com que um novo processo fosse criado com process id
8024, executando rundll32.exe e a linha de comando para este processo (que é
naturalmente a mesma da primeira linha). Logo após iniciar a aplicação,
um bug foi detectado. O BugId gerou um id único (AVR@NULL a1f.904) para este
bug e relatou que sua localização está na função WctRemoveEntry da
dll advapi32.dll carregada por rundll32.exe. Como falhas por ponteiro NULL
normalmente não são exploráveis além de derrubar a aplicação, o impacto de
segurança do bug é Denial of Service. Por padrão, o BugId gera um relatório
formatado em HTML para cada bug que encontra e informa o local onde esse
relatório foi armazenado. Como você pode ver, o nome do arquivo do relatório é
baseado no id e na localização do bug.
Todo id de bug gerado pelo BugId consiste em duas partes separadas por um espaço. A
primeira parte descreve o tipo de bug. No exemplo acima, AVR@NULL, isso
significa Access Violation Reading memory at address NULL (violação de
acesso lendo memória no endereço NULL). A segunda parte descreve a localização do
bug; ela consiste em dois hashes curtos separados por um ponto. Esses hashes são
calculados a partir das funções no topo da pilha consideradas relevantes para o
bug. No exemplo, a1f.904 consiste em a1f (calculado a partir de
advapi32.dll!WctRemoveEntry) e 904 (calculado a partir de
advapi32.dll!CloseThreadWaitChainSession).
Se você executar o mesmo comando novamente, o BugId relatará exatamente o mesmo BugId, pois isso deve causar exatamente o mesmo bug no mesmo código.
Parabéns! Você agora está pronto para testar suas próprias falhas com o BugId, mas
pode querer executar BugId.cmd --help em algum momento para obter informações sobre
as muitas opções de linha de comando diferentes que o BugId suporta.
O BugId foi desenvolvido e testado em um grande número de aplicações durante fuzzing para analisar centenas de milhares de falhas causadas por centenas de bugs diferentes. Nesse papel, ele provou ser extremamente preciso ao analisar bugs, com uma taxa muito baixa de falsos positivos e negativos; ambos são inferiores a 1%.
Naturalmente, nem todos os tipos de bugs são fáceis de detectar e analisar. Alguns bugs atualmente não podem ser detectados de forma confiável no momento em que ocorrem, mas causam uma falha muito mais tarde, em código completamente não relacionado, levando a uma análise completamente incorreta. Nesses casos, reproduzir repetidamente o mesmo bug levará a vários ids de bug diferentes, pois a aplicação falha de maneiras diferentes em momentos diferentes. Para garantir que esse não seja o caso, você é aconselhado a executar seu caso de teste no BugId várias vezes para ver se o id do bug permanece o mesmo.
Outros bugs causam falhas que parecem ser causadas por um tipo diferente de bug. Isso pode resultar em análises e ids de bug incorretos. Principalmente, bugs que resultam de bad casts (conversões inválidas) em código C/C++ são atualmente impossíveis de detectar e relatar pelo BugId. Eles podem resultar em vários tipos diferentes de falhas; mais comumente, violações de acesso quando valores armazenados em propriedades de um objeto são usados incorretamente como ponteiros. Se você suspeitar que bad casts podem ser a causa de uma falha, você deve verificar novamente a análise feita pelo BugId para garantir que ela está correta.
O BugId depende fortemente do full page heap estar sendo usado pela aplicação para conseguir detectar e analisar um grande número de bugs relacionados ao heap. Isso significa que ele será muito menos eficaz na detecção e análise de bugs em aplicações que usam seu próprio gerenciador de heap interno, que não depende do heap padrão do Windows.
O BugId tem um período de teste gratuito de 30 dias para uso comercial e não comercial.
Durante esse período de teste, este trabalho é licenciado sob uma
[Creative Commons Attribution-NonCommercial 4.0 International License](http://creativecommons.org/licenses/by-nc/4.0/).
Após o período de teste, uma licença paga deve ser adquirida em license.skylined.nl se você quiser continuar a usar o BugId.
Licenças Não Comerciais estão disponíveis por uma taxa muito pequena; apenas o suficiente para pagar minhas despesas. Licenças comerciais para pesquisadores de segurança individuais também estão disponíveis com um grande desconto.
Se você tiver alguma dúvida sobre licenciamento, ou quiser discutir um desconto por volume, entre em contato com [email protected].
O BugId tem um período de teste para permitir que você avalie sua utilidade. Se você quiser continuar a usar o BugId após o término do período de teste, peço que contribua com uma pequena taxa para pagar pelo meu trabalho no BugId e pelo gerenciamento do pedido de licença. Se você estiver usando o BugId comercialmente, peço que pague uma taxa de licença regular para compartilhar parte do lucro que você está obtendo com o uso do BugId.