Napad Trojan Source za uvajanje sprememb v kodo, ki so nevidne razvijalcu

Raziskovalci z Univerze v Cambridgeu so objavili tehniko za tiho vstavljanje zlonamerne kode v strokovno pregledano izvorno kodo. Pripravljena metoda napada (CVE-2021-42574) je predstavljena pod imenom Trojan Source in temelji na oblikovanju besedila, ki je videti drugače za prevajalnik/tolmač in osebo, ki gleda kodo. Primeri metode so prikazani za različne prevajalnike in tolmače, ki so na voljo za C, C++ (gcc in clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go in Python.

Metoda temelji na uporabi posebnih znakov Unicode v komentarjih kode, ki spreminjajo vrstni red prikaza dvosmernega besedila. S pomočjo takšnih kontrolnih znakov je mogoče nekatere dele besedila prikazati od leve proti desni, druge pa od desne proti levi. V vsakodnevni praksi lahko takšne kontrolne znake uporabimo na primer za vstavljanje kodnih vrstic v hebrejščini ali arabščini v datoteko. Toda če združite vrstice z različnimi smermi besedila v eni vrstici z uporabo določenih znakov, lahko odlomki besedila, prikazanega od desne proti levi, prekrivajo obstoječe običajno besedilo, prikazano od leve proti desni.

S to metodo lahko kodi dodate zlonamerno konstrukcijo, nato pa naredite besedilo s to konstrukcijo nevidno, ko gledate kodo, tako da v naslednji komentar ali znotraj dobesednih znakov, prikazanih od desne proti levi, dodate, kar bo povzročilo popolno različni znaki, ki so prekriti z zlonamernim vstavkom. Takšna koda bo ostala pomensko pravilna, vendar bo interpretirana in prikazana drugače.

Napad Trojan Source za uvajanje sprememb v kodo, ki so nevidne razvijalcu

Med pregledovanjem kode se bo razvijalec soočil z vizualnim vrstnim redom znakov in videl nesumljiv komentar v sodobnem urejevalniku besedil, spletnem vmesniku ali IDE, vendar bosta prevajalnik in tolmač uporabila logični vrstni red znakov in bosta zlonamerni vnos obdelati takšen, kot je, ne da bi bil pozoren na dvosmerno besedilo v komentarjih. Težava zadeva različne priljubljene urejevalnike kode (VS Code, Emacs, Atom), pa tudi vmesnike za ogled kode v repozitorijih (GitHub, Gitlab, BitBucket in vsi izdelki Atlassian).

Napad Trojan Source za uvajanje sprememb v kodo, ki so nevidne razvijalcu

Obstaja več načinov uporabe metode za izvajanje zlonamernih dejanj: dodajanje skritega izraza »vrnitev«, ki vodi do predčasnega dokončanja funkcije; komentiranje izrazov, ki bi bili običajno vidni kot veljavni konstrukti (na primer za onemogočanje pomembnih preverjanj); dodeljevanje drugih vrednosti nizov, ki vodijo do napak pri preverjanju nizov.

Napadalec lahko na primer predlaga spremembo, ki vključuje vrstico: if access_level != "user{U+202E} {U+2066}// Preverite, ali admin{U+2069} {U+2066}" {

ki bo prikazan v vmesniku za pregled, kot da access_level != “user” { // Preverite, ali je skrbnik

Poleg tega je bila predlagana druga različica napada (CVE-2021-42694), povezana z uporabo homoglifov, znakov, ki so podobni po videzu, vendar se razlikujejo po pomenu in imajo različne kode unicode (na primer znak »ɑ« je podoben » a”, “ɡ” - “g”, “ɩ” - “l”). Podobni znaki se lahko uporabljajo v nekaterih jezikih v imenih funkcij in spremenljivk za zavajanje razvijalcev. Na primer, definirani sta lahko dve funkciji z nerazločljivima imenoma, ki izvajata različna dejanja. Brez podrobne analize ni takoj jasno, katera od teh dveh funkcij se kliče na določenem mestu.

Napad Trojan Source za uvajanje sprememb v kodo, ki so nevidne razvijalcu

Kot varnostni ukrep je priporočljivo, da prevajalniki, tolmači in orodja za sestavljanje, ki podpirajo znake Unicode, prikažejo napako ali opozorilo, če so v komentarjih, nizovnih literalih ali identifikatorjih neparni kontrolni znaki, ki spremenijo smer izhoda (U+202A, U+202B, U+202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E in U+200F). Takšne znake je treba tudi izrecno prepovedati v specifikacijah programskega jezika in jih je treba upoštevati v urejevalnikih kode in vmesnikih repozitorija.

Dodatek 1: Popravki ranljivosti so bili pripravljeni za GCC, LLVM/Clang, Rust, Go, Python in binutils. Težavo so odpravili tudi GitHub, Bitbucket in Jira. Popravek za GitLab je v teku. Za prepoznavanje problematične kode je priporočljivo uporabiti ukaz: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]' /path/to/ vir

Dodatek 2: Russ Cox, eden od razvijalcev OS Plan 9 in programskega jezika Go, je kritiziral pretirano pozornost opisani metodi napada, ki je že dolgo znana (Go, Rust, C++, Ruby) in ni jemana resno . Po Coxovih besedah ​​se težava nanaša predvsem na pravilen prikaz informacij v urejevalnikih kode in spletnih vmesnikih, kar je mogoče rešiti z uporabo pravilnih orodij in analizatorjev kode med pregledovanjem. Zato bi bilo namesto opozarjanja na špekulativne napade bolj primerno, da se osredotočimo na izboljšanje kode in postopkov pregleda odvisnosti.

Ras Cox tudi meni, da prevajalniki niso pravi kraj za odpravo težave, saj s prepovedjo nevarnih simbolov na ravni prevajalnika ostane ogromna plast orodij, v katerih je uporaba teh simbolov sprejemljiva, kot so gradbeni sistemi, sestavljalci, upravitelji paketov in različni konfiguracijski razčlenjevalniki in podatki. Kot primer je naveden projekt Rust, ki je prepovedal obdelavo kode LTR/RTL v prevajalniku, ni pa dodal popravka v upravitelju paketov Cargo, ki omogoča podoben napad preko datoteke Cargo.toml. Podobno lahko datoteke, kot so BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUmakefile, Makefile, go.mod, package.json, pom.xml in requirements.txt, postanejo viri napadov.

Vir: opennet.ru

Dodaj komentar