Co je obfuskace?
On 25 října, 2021 by adminCo je obfuskace kódu?
Obfuskace kódu je proces úpravy spustitelného souboru tak, aby již nebyl pro hackera užitečný, ale zůstal plně funkční. Tento proces sice může modifikovat skutečné instrukce metody nebo metadata, ale nemění výstup programu. Aby bylo jasno, s dostatkem času a úsilí lze reverzním inženýrstvím upravit téměř každý kód. Na některých platformách, jako je Java, Android, iOS nebo .NET (např. Xamarin, C#, VB.NET, F#), však lze pomocí bezplatných dekompilátorů snadno zpětně analyzovat zdrojový kód ze spustitelného souboru nebo knihovny prakticky bez času a úsilí. Automatizovaná obfuskace kódu činí reverzní inženýrství programu obtížným a ekonomicky neproveditelným.
Proč používat obfuskaci kódu?
Ztížením reverzního inženýrství aplikace se můžete chránit před krádeží obchodního tajemství (duševního vlastnictví), neoprávněným přístupem, obcházením licenčních nebo jiných kontrol a odhalením zranitelností.
Jak obfuskace funguje?
Obfuskace kódu se skládá z mnoha různých technik, které se mohou vzájemně doplňovat a vytvářet tak vrstvenou obranu. Nejúčinnější je u jazyků, které vytvářejí nějakou formu instrukcí střední úrovně, jako je Java nebo jazyky .NET jako C#, VB.NET, Managed C++, F# atd. Mezi typické příklady obfuskace a technik zabezpečení aplikací patří:
Obfuskace přejmenováním
Přejmenování mění názvy metod a proměnných. Ztěžuje pochopení dekomprimovaného zdrojového kódu člověkem, ale nemění provádění programu. Nové názvy mohou využívat různá schémata jako „a“, „b“, „c“ nebo čísla, netisknutelné znaky nebo neviditelné znaky. A jména mohou být přetížená, pokud mají různý rozsah. Obfuskace jmen je základní transformací, kterou používá většina obfuskačních programů pro sítě .NET (C# atd.), iOS, Java a Android.
Šifrování řetězců
Ve spravovaném spustitelném souboru jsou všechny řetězce jasně zjistitelné a čitelné. I když jsou metody a proměnné přejmenovány, lze řetězce použít k nalezení kritických částí kódu hledáním odkazů na řetězce uvnitř binárního souboru. To se týká i zpráv (zejména chybových), které se zobrazují uživateli. Aby byla zajištěna účinná bariéra proti tomuto typu útoku, šifrování řetězců skrývá řetězce ve spustitelném souboru a obnovuje jejich původní hodnotu pouze v případě potřeby. Dešifrování řetězců za běhu obvykle způsobuje mírné snížení výkonu za běhu.
Obfuskace řídicích toků
Obfuskace řídicích toků syntetizuje podmíněné, větvené a iterativní konstrukce, které vytvářejí platnou logiku spustitelného souboru, ale při dekompilování poskytují nedeterministické sémantické výsledky. Jednodušeji řečeno, způsobuje, že dekompilovaný kód vypadá jako logické špagety, což je pro hackera velmi obtížné pochopit. Tyto techniky mohou ovlivnit výkonnost metody za běhu.
Transformace vzorů instrukcí
Konvertuje běžné instrukce vytvořené překladačem na jiné, méně zjevné konstrukce. Jedná se o zcela legální instrukce strojového jazyka, které nemusí být čistě mapovány do jazyků vysoké úrovně, jako je Java nebo C#. Příkladem je ukládání přechodných proměnných do mezipaměti, které využívá zásobníkovou povahu běhových prostředí Java a .NET.
Vkládání fiktivního kódu
Vkládání kódu do spustitelného souboru, který neovlivňuje logiku programu, ale rozbíjí dekompilátory nebo značně ztěžuje analýzu zpětně analyzovaného kódu.
Odstranění nepoužívaného kódu a metadat
Odstranění ladicích informací, nedůležitých metadat a použitého kódu z aplikací je zmenší a sníží množství informací dostupných útočníkovi. Tento postup může mírně zlepšit výkonnost za běhu.
Binární spojování/slučování
Tato transformace spojuje více vstupních spustitelných souborů/knihoven do jednoho nebo více výstupních binárních souborů. Spojování lze použít ke zmenšení aplikace, zejména při použití s přejmenováním a ořezáváním, Může zjednodušit scénáře nasazení a může snížit informace dostupné hackerům.
Opaque Predicate Insertion
Obfuskuje přidáním podmíněných větví, které se vždy vyhodnotí na známé výsledky – výsledky, které nelze snadno určit pomocí statické analýzy. Tímto způsobem se zavádí potenciálně nesprávný kód, který se ve skutečnosti nikdy neprovede, ale je matoucí pro útočníky, kteří se snaží porozumět dekompilovanému výstupu.
Anti-Tamper
Obfuskátor může do kódu vložit vlastní ochranu aplikace, aby ověřil, že do aplikace nebylo nijak zasahováno. Pokud je zjištěn zásah, může aplikaci vypnout, omezit její funkčnost, vyvolat náhodné pády (aby se zamaskoval důvod pádu) nebo provést jinou vlastní akci. Může také odeslat zprávu službě, aby poskytla podrobnosti o zjištěném zásahu.
Anti-Debug
Když se hacker snaží pirátsky zneužít nebo padělat vaši aplikaci, ukrást vaše data nebo změnit chování kritické části infrastrukturního softwaru, téměř jistě začne s reverzním inženýrstvím a projde vaši aplikaci pomocí debuggeru. Obfuscator může vrstvit vlastní ochranu aplikace tím, že do ní vloží kód, který zjistí, zda se vaše produkční aplikace spouští v rámci debuggeru. Pokud je debugger použit, může poškodit citlivá data (čímž je ochrání před krádeží), vyvolat náhodný pád (aby se zamaskovalo, že pád byl výsledkem kontroly ladění) nebo provést jinou vlastní akci. Může také odeslat zprávu službě, aby poskytl varovný signál.
Měl bych svou aplikaci obfuskovat?
Pokud vydáváte software, který běží v nedůvěryhodném prostředí a má duševní vlastnictví, poskytuje přístup k citlivým informacím nebo má uzavřené funkce, důrazně zvažte použití obfuskace a vlastní ochrany aplikace za běhu. Díky obfuskaci je pro útočníky mnohem obtížnější prověřit kód a analyzovat aplikaci. Hackerům také ztěžuje ladění a manipulaci s aplikací. Konečným cílem je přidat vrstvu ochrany, která z aplikace ztíží získání nebo odhalení užitečných informací, jako jsou obchodní tajemství (IP), pověření nebo bezpečnostní zranitelnosti. Měla by také ztížit modifikaci aplikační logiky nebo přebalení aplikace škodlivým kódem.
.
Napsat komentář