offuscamento
Che cos’è l’offuscamento?
Offuscamento significa rendere qualcosa di difficile da capire. Il codice di programmazione è spesso offuscato per proteggere la proprietà intellettuale o segreti commerciali e per impedire a un utente malintenzionato di decodificare un programma software proprietario.
Crittografare parte o tutto il codice di un programma è un metodo di offuscamento. Altri approcci includono l’eliminazione di metadati potenzialmente rivelatori, la sostituzione di nomi di classi e variabili con etichette prive di significato e l’aggiunta di codice inutilizzato o privo di significato a uno script di applicazione. Uno strumento chiamato obfuscator convertirà automaticamente il codice sorgente semplice in un programma che funziona allo stesso modo, ma è più difficile da leggere e capire.
Sfortunatamente, gli autori di codice dannoso usano anche questi metodi per impedire che i loro meccanismi di attacco vengano rilevati dagli strumenti antimalware. L’attacco 2020 SolarWinds è un esempio di hacker che utilizzano l’offuscamento per eludere le difese.
Le tecniche di deobfuscazione possono essere utilizzate per decodificare ob o annullare ob offuscamento. Queste tecniche includono l’affettatura del programma, che comporta il restringimento del codice del programma solo per le istruzioni pertinenti in un particolare punto del programma. L’ottimizzazione del compilatore e la sintesi del programma sono altre due tecniche di deobfuscazione. Offuscamento mira a rendere il reverse engineering difficile e non vale la pena.
Come funziona l’offuscamento?
L’offuscamento nel codice del computer utilizza frasi complesse e logiche ridondanti per rendere il codice difficile da comprendere per il lettore. L’obiettivo è quello di distrarre il lettore con la sintassi complicata di ciò che stanno leggendo e rendere difficile per loro determinare il vero contenuto del messaggio.
Con il codice del computer, il lettore può essere una persona, un dispositivo informatico o un altro programma. Offuscamento viene utilizzato anche per ingannare gli strumenti antivirus e altri programmi che si basano molto sulle firme digitali per interpretare il codice. I decompilatori sono disponibili per linguaggi come Java, sistemi operativi come Android e iOS e piattaforme di sviluppo come. NET. Possono decodificare automaticamente il codice sorgente; l’offuscamento mira a rendere difficile anche a questi programmi la loro decompilazione.
L’offuscamento del codice non consiste nel modificare il contenuto del codice originale di un programma, ma piuttosto nel rendere più confuso il metodo di consegna e la presentazione di quel codice. L’offuscamento non altera il funzionamento del programma o il suo output finale.
Quello che segue è un frammento di esempio del normale codice JavaScript:
var greeting = 'Hello World';greeting = 10;var product = greeting * greeting;
Lo stesso frammento in forma offuscata assomiglia a questo:
var _0x154f=;var _0x52df=function(_0x159d61,_0x12b953){_0x159d61=_0x159d61-0x122;var _0x154f4b=_0x154f;return _0x154f4b;};(function(_0x19e682,_0x2b7215){var _0x5e377c=_0x52df;while(!!){try{var _0x2d3a87=-parseInt(_0x5e377c(0x129))*parseInt(_0x5e377c(0x123))+-parseInt(_0x5e377c(0x125))*parseInt(_0x5e377c(0x12e))+parseInt(_0x5e377c(0x127))*-parseInt(_0x5e377c(0x126))+-parseInt(_0x5e377c(0x124))*-parseInt(_0x5e377c(0x12f))+-parseInt(_0x5e377c(0x128))*-parseInt(_0x5e377c(0x12b))+parseInt(_0x5e377c(0x12a))*parseInt(_0x5e377c(0x12d))+parseInt(_0x5e377c(0x12c))*parseInt(_0x5e377c(0x122));if(_0x2d3a87===_0x2b7215)break;else _0x19e682(_0x19e682());}catch(_0x22c179){_0x19e682(_0x19e682());}}}(_0x154f,0x1918c));var greeting='Hello\x20World';greeting=0xa;var product=greeting*greeting;
La versione offuscata è quasi impossibile da seguire usando l’occhio umano.
Tecniche di offuscamento
L’offuscamento comporta diversi metodi. Spesso, vengono utilizzate più tecniche per creare un effetto a strati.
I programmi scritti in linguaggi software compilati, come C # e Java, sono più facili da offuscare. Questo perché creano istruzioni di livello intermedio che sono generalmente più facili da leggere. Al contrario, C++ è più difficile da offuscare, perché compila il codice macchina, che è più difficile per le persone con cui lavorare.
Alcune tecniche comuni di offuscamento includono quanto segue:
- Rinominare. L’offuscatore altera i metodi e i nomi delle variabili. I nuovi nomi possono includere caratteri non stampabili o invisibili.
- Imballaggio. Questo comprime l’intero programma per rendere il codice illeggibile.
- Flusso di controllo. Il codice decompilato è fatto per assomigliare alla logica spaghetti, che è non strutturata e difficile da mantenere il codice in cui la linea di pensiero è oscurata. I risultati di questo codice non sono chiari ed è difficile dire quale sia il punto del codice guardandolo.
- Trasformazione del modello di istruzione. Questo approccio prende istruzioni comuni create dal compilatore e le scambia con istruzioni più complesse e meno comuni che fanno effettivamente la stessa cosa.
- Inserimento di codice fittizio. Il codice fittizio può essere aggiunto a un programma per renderlo più difficile da leggere e decodificare, ma non influisce sulla logica o sul risultato del programma.
- Metadati o rimozione del codice non utilizzato. Il codice e i metadati inutilizzati forniscono al lettore informazioni extra sul programma, proprio come le annotazioni su un documento Word, che possono aiutarli a leggerlo ed eseguirne il debug. Rimozione di metadati e codice inutilizzato lascia il lettore con meno informazioni sul programma e il suo codice.
- Inserimento predicato opaco. Un predicato nel codice è un’espressione logica vera o falsa. I predicati opachi sono rami condizionali-o istruzioni if-then-in cui i risultati non possono essere facilmente determinati con l’analisi statistica. L’inserimento di un predicato opaco introduce codice non necessario che non viene mai eseguito ma è sconcertante per il lettore che cerca di comprendere l’output decompilato.
- Anti-debug. Gli ingegneri del software legittimi e gli hacker utilizzano strumenti di debug per esaminare il codice riga per riga. Con questi strumenti, gli ingegneri del software possono individuare problemi con il codice e gli hacker possono usarli per decodificare il codice. I professionisti della sicurezza IT possono utilizzare strumenti anti-debug per identificare quando un hacker esegue un programma di debug come parte di un attacco. Gli hacker possono eseguire strumenti anti-debug per identificare quando viene utilizzato uno strumento di debug per identificare le modifiche che stanno apportando al codice.
- Anti-manomissione. Questi strumenti rilevano il codice che è stato manomesso e, se è stato modificato, interrompe il programma.
- Crittografia stringa. Questo metodo utilizza la crittografia per nascondere le stringhe nell’eseguibile e ripristina i valori solo quando sono necessari per eseguire il programma. Ciò rende difficile passare attraverso un programma e cercare stringhe particolari.
- Trasposizione del codice. Questo è il riordino di routine e rami nel codice senza avere un effetto visibile sul suo comportamento.
Come misurare il successo dell’offuscamento
Il successo dei metodi di offuscamento può essere misurato utilizzando i seguenti criteri:
- Forza. La misura in cui il codice trasformato resiste ai tentativi di deobfuscazione automatizzati determina la forza. Maggiore è lo sforzo, il tempo e le risorse necessari, più forte è il codice.
- Differenziazione. Il grado in cui il codice trasformato differisce dall’originale è un’altra misura di quanto sia efficace. Alcuni dei modi usati per giudicare la differenziazione includono:
- Il numero di predicati che il nuovo codice contiene.
- La profondità dell’albero di ereditarietà (DIT) metric una metrica utilizzata per indicare la complessità del codice. Un DIT più alto significa un programma più complesso.
- Spese. Un metodo di offuscamento efficiente in termini di costi sarà più utile di uno che è costoso, in particolare quando si tratta di quanto bene scala per applicazioni più grandi.
- Complessità. Più livelli aggiunge l’offuscatore, più complesso sarà il programma, rendendo l’offuscamento più efficace.
Vantaggi di offuscamento
I principali vantaggi di offuscamento sono i seguenti:
- Segretezza. L’offuscamento nasconde le preziose informazioni contenute nel codice. Questo è un vantaggio per le organizzazioni legittime che cercano di proteggere il codice da concorrenti e aggressori. Al contrario, i cattivi attori sfruttano la segretezza dell’offuscamento per nascondere il loro codice dannoso.
- Efficienza. Alcune tecniche di offuscamento, come la rimozione del codice inutilizzato, hanno l’effetto di ridurre il programma e renderlo meno dispendioso in termini di risorse da eseguire.
- Sicurezza. Offuscamento è un metodo di sicurezza integrato, a volte indicato come applicazione di auto-protezione. Invece di utilizzare un metodo di sicurezza esterno, funziona all’interno di ciò che viene protetto. È adatto per proteggere le applicazioni che vengono eseguite in un ambiente non attendibile e che contengono informazioni sensibili.
Svantaggi di offuscamento
Uno dei principali svantaggi di offuscamento è che viene utilizzato anche in malware. Gli autori di malware lo usano per eludere i programmi antivirus che scansionano il codice per funzionalità specifiche. Oscurando tali caratteristiche, il malware appare legittimo al software antivirus.
Le tecniche comuni utilizzate dagli autori di malware includono:
- Esclusivo o (XOR). Un’operazione che nasconde i dati applicando valori XOR al codice in modo che solo un occhio addestrato sarebbe in grado di decifrarlo.
- ROT-13. Un’istruzione che sostituisce il codice per caratteri casuali.
Con offuscamento, invece di sviluppare nuovo malware, autori riconfezionare comunemente usato, metodi di attacco delle materie prime per mascherare le loro caratteristiche. In alcuni casi, gli attori malintenzionati includono tecniche specifiche del fornitore.
Un altro svantaggio dell’offuscamento è che può rendere il codice più difficile da leggere. Ad esempio, il codice che utilizza il metodo di offuscamento della crittografia delle stringhe richiede la decrittografia delle stringhe in fase di runtime, il che rallenta le prestazioni.
Offuscamento e SolarWinds
Un attacco a SolarWinds, un produttore di software di gestione e monitoraggio IT di Austin, in Texas, che si pensa sia iniziato già a settembre 2019, ha provocato la violazione di una serie di altre aziende e agenzie governative. L’attacco è stato scoperto nel dicembre 2020 ed è attribuito agli hacker russi. Inizialmente ha compromesso la piattaforma di gestione IT Orion di SolarWinds.
Gli aggressori usavano il malware Sunburst, che combinava offuscamento, apprendimento automatico e tecniche AI per piantare una backdoor negli aggiornamenti software per la piattaforma Orion. Per mascherare i loro sforzi e le difese di bypass, hanno alterato i registri di controllo, cancellato file e programmi dopo l’uso e attività simulate per farlo apparire come applicazioni legittime sulla rete.
Si sospetta che questo attacco alla supply chain sia rimasto inosservato per più di un anno. Il malware inserito nel codice Orion giaceva dormiente e nascosto fino a quando gli utenti hanno scaricato gli aggiornamenti infetti. Si è poi diffuso attraverso la rete inosservato e infettato una lunga lista di organizzazioni che utilizzano Orion.
L’offuscamento è una delle molte tecniche che gli hacker impiegano per penetrare nei sistemi IT. Scopri di più sulla difesa contro vari tipi di attacchi alla sicurezza informatica nella guida approfondita alla pianificazione della sicurezza informatica di TechTarget.