O Google anunciou a inclusão da linguagem de programação Rust entre as linguagens permitidas para o desenvolvimento da plataforma Android. O compilador da linguagem Rust foi incluído na árvore de origem do Android em 2019, mas o suporte para essa linguagem permaneceu experimental. Alguns dos primeiros componentes Rust planejados para Android incluem novas implementações do mecanismo de comunicação entre processos Binder e da pilha Bluetooth.
A introdução do Rust foi realizada como parte de um projeto para fortalecer a segurança, promover técnicas de programação seguras e aumentar a eficiência na identificação de problemas ao trabalhar com memória no Android. Observa-se que cerca de 70% de todas as vulnerabilidades perigosas identificadas no Android são causadas por erros ao trabalhar com memória. O uso do Rust, que se concentra na segurança da memória e no gerenciamento automático da memória, reduzirá o risco de vulnerabilidades causadas por erros de memória, como acesso pós-liberação e saturação de buffer.
Rust reforça a segurança da memória em tempo de compilação por meio de verificação de referência, propriedade de objetos e rastreamento de vida útil do objeto (escopos) e avaliando a correção dos acessos à memória em tempo de execução. Rust também fornece proteção contra overflows de inteiros, requer que valores de variáveis sejam inicializados antes do uso, tem melhor tratamento de erros na biblioteca padrão, usa o conceito de referências e variáveis imutáveis por padrão e oferece tipagem estática forte para minimizar erros lógicos.
No Android, a segurança da memória é fornecida nas linguagens Kotlin e Java já suportadas, mas elas não são adequadas para o desenvolvimento de componentes do sistema devido à alta sobrecarga. Rust permite atingir desempenho próximo às linguagens C e C++, o que permite sua utilização para desenvolvimento de partes de baixo nível da plataforma e componentes para interação com hardware.
Para garantir a segurança do código C e C++, o Android usa isolamento de sandbox, análise estática e testes de difusão. As capacidades de isolamento de sandbox são limitadas e atingiram o limite de suas capacidades (uma maior fragmentação em processos é impraticável do ponto de vista do consumo de recursos). As limitações do uso do sandbox incluem grandes custos indiretos e aumento do consumo de memória causado pela necessidade de gerar novos processos, bem como atrasos adicionais associados ao uso do IPC.
Ao mesmo tempo, o sandbox não elimina vulnerabilidades no código, mas apenas reduz riscos e complica o ataque, uma vez que a exploração requer a identificação não de uma, mas de várias vulnerabilidades. Os métodos baseados em testes de código são limitados, pois para identificar erros é necessário criar condições para que o problema se manifeste. Não é possível cobrir todas as opções possíveis, por isso muitos erros passam despercebidos.
Para processos de sistema no Android, o Google adere à "regra de dois", segundo a qual qualquer código adicionado deve atender a no máximo duas das três condições: trabalhar com dados de entrada não validados, usar uma linguagem de programação insegura (C/C++) e executando sem isolamento estrito de sandbox (com privilégios elevados). Esta regra implica que o código para processamento de dados externos deve ser reduzido a privilégios mínimos (isolado) ou escrito em uma linguagem de programação segura.
O Google não pretende reescrever o código C/C++ existente em Rust, mas planeja usar essa linguagem para desenvolver novo código. Faz sentido usar Rust para código novo porque, estatisticamente, a maioria dos bugs aparece em código novo ou alterado recentemente. Em particular, cerca de 50% dos erros de memória detectados no Android são detectados em código escrito há menos de um ano.
Fonte: opennet.ru