Principais Pontos
- A administração da Casa Branca está recomendando a adoção de linguagens de programação seguras em relação à gestão de memória, como Rust, visando diminuir as vulnerabilidades de segurança nos softwares.
- Linguagens de programação mais antigas e de nível mais baixo, como C, apresentam potenciais riscos de erros no código, o que pode levar a brechas de segurança.
- Linguagens que gerenciam a memória de forma segura, como Rust, oferecem mecanismos de gestão automática de memória e incorporam funcionalidades que previnem erros comuns.
Uma diretiva de uma agência governamental dos EUA sugere que os programadores devem dar preferência a linguagens que protegem a memória, como Rust e Java. Mas, qual o motivo dessa preferência e qual a sua real importância?
O Posicionamento da Casa Branca
Em um comunicado datado de 26 de fevereiro, o Gabinete do Diretor Nacional de Cibersegurança (ONCD) da Casa Branca incentivou os desenvolvedores de software a adotarem linguagens de programação com mecanismos de segurança de memória, sendo Rust um exemplo notável.
Como nação, temos a capacidade e a obrigação de reduzir a área de ataque no ciberespaço e impedir que classes inteiras de falhas de segurança se infiltrem no ecossistema digital. Isso significa que devemos enfrentar o desafio da transição para linguagens de programação que garantam a segurança da memória.
A Relevância da Questão
A ONCD, estabelecida em 2021, reporta-se diretamente ao Presidente, fornecendo aconselhamento sobre segurança cibernética e tópicos relacionados. É provável que as políticas dos EUA influenciem o panorama tecnológico global.
Muitas das maiores vulnerabilidades de segurança da história foram originadas por problemas relacionados à gestão da memória. Linguagens mais antigas e de nível mais baixo concedem aos programadores grande poder, mas isso também eleva o risco de códigos defeituosos causarem sérios incidentes.
Não obstante, o uso de linguagens com mecanismos de segurança de memória — como Rust, Python e JavaScript — tem apresentado crescimento consistente. O anúncio da ONCD provavelmente se deve ao fato de que linguagens menos seguras como C têm um histórico extenso e seu código legado está profundamente enraizado na infraestrutura e em grande parte dos softwares que utilizamos diariamente.
A Caracterização de uma Linguagem Não Segura
Códigos não seguros não são necessariamente complexos ou intimidadores. Considere este exemplo simples de um programa em C:
#include <stdio.h>int main (void) {
int arr[3] = { 0, 0, 0 };
printf("%d\n", arr[3]);
return 0;
}
Este é um exemplo clássico de um problema que pode resultar em um ataque de estouro de buffer. O programador negligenciou o fato de que os arrays em C (e em muitas outras linguagens) são indexados a partir de zero, o que significa que o primeiro elemento é arr[0]. A tentativa de acessar arr[3] é, portanto, um erro, mas o C permitirá:
O valor em arr[3] é um endereço de memória válido, como qualquer outro, mas que não pertence ao array. Qualquer valor pode ser armazenado nesse local, e as consequências de acessá-lo ou modificá-lo podem variar desde uma simples falha no programa até um incidente de segurança catastrófico. Muitos hackers, ao longo da história, exploraram vulnerabilidades como essa.
Embora o compilador C gere um aviso, ele também produz um executável. Um programador pode ignorar avisos e até mesmo ocultá-los utilizando sinalizadores do compilador. O C permite que você cause danos a si mesmo, enquanto linguagens como Rust não lhe fornecerão essa oportunidade.
A Aparência de um Código Seguro para Memória
Em uma linguagem segura para memória, como Rust, o mesmo problema simplesmente não existe. Veja o mesmo programa, reescrito em Rust:
fn main() {
let arr: [u32; 5] = [0;3];
println!("{}", arr[3]);
}
Embora este código seja sintaticamente correto, o Rust não conseguirá compilá-lo:
O compilador detalha o problema e impede a geração de um executável. O Rust simplesmente não permite a execução desse tipo de código.
O Rust oferece diversos recursos para garantir segurança. Ele inclui ponteiros inteligentes para gerenciar a memória de forma automática e evitar a desreferenciação de ponteiros nulos.
É Necessário Mudar de Linguagem?
Cada linguagem de programação tem um propósito específico, portanto, é preciso ter cautela ao seguir recomendações para evitá-las completamente, mesmo que venham de fontes oficiais. Embora seja possível se especializar em uma linguagem específica, é benéfico aprender diversas opções para ampliar as possibilidades.
A segurança da memória é um recurso presente em muitas linguagens modernas, e é provável que você já esteja familiarizado com pelo menos uma delas. O C tem suas aplicações, mas existem alternativas mais seguras que reduzem a ocorrência de erros. Em particular, se você busca uma linguagem eficiente com mecanismos de segurança robustos, o Rust é uma opção recomendada.