Šodien daudzas stundas internets stāvēja uz vietas, jo datoru darbības pārtraukumu radītais domino efekts milzīgos pasaules reģionus ienesa digitālā tumsā. Aviokompānijas, finanšu institūcijas, tiešsaistes sakari un neskaitāmi citi pakalpojumi izšļāca un nomira, atstājot pasauli neticībā par tā, kas šķita kā neuzvarams tīkls, sabrukumu.
Šokējošais vaininieks? Saskaņā ar kiberdrošības firmas Crowdstrike veikto analīzi, tas viss tika izsekots programmētāja kļūdai vienā koda rindā — šķietami nekaitīgā kļūmē senajā, atmiņu izsalkušajā C++ valodā.
Kādā pavedienā par X Zaks Vohijs apgalvoja, ka globālu tehnoloģiju sabrukumu izraisīja kļūda C++ koda rindā. Tiem, kas nav pazīstami, Vohijs ir bijušais Google darbinieks, kurš 950 lappušu iekšēju dokumentu nopludināja DOJ, atklājot informāciju par Google cenzūras praksi.
“Tā bija NULL rādītāja problēma C++ nedrošā atmiņa dēļ,” savā X ziņojumā paskaidroja Vohijs.
Kā kļūda vienā C++ koda rindā izraisīja Microsoft globālo pārtraukumu
Saskaņā ar Vorhies teikto, programmatūras atjaunināšanas laikā Crowdstrike kods mēģināja piekļūt “atmiņas adresei 0x9c (vai 156)” nederīgam atmiņas reģionam, kas pēc tam izraisīja pasaules mēroga pārtraukumu. Tālāk ir redzams ekrānuzņēmums ar steka trasēšanas izgāztuvi Vorhies, kas kopīgots vietnē X.
Crowdstrike analīze:
Tas bija NULL rādītājs no atmiņas nedrošās C++ valodas.
Tā kā esmu profesionāls C++ programmētājs, ļaujiet man jums atšifrēt šo steka izsekojamību. pic.twitter.com/uUkXB2A8rm
— Zaks Vorhijs / Google ziņotājs (@Perpetualmaniac) 2024. gada 19. jūlijs
“Kāpēc tika piekļūta atmiņas adresei 0x9c?” Vorhijs jautāja. “Atbilde ir programmētāja kļūda. Programmā C++, ko izmanto CrowdStrike, adrese 0x0 ir īpaša vērtība, kas nozīmē “šeit nekā nav” — mēģinot tai piekļūt, rodas fatāla kļūda,” viņš paskaidroja.
Paredzams, ka C++ programmētāji ar to izturēsies, pārbaudot nulles vērtības, nododot objektus apkārt. Parasti jūs varētu redzēt šādu kodu: virkne* p = get_name(); if (p == NULL) { print (“Nevarēja iegūt nosaukumu”); }.
CrowdStrike koda izdrukā Vorhies atzīmēja, ka programma mēģināja nolasīt atmiņas adresi 0x9c, kas nozīmē skaitlisko vērtību 156.
Vorhies arī paskaidroja, ka problēma radās no programmētāja nespējas apstiprināt objekta derīgumu pirms piekļuves tā dalībnieku mainīgajiem. Aprēķins NULL + 0x9C = 0x9C = 156 norāda uz nederīgu atmiņas apgabalu.
“Tātad, kas notika, tas ir programmētājs aizmirsa pārbaudīt, vai objekts, ar kuru tas strādā, nav derīgstā mēģināja piekļūt vienam no objektu dalībnieku mainīgajiem…”
Šajā steka izdrukā ir redzams, ka tas mēģina nolasīt atmiņas vērtību 0x9c. Cilvēku skaitļos tā ir vērtība 156.
Tātad notika tas, ka programmētājs aizmirsa pārbaudīt, vai objekts, ar kuru tas strādā, nav derīgs, tas mēģināja piekļūt vienam no objektu dalībnieku mainīgajiem…
— Zaks Vorhijs / Google ziņotājs (@Perpetualmaniac) 2024. gada 19. jūlijs
Nāves zilais ekrāns
Šī kļūda bija īpaši problemātiska, jo tā bija saistīta ar sistēmas draiveri ar priviliģētu piekļuvi datoram. Lai aizsargātu sistēmas integritāti, operētājsistēmai nekas cits neatlika, kā nekavējoties avarēt.
“Tas ir tas, kas izraisīja Blue Screen of Death,” sacīja Vohijs. “Lai gan priviliģēts kods parasti var atgūties pēc avārijas, pārtraucot programmas darbību, sistēmas draiveri to nespēj. Kad jūsu dators avarē, tas bieži notiek sistēmas draiveru kļūmes dēļ.
Vorhies atzīmēja, ka, ja programmētājs būtu veicis NULL pārbaudi vai izmantojis modernus rīkus, kas izstrādāti šādu problēmu novēršanai, kļūda varētu būt novērsta. Diemžēl defekts izslīdēja cauri plaisām, nonāca ražošanā, un pēc tam CrowdStrike to izstumja kā obligātu atjauninājumu. Hmm!
Ja programmētājs būtu pārbaudījis NULL vai izmantojis modernus rīkus, kas pārbauda šāda veida lietas, to varēja noķert. Bet kaut kādā veidā tas nonāca ražošanā, un pēc tam Crowdstrike to pamudināja kā piespiedu atjauninājumu… HĀ!
— Zaks Vorhijs / Google ziņotājs (@Perpetualmaniac) 2024. gada 19. jūlijs
Skatoties uz priekšu
Turpinot, Vorhies ieteica korporācijai Microsoft ieviest stingrākas politikas bojātu draiveru atcelšanai, nevis riskantos atjauninājumus nosūtīt tieši klientiem. Viņš arī ierosināja, ka CrowdStrike vajadzētu paaugstināt savu kodu drošības virsnieka lomu, lai koncentrētos uz koda sanitizācijas rīku integrēšanu, kas var automātiski novērst šādas problēmas. Turklāt Vorhies norādīja, ka CrowdStrike varētu apsvērt iespēju pārrakstīt sistēmas draiveri no C++ uz modernāku valodu, piemēram, Rust, kas pēc būtības novērš šāda veida problēmas.