Biały Dom chce programowania bezpiecznego dla pamięci, ale co to jest?

Najważniejsze Informacje dotyczące Bezpieczeństwa Kodu

  • Administracja rządowa USA apeluje o stosowanie języków programowania z wbudowanymi mechanizmami ochrony pamięci, takich jak Rust, w celu zredukowania podatności kodu na ataki.
  • Tradycyjne języki niskopoziomowe, na przykład C, niosą ze sobą ryzyko błędów w kodzie, które mogą skutkować poważnymi naruszeniami bezpieczeństwa.
  • Języki programowania z bezpiecznym zarządzaniem pamięcią, jak Rust, automatycznie kontrolują alokację pamięci i zapobiegają powstawaniu błędów.

Agendy rządowe w Stanach Zjednoczonych rekomendują programistom wybór języków bezpiecznych dla pamięci, takich jak Rust i Java. Ale czym te języki się wyróżniają i dlaczego ich wybór ma tak duże znaczenie?

Stanowisko Białego Domu

W oświadczeniu wydanym 26 lutego, Biuro Krajowego Dyrektora ds. Cyberbezpieczeństwa (ONCD) w Białym Domu, zaapelowało do twórców oprogramowania o preferowanie języków programowania z wbudowaną ochroną pamięci, jak na przykład Rust.

Według komunikatu ONCD:

Jako naród mamy szansę i obowiązek zminimalizować potencjalne zagrożenia w cyberprzestrzeni oraz zapobiegać pojawianiu się błędów bezpieczeństwa w ekosystemie cyfrowym. To zadanie wymaga od nas przejścia na języki programowania z bezpiecznym zarządzaniem pamięcią.

Dlaczego to jest istotne?

ONCD, powołane w roku 2021, podlega bezpośrednio Prezydentowi i doradza mu w kwestiach cyberbezpieczeństwa. Polityka Stanów Zjednoczonych w tej materii prawdopodobnie wpłynie na całą globalną branżę technologiczną.

Wiele z najpoważniejszych luk w zabezpieczeniach systemów informatycznych wynikało z problemów z zarządzaniem pamięcią. Starsze języki niskiego poziomu dają programistom szerokie możliwości, ale jednocześnie podnoszą ryzyko powstania błędów w kodzie, które mogą mieć poważne konsekwencje.

Warto zauważyć, że popularność języków bezpiecznych dla pamięci, takich jak Rust, Python czy JavaScript, stale rośnie. ONCD decyduje się na ten apel prawdopodobnie dlatego, że mniej bezpieczne języki, takie jak C, są obecne w informatyce od tak dawna, że ich starszy kod jest głęboko zakorzeniony w infrastrukturze i większości oprogramowania, z którego korzystamy na co dzień.

Cechy języka o niskim poziomie bezpieczeństwa

Niebezpieczny kod nie zawsze wygląda na skomplikowany czy zawiły. Spójrzmy na prosty przykład programu w języku C:

#include <stdio.h>
int main (void) {
    int arr[3] = { 0, 0, 0 };
    printf("%d\n", arr[3]);
    return 0;
}

To klasyczny przykład błędu, który może prowadzić do ataku zwanego przepełnieniem bufora. Programista zapomniał, że w języku C tablice są indeksowane od zera, a nie od jedynki, co oznacza, że pierwszy element ma indeks arr[0]. Próba odwołania się do arr[3] jest błędem, ale C na to pozwala.

Wartość pod adresem arr[3] jest poprawnym adresem pamięci, tak jak każdy inny, ale nie należy on do tablicy. Można tam przechowywać dowolną wartość, a konsekwencje odczytu lub zapisu mogą obejmować awarię programu lub katastrofalne naruszenie bezpieczeństwa. W przeszłości hakerzy często wykorzystywali takie błędy.

Chociaż kompilator C generuje ostrzeżenie, tworzy również plik wykonywalny. Programista może zignorować ostrzeżenia, a nawet ukryć je za pomocą flag kompilatora. Język C nadal pozwala na popełnienie błędów, podczas gdy języki takie jak Rust w ogóle na to nie pozwalają.

Charakterystyka kodu bezpiecznego dla pamięci

W języku zapewniającym bezpieczeństwo pamięci, takim jak Rust, ten sam problem po prostu nie wystąpi. Oto ten sam program zapisany w języku Rust:

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

Mimo że ten kod jest poprawny składniowo, kompilacja w Rust się nie powiedzie:

Kompilator sygnalizuje problem i nie tworzy pliku wykonywalnego. Rust nie dopuści do uruchomienia takiego kodu.

Oprócz tego, Rust oferuje wiele innych mechanizmów ochrony. Udostępnia funkcje takie jak inteligentne wskaźniki do automatycznego zarządzania pamięcią i zapobiegania próbom dereferencji wskaźników o wartości null.

Czy warto zmienić język programowania?

Każdy język programowania został stworzony w konkretnym celu, więc należy zachować ostrożność, nawet jeśli rada pochodzi od Prezydenta. Chociaż można się specjalizować w konkretnym języku, warto również poznać inne języki, aby poszerzyć swoje kompetencje.

Bezpieczeństwo pamięci jest cechą charakterystyczną wielu współczesnych języków, dlatego warto znać przynajmniej jeden z nich. Język C ma swoje zastosowania, ale istnieją bezpieczniejsze alternatywy, które zmniejszą ryzyko wystąpienia błędów. W szczególności, jeśli potrzebujesz wydajnego języka z dobrymi zabezpieczeniami, warto rozważyć Rust.


newsblog.pl