
Certamente você já ouviu a expressão "caça aos insetos" muitas vezes. Atrevo-me a supor que você não se importará de ganhar cem ou duzentos (ou mesmo mil) dólares por encontrar uma potencial vulnerabilidade no programa de alguém. Neste artigo, falarei sobre um truque que ajudará a analisar projetos de código aberto para encontrar essas vulnerabilidades.
Recompensas de bugs em software livre e de código aberto - o que é?
Bug Bounty é um nome comum para vários programas, onde os desenvolvedores de sites e software oferecem recompensas em dinheiro por encontrar bugs e vulnerabilidades. Além dos programas bem conhecidos de Bug Bounty de grandes empresas, como Apple ou Microsoft, também existem programas para pesquisar vulnerabilidades em projetos de código aberto.
Muitos deles podem ser encontrados no HackerOne, mas talvez o maior seja o FOSSA - Auditoria de Software Livre e de Código Aberto. É um programa de busca de vulnerabilidades em vários projetos de código aberto, patrocinado pela União Europeia. O fundo total do prêmio é uma quantia impressionante - até 850.000 euros!
Como participar?
Primeiro, você precisa se registrar no
HackerOne . Precisamos apenas de projetos de código aberto. Há uma
lista completa no HackerOne.
Se você deseja participar do Bug Bounty da União Europeia, a lista de projetos que participam deste programa pode ser encontrada
aqui . Para a maioria dos projetos, basta registrar-se no HackerOne, mas muitos dos programas listados também estão no site intigriti.com.
Para participar, você deve escolher um projeto apropriado e ler atentamente os termos de participação. Se você concorda com eles, vá para uma parte prática.
Para encontrar uma vulnerabilidade e obter o seu dinheiro, basta baixar um projeto (ou cloná-lo no GitHub) e analisar cuidadosamente cada linha de código, examinando cada expressão em busca de possíveis erros. Se você encontrar algo, isso pode afetar a segurança do programa - faça um relatório e envie aos desenvolvedores. Se eles consideram sua descoberta digna de recompensa - você tem seu dinheiro no bolso :).
Mas onde está a simplicidade?
A parte simples é que você não precisa analisar o código apenas manualmente. Existem ferramentas que permitem procurar erros no código automaticamente. Por exemplo - analisadores de código estático. Eu prefiro usar nossa ferramenta -
PVS-Studio . O analisador PVS-Studio é capaz de encontrar erros no código, escritos em C ++, C # e Java, além de ter uma interface amigável. Além disso, existem várias opções de uso gratuito. Enfim, existem outros
analisadores de código .
Obviamente, os analisadores estáticos podem revelar nem todos os erros. Esqueça! Afinal, temos o objetivo de encontrar erros de maneira rápida e fácil, e não de encontrar todos eles.
Depois que o projeto for baixado e construído, serão necessários apenas alguns cliques para iniciar a análise. O resultado será um relatório com um número (geralmente significativo) de avisos gerados pelo analisador. No PVS-Studio, eles são classificados em três níveis de certeza. Você deve começar com o primeiro nível de avisos, para que os níveis de laranja e amarelo possam ser eliminados do resultado da análise.
Um exemplo de filtragem dos resultados da análise.
Assim, você só precisará observar os avisos restantes e escolher os lugares que podem representar o maior perigo. Vale a pena verificar se é possível reproduzir algum deles diretamente ao executar o programa. Se você conseguir fazer isso - não apenas aumentará as chances de os desenvolvedores aceitarem o relatório, mas também certamente aumentará o valor do pagamento. Nesse caso, a visibilidade é sua melhor amiga.
Também vale a pena considerar se o bug encontrado afeta a segurança do programa. Afinal, neste caso, o valor pago a você será várias vezes mais :)
A captura de tela mostra a interface do Visual Studio. No entanto, não deixe enganar você. O analisador pode ser usado não apenas como um plug-in para o Visual Studio, mas também por si só, incluindo os ambientes
Linux e macOS .
Prós desta abordagem
Primeiro, usar um analisador estático é uma das maneiras mais fáceis de encontrar bugs. Você não precisa ter nenhum conhecimento especial para usar os analisadores de código: você só precisa entender o idioma em que o código está escrito.
Em segundo lugar, os analisadores estão atentos. Eles não se cansam e não perdem a vigilância, ao contrário de um ser humano. Portanto, eles podem ser usados para analisar as bases de código maiores que você quiser, com custo quase mínimo.
Terceiro, os analisadores geralmente têm mais conhecimento que os humanos. O que isso significa? Deixe-me explicar meus pensamentos com o exemplo do código do kernel do Android:
static void FwdLockGlue_InitializeRoundKeys() { unsigned char keyEncryptionKey[KEY_SIZE]; .... memset(keyEncryptionKey, 0, KEY_SIZE);
Parece, onde está um erro aqui?
Acontece que um compilador, vendo que uma matriz não é usada em nenhum outro lugar, pode otimizar o código e remover a chamada da função
memset . E fará isso apenas ao criar a configuração da versão. Tudo ficaria bem, mas apenas a chave de inscrição permanecerá na RAM não esclarecida por algum tempo, dessa forma, pode ser obtida por um invasor. Uma verdadeira violação de segurança!
Além disso, dificilmente pode ser encontrado por você: no modo de depuração, a chamada do
memset funciona bem. Os testes também não serão úteis ... A única coisa que resta é estar ciente e lembrar-se desse recurso.
E se os desenvolvedores do projeto não souberem sobre esse recurso? E se você não souber sobre esse recurso ao procurar bugs? Quanto ao analisador, ele possui o diagnóstico
V597 , então você definitivamente descobrirá esse recurso ao visualizar o relatório.
Finalmente, o quarto ponto. Uma das vantagens mais úteis do uso de análise estática ao perseguir o Bug Bounty é a velocidade. É verdade que você pode conferir dois, três, quatro projetos em uma noite - mas isso não é tudo.
O principal é que você pode ser o primeiro. Embora o prêmio seja oferecido por encontrar bugs em qualquer projeto, o projeto continua a ser refinado e desenvolvido. Os desenvolvedores enviam novos lançamentos e novos recursos, além de novo código e novo espaço para erros. Ao usar a abordagem que descrevi, você poderá considerar de maneira direcionada novos erros e possíveis vulnerabilidades no primeiro dia em que forem lançados.
Potenciais vulnerabilidades
Um leitor atento pode ficar intrigado:
Espera, espera! Por um lado, você está dizendo sobre procurar erros no código nos programas, por outro lado - está mencionando possíveis vulnerabilidades. Vulnerabilidades são mais interessantes em termos de Bug Bounty. Por favor, esclareça o que você quer dizer!O fato é que erros e possíveis vulnerabilidades são basicamente a mesma coisa. Certamente, apenas alguns erros / vulnerabilidades em potencial provam ser vulnerabilidades reais em pesquisas futuras. No entanto, um erro inofensivo e uma vulnerabilidade crucial podem parecer exatamente iguais no código. O artigo "
Como o PVS-Studio pode ajudar na detecção de vulnerabilidades? " Dá vários bugs aparentemente comuns que agora são conhecidos por serem vulnerabilidades.
A propósito, de acordo com o relatório do Instituto Nacional de Padrões e Tecnologia (NIST), cerca de 64% das vulnerabilidades nos aplicativos estão relacionadas a erros de software, não a problemas diretamente relacionados à segurança.
Então pegue a urtiga, obtenha o PVS-Studio e comece a procurar por erros e falhas de segurança! A classificação de acordo com a
CWE será de grande ajuda aqui.
Conclusão
Felizmente, ajudei um leitor a procurar os mesmos erros que lhe trarão honras e recompensas monetárias. Tenho certeza de que a análise estática ajudará nisso! Lembre-se de que os desenvolvedores geralmente não têm tempo para analisar os erros em detalhes; portanto, você terá que provar que sua descoberta pode realmente afetar o programa. A melhor maneira é reproduzi-lo visualmente. E lembre-se: quanto mais o bug destruir a segurança - mais você será pago por isso.
Bem, é isso. Boa sorte na busca de uma recompensa!