Insegurança de memória
Bugs de segurança de memória, erros no manuseio de memória em linguagens de programação nativas, são o problema mais comum nas bases de código Android. Eles são responsáveis por mais de 60% das vulnerabilidades de segurança de alta gravidade e por milhões de falhas visíveis ao usuário.
Bugs de segurança de memória impactam negativamente a qualidade e a estabilidade e são responsáveis por uma parcela significativa das falhas observadas em dispositivos de usuários finais. Portanto, uma alta densidade de bugs de segurança de memória está diretamente correlacionada com uma experiência ruim do usuário.
O código nativo, escrito em linguagens inseguras para memória, como C, C++ e Assembly, representa mais de 70% do código da plataforma Android e está presente em aproximadamente 50% dos aplicativos da Play Store.
Dada a complexidade cada vez maior do código, se não forem atendidos, os bugs de segurança da memória aumentarão com o tempo. Portanto, fornecer ao nosso ecossistema ferramentas e tecnologias que possam detectar e mitigar esses bugs é fundamental para o nosso sucesso a longo prazo.
Nos últimos anos, temos trabalhado em estreita colaboração com nossos parceiros de hardware para desenvolver tecnologias de hardware como Arm Memory Tagging e introduzimos Rust na base de código do Android.
Essas tecnologias acelerarão nosso caminho para a segurança da memória e ajudarão a indústria de software em geral a resolver uma área problemática importante.
Bugs de segurança de memória afetam negativamente a qualidade
Bugs latentes de segurança de memória podem causar resultados não determinísticos, dependendo do estado do sistema. Esse comportamento imprevisível leva a travamentos e aborrecimentos para nossos usuários.
Todos os dias observamos milhões de travamentos nativos de dispositivos de usuários finais e, com a introdução do GWP-ASan , atribuímos a maioria deles a bugs de segurança de memória.
Este ponto de dados valida a correlação entre qualidade e densidade de bugs de segurança de memória e está alinhado com o que nossos colegas do Chrome observam (consulte a lista de prioridades de bugs do Chrome GWP-ASan ).
Bugs de segurança de memória afetam negativamente a segurança
Bugs de segurança de memória têm sido consistentemente os principais contribuintes para as vulnerabilidades de segurança do Android, desde o primeiro lançamento do Android.
Embora seja encorajador saber que este não é apenas um problema do Android (veja as estatísticas do Chrome e da Microsoft ), precisamos fazer mais pela segurança de nossos usuários.
A equipe do Project Zero do Google rastreia explorações de dia zero que foram usadas em ataques reais contra usuários como vulnerabilidades de dia zero. Estes não são bugs hipotéticos, mas explorações usadas ativamente em ataques contra usuários. Bugs de segurança de memória (corrupção de memória e uso após liberação) constituem a esmagadora maioria.
Bugs de segurança de memória aumentam custos
Manter os dispositivos atualizados com correções de segurança mantém nossos usuários seguros, mas acarreta um custo monetário para nosso ecossistema.
A alta densidade de bugs de segurança de memória no código do fornecedor de baixo nível, que geralmente possui modificações personalizadas, aumenta significativamente os custos de correção e testes. No entanto, detectar esses bugs no início do ciclo de desenvolvimento pode reduzir esses custos.
A pesquisa mostra que detectar bugs mais cedo pode reduzir custos em até seis vezes. No entanto, dada a complexidade do nosso ecossistema, o número médio de bases de código mantidas por um fornecedor e a complexidade cada vez maior do software, as poupanças poderiam ser maiores.
Segurança de memória
A partir do Android 12, fizemos alterações sistêmicas para reduzir a densidade de bugs de segurança de memória nas bases de código do Android. Estamos ampliando as ferramentas de segurança de memória do Android e introduzindo novos requisitos que incentivam nosso ecossistema a resolver essa categoria de bugs. Com o tempo, isso deverá se traduzir em maior qualidade e melhor segurança para nossos usuários e em custos mais baixos para nossos fornecedores.
A segurança da memória provavelmente se tornará um diferencial de qualidade e segurança nos próximos anos, e o Android planeja liderar esse caminho.
Requisitos de apoio à segurança da memória
O Documento de definição de compatibilidade do Android (CDD) recomenda fortemente o uso de ferramentas de segurança de memória durante o desenvolvimento.
Estamos trabalhando em estreita colaboração com nosso ecossistema para aumentar o uso de ferramentas de segurança de memória e integrá-las nos processos contínuos de integração e teste.
Com o tempo, gostaríamos de garantir que cada dispositivo passe por uma execução completa do Compatibility Test Suite ( CTS ), usando ferramentas de segurança de memória, o que demonstra que nenhum desses bugs foi encontrado. Por exemplo, as plataformas Arm v9 serão solicitadas a fornecer uma execução CTS com Memory Tagging habilitada, enquanto as plataformas Arm v8 serão solicitadas a fornecer uma execução CTS usando HWASAN e KASAN.
Rust como uma nova linguagem de programação para código de plataforma
O Android 12 introduziu o Rust como linguagem de plataforma . Rust fornece memória e segurança de thread em níveis de desempenho semelhantes ao C/C++. Esperamos que Rust seja a escolha preferida para a maioria dos novos projetos nativos. No entanto, reescrever todo o código inseguro de memória, que atualmente representa mais de 70% do código da plataforma Android, em Rust não é viável. No futuro, o Rust será complementar às ferramentas de segurança de memória.
Ferramentas de segurança de memória
O Android oferece suporte a uma ampla variedade de ferramentas que ajudam a detectar bugs de segurança de memória. A figura abaixo apresenta uma taxonomia das ferramentas de segurança de memória Android disponíveis.
Nossas ferramentas cobrem uma vasta gama de cenários e alvos de implantação. A documentação a seguir descreve cada ferramenta e fornece uma referência para usá-las em seus produtos.