Casa Branca adverte contra a utilização destas populares linguagens de programação
Uma agência governamental dos EUA decretou que os programadores devem usar linguagens seguras em termos de memória, como Rust e Java, ao invés de C e C++. Mas por que é que elas são melhores e isso realmente importa?
O que é que a Casa Branca está a dizer?
Numa declaração, o Gabinete do Diretor Cibernético Nacional (ONCD - Office of the National Cyber Director) da Casa Branca alertou os programadores de software a adotarem linguagens de programação com memória segura, como Rust.
O ONCD afirmou:
Nós, como nação, temos a capacidade - e a responsabilidade - de reduzir a superfície de ataque no ciberespaço e impedir que classes inteiras de erros de segurança entrem no ecossistema digital, mas isso significa que precisamos de enfrentar o difícil problema de mudar para linguagens de programação com memória segura.
Muitas das piores vulnerabilidades de segurança de sempre tiveram como causa principal problemas com a segurança da memória. As linguagens de baixo nível mais antigas dão aos programadores muito poder, mas isso aumenta o risco de um código com erros causar graves repercussões.
Independentemente disso, a utilização de linguagens com segurança de memória - como Rust, Python e JavaScript - tem vindo a aumentar. É provável que o ONCD esteja a fazer este anúncio porque as linguagens menos seguras, como o C, existem há tanto tempo que o seu código está agora enraizado na infraestrutura e em grande parte do software que utilizamos diariamente.
Como funcionam as linguagens inseguras?
O código inseguro nem sempre parece assustador ou mesmo complicado. Veja este exemplo de um simples 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 bug que pode levar a um ataque de buffer overflow. O programador esqueceu-se que os arrays em C (e na maioria das outras linguagens) começam no index zero, o que significa que o primeiro elemento está em arr[0]. Tentar aceder a arr[3] é, portanto, um erro, mas que o C permite:
O valor em arr[3] é um endereço de memória válido, como qualquer outro, apenas não pertence ao array. Qualquer valor poderia ser armazenado lá, e as consequências de acessá-lo ou escrevê-lo podem gerar um crash do programa ou um incidente de segurança mais catastrófico. Muitos hackers ao longo da história exploraram estes bugs.
Como funciona o código nas linguagens com segurança de memória?
Numa linguagem com memória segura como Rust, o mesmo problema simplesmente não existe. Aqui está o mesmo programa, em Rust:
fn main() { let arr: [u32; 5] = [0;3]; println!("{}", arr[3]); } |
Embora esse código seja sintaticamente válido, o Rust não conseguirá compilá-lo:
O compilador explica o problema e recusa-se a produzir um executável. O Rust simplesmente não permite que execute esse código.
O Rust tem muitos outros recursos além desses, para ajudar a protegê-lo. Este inclui recursos como apontadores inteligentes para lidar com a gestão de memória automaticamente e evitar a "desreferência" de apontadores nulos.
Todas as linguagens de programação têm um objetivo, pelo que deve ter cuidado com os conselhos para evitar absolutamente qualquer uma, mesmo que venham de um Presidente. Embora possa optar por se especializar numa determinada linguagem, é sempre útil aprender uma variedade, para expandir as suas opções.
Leia também: