O Google está desenvolvendo partes do Android em Rust para melhorar a segurança

click fraud protection

O Google está escrevendo e reescrevendo partes do Android em Rust para melhorar a segurança do sistema operacional como um todo, em comparação com C e C++. Continue lendo para saber mais!

O Android como uma solução completa de sistema operacional envolve muitas partes móveis. De modo geral, essas partes são o ecossistema do aplicativo e, em seguida, o próprio sistema operacional. Como desenvolvedor, a linguagem de programação de sua escolha varia dependendo da parte do Android em que você está trabalhando. Para desenvolvedores de aplicativos, Java e Kotlin são opções populares. Para desenvolvedores que trabalham no sistema operacional e nos níveis mais baixos dele, C e C++ têm sido escolhas populares até agora. Hoje, o Google está adicionando uma terceira opção para desenvolvedores de sistema operacional, já que o Android Open Source Project agora oferece suporte à linguagem de programação Rust para desenvolver o próprio sistema operacional.

Limitações de C e C++

Níveis mais baixos do sistema operacional Android requerem linguagens de programação de sistemas como C e C++. Essas linguagens fornecem aos desenvolvedores controle e previsibilidade, o que é importante ao acessar recursos e hardware de sistema de baixo nível.

Infelizmente, C e C++ não fornecem garantias de segurança de memória, tornando-os propensos a bugs e vulnerabilidades de segurança. O desenvolvedor é responsável por gerenciar o tempo de vida da memória nessas linguagens, mas em bases de código complexas e multithread, é mais fácil falar do que fazer.

C e C++ juntos constituem dezenas de milhões de linhas de código na plataforma Android. Esses bugs de segurança de memória se tornam a fonte de código incorreto mais difícil de resolver, representando cerca de 70% das vulnerabilidades de segurança de alta gravidade do Android. Apenas corrigir esses bugs torna-se insuficiente para lidar com o problema, e uma abordagem melhor seria evitá-los em primeiro lugar.

A falta de garantias de segurança de memória força os desenvolvedores a executar processos Android em sandboxes fortemente restritas e sem privilégios. Mas os sandboxes são caros em recursos, consumindo sobrecarga adicional e introduzindo latência. O sandbox também não elimina totalmente as vulnerabilidades do código e sua eficácia é reduzida devido à alta densidade de bugs, permitindo ainda que os invasores encadeiem múltiplas vulnerabilidades.

Outra limitação, embora não exclusiva de C e C++, mas aplicável a todos os problemas de segurança de memória, é que o estado errôneo deve, na verdade, ser acionado no código instrumentado para ser detectado. Portanto, mesmo que seu código tenha testes excelentes, o bug real pode passar despercebido. E quando são encontrados bugs, corrigi-los é outra tarefa, envolvendo um processo longo e caro que nem sempre leva a uma correção correta. Assim, a detecção de bugs torna-se não confiável e a prevenção de bugs é a melhor abordagem a ser adotada à luz dessas limitações.

É aqui que entra em cena a mudança para uma linguagem segura de memória como Rust.

Ferrugem e seus benefícios

Rust fornece garantias de segurança de memória usando uma combinação de verificações em tempo de compilação para impor a vida/propriedade do objeto e verificações em tempo de execução para garantir que os acessos à memória sejam válidos. Essa segurança é alcançada ao mesmo tempo em que fornece desempenho equivalente ao C e C++. Rust também reduz a necessidade de sandboxing, permitindo aos desenvolvedores mais espaço para introduzir novos recursos que são mais seguros e leves em recursos.

Embora o Rust realmente tenha seus benefícios, não é viável mudar todo o sistema operacional Android para o Rust durante a noite. E isso pode nem ser necessário, já que a maioria dos bugs de memória do Android ocorre em código novo ou modificado recentemente, com cerca de 50% tendo menos de um ano. O Google acredita que seus esforços de linguagem segura para memória são mais bem focados em novos desenvolvimentos, em vez de reescrever código C e C++ maduro.

Rust também se concentra na prevenção de bugs, em vez de se apoiar fortemente na detecção de bugs, resultando em maior correção do código. Possui vários recursos importantes, como segurança de memória, simultaneidade de dados, sistemas de tipos mais expressivos, imutáveis referências e variáveis ​​por padrão, manipulação de inteiros mais segura, melhor manipulação de erros em bibliotecas padrão e muito mais mais.

O que a mudança para Rust significa para o Android?

O Google afirma que vem adicionando suporte Rust ao Android Open Source Project nos últimos 18 meses. Mas adicionar uma nova linguagem à plataforma Android é uma tarefa enorme. Algumas cadeias de ferramentas e dependências precisam ser mantidas, a infraestrutura e as ferramentas de teste devem ser atualizadas e os desenvolvedores precisam ser treinados.

O Google tem alguns projetos pioneiros que compartilharão nos próximos meses. Mas, mesmo assim, está ficando claro que escalar o suporte do Rust para mais sistemas operacionais é um projeto de vários anos.

Pelo que podemos ver, o Google já está usando Rust em alguns lugares. A nova pilha Bluetooth reescrita do Android com o codinome "Gabeldorsche"está sendo escrito em Rust. O trabalho no Gabeldorsche começou na época do Android 11, mas ainda não está em uso. Android Armazenamento de chaves 2.0 O módulo é escrito em Rust, assim como a parte do espaço do usuário do fichário, o driver IPC do Android. Embora não esteja relacionado ao Android, Fúcsiaé novo pilha de rede também está sendo escrito em Rust.

Para desenvolvedores de aplicativos, a mudança não muda nada sobre como você, como desenvolvedor de aplicativos, escreve aplicativos ou como as APIs da estrutura funcionam. Essa opção afeta apenas como o sistema operacional é gravado. De acordo com um membro da equipe de relações com desenvolvedores Android, o Google também não planeja lançar um Rust NDK no momento. As linguagens suportadas para desenvolvimento de aplicativos continuarão a ser Kotlin, Java, C e C++.