Ciele
-
Po tejto prednáške budeš vedieť:
- vysvetliť účel obfuskácie a čo obfuskácia negarantuje
- rozlíšiť základné kategórie obfuskácie (syntaktická, kontrolno-toková, dátová, virtualizačná)
- na jednoduchom príklade ukázať control flow flattening
- vysvetliť limity obfuskácie
Obsah
Obfuskácia je proces, pri ktorom sa kód alebo dáta úmyselne zmenia tak, aby boli pre človeka alebo dekompilačný nástroj ťažšie pochopiteľné, pričom sa nezmení ich pôvodná funkcia. Nejde o neprelomiteľnú ochranu (tá neexistuje), ale o zvýšenie času a expertízy potrebnej na analýzu kódu.
Ciele obfuskácie: zvýšenie nákladov na reverzné inžinierstvo, ochrana duševného vlastníctva (proprietárne algoritmy), prevencia cheatovania a modifikácie (napr. hry, anticheat systémy), ochrana pred exploitáciou binárnych programov (sťaženie analýzy nástrojmi ako IDA Pro, Ghidra), komplikovanie extrakcie citlivých informácií (API kľúče, licencie), podpora dôveryhodnosti v cloudových/mobilných architektúrach, kde klientská časť aplikácie nemôže predpokladať dôveryhodné prostredie.
Štyri základné kategórie obfuskácie
- Syntaktická (textová/symbolická) – premenovanie symbolov na krátke nič nehovoriace identifikátory (napr.
A,X1), vkladanie mŕtveho kódu, zavádzajúcich konštrukcií, preusporiadanie blokov. - Kontrolno-toková – control flow flattening (vetvy programu sa konvertujú do jednej slučky riadenej stavovou premennou), opaque predicates (podmienky s konštantným, no zložito vypočítaným výsledkom), rozklad/spájanie vetvení, transformácie cyklov.
- Dátová – šifrovanie/kódovanie konštánt, rozklad dátových štruktúr na fragmenty, dynamické generovanie dát počas behu, pointer scrambling (v C/C++).
- Virtualizačná – kód sa preloží do proprietárneho bytekódu interpretovaného vlastným virtuálnym strojom; alebo polymorfné/metamorfné štruktúry, kde sa kód mení pri každom spustení (používané aj v malvéri).
Podľa úrovne aplikácie sa obfuskácia delí na zdrojovú (na úrovni zdrojového kódu), bytecode (napr. Java bytecode, .NET IL) a binary-level (priamo na spustiteľnom súbore).
Limity obfuskácie
Kód musí byť nakoniec vykonaný strojom, teda útočník ho v princípe vždy môže analyzovať – obfuskácia len znižuje efektivitu statickej/dynamickej analýzy. Virtualizácia a control-flow obfuskácia môžu zvýšiť nároky na CPU, spôsobiť problémy s kompatibilitou (mobilné platformy, JIT) a nikdy negarantujú neprelomiteľnosť – ide o techniku zvyšovania nákladov útočníka, nie o kryptografickú tvrdosť.
Obfuskácia má miesto v Secure Development Lifecycle najmä vo fáze implementácie (identifikácia kritických častí kódu) a buildovania (integrácia do build pipeline, napr. nástroje ProGuard, DexGuard, Dotfuscator pre Javu/.NET).
Praktické príklady a demonštrácie
- Živá ukážka control flow flattening na fragmente
if age >= 18: category = "adult" else: category = "minor"(rovnaký príklad ako na cvičení) – prevod nawhilecyklus riadený premennou stavu. - Porovnanie čitateľného a obfuskovaného fragmentu kódu (napr. zmena zmysluplných názvov premenných/funkcií na zavádzajúce – "výpočet okien" prezlečený za "výpočet rýchlosti").
Čo si zapamätaj
- Obfuskácia mení formu kódu, nie jeho funkciu, a nie je nikdy absolútnou ochranou.
- Štyri kategórie obfuskácie a aspoň jeden konkrétny príklad techniky z každej.
- Princíp control flow flattening.