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

  • Biały Dom nalega, aby używać języków bezpiecznych dla pamięci, takich jak Rust, w celu ograniczenia luk w zabezpieczeniach kodu.
  • Starsze języki niższego poziomu, takie jak C, stwarzają ryzyko wystąpienia błędów w kodzie prowadzących do incydentów związanych z bezpieczeństwem.
  • Języki bezpieczne dla pamięci, takie jak Rust, oferują funkcje automatycznego zarządzania pamięcią i zapobiegania błędom.

Agencja rządowa Stanów Zjednoczonych zadecydowała, że ​​programiści powinni preferować języki bezpieczne dla pamięci, takie jak Rust i Java. Ale dlaczego są lepsze i czy to naprawdę ma znaczenie?

Co mówi Biały Dom?

W oświadczeniu z 26 lutego Biuro Krajowego Dyrektora ds. Cyberbezpieczeństwa (ONCD) Białego Domu nalegało, aby twórcy oprogramowania przyjęli języki programowania bezpieczne dla pamięci, takie jak Rust.

ONCD stwierdziło:

Jako naród mamy możliwość – i odpowiedzialność – zmniejszenia powierzchni ataku w cyberprzestrzeni i zapobiegania przedostawaniu się całych klas błędów bezpieczeństwa do ekosystemu cyfrowego, ale to oznacza, że ​​musimy stawić czoła trudnemu problemowi przejścia na języki programowania bezpieczne dla pamięci .

Dlaczego to jest ważne?

ONCD, utworzona w 2021 r., podlega bezpośrednio Prezydentowi, doradzając mu w kwestiach cyberbezpieczeństwa i pokrewnych. Polityka Stanów Zjednoczonych prawdopodobnie będzie miała oddźwięk w całym świecie technologii.

Przyczyną wielu najgorszych w historii luk w zabezpieczeniach były problemy z bezpieczeństwem pamięci. Starsze języki niższego poziomu dają programistom duże możliwości, ale zwiększa to ryzyko wystąpienia błędów w kodzie, powodujących poważne konsekwencje.

Niezależnie od tego, wykorzystanie języków bezpiecznych dla pamięci – takich jak Rust, Python i JavaScript – od dawna rośnie. ONCD prawdopodobnie ogłasza to, ponieważ mniej bezpieczne języki, takie jak C, istnieją już tak długo, że ich starszy kod jest obecnie zakorzeniony w infrastrukturze i większości oprogramowania, którego używamy na co dzień.

Jak wygląda niebezpieczny język?

Niebezpieczny kod nie zawsze wygląda przerażająco lub nawet skomplikowanie. Weźmy przykład prostego programu w C:

#include <stdio.h>

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

Jest to klasyczny przykład błędu, który może doprowadzić do ataku polegającego na przepełnieniu bufora. Programista zapomniał, że tablice w C (i większości innych języków) są indeksowane zerem, co oznacza, że ​​pierwszy element znajduje się w arr[0]itp. Próba dostępu do arr[3] jest zatem błędem, ale takim, na który C pozwoli:

Wartość przy arr[3] jest prawidłowym adresem pamięci, jak każdy inny, po prostu nie należy do tablicy. Można tam przechowywać dowolną wartość, a konsekwencje dostępu do niej lub zapisu na niej mogą obejmować awarię programu lub katastrofalne zdarzenie związane z bezpieczeństwem. Wielu hakerów w historii wykorzystywało takie błędy.

Chociaż kompilator C nadal generuje ostrzeżenie, generuje również plik wykonywalny. Programista może ignorować ostrzeżenia, a nawet ukrywać je za pomocą flag kompilatora. C nadal pozwoli ci strzelić sobie w stopę, podczas gdy języki takie jak Rust w ogóle nie oferują ci broni.

Jak wygląda kod bezpieczny dla pamięci?

W języku zapewniającym bezpieczną pamięć, takim jak Rust, ten sam problem po prostu nie istnieje. Oto ten sam program w Rust:

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

Chociaż ten kod jest poprawny składniowo, Rustowi nie uda się go skompilować:

Kompilator wyjaśnia problem i odmawia utworzenia pliku wykonywalnego. Rust po prostu nie pozwoli ci uruchomić tego kodu.

Oprócz tego Rust ma wiele innych funkcji, które pomagają Cię chronić. Zawiera funkcje takie jak inteligentne wskaźniki do automatycznego zarządzania pamięcią i zapobiegania wyłuskiwaniu wskaźników zerowych.

Czy powinienem zmienić języki?

Każdy język programowania ma swój cel, dlatego należy uważać na rady, aby absolutnie ich unikać, nawet jeśli pochodzą od Prezydenta. Chociaż możesz zdecydować się na specjalizację w konkretnym języku, zawsze warto uczyć się różnych języków, aby poszerzyć swoje możliwości.

Bezpieczeństwo pamięci to cecha tak wielu współczesnych języków, że równie dobrze możesz znać przynajmniej jeden. C ma swoje zastosowania, ale istnieją bezpieczniejsze opcje, które spowodują mniej wpadek. W szczególności, jeśli szukasz wydajnego języka, który ma dobre zabezpieczenia, Rust jest koniecznością.