Obstaja prostor za vstavljanje kode med aplikacijo in njenimi zunanjimi knjižnicami. To početje samo po sebi ni slabo, je pa odličen način za škodo.
Ko morajo razvijalci razširiti funkcionalnost programa, za katerega nimajo izvorne kode, se pogosto obrnejo na povezovanje DLL. To je neobičajen način, da program pripravite do nečesa, čemur ni namenjen.
Dejstvo je, da hekerji to tehniko uporabljajo tudi iz popolnoma napačnih razlogov, kot je uporaba neškodljivih aplikacij kot orožje ali vdiranje programske opreme. Torej, kaj je povezovanje DLL in kako dejansko deluje?
Kaj je DLL?
Vsaka aplikacija je za izvajanje odvisna od nekaterih datotek zunaj svoje osnovne kode. Te zunanje datoteke vsebujejo kodo in podatke, ki jih program potrebuje za pravilno delovanje. Ko katera od teh zunanjih datotek izgine, ima lahko program težave s stabilnostjo ali pa se popolnoma zavrne.
V operacijskem sistemu Windows se te zunanje datoteke imenujejo DLL ali dinamično povezovalne knjižnice. Knjižnice dinamičnih povezav so bistvene komponente operacijskega sistema Windows, ki zagotavljajo kodo in vire, ki jih je mogoče ponovno uporabiti, in jih je mogoče deliti v več aplikacijah.
Zunanje datoteke v sistemu Windows so znane kot knjižnice. Obstajata dve vrsti knjižnic: dinamične in statične. Dinamične knjižnice se naložijo med izvajanjem, statične knjižnice pa med prevajanjem. DLL je dinamična knjižnica.
Kaj je DLL Hooking?
Preklapljanje DLL je tehnika, ki vključuje prestrezanje in spreminjanje klicev funkcij, ki jih programi ali procesi izvedejo v DLL. V bistvu postavitev Man-in-The-Middle se vzpostavi tam, kjer je kljuka med programom in DLL-ji, ki jih kliče. Vsi ali ciljni klici funkcij se nato izsledijo in spremenijo.
Tukaj je primer delovnega toka napada s povezovanjem DLL:
- Napadalec analizira klice funkcij, ki jih izvede program, in datoteke DLL, od katerih je odvisen.
- Napadalec ustvari kavelj z uporabo ene od številnih implementacijskih tehnik, kot so IAT hooking, inline hooking, COM hooking itd.
- Zgodi se izvajanje poljubne kode.
- Izvedba prvotnega klica funkcije se lahko zgodi ali pa tudi ne.
- Napadalec zakrije svoje sledi tako, da izbriše kavelj in razveljavi vse narejene spremembe.
Preklapljanje DLL je prefinjena tehnika, ki jo je mogoče uporabiti za dobro (kot je razširitev funkcionalnosti programa, odpravljanje napak in beleženje) ali za slabo (kot je obhod varnostnih ukrepov, kraja občutljivih podatkov, izvajanje poljubne kode in pisanje video iger heki).
Kako deluje povezovanje DLL?
Preden se potopite v izvajanje povezovanja DLL, je pomembno, da razjasnite osnove. Stopimo korak nazaj in razumemo, kaj se zgodi, ko program DLL pokliče funkcijo.
Ko program pokliče funkcijo v DLL, operacijski sistem najprej poišče ime funkcije uvozno tabelo naslovov programa in pridobi naslov funkcije iz izvoznega naslova DLL Tabela.
Ko je naslov funkcije razrešen, lahko program skoči na naslov funkcije za dostop do nje in jo izvede. Priključevanje DLL se vrti okoli prestrezanja tega procesa in preusmerjanja funkcijskega klica na drugo funkcijo. Obstaja več načinov za implementacijo povezovanja DLL. Oglejmo si najpogosteje uporabljene tehnike za njegovo izvajanje.
To je lahko precej tehnično, zato vam lahko pomaga, če ste napredni uporabnik sistema Windows ali kako drugače dobro razumejo notranjost sistema Windows.
IAT Hooking
IAT hooking je učinkovita tehnika, ki jo avtorji zlonamerne programske opreme pogosto uporabljajo za izogibanje varnostnim ukrepom in izogibanje odkrivanju. Uvozna naslovna tabela (IAT) je podatkovna struktura, ki se naloži v pomnilnik vsakič, ko se ustvari nov proces. IAT vsebuje imena vseh uvoženih funkcijskih klicev in njihove pomnilniške naslove.
Ko program pokliče funkcijo v DLL, se ime funkcije najprej išče v IAT in če je pomnilniški naslov omenjene funkcije ni najden v IAT, potem je vzpostavljen iz izvoznega naslova DLL Tabela.
To je podatkovna struktura, kjer so vse funkcije, ki jih izvozi DLL, preslikane v njihove pomnilniške naslove. Pri povezovanju IAT lahko nasprotnik spremeni IAT procesa in zamenja legitimne preslikave funkcij z zlonamernimi, ki tako motijo načrtovano delovanje in povzročijo samovoljno izvajanje programa Koda.
Takole izgleda splošni tok napada pri povezovanju IAT:
- Program izvede klic funkcije.
- Naslov funkcije se nahaja v IAT.
- Ker je bil IAT zasvojen; naslov funkcije je bil spremenjen in naložena je pomnilniška lokacija zlonamerne funkcije.
- Program skoči na mesto zlonamerne funkcije in izvede poljubno kodo.
- Končno se izvrši prvotni klic funkcije.
Inline Hooking
Inline hooking je tehnika povezovanja DLL, ki vključuje spreminjanje izvorne kode ciljne funkcije, da se njeno izvajanje usmeri na posebno funkcijo. Inline Hooking, v nasprotju s IAT hookingom, neposredno spremeni kodo ciljne funkcije, kar daje napadalcu natančnejši nadzor nad tem, kako se ciljna funkcija obnaša.
V zgornjem diagramu opazujte, kako je bila zakonita funkcija spremenjena, da kaže na zlonamerno funkcijo. Ko so izvedena vsa navodila v zlonamerni funkciji, se naredi navodilo za skok za vrnitev na legitimno funkcijo, da se ta dokonča.
Nasprotniki uporabljajo inline hooking, da naredijo trajne spremembe v programu, kot je spreminjanje parametrov ali vrnjene vrednosti funkcije.
Microsoftovi obvozi
Microsoft Research je razvil interni paket za povezovanje DLL, Detours. Programerjem omogoča sledenje in spreminjanje klicev funkcij, ki jih izvede program. Obvozi se lahko uporabljajo za različne naloge, vključno z, vendar ne omejeno na: instrumentacijo, testiranjem in odpravljanjem napak.
Nasprotniki uporabljajo Detours za izvajanje napadov z vstavljanjem DLL in povezovanjem, razvijalci pa jih pogosto uporabljajo za razširitev funkcionalnosti svojih aplikacij. Več o paketu Obvozi lahko izveste na uradno skladišče GitHub.
Zdaj veste, kako deluje povezovanje DLL
Preklapljanje DLL je sofisticirana tehnika, ki lahko, če se uporablja iz pravih razlogov, poveča zmogljivosti vaše aplikacije ali vam pomaga odpraviti napake in optimizirati programsko opremo. Na žalost se hooking pogosteje uporablja kot kontradiktorna tehnika in ne kot razvojna. Zato je pomembno, da sprejmete in se držite najboljših varnostnih praks, ki zagotavljajo, da so vaše aplikacije varne in brez napadov, kot sta hooking in injection.