O Google anunciou recentemente a inclusão da linguagem de programação Rust entre as linguagens permitidas para o desenvolvimento Android.
Já que o compilador Rust foi incluído na árvore de origem do Android em 2019, o suporte a idiomas permaneceu experimental.
Alguns dos primeiros componentes do Rust enviados para o Android são novas implementações do mecanismo de comunicação entre processos Binder e a pilha Bluetooth.
A implementação do Rust foi realizada como parte de um projeto para fortalecer a segurança, promover técnicas de codificação seguras e melhorar a eficiência de 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 da linguagem Rust, que se concentra no gerenciamento seguro de memória e fornece gerenciamento automático de memória, reduzirá o risco de vulnerabilidades causadas por erros durante o manuseio da memória, como acessar uma área de memória após ela ter liberado e estourado os limites do buffer.
O manuseio seguro da memória é garantido no Rust em tempo de compilação, verificando referências, rastreando a propriedade e a vida do objeto (escopo), bem como avaliando a exatidão do acesso à memória em tempo de execução.
Rust também fornece meios de proteção contra estouros de inteiros, requer inicialização obrigatória de valores de variáveis ​​antes do uso, lida melhor com erros na biblioteca padrão, adota o conceito de variáveis ​​imutáveis ​​e referências por padrão e oferece escrita estática forte para minimizar erros lógicos.
No Android, o gerenciamento seguro de memória é fornecido nas linguagens Kotlin e Java já compatíveis, mas eles não são adequados para desenvolver componentes de sistema devido à sobrecarga pesada.
Rust permite desempenho próximo às linguagens C e C++, permitindo que seja usado para desenvolver partes de baixo nível da plataforma e componentes para fazer interface com o hardware.
Para garantir a segurança do código C e C++, o Android usa isolamento sandbox, análise estática e testes de difusão. Os recursos de isolamento de sandbox são limitados e atingiram o limite de seus recursos (uma fragmentação adicional nos processos não é prática do ponto de vista do consumo de recursos).
Dentre as limitações do uso do sandbox, eles citam a alta sobrecarga e o maior consumo de memória causados ​​pela necessidade de geração de novos processos, bem como a latência adicional associada ao uso do IPC.
Ao mesmo tempo, a sandbox não elimina vulnerabilidades no código, mas apenas reduz os riscos e complica o ataque, pois a exploração requer a identificação não de uma, mas de várias vulnerabilidades.
Os métodos de teste de código são limitados porque, para detectar erros, é necessário criar condições para a manifestação do problema. Não é possível cobrir todas as opções possíveis, tantos erros passam despercebidos.
Para processos de sistema no Android, o Google segue a '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 verificados, usando uma linguagem de programação insegura (C/C++ ) e execute sem isolamento de caixa de areia rígida (com privilégios elevados).
Segue-se desta regra que o código para processar dados externos deve ser reduzido ao mínimo privilégio (isolado) ou escrito em uma linguagem de programação segura.
O Google não pretende reescrever o código C/C++ existente no Rust, mas planeja usar essa linguagem para desenvolver um novo código.
Faz sentido usar Rust para código novo, uma vez que estatisticamente a maioria dos erros aparece em código novo ou modificado 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.