Bílý dům chce programování bezpečné pro paměť, ale co to je?

Zásadní body

  • Bílý dům doporučuje používání jazyků s bezpečnou správou paměti, jako je Rust, z důvodu minimalizace bezpečnostních zranitelností v programovém kódu.
  • Starší, nízkoúrovňové jazyky, například C, s sebou nesou riziko chyb v kódu, které mohou vést k bezpečnostním incidentům.
  • Jazyky s bezpečnou správou paměti, jako je Rust, nabízejí automatizovanou správu paměti a mechanismy pro prevenci chyb.

Americká vládní agentura dospěla k závěru, že programátoři by měli preferovat jazyky, které zajišťují bezpečnost paměti, jako jsou Rust a Java. Proč jsou tyto jazyky považovány za lepší a jaký je jejich skutečný význam?

Vyhlášení Bílého domu

Úřad Národního ředitele pro kybernetickou bezpečnost (ONCD), spadající pod Bílý dům, vydal 26. února prohlášení, v němž naléhá na vývojáře softwaru, aby upřednostňovali programovací jazyky s bezpečnou správou paměti, jako je například Rust.

ONCD uvedl:

Jako stát máme možnost – a povinnost – omezit zranitelnost v kyberprostoru a zabránit tomu, aby se do digitálního ekosystému dostávaly celé skupiny bezpečnostních chyb. To ovšem vyžaduje, abychom se vypořádali s náročným úkolem přechodu na programovací jazyky s bezpečnou správou paměti.

Proč je to důležité?

ONCD, založená v roce 2021, přímo podléhá prezidentovi a poskytuje poradenství v oblasti kybernetické bezpečnosti a souvisejících problémů. Politika USA bude pravděpodobně mít dopad na celý technologický svět.

Velká část závažných bezpečnostních zranitelností má kořeny v problémech souvisejících s bezpečností paměti. Starší nízkoúrovňové jazyky sice dávají programátorům značnou kontrolu, ale zároveň zvyšují riziko, že chybně napsaný kód může mít vážné následky.

Používání jazyků s bezpečnou správou paměti, jako jsou Rust, Python a JavaScript, je již delší dobu na vzestupu. ONCD pravděpodobně vydává toto oznámení, protože méně bezpečné jazyky, jako je C, existují již dlouho a jejich starší kód je nyní hluboce zakořeněn v infrastruktuře a většině softwaru, který denně používáme.

Jak vypadá nebezpečný jazyk?

Nebezpečný kód nemusí vždy vypadat děsivě nebo komplikovaně. Vezměte si například tento jednoduchý program v jazyce C:

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

Toto je klasický příklad chyby, která může vést k útoku přetečením zásobníku. Programátor zapomněl, že pole v C (a ve většině ostatních jazyků) jsou indexována od nuly. To znamená, že první prvek je na adrese arr[0]. Pokus o přístup k arr[3] je tedy chyba, ale C to umožní:

Hodnota na pozici arr[3] je platná adresa paměti, stejně jako každá jiná, jen nepatří do pole. Může zde být uložena jakákoli hodnota a následky přístupu k ní nebo zápisu do ní mohou mít různé dopady, od selhání programu až po katastrofální bezpečnostní incidenty. V minulosti mnoho hackerů tyto chyby zneužívalo.

Přestože kompilátor C generuje varování, vytvoří i spustitelný soubor. Programátor může varování ignorovat a dokonce je skrýt pomocí parametrů kompilátoru. C vám stále dává možnost ublížit si, zatímco jazyky jako Rust vám tuto možnost vůbec nenabídnou.

Jak vypadá kód s bezpečnou správou paměti?

V jazyce s bezpečnou správou paměti, jako je Rust, takový problém jednoduše nevznikne. Zde je stejný program napsaný v Rustu:

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

I když je tento kód syntakticky správný, Rust ho nezkompiluje:

Kompilátor vysvětlí problém a odmítne vytvořit spustitelný soubor. Rust vám jednoduše nedovolí takový kód spustit.

Kromě toho má Rust mnoho dalších funkcí, které vám pomáhají chránit. Zahrnuje funkce, jako jsou chytré ukazatele, které automaticky spravují paměť a zabraňují dereferenci nulového ukazatele.

Mám přejít na jiný jazyk?

Každý programovací jazyk má své specifické určení, takže je důležité být opatrný ohledně rad, které vám říkají, abyste se jim absolutně vyhýbali, a to i v případě, že pocházejí od prezidenta. I když se můžete rozhodnout specializovat na určitý jazyk, je vždy prospěšné učit se různým jazykům a rozšiřovat své obzory.

Bezpečnost paměti je klíčovou vlastností mnoha moderních jazyků, takže je pravděpodobné, že jste s alespoň jedním z nich obeznámeni. Jazyk C má své využití, ale existují bezpečnější alternativy, které minimalizují riziko vzniku chyb. Zejména pokud hledáte efektivní jazyk, který má dobrá bezpečnostní opatření, je Rust výbornou volbou.