Objavljeno: 30.4.2024 | Avtor: Matej Huš | Monitor Maj 2024

Globalni napad na Linux, ki je spodletel

Pred mesecem dni je eden izmed razvijalcev orodja xz za Linux vanj vstavil zlonamerno kodo, ki je v SSH vgradila stranska vrata. Ta so mu omogočala vstop v katerikoli sistem, ki je imel nameščeno to knjižnico. Pazljivemu inženirju iz Microsofta se lahko zahvalimo, da je napad odkril dovolj zgodaj, preden bi bila koda vključena v redne Linuxove distribucije za širšo rabo. To mu je uspelo, ker je bil zlonamerni akter nekoliko površen.

Časovnica napada. Slika: Thomas Roccia, Microsoft

Ena izmed najpogosteje izpostavljenih prednosti odprtokodne programske opreme je varnost, saj lahko kodo vsakdo pogleda in se prepriča, kaj in kako počne, da se ne bi v njej znašli kakšni zlonamerni koščki. Pri uporabi Windows moramo Microsoftu zaupati, da operacijski sistem ne vsebuje kakšnih namernih ranljivosti ali stranskih vrat, pri Linuxu pa lahko to sami preverimo. Takšna idealistična slika je v resničnem svetu nekoliko bolj siva. Microsoft je že pred dvema desetletjema posameznim velikim strankam, denimo državnim službam, omogočil vpogled v izvorno kodo. Program Shared Source Initiative (SSI) so zagnali že maja 2001. Na drugi strani je Linux, ki sestoji iz jedra in celega kupa dodatnega programja. V teoriji lahko kodo vsakdo pogleda, a drugo vprašanje je, koliko ljudi to dejansko počne. Hkrati pa velika večina uporabnikov ne prevede izvorne kode, temveč uporabi že pripravljene paketke. Ti se prevajajo in preverjajo v skupnosti, a na koncu je zaključek vendarle enak – posameznik mora še vedno nekomu zaupati. Enako je tudi v življenju, ko verjamemo − deklaracijam.

Nihče ne ve, kdo je Jia Tan, ki je podtaknil zlonamerno kodo. Nemalo strokovnjakov meni, da je v resnici kolektivni psevdonim za kakšnega državnega akterja.

Bil je teden pred velikonočnimi prazniki, ko je Microsoftov inženir Andres Freund začudeno ugotavljal, da so oddaljene povezave prek protokola SSH in njegovega računalnika z najnovejšo Linuxovo distribucijo Debian nenadoma počasnejše. Freund, ki sicer v Microsoftu dela pri PostgreSQL, je opažal, da prijave prek SSH potrebujejo preveč procesorskih ciklov in da prožijo poročila o napakah v orodju valgrind, ki v Linuxu omogoča nadzorovanje pomnilnika in lovljenje napak. Govorimo o nekajkratnem podaljšanju, ki ga je odkril Freund: namesto 0,3 sekunde je preverjanje pristnosti ob prijavi v SSH po novem trajalo 0,8 sekunde.

Ker je v prejšnjih različicah Debiana omenjena funkcija delovala brezhibno, je začel preverjati, kaj se je zgodilo. Odkril je namerno vstavljeno ranljivost, ki je prav med velikonočnim koncem tedna zatresla svet. Le Freundovemu budnemu očesu se lahko zahvalimo, da so jo odkrili, preden bi pristala v praktično vseh Linuxovih distribucijah. Šlo je za najresnejši napad na integriteto računalnikov z vstavljanjem namerne ranljivosti v kodo, ki se distribuira vzdolž celotne dobavne verige – temu pravimo supply chain attack.

Prikrivanje

Ranljivosti so sestavni del računalništva in tičijo v praktično vsakem večjem kosu programske opreme. Tam se znajdejo nehote, včasih kot hrošči v programiranju, spet drugič zaradi napake v dizajnu ali algoritmih, na katere ni nihče pomislil. Redno posodabljanje sistemov in uporaba novejših različic sta nujna prav zato, ker s tem poskrbimo, da so odkrite luknje in ranljivosti zakrpane. Velika podjetja imajo celo razpise (bug bounty), na katerih delijo nagrade za odgovorno prijavljene ranljivosti, ki jih odpravijo pred razkritjem javnosti. Velika večina ranljivosti se zakrpa, še preden se bi lahko izkoriščale, saj jih tudi zlikovci ne poznajo. Pogosto njihovo izraba niti ni trivialna, saj je zanje potreben fizični dostop do sistema ali pa ne omogočajo popolnega nadzora nad njim. Le redko gre za nujnost, ki jo je treba popraviti takoj in zdaj – tak primer je bil črv WannaCry leta 2017.

Sporočilo, s katerim je Andres Freund svet opozoril na podtaknjena stranska vrata.

Povsem drugače pa je, če bi nekdo v programsko opremo namerno vgradil stranska vrata, ki bi mu omogočala dostop, za katerega ne bi vedel nihče drug. Ne le da bi ga lahko začel uporabljati takoj, ko bi mu ga uspelo vtihotapiti v kodo, poskrbel bi tudi, da bi imel popoln dostop do sistema. Tak primer je odkril Freund in ga javno objavil 29. marca.

Koda za SSH predstavlja ključno vstopno točko v sistem prek oddaljenih povezav, zato je pod zelo natančnim nadzorom, vsaka sprememba pa se natančno preveri. Navsezadnje OpenSSH teče na 20 milijonih IP in je desetkrat bolj priljubljen kot Microsoftov RDP (Remote Desktop Protocol). Freund je ugotovil, da je ranljivost to pot tičala v precej manj zanimivem orodju (XZ Utils), ki se uporablja za stiskanje in razširjanje datotek. Gre za univerzalno orodje, ki je prisotno v vseh Unixovih operacijskih sistemih, torej tudi v vseh Linuxovih distribucijah. Ker opravlja precej dolgočasno nalogo, se ne posodablja prav pogosto, za vzdrževanje skrbi malo ljudi in tudi kode ne gleda ravno množica razvijalcev. XZ Utils je torej idealna tarča za skrivanje stranskih vrat, ki jih vstavili v knjižico liblzma.

Freund je ugotovil, da je za počasno povezovanje prek SSH odgovoren xz. Tistega petka je na Open Source Security Listu objavil informacijo, da je ranljivost prisotna v najnovejših različicah XZ Utils 5.6.0 in 5.6.1, ki pa sicer še nista bili vključeni v distribucije Linuxa za širšo rabo. Zgolj najnovejša predogledna različica Debiana ju je že imela.

V kodi so bila stranska vrata z javnim ključem, ki so vsakomur z ustreznim ključem Ed448 – upravičeno lahko domnevamo, da ga ima krivec za incident – omogočala neopazno prijavo v sistem in izvedbo poljubne kode (remote code execution). Kakšno kodo je želel poganjati storilec, ne vemo, a storil bi lahko karkoli: kradel druge šifrirne ključe, datoteke, finančne informacije, kriptovalute, onesposobil sisteme itd.

XZ Utils je pripravna tarča tudi zato, ker je liblzma pogosto povezana (linked) z OpenSSH. V osnovnem OpenSSH to ne drži, a v Debianu in številnih drugih distribucijah je sshd povezan s systemd, ki ob zagonu naloži kopico storitev. Hkrati je systemd povezan s knjižnico za stiskanje liblzma iz XZ Utils. Povezane knjižnice pa vplivajo druga na drugo in tako so lahko stranska vrata v knjižnici za stiskanje datotek omogočila nepooblaščen dostop prek SSH.

Četudi je xz manj pod drobnogledom kot sshd, stranskih vrat povsem očitno vanj niso mogli postaviti. Namesto tega so storilci ranljivost skrili v datoteko make, ki jo poženemo ob prevajanju kode. V njej so podrobna navodila, kako naj se koda prevede, katera stikala se vklopijo, v katerih datotekah je koda, katere binarne datoteke je treba vključiti itd. Datoteke make so dveh vrst, se pogosto šalijo programerji: kratke in dolgočasne ali dolge in nerazumljive. Formalno so seveda del kode programa in podvržene istemu preverjanju, v resničnosti pa se jim posveča za odtenek manj pozornosti. Napadalci so zato kodo skrili prav tja, in sicer v obliki prevedenih izvršljivih (binarnih) datotek, ki jih make vključi v program med prevajanjem.

Vse preveč projektov sloni na neplačanih prostovoljcih, ki imajo druge službe in življenjske obveznosti, projekte pa vodijo v prostem času.

Izvorna koda xz je bila nespremenjena, okužene so bile datoteke tarballs (ki vsebujejo kodo, dokumentacijo in navodila za prevajanje oziroma make). Skrivališče bi bilo težko boljše.

Analiza

Med raziskovalci in inženirji, ki so v naslednjih dneh podrobno analizirali ranljivost, jih je več poudarilo njeno dovršenost in uperjenost proti Debianu in Red Hatu. Ranljivost je podtaknjena v petstopenjski nalagalnik (loader), ki dobro skrije svoj novi tovor. Pri prevajanju knjižnice na platformi amd64 (to je standardna 64-bitna platforma, na kateri temelji večina današnjih računalnikov), če imamo knjižnico glibc in uporabljamo GCC, ter gradnji paketkov DEB ali RPM za namestitev se vključijo zadnje stopnje stranskih vrat.

V praksi bi šel napad potem nekako takole … Če bi se pri preverjanju posredovanega ključa v SSH izkazalo, da ustreza nastavljenemu »prstnemu odtisu« – torej bi bil ključ napadalčev –, bi se še pred dejanskim preverjanjem odšifrirala vsebina in posredovala sistemu v izvajanje prek systemd. Če se prstni odtis ne bi ujemal, pa bi funkcija nadaljevala običajne postopke preverjanja istovetnosti in nihče ne bi vedel, da se je vmes sploh kaj preverjalo. Skratka, napadalci so ugrabili algoritem za preverjanje pristnosti prek ključev SSH RSA tako, da je vedno dovolil prijavo z magičnim ključem, ki je v lasti napadalca. Vse to pa je mogoče, ker glibc omogoča prevzeti funkcijo RSA_public_decrypt v OpenSSH, ko proces sshd naloži okuženo xz.

Afera SolarWinds

Ena izmed najresnejših afer se je zgodila leta 2020, ko so v programskem paketu Orion podjetja SolarWinds odkrili stranska vrata. Okuženo različico je dotlej preneslo in namestilo že 18.000 uporabnikov, a napadenih je bilo le okoli 0,2 odstotka. Napadalci so tarče premišljeno izbrali: podjetja z informacijsko tehnologijo, vladne službe, nevladne organizacije in pogodbene podizvajalce za državo.

Več mesecev trajajoči napad je odkrilo podjetje FireEye, ki je decembra 2020 razkrilo, da so bili žrtev napada neznanega akterja na ravni države – več ameriških senatorjev je kasneje trdilo, da imajo obveščevalske indice o ruski vpletenosti, in sicer njihove skupine APT29 oziroma Cozy Bear. FireEye je velikan na področju računalniške varnosti, zato je bil napad nanje veliko presenečenje.

Izkazalo se je, da so hekerji napadli prek stranskih vrat v Orionu, ki ga je uporabljal tudi FireEye. Ker so napadalci predhodno pridobili dostop do ključev za podpisovanje kode, so lahko izdali nove inačice SolarWindsovih knjižnic, ki so imele ustrezne podpise, zato so se normalno distribuirale. Vdor v SolarWinds pa je bil mogoč, ker niso uporabljali ustreznih varnostnih protokolov – javno dostopen strežnik FTP je imel geslo za dostop solarwinds123. Podjetje je za te spodrsljaje okrivilo nekega pripravnika.

Kasneje je bila proti SolarWindsu vložena kolektivna tožba, v kateri so se novembra 2022 poravnali za odškodnino 26 milijonov dolarjev.

Stranska vrata so napisana tako, da se razkrijejo šele, če je izpolnjenih več pogojev, sicer jih je težko prepoznati. Prizadeta distribucija potrebuje knjižnico glibc, xz (oziroma njegov sestavni del liblzma) različice 5.6.0 ali 5.6.1, napadalec pa magični ključ. Velja tudi obratno: analize so pokazale, da imajo stranska vrata stikalo za ustavitev (killswitch). Če med okoljske spremenljivke dodamo ustrezni niz (yolAbejyiejuvnup=Evjtgvsh5okmkAvj), se stranska vrat deaktivirajo. To seveda ni rešitev, le začasni obvod je lahko, dokler ne povozimo xz z varno različico.

Prvič smo imeli srečo v Freundovem pazljivem očesu, ki je bilo pozorno na nenavadno upočasnitev. Freund ni iskal ranljivosti v sshd, kaj šele v systemd ali xz, temveč ga je zmotila povečana poraba procesorskih ciklov pri avtentikaciji SSH. Druga sreča pa je časovni okvir, saj smo za stranska vrata izvedeli, še preden bi bile prizadete v distribucije vključene inačice xz ter nameščene na milijone računalnikov. Napad na dobavno verigo je bil preprečen v zadnjem hipu. Če bi se okuženi xz razširil po ekosistemu, bi bila to ena najhujših mogočih katastrof – predstavljajte si, da ima nepoznani zlonamerni akter polni dostop do vseh računalnikov, na katerih teče Linux!

K sreči so bile prizade le različice Fedora Rawhide in beta Fedora Linux 40 ter beta inačica novega Debiana. Razvijalci so se hitro odzvali in v distribucijah prešli nazaj na xz 5.4, dokler niso izdali popravljene izvedenke xz 5.6.2. Katastrofa je bila v zadnjem hipu preprečena.

Infiltracija

Ko je bila akutna nevarnost mimo, se je začela analiza dogodkov. Poleg analize delovanja stranskih vrat so začeli iskati krivca, ki je zlonamerno kodo podtaknil v xz. Izkazalo se je, da je kodo dodal večletni razvijalec in vzdrževalec xz z uporabniškim imenom JiaT75 oziroma Jia Tan s polnim imenom. Bodisi je Tan dolgo načrtoval to potezo bodisi je nekdo vdrl v njegov sistem in ga izkoristil za vnos ranljivosti. Čedalje bolj verjeten je prvi scenarij.

Shema zlorabe knjižnice liblzma v xz. Slika: Akamai

JiaT75 se je razvoju xz pridružil oktobra 2021, ko je poslal povsem legitimni dodatek h kodi, ki so ga razvijalci preverili in vključili. Tan je odtlej redno prispeval kodo in si prizadeval postati vodja ali vsaj sovodja projekta, ki ga je dotlej vodil Lasse Collin. Ta je v letih 2005–2008 razvil format xz in vodil projekt.

Ko nekdo prispeva novo kodo, običajno popravek, lahko traja nekaj časa, da se ta potem znajde v produkcijski različici. Aprila in maja 2022 sta se začela z elektronskimi sporočili oglašati Jigar Kumar in Dennis Ens, ki sta Collina javno kritizirala. Trdila sta, da projektu ne posveča dovolj pozornosti, da je prepočasen in da se mora zavedati svojih omejitev, kar se je nanašalo na Collinova sporočila, da je projekt v zaostanku tudi zaradi njegovih težav z duševnim zdravjem – k čemur sta obilno prispevala prav Kumar in Ens s stalnim pritiskanjem in z mestoma nesramnimi sporočili. Vztrajala sta, da ne bo nobenega premika v projektu, dokler se ne doda še en vzdrževalec. Sčasoma je Collin Tana na to mesto tudi imenoval in septembra 2022 je ta začel opravljati to delo, torej je lahko dodajal spremembe v produkcijsko kodo brez dodatnega nadzora. Januarja 2023 je potrdil svoj prvi prispevek v kodo (commit merge).

Kaj so stranska vrata

Stranska vrata (backdoor) so prikriti način za dostop v sistem, kjer se izognemo klasičnemu preverjanju istovetnosti. Vgrajena so lahko na različnih ravneh, od firmwara prek operacijskega sistema do programske opreme, ki teče na njem. Čeprav so v glavnem namenjena oddaljenemu dostopu, je njihova značilnost prikritost, saj uporabniku njihov obstoj načelno ni znan.

Za vstavitev stranskih vrat si včasih prizadevajo tudi državni organi. V zadnjih letih so pogoste debate o stranskih vratih v orodjih za šifrirano komunikacijo, kot je Whatsapp ali iOS. Ker organi pregona ne morejo do vsebine komunikacije, četudi bi imeli sodno odredbo, se pojavljajo zamisli, da bi proizvajalce zakonsko prisilili v vgradnjo stranskih vrat tako, da bi bila dostopna le organom pregona.

Varnostni strokovnjaki opozarjajo, da je to v praksi nemogoče. Obstoj stranskih vrat bi prej ali slej postal javno znan, nato pa bi jih začeli iskati tudi zlonamerni akterji. Na internetu namreč ni oddaljenih zlikovcev na drugih kontinentih, temveč smo vsi drug drugemu sosedje. Za napade ne veljajo omejitve iz fizičnega sveta, kjer mora vlomilec mimo hiše in ob tem imeti še dovolj časa – na internetu je vlomilcev lahko milijone.

V zgodovini smo že videli nekaj stranskih vrat, ki so se pojavila v komercialnih izdelkih. Že davnega leta 1998 je hekerska skupina Cult of the Dead Cow napisala slavni program Back Orifice, ki je omogočal prevzem oddaljenega nadzora nad računalniki z Windows. V generator psevdonaključnih števil za šifrirni algoritem Dual EC DRBG je stranska vrata vstavila kar ameriška NSA in zanje imela tudi zasebni ključ, kar smo izvedeli leta 2013. V Borland Interbase pa je stranska vrata vgradil kar proizvajalec (v različicah 4.0-6.0), kar so odkrili leta 2001.

Obstoj stranskih vrat na ravni strojne opreme ali firmwara je bistveno težje dokazati, je pa to razlog, da so zahodne države skeptične do kitajskih ponudnikov omrežne infrastrukture (in seveda obratno). Domači uporabniki pa si lahko stranska vrata v najširšem pomenu besede najlažje nakopljejo, če uporabljajo piratske različice operacijskih sistemov ali programov, ki jih snamejo iz nezanesljivih oziroma sumljivih virov.

Back Orifice iz leta 1998 velja za prva prava stranska vrata.

Dotlej so bili razen ene izjeme vsi njegovi dodatki nedolžni in koristni. To se je spremenilo 23. februarja letos, ko je Jia Tan v kodo dodal stranska vrata v obliki binarne kode. Skril jo je v preizkusne datoteke, ki so del paketka za testiranje delovanja algoritma, kar je običaj že ves čas. Tedaj ni nihče posumil ničesar. Inačica 5.6.0 je izšla 24. februarja letos in je že imela stranska vrata. Pozneje, 9. marca, je Tan izdal še 5.6.1.

V vmesnem času je bil napad skorajda onemogočen, saj so nekateri razvijalci že predlagali spremembe, ki bi iz systemd odstranili povezavo z liblzma. Ta sprememba ni bila posledica kakršnegakoli suma, temveč je šlo za že znano zamisel o krčenju systemd z odstranjevanjem manj pomembnih in pogosto uporabljenih statičnih povezav. Tan je moral pospešiti taktiko, preden bi pristop padel v vodo. Da bi pospešil vgradnjo v distribucije, je Hans Jansen prijavil hrošča v Debianu, za odpravo katerega bi morali nadgraditi xz na 5.6.1, torej »ugrabljeno« različico. Tan je 28. marca prijavil hrošča v Ubuntu, da bi se zgodilo isto. A čas se je iztekel. Andres Freud je o stranskih vratih 28. marca obvestil Debian, ki se je takoj odzval, dan pozneje pa še širšo javnost. Ranljivost je dobila oznako CVE-2024-3094

Tan je scenarij očitno načrtoval leta vnaprej. Jigar Kumar in Dennis Ens sta psevdonima, saj ju nikjer na internetu ni moč najti. Tudi Hans Jansen je neobstoječ. Oglasil se je le junija 2023, ko je poslal nekaj popravkov, ter marca letos, sicer pa je kot duh. Kaj pa Jia Tan?

Kdo je Jia Tan?

Nihče ne ve, kdo je Jia Tan. Njegov elektronski naslov se pojavlja zgolj v Githubu in Gitlabu, tu in tam še v elektronski pošti projekta Tukaani in Debiana. Znani varnostni raziskovalec Brian Krebs je pojasnil, da sta za to mogoči zgolj dve razlagi: bodisi gre za nekoga, ki je izjemno paranoičen in je ustvaril anonimni elektronski predal za komunikacijo, bodisi gre za izmišljeni psevdonim, za katerim stoji organizirana združba. Nemalo strokovnjakov meni, da je Jia Tan v resnici kolektivni psevdonim. Krebs sumi, da gre za kakšnega državnega akterja.

Podatkov o Tanu skorajda ni. Uporabljal je VPN iz Singapurja, zato ne vemo niti, iz katere države prihaja. Na internetu ni nobenih drugih njegovih »prstnih odtisov«. Metodičnost njegovega pristopa, potrpežljivost, vključenost tretjih oseb in ostali indici kažejo, da je šlo za organizirano, zelo motivirano skupino z obilico znanja in dovolj denarja, kar kaže na državno sponzorirane akterje. Običajni osumljenci so seveda Rusija (APT29), Kitajska (APT41) in Severna Koreja (Lazarus), pravi Costin Raiu, ki je do lani delal v podjetju Kaspersky. Bi bili lahko tudi Američani? Tehnično so tega sposobni, a Raiu meni, da ne bi sabotirali odprte kode, predvsem pa bi uporabili kriptografske funkcije, ki so odporne na prihajajoče kvantne algoritme – ED448 pa ni taka. Tan je imel na računalniku uro nastavljeno na časovni pas, ki ustreza Kitajski (UTC+8), nekajkrat pa je očitno na to pozabil in oddajal iz vzhodnoevropskega ali bližnjevzhodnega časovnega pasa. To med osumljence doda Izrael in Iran.

Ob tem velja omeniti, da je Jia Tan še pred delom pri xz predložil tudi popravek za libarchive, v katerem je eno izmed funkcij zamenjal z manj varno. Njegovo spremembo so odtlej že odpravili. Skupno je Jia Tan v letih 2021–2024 v sedem projektov prispeval 6.000 sprememb kode. Kje vse so njegovi – ali njihovi – odtisi, je praktično nemogoče ugotoviti, ker se pogosto več sprememb več avtorjev združi v paketke (squashing commits). A vendarle pretirana paranoja ni potrebna. Bržkone je Tan tako gradil zaupanje skupnosti, ne pa poskušal sabotirati sedmero projektov.

Nauki

Skorajšnja katastrofa je opomnik, da vzdrževanje odprte kode še vedno ni zadovoljivo rešeno. Vse preveč projektov sloni na neplačanih prostovoljcih, ki imajo druge službe in življenjske obveznosti, projekte pa vodijo v prostem času. Tak primer je XZ Utils, ki ga Collin vzdržuje v prostem času. Vložki so povsem nesorazmerni s pričakovanji, saj rezultate projektov uporabljajo po vsem svetu, nanje pa se zanašajo celo velike korporacije. Milijoni strežnikov tečejo na Linuxu in uporabljajo xz. Hkrati te iste korporacije zahtevajo zanesljivost, odzivnost in pomoč prostovoljnih vzdrževalcev projekta, za kar pa ne želijo finančno prispevati.

Čeprav je bil napad dovršen in po mnenju številnih analitikov plod večletnega truda, ga je skupnost – resda v zadnjem hipu – prepoznala.

To pot smo jo odnesli dobro. Čeprav je bil napad dovršen in po mnenju številnih analitikov plod večletnega truda, ga je skupnost – resda v zadnjem hipu – prepoznala. Uči pa nas, da sistem temelji na ljudeh. Tokratni napad je vključeval napreden socialni inženiring, saj so napadalci ustvarili več fiktivnih oseb, ki so imele vsaka svojo vlogo. Ena je nastopala kot razvijalec in se je sčasoma zavihtela na mesto odgovornega vzdrževalca, druge so to posredno omogočile s ploho elektronskih sporočil, s katerimi so izvajale pritisk na dotedanjega vzdrževalca, ter z lažnimi prijavami hroščev pospeševale vključitev nove kode v končno različico.

Odprta koda torej ni jamstvo za varnost, je pa eden izmed pogojev. Hkrati pa je potrebno zavedanje, da odprta koda ni zgolj koda, temveč celotni ekosistem. To pot je ta odigral svojo vlogo, saj je katastrofo preprečil, a poslal resno opozorilo, kaj vse je narobe z njegovo trajnostjo. Nekoč predani prostovoljci ne bodo več dovolj.

Naroči se na redna tedenska ali mesečna obvestila o novih prispevkih na naši spletni strani!

Komentirajo lahko le prijavljeni uporabniki

 
  • Polja označena z * je potrebno obvezno izpolniti
  • Pošlji