Contents

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

Szybkie linki

⭐ Co mówi Biały Dom?

⭐ Dlaczego to ważne?

⭐ Jak wygląda niebezpieczny język?

⭐ Jak wygląda kod bezpieczny dla pamięci?

⭐ Czy powinienem zmienić język?

Kluczowe wnioski

Biały Dom zalecił wykorzystanie języków programowania, które priorytetowo traktują bezpieczeństwo pamięci, takich jak Rust, w celu ograniczenia potencjalnych zagrożeń bezpieczeństwa związanych z błędami kodowania i lukami w zabezpieczeniach.

W bardziej prymitywnych językach programowania, takich jak C, istnieje zwiększone prawdopodobieństwo, że błędy w kodzie mogą spowodować naruszenie bezpieczeństwa.

Rust, język znany ze swoich środków bezpieczeństwa, zapewnia dodatkową warstwę zabezpieczeń dzięki automatycznemu zarządzaniu pamięcią i wbudowanym funkcjom zapobiegania błędom.

Niedawna dyrektywa wydana przez agencję rządową Stanów Zjednoczonych zaleca profesjonalistom w dziedzinie programowania przyjęcie języków bezpiecznych dla pamięci, takich jak Rust i Java. Pojawia się jednak pytanie, co odróżnia te języki od innych i czy to rozróżnienie jest istotne w praktyce.

Co mówi Biały Dom?

W swoim oświadczeniu z 26 lutego Biuro Krajowego Dyrektora ds. Cyberbezpieczeństwa w Białym Domu opowiedziało się za tym, aby twórcy oprogramowania stosowali języki programowania bezpieczne dla pamięci, takie jak Rust.

ONCD powiedział :

Jako społeczeństwo, mamy możliwość i obowiązek zminimalizowania podatności cyberprzestrzeni na zagrożenia poprzez utrudnianie wprowadzania luk w zabezpieczeniach obejmujących szereg klas, poprzez przyjęcie języków programowania bezpiecznych dla pamięci. Stanowi to jednak wyzwanie, które wymaga rozwiązania.

Dlaczego jest to ważne?

Biuro ds. Cyberprzestrzeni i Innowacji Cyfrowych (ONCD), które zostało założone w 2021 r., działa pod bezpośrednim nadzorem prezydenta, zapewniając fachowe doradztwo w kwestiach związanych z cyberbezpieczeństwem i powiązanymi z nim obawami. Oczekuje się, że decyzje podejmowane w Stanach Zjednoczonych w odniesieniu do tej domeny będą miały znaczący wpływ na szerszy krajobraz postępu technologicznego zarówno w kraju, jak i za granicą.

Kilka godnych uwagi naruszeń bezpieczeństwa zostało przypisanych błędom w zarządzaniu pamięcią, co jest podstawowym aspektem programowania. Wykorzystanie starszych, niskopoziomowych języków daje programistom szeroki zakres możliwości, ale jednocześnie zwiększa prawdopodobieństwo, że błędne kodowanie może mieć szkodliwe konsekwencje.

Pomimo tego, istnieje rosnąca tendencja do wykorzystywania bezpiecznych dla pamięci języków programowania, takich jak Rust, Python i JavaScript. Jest wysoce prawdopodobne, że komitet standaryzacyjny Object, Class, and Data (ONCD) wydał to oświadczenie ze względu na rozpowszechnienie niebezpiecznych języków, takich jak C, które stały się głęboko zakorzenione w naszej infrastrukturze technologicznej i są powszechnie używane w wielu codziennych aplikacjach.

Jak wygląda niebezpieczny język?

Oczywiście z przyjemnością przedstawię bardziej wyrafinowaną wersję tego stwierdzenia. Oto moja próba przeformułowania go w elegancki sposób: Warto zauważyć, że niebezpieczny kod programowania nie zawsze wykazuje złowieszczy wygląd lub skomplikowaną złożoność. Przykładem może być podstawowy program w języku C, który mimo wszystko może kryć w sobie potencjalne zagrożenia dla bezpieczeństwa i stabilności systemu.

#include <stdio.h>

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

Ilustruje to przykładowy przykład błędu, który może skutkować

/pl/images/memory-safety-c-overflow.png

Informacje przechowywane w lokalizacji wyznaczonej przez zmienną “arr[3]” stanowią legalny adres pamięci, porównywalny z innymi w systemie. Jednak ten konkretny adres nie odpowiada elementowi w zdefiniowanych granicach tablicy. W związku z tym w tym miejscu mogą być przechowywane dowolne dane, co może skutkować zarówno całkowitą awarią systemu, jak i poważnymi naruszeniami bezpieczeństwa. W przeszłości wielu cyberprzestępców wykorzystywało podobne luki w zabezpieczeniach.

Pomimo wyemitowania powiadomienia ostrzegawczego, kompilator C nadal generuje program wykonywalny. W gestii dewelopera leży wybór tłumienia lub ukrywania takich alertów za pomocą określonych dyrektyw kompilatora. Niezależnie od tej opcji, C nadal zapewnia możliwość samookaleczenia, podczas gdy alternatywne języki programowania, takie jak Rust, powstrzymują się od dostarczania narzędzi niezbędnych do osiągnięcia takich rezultatów.

Jak wygląda kod bezpieczny dla pamięci?

W języku programowania, który nadaje priorytet bezpieczeństwu i zapobiega uszkodzeniom danych, takim jak Rust, kwestia przepełnienia bufora nie pojawia się. Poniższy kod demonstruje tę koncepcję w języku Rust:

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

Pomimo poprawności gramatycznej, Rust nie będzie w stanie przetworzyć tego konkretnego fragmentu kodu z powodu błędu kompilacji.

/pl/images/memory-safety-rust-compile-error.png

Język programowania Rust wykazuje ścisłe przestrzeganie własnych zasad, odmawiając wykonania jakiegokolwiek kodu, który narusza ustalone wytyczne.W przypadku napotkania problematycznego kodu, kompilator zapewnia jasne wyjaśnienie problemu, skutecznie zapobiegając generowaniu wykonywalnego programu.

Rust oferuje wiele dodatkowych funkcji poza tymi wymienionymi wcześniej, mających na celu zwiększenie bezpieczeństwa poprzez automatyczne zarządzanie pamięcią i unikanie dereferencji wskaźnika null. Obejmują one implementację inteligentnych wskaźników, które efektywnie zarządzają zasobami i łagodzą potencjalne błędy wynikające z niewłaściwego użycia lub obsługi tych wskaźników.

Czy powinienem zmienić język?

Istotne jest, aby zdać sobie sprawę, że każdy język programowania służy określonej funkcji i celowi, dlatego nierozsądne byłoby lekceważenie ostrożności przy rozważaniu absolutnego unikania niektórych języków, niezależnie od ich poparcia przez wysoko postawione osoby, takie jak prezydenci. Pomimo skłonności do opanowania konkretnego języka, nabycie biegłości w wielu językach może zapewnić szeroki zakres możliwości wszechstronności i adaptacji w przyszłych przedsięwzięciach.

Bezpieczeństwo pamięci jest istotną cechą wielu współczesnych języków programowania, co sprawia, że znajomość przynajmniej jednego z nich jest niezbędna. Podczas gdy C może posiadać pewną użyteczność, stwarza znaczne ryzyko ze względu na brak środków bezpieczeństwa. Na szczęście istnieją alternatywy, które zapewniają ulepszone funkcje bezpieczeństwa i wydajność, w szczególności Rust, który powinien być brany pod uwagę przez osoby poszukujące języka z solidnymi mechanizmami bezpieczeństwa przy jednoczesnym zachowaniu możliwości optymalizacji wydajności.