Szerző: Dömös Zsuzsanna

2022. november 15. 10:20

A C és a C++ leváltására buzdít az amerikai nemzetbiztonság

Az Egyesült Államok eddig nem látott határozottsággal szorgalmazza az olyan alacsony szintű programozásra alkalmas, biztonságot előtérbe helyező nyelvek használatát a fejlesztők számára, mint a Rust és a Swift, ez a momentum pedig egy felemelkedő trend újabb fontos mérföldköve. Mindeközben az ügynökség egyben azt is sugallja, hogy a jól bevált C és C++ használata már nem kellően biztonságos.

Az Egyesült Államok Nemzetbiztonsági Ügynöksége (NSA) új útmutatót tett közzé a kibertámadásokra lehetőséget adó memóriahibák megelőzésére és kezelésére vonatkozóan a szoftverfejlesztők és üzemeltetők számára. A dokumentum részletezi, hogy illetéktelenek miként tudnak visszaélni a távolból a memóriát kezelő kódok sebezhetőségeivel, ami gyakrabban fordul elő azon nyelvekkel, amelyek több lehetőséget és rugalmasságot biztosítanak a programozóknak, így például a széleskörben elterjedt C-vel és C++-szal.

A kérdéskör fontosságát jól mutatja, hogy a Microsoft és a Google jelentése szerint a szoftverekben megbújó biztonsági sérülékenységek közel 70 százaléka valamilyen memóriahibára vezethető vissza. Emellett a Common Weakness Enumeration (CWE) katalógust gondozó The MITRE Corporation leggyakoribb sebezhetőségeket listázó 25-ös toplistáján évek óta ott van a CWE-119-es kódjelű "Improper Restriction of Operations within the Bounds of a Memory Buffer”, a memóriapuffer túlcsordulása, mint biztonsági hiányosság. A támadók előszeretettel keresnek utakat a rendszerekbe a memóriaallokáció hiányain keresztül is.

nsa_c

Hány adag sültkrumplit bír el 25 Kubernetes klaszter? (x)

Globálisan napi akár 2,5 millió rendeléssel is megbirkóznak az RDI Hungary által fejlesztett háttérrendszerek és mobilalkalmazások.

Hány adag sültkrumplit bír el 25 Kubernetes klaszter? (x) Globálisan napi akár 2,5 millió rendeléssel is megbirkóznak az RDI Hungary által fejlesztett háttérrendszerek és mobilalkalmazások.

A nemzetbiztonság kiberbiztonságért felelős műszaki igazgatója, Neal Ziring szerint a védvonalon kódok oldaláról lehet erősíteni a memóriabiztonsági garanciákkal rendelkező nyelvekre való áttéréssel. A "Software Memory Safety - Cybersecurity Information Sheet" címet viselő dokumentum többek között a C#, a Go, a Java, a Ruby, valamint a Rust és a Swift nyelveket említi az ajánlások közt.

Természetesen még ez sem garantálja a teljes biztonságot, a szervezet ezen felül statikus és dinamikus biztonsági tesztek futtatását ajánlja, azokból is lehetőség szerint minél többet, továbbá a támadások megnehezítő olyan további technológiák használatát, mint a Control Flow Guard (CFG), az Address Space Layout Randomization (ASLR) és Data Execution Prevention (DEP). Az áttérés hátrányai közt felmerülhet, hogy a fejlesztési folyamatok lassulhatnak, a nyelvek közti váltás pedig nem megy egyik pillanatról a másikra, a Rustnak például meredek a tanulási görbéje.

Friss hír, hogy az Nvidia biztonsági csapata is blogposztot tett közzé arról, milyen elvek mentén mérhető, hogy egy programozási nyelv használata mennyire befolyásolja a szoftverek biztonságosságát. A chipgyártó mérnökei szerint ilyen szempontok mentén érdemes lehet a nyelvek közti váltás, a csapat is elkezdte leváltani az addig használt C/C++-t a SPARK-ra, ami ugyan nem okozott érezhető teljesítménycsökkenést, de egyértelműbbé tette a biztonsági hibák ellenőrzését, már több Nvidia termék is SPARK-ban írt kódokkal fut.

Terjed a rozsda


Az olyan széles körben elterjedt nyelvek, mint a C és a C++ ugyan nagy szabadságot és rugalmasságot biztosítanak a memóriakezelésben, de az egyszerű hibák is kihasználható sebezhetőségek keletkezéséhez vezethetnek. A C vagy C++ programozási nyelveken írt alkalmazásokban gyakoribbak az ilyen kódolási hibák, ezért a fejlesztői közösség az utóbbi évek során már láthatóan elkezdett biztonságosabb gyakorlatok felé fordulni, és az irányváltást mutatja az is, hogy a cégek is létre hívtak új nyelveket.

Ezek közül 2015-ben robbant be az NSA által is említett sokat ígérő színfolt, a Mozilla által fejlesztett nyílt forráskódú Rust programozási nyelv, ami nem kevesebbet vállal, minthogy a biztonságot eddig nem látott szintre emeli azzal, hogy kvázi egy "biztonsági hálót" húz a fejlesztő alá, amivel a memóriahibák megelőzhetők. Ráadásul olyan módon lett megtervezve a Rust, hogy képes legyen kiváltani a C és C++ nyelveket szinte minden olyan területen, ahol jobb híján ezeket a nyelveket használták eddig a fejlesztők.

Ez persze nem jelenti még, hogy a C és a C++ teljesen eltűnne a jövőben, mivel elég nagy értéket képviselnek ahhoz, hogy ne lehessen tőlük csak úgy megválni: működnek, lehet őket használni. Ugyan a jövőben jellemző lesz, hogy az új szoftverrészeket vegyes megoldásként Rustban is fogják írni a fejlesztők, de önmagukban nem fognak eltűnni az eddig használt nyelvek sem, elég arra gondolni, hogy a Fortrant is hasznosítjuk még"

- említette meg korábban a Rust kapcsán Krüpl Zsolt, az RSOE fejlesztője és rendszermérnöke egy meetupunkon.

A Rust előnye, hogy elsődleges szempontja a biztonságos kód: amit lehet, azt ellenőrzés alatt tart a fordító, jellemzője a futásidejű ellenőrzés. A gyors futású, memóriahatékony nyelv alatt nincs semmiféle futtatókörnyezet, natív assembly kódot fordít, illetve szemétgyűjtő algoritmust (garbage collector, GC) sem használ, ami lassítaná. Végeredményben egy rendszerprogramozásra alkalmas nyelv, ami felhasználható mikrovezérlőktől kezdve a szerverekig, operációs rendszer fölött is, de akár annak írására is használható. Kiemelendő még, hogy próbálja támogatni a Webassembly-t, ahogy az Nvidia grafikusprocesszorát, a CUDA-t is.

A GC-paradigma kidobásával, illetve a felturbózott memóriakezeléssel a Rust a C, másik oldalon a JavaScript/Java egyik legnagyobb problémájától szabadul meg - a nyelv rossz memóriamenedzsmentje ugyanis jócskán visszavetheti egy-egy program teljesítményét. De a Java vagy JavaScript esetében sem sokkal jobb a helyzet, ahol a memóriát tisztán tartó szemétgyűjtő éli fel az erőforrásokat.

A natív kóddal dolgozó Rust ehelyett egy a fordítóban implementálja ezt, egy a fordítóra épülő referenciaszámlálót használ, amely rögtön eltávolítja a memóriában lévő objektumokat, ha már nincs rájuk szükség. Hátrányai közt említhető, hogy a C-hez és C++-hoz képest lassabb a fordítás, mivel mindent ellenőriz, nem fájlonként, hanem a projektet egyben próbálja átlátni. Elsődleges célterület a konzolalkalkalmazások, a webassembly, a hálózatalkalmazások és a beágyazott rendszerek. A SlashData elemzőcég szerint 2020 első negyedéve és 2022 első negyedéve közt megháromszorozódott a Rustot használó fejlesztők száma.

Légüres térben


Nem a Rust az első olyan nyelv, ami próbálja kivédeni a memóriakezelési problémákat: említhető korábbról a Cyclone nyelv (AT&T Labs), a Safe-C, a Checked-C (Microsoft), újabban pedig a kísérleti stádiumban lévő, de első kiadásánál még nem tartó Projekt Verona, szintén a Microsofttól. Mindeközben a Google oldaláról is érkezik az alternatíva a júliusban bejelentett, egyelőre kísérleti projektként létező, nyílt forráskódú Carbon nyelv képében, amit a keresőcég nem titkoltan a C++ utódjának szán.

A Google-mérnök Chandler Carruth kiemelte, hogy a Rust nem rendelkezik azzal a kétirányú együttműködési képességgel, mint ami például megvan a Java és a Kotlin közt, ez pedig nehezíti a migrációt, egy C++-os ökoszisztéma körülményesen mozgatható át a Rust környezetébe. A Carbon ezzel ellenben teljes mértékben együtt tud működni oda-vissza a meglévő C++ kódokkal. A Google hozzátette: a Carbon nem kiegészítője a C++-nak, hanem alapvetően más szerkezetet és elemeket használ, de könnyen elsajátítható azok számára, akik a C++-ban otthonosan mozognak.

Az NSA új útmutatója egyben azt is sugallja, hogy a C és a C++ használata egyre problémásabb, ha a biztonsági szempontokat nézzük, erre korábban utalt a Microsoft Azure műszaki igazgatója, Mark Russinovich is, aki szeptemberben úgy nyilatkozott, hogy az új projekteket már nem a két jól bevált nyelvvel érdemes fejleszteni. A CTO szorgalmazza, hogy az új eszközöket a vállalat már Rustban készítse, de az eddigi hatalmas mennyiségű C/C++-ban írt kódokat még legalább egy évtizedig fogják hasznosítani és fejleszteni.

Az NSA lépését az Acronis kiberbiztonsági cég szakértője, Kevin Reed szintén üdvözíti, hozzátéve, hogy az évek során írt C és C++ kódok mennyisége óriási, így ha holnaptól kezdve mindenki Rustot vagy Go-t használna, akkor is évtizedekbe telne felszámolni a korábbi megoldásokat.

Hogy a biztonságban a korábbinál nagyobb figyelmet kapnak a memóriakezelési sérülékenységek, annak egyik apropója az IoT-eszközök elterjedése, illetve az önvezető autók, amik négykeréken járó biztonsági bombák lehetnek, a beágyazott rendszerek firmware-jében ugyanis sok a puffertúlcsordulásra lehetőséget adó hiba.

A szigorodó szabályok közt formálódó járműipar kezdi felfedezni magánaak a Rustot, éppen amiatt, hogy használatával a biztonsági kockázatok csökkenthetők. A Microsoft Windows és Azure csapata, az Amazon Web Services, a Meta az Android Open Source Project fejlesztői mellett a Volvo szoftvermérnökei is a Rustot dícsérik, emellett a többi autógyártó, köztük a Ford, a GM, a BMW, a Bosch, a Volkswagen és a Toyota is a Rust lehetőségeit kutatja az Autosar nevű autóipari fejlesztési együttműködés égisze alatt.

Ha érdekel a téma: november 15-én ingyenes online meetupot tartunk, ahol a modern C ++ csapdáiról és buktatóiról beszél Porkoláb Zoltán, az Ericsson Principal C ++ developere.

Kubernetes képzéseinket már közel 300 szakember végezte el. A nagy sikerre való tekintettel a tanfolyamot aktualizált tananyaggal június 18-án újra elindítjuk! A 8 alkalmas, élő képzés képzés órái utólag is visszanézhetők, és munkaidő végén kezdődnek.

a címlapról