Casa Branca quer código seguro: Rust e a nova era da programação

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.

A ONCD declarou:

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.