Casa Albă vrea programare sigură pentru memorie, dar ce este asta?

Recomandări Principale

  • Administrația prezidențială americană încurajează utilizarea limbajelor de programare cu gestionare sigură a memoriei, cum ar fi Rust, pentru a reduce vulnerabilitățile de securitate din cod.
  • Limbajele de programare de nivel inferior mai vechi, precum C, prezintă riscuri semnificative ca erorile de cod să conducă la incidente de securitate.
  • Limbajele care asigură siguranța memoriei, precum Rust, oferă mecanisme automate de gestionare a memoriei și protecție împotriva erorilor frecvente.

O instituție guvernamentală din Statele Unite a solicitat programatorilor să acorde prioritate limbajelor de programare care oferă siguranță memoriei, printre care se numără Rust și Java. Dar ce le face superioare și cât de mult contează această recomandare?

Ce a declarat Casa Albă?

Într-o comunicare oficială din 26 februarie, Biroul Național al Directorului Cibernetic (ONCD) din cadrul Casei Albe a recomandat dezvoltatorilor de software să adopte limbaje de programare cu funcții de siguranță a memoriei, cum ar fi Rust.

Conform declarației ONCD:

Ca națiune, deținem capacitatea și responsabilitatea de a reduce riscurile în spațiul cibernetic și de a împiedica infiltrarea unor categorii întregi de erori de securitate în mediul digital. Aceasta implică necesitatea de a aborda dificila tranziție către limbaje de programare cu gestionare sigură a memoriei.

De ce este important acest lucru?

ONCD, înființat în 2021, raportează direct Președintelui, oferind sfaturi în materie de securitate cibernetică și aspecte conexe. Politicile SUA ar putea influența direcția tehnologiei la nivel global.

Multe dintre cele mai grave vulnerabilități de securitate au fost generate de probleme legate de siguranța memoriei. Limbajele de nivel inferior, mai vechi, oferă programatorilor un control extins, dar acest lucru mărește riscul ca erorile de cod să provoace consecințe grave.

Utilizarea limbajelor care garantează siguranța memoriei, precum Rust, Python și JavaScript, a crescut semnificativ. ONCD face probabil această declarație deoarece limbaje mai puțin sigure, ca C, sunt atât de răspândite, încât codul lor existent este profund înrădăcinat în infrastructuri și în majoritatea programelor pe care le folosim zilnic.

Cum arată un limbaj nesigur?

Codul nesigur nu pare întotdeauna intimidant sau complex. De exemplu, luați în considerare acest program C simplu:

#include <stdio.h>

int main (void) {
int arr[3] = { 0, 0, 0 };
printf("%d\n", arr[3]);
return 0;
}

Acesta este un exemplu clasic de eroare care poate duce la un atac de depășire a bufferului. Programatorul a omis că matricele în C (și în multe alte limbaje) sunt indexate de la zero, ceea ce înseamnă că primul element este la arr[0]. Încercarea de a accesa arr[3] este, așadar, o greșeală, însă C o permite:

Valoarea la arr[3] este o adresă de memorie validă, ca oricare alta, doar că nu face parte din matrice. Orice informație ar putea fi stocată acolo, iar efectele accesării sau scrierii asupra ei pot varia de la o blocare a programului la un incident major de securitate. Mulți hackeri au exploatat astfel de erori de-a lungul timpului.

Deși compilatorul C emite un avertisment, generează totuși și un executabil. Un programator poate ignora avertismentele și chiar le poate ascunde folosind opțiuni de compilare. C îți permite să te expui riscurilor, în timp ce limbaje ca Rust îți oferă o protecție superioară.

Cum arată codul cu gestionare sigură a memoriei?

Într-un limbaj cu siguranță a memoriei, cum ar fi Rust, aceeași problemă este eliminată. Iată același program, rescris în Rust:

fn main() {
let arr: [u32; 5] = [0;3];
println!("{}", arr[3]);
}

Deși codul este corect din punct de vedere sintactic, Rust nu va reuși să-l compileze:

Compilatorul semnalează eroarea și refuză generarea unui executabil. Rust pur și simplu nu permite rularea acestui cod.

Rust are multe alte funcții de protecție. Acesta include caracteristici precum pointeri inteligenți care gestionează automat memoria și previn dereferențierea pointerilor nuli.

Ar trebui să schimb limbajele de programare?

Fiecare limbaj de programare are un scop specific, așa că ar trebui să fim precauți în a evita categoric ceva, chiar dacă recomandarea vine de la Președinte. Deși ne putem specializa într-un limbaj, este întotdeauna benefic să cunoaștem o varietate, extinzându-ne posibilitățile.

Siguranța memoriei este o caracteristică comună a multor limbaje moderne, așa că este util să fim familiarizați cu cel puțin unul. C are aplicațiile sale, dar există opțiuni mai sigure care pot preveni erorile. În special, dacă dorim un limbaj eficient care oferă și o protecție sporită, Rust este o alegere excelentă.