A importância de conhecimentos diversos em pesquisa de vulnerabilidades – A transferibilidade de conhecimento

To access this blog post in English, click here.

Para alcançar uma carreira de excelência e alto nível em segurança da informação, conhecimentos técnicos diversos e profundos são, muitas vezes, necessários. É crucial ter uma experiência solida com:

  • Protocolos de rede
  • Arquitetura de computadores
  • Sistemas operacionais
  • Linguagens de programação
  • Compiladores e muitos outros conhecimentos

O profissional precisa ser um polímata. Estamos falando de carreiras que fazem a diferença, pessoas que trabalham na vanguarda da tecnologia moderna. Outras qualidades são também necessárias, claro, mas o foco aqui é apenas no ponto técnico.

É comum ouvir de pessoas interessadas em vulnerability research que consideram os nossos treinamentos interessantes, mas têm interesse em outros sistemas, como Windows ou MacOS, e por este motivo não os farão. É comum também ouvir o mesmo de pessoas que querem trabalhar com blue/red/purple team, análise de malware, threat intel ou outra área técnica de segurança da informação. Entendemos bem essa argumentação, porém, acreditamos que a premissa não é válida e, muitas vezes, é perigosa. Por este motivo, decidimos escrever esse blog post para endereçar essa questão.

A verdade é que não importa a área técnica específica que deseja, quanto mais conhecimento tiver, um melhor e mais capaz profissional você provavelmente se tornará. Você será capaz de:

  • Identificar e entender os problema diversos com maior facilidade.
  • Personalizar as ferramentas, sistemas, para seu propósito específico.
  • Encontrar vulnerabilidades e problemas em diversos sistemas e linguagens de programação.
  • Inovar através do desenvolvimento de novas técnicas de exploração e muito mais.

Conhecimentos em sistemas operacionais são fundamentais para quaisquer dessas áreas mencionadas, pois é um dos principais componentes em um sistema informatizado. A seguir, apresentaremos exemplos reais de como essa diversidade de conhecimentos se traduz diretamente em vulnerability research, mostrando como habilidades adquiridas em um contexto podem ser transferidas com sucesso para outros.

Técnicas de Exploração no Windows Baseada em Técnicas do Linux

Ao pensar sobre a influencia de técnicas de exploração de vulnerabilidades empregadas um sistema operacional que inspirou técnicas em outros sistemas, lembramos do blog post do Project Zero [1]. Em exploração de vulnerabilidades no kernel do Linux, o userfaultfd [2] é uma funcionalidade muito interessante. Esse recurso oferece uma capacidade muito relevante em exploração de vulnerabilidades: ele permite estender o tempo entre acessos realizados pelo kernel à memória controlada pelo usuário. Isso é uma capacidade muito útil em exploração de race conditions e em use-after-frees. Porém, o recurso não existe no Windows. No Linux, além do userfaultfd, existem outras técnicas que podem ser utilizadas quando esse recurso não está presente, como o sistema de arquivo FUSE.

Inspirado nessas técnicas de exploração de vulnerabilidades no kernel do Linux, o pesquisador James Forshaw decidiu investigar essa capacidade no Windows e descobrir técnicas que oferecessem a mesma funcionalidade. Isso demonstra o quanto é relevante para um pesquisador acompanhar o que acontece em outros sistemas. Ele chegou a uma técnica similar à utilizada com o sistema de arquivo FUSE no Linux. Além da inspiração de tentar obter uma capacidade do Linux que fosse similar no Windows, o mecanismo derivado por Forshaw também envolve sistema de arquivo. Para alcançar o feito, eles buscou por funcionalidades no Windows que tivessem as mesmas propriedades do FUSE do Linux que é permitir o usuário controlar o acesso a objetos do sistema de arquivo.

Sendo assim, fica evidente que o conhecimento aprofundado de um sistema operacional e técnicas de exploração específicas inspiram técnicas desenvolvidas para outros sistema operacionais. A transferibilidade de conhecimento existe nesse domínio e é altamente recomendado ter experiência diversas.

Explorando Browsers Como no Kernel do Linux

Um outro caso que nos chamou a atenção é o artigo escrito por r3tr07a na edição 71 da prestigiada revista digital Phrack [3] sobre exploração de vulnerabilidades no browser Chrome. No artigo, o autor deixa claro que se inspirou em técnicas de exploração utilizadas em vulnerabilidades no kernel do Linux para desenvolver novos mecanismos de exploração no navegador Chrome. Além de ter escrito um artigo interessante, o autor mostra que tem experiências avançadas em exploração de vulnerabilidades tanto com kernel do Linux quanto com navegadores. No final do artigo, o autor levanta um ponto importante que destacamos abaixo:

“High-performance allocators tend to share vulnerabilities inherent in their operation and performance.”

Alocadores são componentes dos softwares responsáveis por gerenciar a memória utilizada. Todo sistema operacional implementa no mínimo um, porém, há alguns anos, provavelmente visando desempenho, muitos outros softwares do dia a dia também implementam os seus próprios alocadores. Além dos browsers, o Adobe PDF Reader e o Flash costumavam implementar seus próprios alocadores, e as linguagens de programação também fazem isso.

A linguagem Go, por exemplo, utiliza um alocador de memória inspirado no slab allocator, que foi originalmente desenvolvido para o sistema operacional Solaris e hoje é utilizado em diversos sistemas operacionais Unix. O alocador de memória no Linux, o SLUB, é derivado do slab allocator. Memória é fundamental para todos os sistemas e por este motivo o SLUB é altamente otimizado. É um componente do Linux que recebe atualizações com frequência. Uma das otimizações dos alocadores modernos é utilizar variáveis per-cpu. Essa tecnologia funciona devido a uma abstração criada pelo sistema operacional que concede acesso a variáveis somente para a CPU em questão. Como, desta forma, através da abstração do sistema operacional, não pode ocorrer acesso simultâneo, o mecanismo de locking pode ser ausente ou simplificado.

Variáveis per-cpu é um assunto que discutimos em nosso treinamento de exploração de vulnerabilidades em kernel. Hoje em dia diversos alocadores fazem uso desse recurso, assim como linguagens de programação como a linguagem Go.

Conhecimento em alocadores de memória, em kernel ou usermode, é aconselhável para uma melhor compreensão de como a aplicação funciona e essencial em exploração de vulnerabilidades. Este também é um tópico de fácil transferibilidade. Como foi mencionado aqui, diversas aplicações e sistemas operacionais implementam seus próprios alocadores. Existem diversos alocadores, em aplicações de user mode, sistemas operacionais e linguagens de programação, e eles são similares em propósitos e propriedades, normalmente sendo evoluções de um modelo anterior.

A Aventura de Um Pesquisador de iOS no Android

Um outro ponto para evidenciar de que conhecimentos diversos podem ser úteis, lembramos do blog post [4] escrito por Brandon Azad, um especialista em dispositivos iOS. O artigo é bem interessante e de alto nível. Nele, Azad escreve exploit para um vulnerabilidade no driver de Neural Processing Unit (NPU) em dispositivos Android da Samsung. Na conclusão, é mencionado que o pesquisador ficou bastante surpreso com as similaridades e os paralelos que emergiram durante o trabalho, até relembrando de um trabalho anterior que ele realizou no iOS.

“Despite all these differences between the two platforms, I was overall quite surprised with the similarities and parallels that did emerge. Even though the final exploit flow for this NPU bug ended up being quite different, there were many echoes of the oob_timestamp exploit along the way. Thus my past experience developing iOS kernel exploits did in fact help me come up with ideas worth trying on Android, even if most of those ideas didn’t pan out.”

Desenvolvedor do Chrome Identificando Bugs em CPUs

Um último ponto que trazemos nesse post é sobre o desenvolvedor do Chrome chamado Bruce Dawson. Bruce é um aclamado desenvolvedor, tendo trabalhado em grandes empresas como Vale, Microsoft e Google. Ele mantém um blog [5] chamado Random ASCII em que costuma compartilhar excelente conteúdo. Em um desses posts [6], Bruce detalhe como encontrou um problema de design na CPU do Xbox 360. O post é bem interessante e recomendamos a leitura, porém, o ponto de estarmos aqui falando sobre ele é uma resposta dele na thread sobre o post no Hacker News [7].

Na thread, um engenheiro que trabalha com CPUs menciona que nos dias atuais, ter uma CPU no mercado com problemas de coerência de memória seria um grande erro. O autor do comentário utiliza o termo em Inglês “escape to silicon” e um outro comentário pergunta o que significa esse termo. Bruce responde claramente o significado do termo, mas o que chama a atenção é ele dizer que como um desenvolvedor do Chrome, ele precisa lidar com bugs de CPU com frequência. Apesar deste ponto não ser sobre transferibilidade de conhecimento, aqui demonstra o quanto um profissional na vanguarda da tecnologia, trabalhando diretamente no principal browser do mercado, precisa saber, como afirmamos no início deste texto.

Esse ponto chama bastante a atenção e acreditamos que tem a ver diretamente com o ponto deste post. Um programador que está trabalhando em tecnologias de ponta hoje, precisa saber tanto sobre o produto e as tecnologias envolvidas, assim como os processadores modernos funcionam. É evidente que nem todos os programadores trabalhando no Chrome ou em qualquer outro navegador precisam ter esse conhecimento, mas acreditamos que existem bem mais benefícios do que malefícios em ter esse conhecimento.

Não obstante, os termos utilizados hoje em dia para se referir ao conjunto de tecnologias utilizadas é stack que em inglês significa: uma pilha de coisas dispostas umas sobre as outras. Nenhuma tecnologia moderna funciona de forma isolada e quanto mais você souber sobre os componentes envolvidos na stack, acreditamos que um melhor e mais completo profissional você será.

Conclusão

O objetivo deste post foi mostrar que, na verdade, o conhecimento diverso é recomendado para alcançar um entendimento mais apurado, diferente do que estamos acostumados a ouvir. Um profissional experiente precisa ser capaz de entender os detalhes de forma abstrata, independente da implementação. Talvez isso já seja comum para um profissional experiente, mas talvez iniciantes dêem mais ênfase para os detalhes técnicos, específicos. Não compreendem as características e propriedades envolvendo classes de vulnerabilidades ou técnicas de exploração e, assim, não conseguem realmente aprender e aplicar em cenários diferentes do ambiente de aprendizado. Ao escrever esse blog post, lembramos do físico renomado Wolfgang Pauli, que escreve sobre a capacidade de generalizar a partir de um fenômeno específico.

Segue o texto abaixo:

“O conhecimento não pode ser adquirido através da compreensão de um fenômeno isolado ou de um único grupo de fenômenos, mesmo que se descubra alguma ordem neles. Ele advém do reconhecimento de que uma vasta quantidade de fatos experienciais está interconectada e pode, portanto, ser reduzida a um princípio comum. […] ‘Compreender’ provavelmente não significa mais do que ter as ideias e os conceitos necessários para reconhecer que uma grande quantidade de fenômenos diferentes faz parte de um todo coerente. Nossa mente fica menos perplexa assim que reconhecemos que uma situação especial, aparentemente confusa, é meramente um caso particular de algo mais amplo, e que, como resultado, pode ser formulada de maneira muito mais simples. A redução de uma variedade colorida de fenômenos a um princípio geral e simples, ou, como os Gregos diriam, a redução do muito ao um, é precisamente o que queremos dizer com ‘compreensão’. A capacidade de prever é frequentemente a consequência da compreensão, de ter os conceitos certos, mas não é idêntica à ‘compreensão’.”

Em nossos treinamentos, focamos não apenas nas técnicas específicas, mas explicamos as propriedades, características, fraquezas e robustez das implementações, permitindo entender como as coisas funcionam além do ambiente utilizado, permitindo generalizar a partir do fenômeno específico analisado. O Linux é um dos softwares mais otimizados e é desenvolvido pelos mais experientes e renomados desenvolvedores do mundo. Estudá-lo permite que você aprenda na prática implementações do mais alto nível do mercado, uma oportunidade bastante exclusiva.

Nossos treinamentos são ministrados por profissionais experientes que realizam exploração de vulnerabilidades há décadas. Oferecemos diversas vantagens para garantir o seu sucesso:

  • Instrutores de nível internacional: Profissionais com experiência comprovada em exploração de vulnerabilidades.
  • Comunidade exclusiva: Acesso antecipado aos nossos artigos e discussões avançadas.
  • Recursos flexíveis: Videoaulas gravadas para revisão a qualquer momento.
  • Suporte estendido: Suporte ao aluno por até 6 meses após o treinamento.

Aproveite esta oportunidade e garanta sua vaga. As vagas são limitadas para manter a qualidade do ensino.

Próximos Treinamentos

Referências

[1] – Windows Exploitation Tricks: Trapping Virtual Memory Access
https://googleprojectzero.blogspot.com/2021/01/windows-exploitation-tricks-trapping.html

[2] – Userfaultfd
https://docs.kernel.org/admin-guide/mm/userfaultfd.html

[3] – Allocating new exploits – Pwning browsers like a kernel – Digging into PartitionAlloc and Blink engine
https://phrack.org/issues/71/10#article

[4] – An iOS hacker tries Android
https://googleprojectzero.blogspot.com/2020/12/an-ios-hacker-tries-android.html

[5] – Random ASCII – tech blog of Bruce Dawson
https://randomascii.wordpress.com

[6] – Finding a CPU Design Bug in the Xbox 360
https://randomascii.wordpress.com/2018/01/07/finding-a-cpu-design-bug-in-the-xbox-360/

[7] – on: Finding a CPU Design Bug in the Xbox 360 (2018)
https://news.ycombinator.com/item?id=27481721