Verwendung unsichtbarer Unicode-Zeichen zum Ausblenden von Aktionen im JavaScript-Code

Im Anschluss an die Angriffsmethode „Trojan Source“, die auf der Verwendung von Unicode-Zeichen basiert, die die Anzeigereihenfolge von bidirektionalem Text ändern, wurde eine weitere Technik zur Einführung versteckter Aktionen veröffentlicht, die auf JavaScript-Code anwendbar ist. Die neue Methode basiert auf der Verwendung des Unicode-Zeichens „ㅤ“ (Code 0x3164, „HANGUL FILLER“), das ein Buchstabe ist, aber keinen sichtbaren Inhalt hat. Die Unicode-Kategorie, zu der dieses Zeichen gehört, ist seit der ECMAScript 2015-Spezifikation für die Verwendung in JavaScript-Variablennamen zulässig, was es ermöglicht, unsichtbare Variablen oder neue Variablen zu erstellen, die von anderen Variablen in gängigen Code-Editoren wie Notepad++ und VS Code nicht zu unterscheiden sind.

Als Beispiel wird der Code für die Node.js-Plattform angegeben, in dem mithilfe einer Variablen, die aus einem einzelnen Zeichen „ㅤ“ besteht, eine Hintertür ausgeblendet wird, die es ermöglicht, den vom Angreifer angegebenen Code auszuführen: app.get( '/network_health', async (req, res) = > { const { timeout,ㅤ} = req.query; // sagt eigentlich „const { timeout,ㅤ \u3164}“ const checkCommands = [ 'ping -c 1 google. com', 'curl -s http:// example.com/',ㅤ // Komma gefolgt von \u3164 ];

Über den externen Parameter wird auf den ersten Blick nur der Timeout-Wert übergeben und das Array mit den auszuführenden Befehlen enthält eine harmlose feste Liste. Tatsächlich wird jedoch nach der Timeout-Variablen der Wert einer weiteren unsichtbaren Variablen mit dem Symbolcode \u3164 zugewiesen, der ebenfalls in das Array ausführbarer Befehle eingefügt wird. Wenn also eine solche Struktur vorhanden ist, kann ein Angreifer eine Anfrage wie „https://host:8080/network_health?%E3%85%A4=command“ senden, um die Hintertür zu aktivieren und seinen Code auszuführen.

Als weiteres Beispiel wird das Zeichen „ǃ“ (ALVEOLAR CLICK) angegeben, das verwendet werden kann, um den Anschein eines Ausrufezeichens zu erwecken. Beispielsweise ist der Ausdruck „if(environmentǃ=ENV_PROD){“ bei der Ausführung in Node.js 14 immer wahr, da er nicht auf Unterschiede prüft, sondern die Variable „environmentǃ“ auf ENV_PROD setzt. Zu den irreführenden Unicode-Zeichen gehören „/“, „−“, „+“, „⩵“, „❨“, „⫽“, „꓿“ und „∗“.

Source: opennet.ru

Kommentar hinzufügen