Recentemente ho iniziato a conoscere meglio il funzionamento degli antivirus e di altri prodotti antimalware e mi sono reso conto che la maggior parte di questi utilizza principalmente 3 tecniche diverse per rilevare e bloccare il malware:
- Rilevamento basato su firma
- Analisi euristiche
- Sandboxing (per i file che attraversano il filtraggio di 1. e 2.)
All'inizio mi è sembrata una grande idea, specialmente le funzioni intelligenti sandboxing che potrebbero essere in grado di rilevare l'esecuzione ritardata, le contromisure della macchina virtuale, la crittografia e altro ancora.
Quindi un modo per aggirare quelle tecniche di rilevamento mi è passato per la testa, quindi l'ho testato e funziona contro tutti gli antivirus che ho provato e probabilmente su chiunque faccia affidamento su quelle tecniche:
Che cosa succede se il codice dannoso viene crittografato in un file dall'aspetto innocente con una passphrase che sarà conosciuta solo dalla vittima (che ovviamente non ne è a conoscenza) e che sarà necessaria per decrittografare il codice dannoso ed eseguire al momento dell'esecuzione?
Supponiamo che un codice dannoso sia crittografato utilizzando la funzione di crittografia AES256 con una specifica passphrase. Quindi la stringa risultante crittografata viene inserita in un file JScript che contiene le istruzioni per decrittografarlo una volta che l'utente digita la frase di accesso ed eseguirlo tramite una funzione eval () in fase di runtime. Non c'è modo per l'antivirus di sapere o indovinare la frase di passaggio giusto? E non c'è modo di sapere che c'è del codice malevolo nascosto all'interno di quel file JScript. E poiché verrà decrittografato in memoria solo in fase di runtime, senza mai essere scritto sul disco, il rilevamento basato su firma e l'analisi euristica falliranno. Lo stesso vale per il sandboxing poiché nessuna azione dannosa verrà attivata senza che l'utente debba digitare la passphrase.
Ora per fare in modo che l'utente digiti la pass phrase, può essere usato un semplice tipo di Captcha, che chiede all'utente di digitare le parole che vede in un'immagine (o il disegno ASCII per esempio ^^) per assicurarsi che sia lui non un robot. Quindi, quando l'utente lo digiterà, il codice dannoso verrà decrittografato ed eseguito.
Come ci si dovrebbe difendere da questo tipo di attacco? Forse un antivirus avanzato che utilizza tecniche di deep learning potrebbe essere in grado di rilevarlo, ma mi sembra che gli attuali programmi antivirus siano completamente vulnerabili ad esso.
Aggiornato: esempio di codice che illustra la tecnica sopra
Ecco una semplice implementazione in JScript:
var encryptionFunction = ; // Any encryption function, e.g. AES256 from CryptoJS
var hiddenCode = ; // Write any code here, e.g. WScript.Echo('My code has been executed !');
var passphrase = "Any pass phrase"; // It'll be used as a CAPTCHA challenge-response, e.g. picture with the passphrase or ASCII drawing
var encryptedCode = encryptionFunction(hiddenCode, passphrase); // Our hidden code will be encrypted with the passphrase
var template = "var decryptionFunction = ;" + // The decryption function is defined here
"var passphrase = InputBox('Your CAPTCHA challenge goes here');" + // CAPTCHA in an Input Box, user's input = passphrase
"eval(decryptionFunction('" + encryptedCode + "', passphrase))"; // Decryption of the encrypted code thanks to the user's input and run at execution time through eval()
var file = ; // Create a new JScript file (or WSF) and put the template as its content
08/04/2017 - Prova del concetto + Scansione antivirus
Ho aggiunto una dimostrazione del concetto:
link
È fondamentalmente un semplice file WSF che visualizza una finestra che richiede una password, nascosta in un disegno ASCII. Una volta che l'utente digita la password corretta, il codice crittografato incorporato nel file verrà decrittografato ed eseguito in runtime, visualizzando semplicemente "Il mio codice è stato eseguito!" all'interno di una finestra.
Come pensavo, la routine di decrittografia non era considerata dannosa da alcun antivirus su VirusTotal (0/56), ecco la scansione antivirus:
link