====== Rowhammer napad ====== ===== Sažetak ===== Povećanje kapaciteta memorijskih modula dovelo je do neželjenih pojava u kojima elektromagnetske interferencije uzrokovane čitanjem memorije mogu utjecati na konzistentnost sadržaja memorije. Takve pojave moguće je namjerno izazvati i iskoristiti ih kako bi se narušila sigurnost operacijskog sustava. Ključne riječi: rowhammer; DRAM; napad; ===== Uvod ===== Tehnologija **DRAM** memorijskih modula ostvarila je veliki napredak u zadnja dva desetljeća, od drastičnog povećanja kapaciteta memorijskih modula do povećavanja takta rada. Veliki dio tog napretka leži u smanjivanju veličine memorijskih ćelija što omogućuje smještanje većeg broja ćelija na isti prostor čime se povećava kapacitet memorijskog modula i doprinosi smanjivanju cijene izrade takvih memorijskih modula. Međutim, povećavanje gustoće memorijskih ćelija unutar memorijskog modula sa sobom donosi niz neželjenih pojava koje utječu na pouzdanost, kvalitetu i možda najvažnije, sigurnost cijelog računalnog sustava. //Rowhammer// napad iskorištava elektromagnetske interferencije koje nastaju opetovanim adresiranjem pojedine memorijske lokacije unutar modula kako bi promijenio vrijednost bita u nekoj od susjednih ćelija i time potencijalno narušio sigurnost računalnog sustava. ===== Struktura DRAM memorijskih modula ===== Moderne memorijske module dijelimo u (većinom) dvije skupine: **DRAM ** (//dynamic// RAM) i **SRAM ** (//static// RAM). Obzirom da //Rowhammer// napad iskorištava mane u **DRAM** modulima, u nastavku neće biti dan opis **SRAM** modula. Osnovna komponenta svakog DRAM memorijskog modula jest memorijska ćelija. Njena izvedba je vrlo jednostavna i sastoji se od jednog tranzistora i jednog kondenzatora. Ćelija pohranjuje jedan bit informacije pomoću naboja pohranjenog u kondenzatoru. Više ćelija povezano je na dvije iste linije, //word line //koji služi za pristup pojedinom nizu ćelija i //digit line //koji služi dohvaćanju sadržaja pojedinog niza ćelija. Kada se na //word line //dovede napon tranzistor u ćeliji propušta naboj iz kondenzatora na //digit line//, čime se na toj liniji postavlja vrijednost koja je bila u ćeliji. Upisivanje podataka u ćeliju ide obrnutim redoslijedom, potrebno je dovesti željenu vrijednost na //digit line// i potom dovesti napon na //word line// i održavati ga dovoljno dugo kako bi se kondenzator unutar ćelije napunio ili ispraznio. {{:racfor_wiki:blockchain:dramcell.png?320x320|Struktura DRAM ćelije}} Važno je naglasiti da naboj pohranjen u kondenzatoru iščezava kroz određeno vrijeme. Ta činjenica uzrokuje određene probleme pri implementaciji takvih sklopova. Zbog potrebe za velikim memorijskim kapacitetima, kondenzatori u današnjim modulima moraju biti jako maleni što dodatno pospješuje probleme uzrokovane iščezavanjem naboja iz kondenzatora. Zbog male količine naboja pohranjene u ćelijama potrebno je na izlaz //digit line//-a dodati pojačalo koje će moći razlikovati vrijednosti 0 i 1 iz malih ulaznih napona.\\ Nadalje, brzina čitanja i pisanja u ćelije ograničena je brzinom punjenja i pražnjenja kondenzatora što ima velike posljedice za performanse **DRAM** modula. Međutim, najveći problem jest osigurati konzistentnost stanja ćelije zbog čega je potrebno periodički osvježavati stanje ćelije. Osvježavanje ćelije postiže se čitanjem reda ćelija i vraćanjem pojačanog signala nazad na //digit line. //Tijekom te operacije svi pokušaji čitanja ili pisanja u taj niz ćelija se odbacuju, što opet ima negativne posljedice na performanse. {{:racfor_wiki:blockchain:cap_charge.png?400x235|Graf nabijanja i pražnjenja kondenzatora}} Najčešća organizacija **DRAM**-a jest grupiranje više nizova (odnosno redova) ćelija u polje odnosno tzv. //bank. //Međutim, takva polja se rijetko upotrebljavaju samostalno s obzirom na njihov malen kapacitet te se tako više polja grupira u tzv. //rank. //Upravljanje stanjem memorije prepuštenoj je memorijskom kontroleru, sklopu koji se tipično nalazi unutar procesora. Standard **DDR**, danas najzastupljeniji, propisuje nekoliko vrsta naredbi koje memorijski kontroler može koristiti kako bi upravljao **DRAM** modulom od kojih su najvažnije one za čitanje, pisanje i osvježavanje ćelija. Dodatno, standard garantira da će sadržaj memorije ostati konzistentan u periodu od barem 64 milisekunde. Tijekom tog perioda sve ćelije u svim poljima moraju biti osvježene. {{:racfor_wiki:blockchain:dramarray.png?400x400|Polje DRAM ćelija}} Pristupanje sadržaju //rank//-a se odvija u tri koraka:\\ ^DRAM naredba^Opis| |ACTIVATE|Podiže napon na //word line//-u željene memorijske lokacije| |READ|Iščitava vrijednost pojedinog stupca| |PRECHARGE|Osvježava sadržaj ćelije s prethodno pročitanom vrijednošću| \\ ===== Analiza napada ===== //Rowhammer// napad oslanja se na neželjene pojave koje se manifestiraju prilikom elektromagnetskih interferencija između više komponenti u **DRAM** modulu. U znanstvenom radu u kojem je otkriven //Rowhammer// napad autori su utvrdili da opetovano adresiranje (odnosno podizanje napona na //word line//-u) niza ćelija uzrokuje brže pražnjenje kondenzatora u nekim susjednim ćelijama. Također je izneseno par hipoteza kojima se pokušalo objasniti tu pojavu: - Mijenjanje napona na pojedinom //word line//-u može dovesti do induciranja napona u susjednim //word line//-ovima čime se na kratko vrijeme propušta napon iz kondenzatora unutar ćelije i pospješuje pražnjenje kondenzatora - Premošćivanje pojedinih linija nastalo kao pogreška pri proizvodnom procesu pospješuje pražnjenje kondenzatora Kako bi mogli demonstrirati napad, autori su osmislili kratki program koji opetovano čita sadržaj memorije: ^x86 naredba^Opis| |code1a:|Deklaracija labele| |mov (X), %eax|Premještanje sadržaja memorijske lokacije X u registar eax| |mov (Y), %ebx|Premještanje sadržaja memorijske lokacije Y u registar eax| |clflush (X)|Pražnjenje sadržaja memorijske lokacije X iz priručne memorije| |clflush (Y)|Pražnjenje sadržaja memorijske lokacije Y iz priručne memorije| |mfence|Osigurava čekanje na izvršavanje gornjih naredbi| |jmp code1a|Preusmjerava tok izvođenja programa nazad na prvu naredbu u tablici| Adrese **X** i **Y **posebno su odabrane da odgovaraju nizovima ćelija unutar istog //bank//-a kako bi memorijski kontroler morao ispoštovati proceduru čitanja i "zatvaranja" niza ćelija. Nakon pokretanja navedenog programa kroz više milijuna iteracija, autori su primijetili veliku količinu ćelija čiji je sadržaj promijenjen. Kako bi produbili razumijevanje o ovoj vrsti napada, autori su testirali 129 **DRAM **modula od tri neimenovana proizvođača. Testiranja su ispitivala učestalost promjene sadržaja ćelija u ovisnosti o tri parametra: - Aktivacijski interval - vrijeme čekanja između ponovnog adresiranja niza ćelija - Interval osvježavanja - vrijeme unutar kojeg sadržaj svih ćelija mora biti osvježen - Uzorak podataka - inicijalni sadržaj ćelija prije nego što se test pokrene Utvrđeno je da broj uočenih pogrešaka pada s rastom aktivacijskog intervala, a raste s povećanjem intervala osvježavanja. \\ Autori navode da na svakih 10^9 ćelija otprilike 10^5 ćelija promijene sadržaj tijekom provođenja testova te da je otprilike 70% testiranih ćelija promijenilo sadržaj prilikom svih provođenja testova. \\ ===== Obrana od napada Rowhammer ===== Napad Rowhammer predstavlja veliku opasnost zbog činjenice da se može izvršavati neprimijećeno i pomoću neprivilegiranog korisničkog računa. Zbog velike raširenosti **x86** arhitekture i sve većih **DRAM** modula broj korisnika koji su ranjivi na ovaj napad drastično raste. **ECC** (//Error-Correcting Code//) memorija nameće se kao potencijalno rješenje problema obrane. **ECC** **DRAM** moduli opremljeni su s dodatnim memorijskim čipovima kako bi mogli ispravljati jednostruke i detektirati dvostruke pogreške unutar jedne memorijske "riječi". Međutim, napad //Rowhammer // često izaziva više pogrešaka unutar jedne riječi čime ovakva vrsta zaštite postaje beskorisna. U radu u kojem je prvi put objavljen napad //Rowhammer// autori navode nekoliko potencijalnih rješenja koja su vezana uz parametre rada **DRAM** modula. Smanjivanje intervala osvježavanja uklonilo bi veliku većinu pogrešaka ali bi uvelike povećalo potrošnju energije i smanjilo performanse modula. Također bi bilo moguće provesti otkrivanje ćelija koje uzrokuju većinu pogrešaka i mapirati njihove adrese na druge, rezervne ćelije. Taj proces može provesti proizvođač ili krajnji korisnik. Međutim, dugotrajnost takvog procesa sprječava bilo kakvu praktičnu primjenu. Kao najbolje rješenje autori predlažu novu tehniku, **PARA** (eng. //Probabilistic Adjacent Row Activation//). Tehnika se zasniva na probabilističkom osvježavanju susjednih nizova ćelija prilikom svakog pristupa nekom od nizova ćelija. Prilikom svakog pristupa nizu ćelija se uz neku malu vjerojatnost //p //osvježava sadržaj susjednog niza ćelija. Tako bi prilikom opetovanog pristupanja nizu ćelija vjerojatnost osvježavanja susjednih nizova ćelija rasla. Prednost ove tehnike je da ne zahtijeva nikakvo posebno sklopovlje za praćenje stanja ćelija već je dovoljno napraviti male izmjene unutar memorijskog kontrolera. ===== Varijacije napada Rowhammer ===== Ubrzo nakon objavljivanja napad //Rowhammer //je privukao veliku pažnju cijele industrije računalne sigurnosti i uzrokovao velike bojazni od potencijalnih šteta. Razvoj napada i njegova primjena na drugim platformama nije stala i ubrzo je došlo do razvoja raznih napada koji kao glavnu tehniku koriste napad //Rowhammer//. Napad //Rowhammer// pretpostavlja da se kod koji uzrokuje neželjene promjene u memoriji izvodi na ciljnom računalu. Međutim, objavljivanjem napada //Throwhammer// pokazalo se da je u nekim slučajevima uzrokovati neželjene promijene u memoriji preko mreže. //Throwhammer// iskorištava mogućnost udaljenog direktnog pristupa memoriji odnosno **RDMA** (eng. //Remote Direct Memory Access//) kako bi slanjem velikog broja paketa uzrokovao neželjene promjene u memoriji. **RDMA** se široko upotrebljava u raspodijeljenim sustavima koji zahtijevaju visoke performanse. Ideja iza takvog pristupa jest maksimalno rasteretiti procesor i dozvoliti mrežnoj kartici direktan pristup unaprijed zadanom memorijskom polju kako bi se pospješila brzina kopiranja podataka. Autori rada u kojem je napad //Throwhammer// prvi put objavljen utvrdili su da je kroz period od 30 minuta moguće uzrokovati do nekoliko stotina jedinstvenih promjena vrijednosti ćelija. Takav pristup zahtijeva slanje milijuna paketa u sekundi i ne rezultira velikim brojem neželjenih promjena u memoriji. Iako se originalna implementacija napada //Rowhammer// oslanjala na specifičnu naredbu unutar **x86** arhitekture, pojavio se velik broj napada koji uspješno koriste //Rowhammer// na **ARM** platformama, prvenstveno mobilnim uređajima. Napad Drammer uspješno iskorištava //Rowhammer// napad na //Android// uređajima uz pomoć posebno osmišljenih tehnika pristupa memoriji kako bi zaobišao sigurnosne postavke operacijskog sustava i došao do administratorskog (eng. //root//) korisničkog računa. Napad je moguće izvršiti u cijelosti pomoću aplikacije koja ne zahtijeva //nikakve// posebne dozvole, što ugrožava jako veliki broj korisnika. Napad //Rowhammer// prvenstveno se upotrebljava kako bi se promijenilo stanje memorije. Međutim, nedavno objavljen napad //RAMBleed// pokazuje da je moguće čitati sadržaj memorije uz pomoć napada //Rowhammer//. Autori su u radu demonstrirali napad pomoću čitanja 2048 bitnog privatnog **RSA** ključa kojeg koristi //OpenSSH//. ===== Zaključak ===== Napad //Rowhammer// ozbiljna je prijetnja velikom broju uređaja koja je pokrenula lavinu nove vrste napada koje se temelje na uzrokovanju neželjenih promjena stanja ćelija. Iako postoje tehnike obrane od takvih napada, one su često beskorisne ili produljuju vrijeme napada. Daljnjim proučavanjem raznih platformi iz perspektive ovakvih napada doći će do još više napada temeljenih na napadu //Rowhammer//. ===== Izvori ===== [1] [[https://users.ece.cmu.edu/~yoonguk/papers/kim-isca14.pdf|Y. Kim et al., "Flipping bits in memory without accessing them: An experimental study of DRAM disturbance errors," 2014 ACM/IEEE 41st International Symposium on Computer Architecture (ISCA), Minneapolis, MN, 2014, pp. 361-372.]] [2] [[https://people.freebsd.org/~lstewart/articles/cpumemory.pdf|Drepper, Ulrich. (2007). What Every Programmer Should Know About Memory. ]] [3] [[https://download.vusec.net/papers/throwhammer_atc18.pdf|Throwhammer: Rowhammer Attacks over the Network and Defenses. Tatar, A.; Konoth, R. K.; Athanasopoulos, E.; Giuffrida, C.; Bos, H.; and Razavi, K. In USENIX ATC, July 2018.]] [4] [[https://vvdveen.com/publications/drammer.pdf|Drammer: Deterministic Rowhammer Attacks on Mobile Platforms. van der Veen, V.; Fratantonio, Y.; Lindorfer, M.; Gruss, D.; Maurice, C.; Vigna, G.; Bos, H.; Razavi, K.; and Giuffrida, C. In CCS, October 2016. ]] [5] [[https://rambleed.com/docs/20190603-rambleed-web.pdf|RAMBleed: Reading Bits in Memory Without Accessing Them, Kwong, Andrew and Genkin, Daniel and Gruss, Daniel and Yarom, Yuval in 41st {IEEE} Symposium on Security and Privacy (S\&P) ]]