Cuprins
Recomandări cheie
- Casa Albă îndeamnă utilizarea unor limbaje sigure pentru memorie, cum ar fi Rust, pentru a reduce vulnerabilitățile de securitate în cod.
- Limbile mai vechi de nivel inferior, cum ar fi C, prezintă riscuri ca codul cu erori să conducă la incidente de securitate.
- Limbile sigure pentru memorie, cum ar fi Rust, oferă funcții de gestionare automată a memoriei și de prevenire a erorilor.
O agenție guvernamentală americană a decretat că programatorii ar trebui să favorizeze limbaje sigure pentru memorie precum Rust și Java. Dar de ce sunt mai bune și contează asta cu adevărat?
Ce spune Casa Albă?
Într-o declarație din 26 februarie, Biroul National Cyber Director (ONCD) de la Casa Albă a îndemnat dezvoltatorii de software să adopte limbaje de programare sigure pentru memorie, cum ar fi Rust.
Noi, ca națiune, avem capacitatea – și responsabilitatea – de a reduce suprafața de atac în spațiul cibernetic și de a preveni pătrunderea unor clase întregi de erori de securitate în ecosistemul digital, dar asta înseamnă că trebuie să abordăm problema dificilă a trecerii la limbaje de programare sigure pentru memorie. .
De ce este important?
ONCD, înființată în 2021, raportează direct Președintelui, oferindu-i consiliere cu privire la securitatea cibernetică și probleme conexe. Este posibil ca politica SUA să aibă un efect de undă în întreaga lume a tehnologiei.
Multe dintre cele mai grave vulnerabilități de securitate au avut probleme cu siguranța memoriei ca cauză principală. Limbajele mai vechi de nivel inferior oferă programatorilor multă putere, dar acest lucru crește riscul ca codul cu erori să provoace repercusiuni grave.
Oricum, utilizarea limbajelor sigure pentru memorie, cum ar fi Rust, Python și JavaScript, a crescut de mult. ONCD face probabil acest anunț, deoarece limbaje mai puțin sigure, cum ar fi C, există atât de mult încât codul lor moștenit este acum înrădăcinat în infrastructură și în mare parte din software-ul pe care îl folosim zilnic.
Cum arată un limbaj nesigur?
Codul nesigur nu pare întotdeauna înfricoșător sau chiar complicat. Luați acest exemplu de 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 tamponului. Programatorul a uitat că tablourile în C (și majoritatea celorlalte limbi) sunt indexate la zero, ceea ce înseamnă că primul element este la arr.[0]etc. Încercarea de a accesa arr[3] este deci o greșeală, dar una pe care C o va permite:
Valoarea la arr[3] este o adresă de memorie validă, ca oricare alta, pur și simplu nu aparține matricei. Orice valoare ar putea fi stocată acolo, iar consecințele accesării sau scrierii în ea pot varia de la o prăbușire a programului până la un incident de securitate catastrofal. Mulți hackeri de-a lungul istoriei au exploatat astfel de erori.
Deși compilatorul C încă produce un avertisment, generează și un executabil. Un programator este liber să ignore avertismentele și chiar să le ascundă folosind steagurile compilatorului. C vă va lăsa în continuare să vă împușcați în picior, în timp ce limbi precum Rust nu vă vor oferi deloc o armă.
Cum arată codul de siguranță pentru memorie?
Într-un limbaj sigur pentru memorie precum Rust, aceeași problemă pur și simplu nu există. Iată același program, în Rust:
fn main() {
let arr: [u32; 5] = [0;3];
println!("{}", arr[3]);
}
Deși acest cod este valid din punct de vedere sintactic, Rust nu va reuși să-l compila:
Compilatorul explică problema și refuză să producă un executabil. Rust pur și simplu nu vă va lăsa să rulați acest cod.
Rust are multe alte caracteristici pe lângă acestea, pentru a vă proteja. Include funcții precum pointeri inteligente pentru a gestiona automat gestionarea memoriei și pentru a preveni dereferențiarea pointerului nul.
Ar trebui să schimb limbile?
Fiecare limbaj de programare are un scop, așa că ar trebui să te ferești de sfaturi pentru a evita absolut orice, chiar dacă vine de la Președinte. Deși puteți alege să vă specializați într-o anumită limbă, este întotdeauna util să învățați o varietate, să vă extindeți opțiunile.
Siguranța memoriei este o caracteristică a atâtor limbi moderne, încât ați putea la fel de bine să fiți familiarizat cu cel puțin una. C are utilizările sale, dar există opțiuni mai sigure care vor cauza mai puține accidente. În special, dacă sunteți în căutarea unui limbaj eficient care să aibă niște plase de siguranță bune, Rust este o necesitate.