Útok Trojan Source na zavedenie zmien v kóde, ktoré sú pre vývojára neviditeľné

Vedci z Cambrianskej univerzity zverejnili techniku nenápadnej substitúcie škodlivého kódu v recenzovaných zdrojových textoch. Pripravená metóda útoku (CVE-2021-42574) je známa pod názvom Trojan Source a zakladá sa na vytváraní textu, ktorý má odlišný vzhľad pre kompilátor/inteprét a človeka, ktorý si prezerá kód. Príklady aplikácie metódy sú demonštrované pre rôzne kompilátory a interpretery dodávané pre jazyky C, C++ (gcc a clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go a Python.

Metóda je založená na použití špeciálnych Unicode-symbolov v komentároch kódu, ktoré menia poradie zobrazenia obojsmerného textu. Pomocou takýchto ovládacích symbolov môžu byť niektoré časti textu zobrazené sprava doľava, zatiaľ čo iné zľava doprava. V každodennej praxi môžu byť takéto ovládacie symboly použité napríklad na vloženie do súboru s kódom riadkov v hebrejčine alebo arabčine. Ale ak skombinujeme riadky s rôznym smerom textu v jednej línii pomocou uvedených symbolov, úryvky textu zobrazené sprava doľava môžu prekryť už existujúci bežný text zobrazený zľava doprava.

Použitím tejto metódy je možné pridať do kódu škodlivú konštrukciu, ale následne spraviť tento text s touto konštrukciou nenápadným pri prezeraní kódu, cez prídavok do nasledujúceho komentára alebo vo vnútri literálu symbolov, ktoré sú zobrazené sprava doľava, čo povedie k prekrytiu škodlivej vložky úplne inými symbolmi. Takýto kód zostane semanticky korektný, ale bude sa rôzne interpretovať a zobrazovať.

Útok Trojan Source na zavedenie zmien v kóde, ktoré sú pre vývojára neviditeľné

V procese recenzovania kódu sa vývojár stretne s vizuálnym poriadkom výstupu symbolov a uvidí v modernom textovom editore, webovom rozhraní alebo IDE nevyvolávajúci podozrenie komentár, ale kompilátor a interpreter použijú logický poriadok symbolov a spracujú škodlivú vložku tak, ako je, bez ohľadu na obojsmerný text v komentári. Problému sú vystavené rôzne populárne editory kódu (VS Code, Emacs, Atom), ako aj rozhrania na prezeranie kódu v repozitároch (GitHub, Gitlab, BitBucket a všetky produkty Atlassian).

Útok Trojan Source na zavedenie zmien v kóde, ktoré sú pre vývojára neviditeľné

Vyčleňujú sa viaceré spôsoby využitia metódy na vykonanie škodlivých akcií: pridanie skrytého výrazu „return“, ktoré vedie k predčasnému ukončeniu vykonávania funkcie; uzavretie výrazov do komentárov, ktoré sú normálne viditeľné ako platné konštrukcie (napríklad na vypnutie dôležitých kontrol); priradenie iných reťazcových hodnôt, ktoré vedú k zlyhaniu kontrol reťazca.

Napríklad, útočník môže navrhnúť zmenu, ktorá obsahuje riadok: if access_level != „user{U+202E} {U+2066}// Check if admin{U+2069} {U+2066}“ {

ktorá sa bude zobraziť v rozhraní na preskúmanie ako if access_level != „user“ { // Check if admin

Ďalší variant útoku (CVE-2021-42694) súvisí s použitím homoglifov, symbolov, ktoré sú navonok podobné z hľadiska vzhľadu, ale líšia sa významom a majú rôzne unicode kódy (napríklad symbol „ɑ“ pripomína „a“, „ɡ“ — „g“, „ɩ“ — „l“). Takéto symboly môžu byť v niektorých jazykoch použité v názvoch funkcií a premenných, aby uviedli vývojárov do omylu. Napríklad, môžu byť definované dve funkcie s neodlíšiteľnými názvami, ktoré vykonávajú rôzne akcie. Bez podrobného rozboru niet okamžite jasné, ktorá z týchto dvoch funkcií je volaná v konkrétnom mieste.

Útok Trojan Source na zavedenie zmien v kóde, ktoré sú pre vývojára neviditeľné

Ako opatrenie na ochranu sa odporúča implementovať v kompilátoroch, interpretátoroch a nástrojoch na zostavovanie, ktoré podporujú Unicode znaky, výstup chyby alebo varovania za prítomnosti v komentároch, reťazcových literáloch alebo identifikátoroch nepárových riadiacich znakov, ktoré menia smer výstupu (U+202A, U+202B, U+202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E a U+200F). Takéto znaky by mali byť taktiež výslovne zakázané v špecifikáciách programovacích jazykov a mali by byť zohľadnené v kódovacích editoroch a rozhraniach na prácu s repozitármi.

Doplnok 1: Opravy na odstránenie zraniteľnosti boli pripravené pre GCC, LLVM/Clang, Rust, Go, Python a binutils. Problém tiež odstránili GitHub, Bitbucket a Jira. Oprava pre GitLab je v procese prípravy. Na identifikáciu problémového kódu sa odporúča použiť príkaz: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]' /path/to/source

Dodatok 2: Russ Cox, jeden z vývojárov operačného systému Plan 9 a programovacieho jazyka Go, kritizoval nadmernú pozornosť venovanú opísanému spôsobu útoku, ktorý je známy už dlho (Go, Rust, C++, Ruby) a nebol brány vážne. Podľa Coxa problém sa väčšinou týka presnosti zobrazenia informácií v kódovacích editoroch a webových rozhraniach, čo možno vyriešiť použitím správnych nástrojov a analyzátorov kódu pri recenzovaní. Preto by namiesto pritiahnuť pozornosť na teoretické útoky bolo lepšie zamerať sa na zlepšovanie procesov recenzovania kódu a závislostí.

Russ Cox tiež tvrdí, že kompilátory nie sú miestom, kde by sa mala riešiť táto problematika, pretože zakázaním nebezpečných symbolov na úrovni kompilátora zostáva obrovský súbor nástrojov, v ktorých je používanie týchto symbolov stále prípustné, ako sú systémy zostavenia, assembleri, balíkové manažéry a rôzne analyzátory konfigurácie a údajov. Ako príklad je uvedený projekt Rust, ktorý zakázal spracovanie kódu LTR/RTL v kompilátore, ale nepridal opravu do balíkového manažéra Cargo, čo umožňuje vykonať podobný útok prostredníctvom súboru Cargo.toml. Podobne môžu byť zdrojmi útokov aj súbory ako BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUmakefile, Makefile, go.mod, package.json, pom.xml a requirements.txt.

Zdroj: opennet.ru

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster