Objavljeno: 30.4.2019 | Avtor: Simon Peter Vavpotič | Monitor Maj 2019

Kako se (u)braniti pred napadom na strojno programsko opremo?

So naši računalniki še varni pred podivjanimi hekerji? Kako preverimo pristnost strojne programske opreme in kako preprečimo nameščanje vsadkov zlonamerne kode?

»Mokre« sanje hekerjev o prostem dostopu do vseh vsebin v slehernem računalniku na svetu.

Čeprav mnogi še danes ne vedo oziroma ne verjamejo, da lahko računalnik povsem uniči okužba z zlonamerno programsko kodo s spleta, to vsekakor drži. Natančen pregled poljudnega spletnega izobraževanja za računalniške znalce z naslovom Varnost sistemske vgrajene opreme BIOS/UEFI s stališča napadalca in branilca (angl. Security of BIOS/UEFI System Firmware from Attacker and Defender Perspectives) je srh vzbujajoč. Ne toliko zato, ker opiše in razloži najbolj zvite hekerske načine vdora v strogo varovane dele pomnilnika, vključno s strojno programsko opremo računalnika, temveč zaradi s tem povezane nevarnosti kraje občutljivih osebnih podatkov.

Ko heker prevzame popoln nadzor nad računalnikom, lahko obenem prestreza vse komunikacije njegovih uporabnikov prek žičnih (Ethernet) in brezžičnih omrežij (WiFi, UMTS, GPRS, Bluetooth …) in v njihovih imenih izvaja celo pravno zavezujoča dejanja, kot so nakazila finančnih sredstev ali sklepanja kreditnih pogodb prek e-bančnih storitev.

Za kaj gre?

Izjemno prilagodljivo in razširljivo odprto arhitekturo IBM PC iz osemdesetih let preteklega stoletja proizvajalci strojne opreme, predvsem osnovnih plošč in veznih čipovnih naborov, še danes nadgrajujejo in dopolnjujejo. Razvoj gre v smeri čim večje integracije in vsakoletnega dodajanja kopice novih funkcionalnosti, s katerimi želijo proizvajalci premamiti potencialne kupce nove računalniške opreme in hkrati iti v korak z zadnjimi različicami programskih aplikacij ter računalniških iger.

Kako namestiti Intel Chipsec

Navadno se forenzične preiskave vgrajene programske opreme lotimo šele, ko posumimo, da je z računalnikom nekaj hudo narobe. Chipsec zato ni namenjen začetnikom, ampak zahteva dobro poznavanje notranje arhitekture PC-ja in vsaj osnovo znanje programiranja ter splošno poznavanje programskih jezikov in prevajalnikov zanje.

Nameščanja Chipseca sem se lotil po naslednjem vrstnem redu: razširitev in prenos Chipseca iz datoteke vrste ZIP v podimenik imenik chipsec-master na izbranem disku, prevajanje gonilnika chipsec_hlpr.sys z Microsoft Visual Studiem in DDK na enem od računalnikov, kjer sta bila že nameščena (pomembno je, da izdelamo 32-bitno oziroma 64-bitno različico, odvisno od operacijskega sistema, kjer ga bomo uporabili), namestitev Python 2.7.5, namestitev PanDoc (iz pandoc-2.7.1-windows-x86_64.msi), namestitev PyWin32 (iz pywin32-214.win32-py2.7.exe), namestitev in prevajanje Adodbapi-2.6.0.6 (prevajanje izvedemo s klicem python setup.py install), namestitev in prevajanje cmdvars-0.1.3, namestitev in prevajanje PypiWin32-223 različica 2.23 (popravek različice na 2.24) in nazadnje še namestitev in prevajanje Chipseca.

Če se sestavljanja Chipseca lotimo po Intelovih navodilih, mora biti preiskovani računalnik ves čas povezan z internetom, kar je lahko še posebej kočljivo, če domnevamo, da so vanj nameščena odzadnja vrata. Nameščanja se lahko lotimo tudi brez povezave z internetom, tako da vso potrebno programsko opremo prenesemo z interneta z drugim računalnikom in jo namestimo v pravilnem vrstnem redu, tako da samodejne namestitve z interneta niso potrebne. Pri tem vsak namestitveni program (setup.py) sproti izpisuje imena programskih dodatnih programskih paketov in pri tem poskuša manjkajoče prenesti s spleta. Če mu ne uspe, vrne napako, ki jo lahko odpravimo tako, da naknadno ročno prenesemo in namestimo ustrezni programski paket z Githuba ali druge spletne strani in ponovno zaženemo namestitev.

Danes skoraj ne moremo najti kosa strojne opreme (čipovni nabor in razni krmilniki na osnovni plošči, grafične kartice, omrežne kartice, SSD, diski in kabelski modemi), ki ne bi poleg nove digitalne logike vseboval tudi zapletenega strojnega programja za podporo lastnemu delovanju. A prav zaradi zapletenosti vgrajene programske opreme je lahko v njej veliko skritih napak, ki jih je mogoče odpraviti le s posodobitvami, ki jih proizvajalci redno objavljajo na svojih spletnih straneh.

Kje je vgrajena programska oprema?

Do algoritmov za posodabljanje vgrajene programske opreme, ki so bili nekdaj strogo varovane skrivnosti (združenj) proizvajalcev strojne opreme, so se z leti, v zadnjem času pa tudi na račun mikroprocesorskih ranljivosti Meltdown in Spectra, dokopali tudi računalniški hekerji, ki delijo znanje prek temnih internetnih podomrežij. Tako so začeli nastajati hekerski programski paketi (angl. rootkits). Ti vsebujejo zbirke znanj in algoritme, ki celo manj izkušenim članom hekerskih skupin omogočajo vdore v osebne računalnike in velike računalniške sisteme.

Znanje iz temnih internetnih podomrežij

Številni upravljavci velikih informacijskih sistemov svoje zaposlene na področjih skrbništva in zagotavljanja informacijske varnosti že pošiljajo na specializirana izobraževanja in usposabljanja za preprečevanje ter odkrivanje vgrajene zlonamerne programske kode. Ostali si lahko pomagamo z zastonjskimi s spletnimi izobraževalnimi paketi, kot je že omenjeni spletni poduk, ki so ga na osnovi analiz delovanj zajetih hekerskih korenskih paketov pripravili trije McAfeejevi strokovnjaki in Intelov, Yuriy Bulygin, Alex Bazhaniuk, Andrew Furtak in John Loucaides. Izobraževanje se opira tudi na javno objavljene specifikacije vmesnikov ACPI in EFI/UEFI (napredni BIOS).

Hekerski korenski paketi

Hekerski korenski programski paketi so začeli nastajati že okoli leta 1999, ko so se na temnem spletu pojavila orodja, kot sta bila HackerDefender in Haxdoor, ki so omogočala razvoj zlonamerne programske kode (virusi, trojanski konji, črvi …) z možnostjo vgradnje v jedro operacijskega sistema. Najlažje smo jih odpravili s kopiranjem uporabniških podatkov na varne zunanje podatkovne nosilce in ponovno namestitvijo operacijskega sistema.

Naslednja generacija korenskih paketov (Mebroot, TDL4, FIN1, Rovnix, Olmasco, XPAJ, Gapz, Petya, Goldeneye …), razvitih po letu 2005, je zmogla izdelati zlonamerno programsko kodo, ki se je vgradila v nalagalnik operacijskih sistemov, nemalokrat pa je spremenila celo partiticijsko tabelo. Ponovno nameščanje posameznega operacijskega sistema ni več zadoščalo, saj smo morali najprej obnoviti nalagalnik operacijskih sistemov (angl. bootloader), nato pa še okužene operacijske sisteme, pri čemer niso bile redke težave s ponovno vzpostavitvijo pravilnega zagona vseh nameščenih operacijskih sistemov. Ob neuporabnosti partiticijske tabele po odstranitvi zlonamerne programske kode smo morali pobrisati celotno vsebino prizadetega podatkovnega nosilca in jo v celoti obnoviti.

Vendar hekerji niso počivali in skoraj vzporedno so nastala še zmogljivejša orodja, kot so LceLord BIOS Rootkit, Mebromi in ANT catalog, ki omogočajo izdelavo zlonamerne programske kode, ki ne okuži ali poškoduje le podatkovnih nosilcev (predvsem zagonskih diskov ali SSD), temveč prek vmesnika BIOS ACPI vgradi zlonamerno kodo tudi v EEPROM z BIOS-om.

Ne onesposobite računalnika!

Že preverjanje vgrajene strojne opreme in iskanje vanjo vsajene zlonamerne programske kode ni enostavno, toliko bolj tvegano pa je njeno spreminjanje, saj računalnik zaradi sprememb morda ne bo znal več naložiti operacijskega sistema. Če niste o tem povsem prepričani, zato ne spreminjajte vsebin trajnih pomnilnikov (EEPROM-ov, diskov, SSD), saj lahko s tem tudi znatno zmanjšate zmogljivost računalnika, denimo upočasnite prenos podatkov po vodilu USB.

Vsaka uspešna vsaditev zlonamerne programske kode v strojno programsko opremo je problematična tudi zato, ker ima heker veliko možnosti, da tudi v primeru reprogramiranja BIOS-a z originalno strojno programsko opremo proizvajalca zagotovi ponovno namestitev svoje zlonamerne programske kode z zagonskega diska ali druge naprave, če je tudi to prej okužil. Najzanesljivejše zdravilo sta zato le hkratni izbris vseh pomnilnikov računalnika in ponovna namestitev originalne programske opreme vanje.

Zadnja generacija hekerskih orodij, nastalih po letu 2012, temelji na novejšem standardu EFI/UEFI in zna spreminjati tudi vsebino drugih trajnih pomnilnikov v računalniku, ki so v krmilnikih: vodil, enot za masovno hrambo podatkov, zvoka, vrat USB itn.

Orodja za analizo, odkrivanje in odpravljanje zlonamerne kode

Odprava zlonamerne vgrajene programske opreme ni enostavna, saj se moramo prej lotiti njenega odkrivanja in predvsem natančne analize. Hitre in površne odstranitve navadno ne pridejo v poštev, saj ne vemo, ali so v zlonamerni programski kodi skrite pasti, zaradi katerih bi po njeni (delni) odstranitvi računalnik lahko postal neuporaben. Analiza vgrajene programske kode in odkrivanje pomanjkljivosti v nastavitvah ACPI in EFI/UEFI BIOS zahtevata uporabo posebnih programerskih orodij, ki jih pri svojem delu (lahko) uporabljajo tudi hekerji.

Programator, Bus Pirate, omogoča neposredno branje in programiranje veliko različnih EEPROM-ov z vodilom SPI.

Intelov, pred časom javno objavljeni programski paket Chipsec omogoča predvsem analizo vgrajene programske kode BIOS-a in njen izvoz v binarni ali tekstovni obliki ter varnostno analizo sistemskih nastavitev za računalnike z Intelovimi procesorji. Napisan je v programskem jeziku Python, zato moramo pred njegovo uporabo najprej namestiti ustrezen interpreter –prevajalnik, poleg tega pa še z Githuba in/ali drugih spletnih portalov potegniti manjkajoče podporne module.

Chipsec potrebuje za delovanje v okolju Windows ali Linux tudi gonilnik, Chipsec Helper, ki ga moramo zgraditi iz izvorne kode ob pomoči programskih orodij in knjižnic za gradnjo gonilnikov; denimo, v Windows z Microsoft Visual Studiem in ustreznim DDK (razvojni komplet za gradnjo gonilnikov, angl. Driver Development Kit) izvorno kodo iz programskega jezika C++ prevedemo v izvedljivo datoteko chipsec_hlpr.sys. Podobno velja tudi za nekatere druge komponente, ki jih Chipsec potrebuje za svoje delovanje. Namesto vsega tega lahko s spleta pogosto potegnemo tudi v izvedljivo kodo že prevedene komponente za najbolj priljubljene operacijske sisteme.

So prastari računalniki varnejši?

Hekerjem je danes zaradi enotnih standardov ACPI in EFI/UEFI v strojno programsko opremo veliko lažje vsaditi zlonamerno kodo, kot če bi morali natančno preučevati zgradbo posameznih funkcijskih enot različnih računalnikov. Stari računalniki, brez podpore omenjenim standardom, so sicer manj zaščiteni pred vdori vanje ob pomoči ranljivosti, kot sta Spectra in Meltdown, kljub temu pa imajo hekerji neprimerno manj možnosti, da bi uspešno spremenili njihovo strojno programsko opremo.

Vendar Intel svari pred namestitvijo Chipseca na produkcijske računalnike, saj lahko njegove komponente morebitni zlonamerni programski opremi odprejo dodatne možnosti delovanja. V okolju Windows je problematična predvsem uporaba gonilnika chipsec_hlpr.sys, ki ni e-podpisan in zahteva uporabo Windows v načinu brez preverjanja e-podpisov gonilnikov, zato bi si lahko v času njegove uporabe zlonamerna programska oprema veliko enostavneje utrla pot v jedro operacijskega sistema. chipsec_hlpr.sys lahko ob pomoči spletnih storitev Verisign tudi e-podpišemo ali pa ga enostavno namestimo v katero od različic Linuxa, ki jih lahko zaženemo kar s podatkovnega ključka.

Zagon zlonamerne programske opreme, izdelane s korenskim kompletom TDL4, skupaj z operacijskim sistemom.

Poleg Chipseca so Intelovi inženirji pripravili tudi zastonjski prevajalnik zapisov AML, na osnovi katerih tvorimo tabele vmesnika ACPI. iASL je optimizacijski prevajalnik AML v strojni zapis tabel ACPI in povratni prevajalnik v AML (angl. ACPI Source Language Optimizing Compiler and Disassembler) s priloženimi dodatnimi orodji, kot je ACPIdump, s katerim lahko iz delovnega pomnilnika računalnika izvozimo najpomembnejše tabele ACPI in jih nato povratno prevedemo v AML.

Bistvena prednost iASL pred Chipsecom je, da lahko s spleta potegnemo že prevedeno različico za svoj operacijski sistem in jo takoj uporabimo, pri čemer ne potrebujemo gonilnika Chipsec Helper. Pogrešamo pa Chipsecovo diagnostiko, celovito samodejno analizo ranljivosti in poškodb vgrajene programske opreme ter preverjanje vgrajene programske kode vmesnika EFI/UEFI.

Je računalnik okužen?

Odgovor na to vprašanje navadno začnemo iskati z ukazom python chipsec_main.py. Ta izdela poročilo o stanju zaščit pomnilnikov in vgrajene programske opreme v tekstovni obliki, ki ga izpiše v terminalsko okno ali datoteko. Chipsec pri tem samodejno zazna strojno arhitekturo računalnika; pri nepodprtih arhitekturah pa lahko diagnostiko izvedemo le prek stikal –p in –i, pri čemer pri prvem sami izberemo najbolj podobno arhitekturo, pri drugem pa Chipsec uporabi prednastavljeno arhitekturo. Omenimo še, da imamo tudi možnost ročnega dodajanja arhitektur.

Spremenjeni deli vgrajene programske opreme in spremenjen nalagalnik operacijskih sistemov.

Napad zlonamerne programske opreme na nalagalnik operacijskih sistemov.

Na morebiten obstoj neželene vgrajene programske opreme lahko posumimo, če odkrijemo veliko nezaščitenih delov različnih pomnilnikov, za katere je pričakovati, da bi bili ob normalnem delovanju računalnika zaščiteni. Dvome najlažje potrdimo, če s Chipsecom testiramo tudi neokužen računalnik z enakimo arhitekturo, nastavitvami BIOS in sistemsko programsko operemo. Poleg primerjave poročil lahko primerjamo tudi strojno programsko opremo.

Če računalnika z enako arhitekturo nimamo, si lahko pomagamo tudi z obiskom katerega od (predvsem ruskih) spletnih mest, kjer uporabniki objavljajo originalne vgrajene programske kode svojih računalnikov.

Natančnejšo analizo lahko izvedemo s posameznimi klici diagnostičnih orodij Chipsec z ukazom chipsec_util.py. Eden izmed kazalnikov zlonamerne programske kode je obstoj tabel ACPI z neveljavnimi, pogosto tudi neznanimi e-podpisi, vendar le, če imamo možnost izbrati pravo arhitekturo računalnika. Seznam tabel lahko izpišemo z ukazom phyton chipsec_util.py acpi list, ki vrne podpise in pomnilniške naslove vseh glavnih tabel ACPI, hkrati pa našteje tabele z neznanimi ali neveljavnimi e-podpisi. Čeprav vsebine zadnjih z ukazom phyton chipsec_util.py acpi table ne moremo izpisati, jih lahko vseeno poiščemo in izpišemo z različnimi oblikami ukaza phyton chipsec_util.py mem …, med katerimi je tudi chipsec_util.py mem search, s katerim v pomnilniku poiščemo vsa pojavljanja določene vsebine (npr. imena ali podpisa tabele), hkrati pa z različicami ukaza mem tudi v celoti izpišemo problematične tabele.

Tabele z neznanimi e-podpisi lahko namesto tega izpišemo tudi tako, da predhodno dopolnimo specifikacijo znanih tabel ACPI v datoteki \chipsec\hal\acpi.py in nato ponovno namestimo Chipsec z ukazom py setup.py install. To moramo storiti zato, ker se koda v Pythonu delno prevede v izvedljivo kodo.

Sume o obstoju zlonamerne vgrajene programske opreme dodatno podkrepljujejo tudi morebitni zunanji dejavniki, kot je metronomsko utripajoča rdeča svetlobna dioda diskovnega krmilnika, ko diskov ali SSD ne uporablja nobena aplikacija ali operacijski sistem, in to niti takrat, ko zaženemo minimalistični neokuženi Linux s plošče CD ali podatkovnega ključka.

Naslednji korak je preverjanje vsebine tabel ACPI, kar je najlažje, če imamo na voljo izvožene tabele iz neokuženega računalnika z enako arhitekturo in sistemsko programsko opremo. Pri novejših računalnikih z vmesnikom EFI/UEFI se forenzične analize vgrajene programske opreme lotimo z izpisom spremenljivk UEFI z ukazom chipsec_util.py uefi var-list, pri čemer iščemo morebiti dodane zaganjalnike operacijskih sistemov in kose izvedljive programske kode brez imena. Vendar lahko šele natančnejša analiza tovrstne kode, predvsem pa njena primerjava z morebiti pridobljeno izvorno programsko kodo katerega od hekerskih korenskih kompletov, kot so jo izvedli tudi McAfeejevi in Intelovi strokovnjaki, pokaže na dejanski obstoj in vrsto zlonamerne programske opreme.

Kako se zaščititi?

Novi računalniki so vsako leto opremljeni z več programsko-strojnimi varovali, ki hekerjem preprečujejo vsaditev zlonamerne vgrajene programske opreme v tabele UEFI. V skladu s standardom UEFI 2.4 so najpomembnejši varnostni elementi: varni zagon UEFI (angl. UEFI Secure Boot), avtentikacija spremenljivk UEFI, uporaba generatorjev naključnih števil, identifikacija uporabnikov, ki jo omogočajo novi gonilniki DXE, in izmerjeni zagon sistema TCG (angl. Trusted Computing Group measured boot). Za varno uporabo računalnika je nujno, da varnostne elemente pravilno nastavimo in omogočimo v BIOS-u, preden računalnik povežemo z internetom.

Izpis tabel ACPI, med katerimi so tri z neznanimi e-podpisi.

Med novimi tehnologijami, ki vzporedno z varnim zagonom UEFI ali izmerjenim varnim zagonom TCG dodatno povečujejo varnost vgrajene programske opreme, je tudi Intelov BIOS Guard (slov. varuh BIOS-a), katerega programska koda je nameščena v avtenticirani programski RAM (AC RAM, angl. authenticated code RAM) znotraj mikroprocesorja in je edini algoritem, ki lahko spreminja vsebino prek vodila SPI povezanih EEPROM-ov. Pri tem mora biti posodabljanje vgrajene programske opreme najprej omogočeno v BIOS-u, obenem pa pred nameščanjem kakršnekoli posodobitve BIOS Guard preveri pristnost e-podpisa.

Strojna zaščita vgrajene programske opreme

Kljub visokoletečim krilaticam novih zaščitnih standardov za strojno programsko opremo njene 100-odstotne varnosti skoraj ni mogoče pričakovati, dokler bodo posodobitve mogoče le s tako ali drugačno sistemsko programsko opremo in z uspešnim preverjanjem pristnosti e-podpisov. Hekerji zvesto sledijo slehernim posodobitvam, zato bodo varnostne luknje morda že v nekaj letih odkrite tudi v danes najbolje varovani strojni in programski opremi.

Težavam se lahko izognemo le z drastično omejitvijo dostopa računalnika do interneta in uporabo zapletenih požarnih zidov ter usmerjevalnikov ali pa upamo, da bodo proizvajalci v prihodnosti spet uvedli preprosta in učinkovita strojna varovala pred posodabljanjem vgrajene programske opreme, kot je distribucija signala za programiranje ali signala za omogočitev programiranja vsakega od EEPROM-ov na vodilu SPI. Če bi lahko tak signal omogočili ali onemogočili s postavitvijo ali z odstranitvijo električnega mostička na osnovni plošči računalnika, bi v celoti odpadla možnost neželenega reprogramiranja vgrajene programske opreme.

Vprašanje pa je, kako bi bili s tem zadovoljni veliki proizvajalci drage sistemske programske opreme, ki ne bi imeli več na voljo skritih kotičkov trajnega pomnilnika, kamor beležijo število namestitev in uporabljene preizkusne licence, pa tudi proizvajalci posebnih varnostnih programskih paketov, ki na podlagi zapisov v strojno programsko opremo izsledijo odtujeno strojno opremo, takoj ko je ta spet povezana z internetom …

Nadaljnje branje:

Spletno izobraževanje Varnost sistemske vgrajene opreme BIOS/UEFI s stališča napadalca in branilca: github.com/advanced-threat-research/firmware-security-training

Specifikacija naprednega vmesnika ACPI: acpica.org

Intelov prevajalnik iASL: www.acpica.org/downloads/binary-tools

Specifikacija vmesnika EFI/UEFI: uefi.org/specifications

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