Cambridge'i ĂŒlikooli teadlased avaldasid tehnika, mis vĂ”imaldab varjatud pahatahtliku koodi sisestamist ĂŒlevaatatud lĂ€htefailidesse. Valmistatud rĂŒnnakumeetod (CVE-2021-42574) on tuntud nimega Trojan Source ning pĂ”hineb teksti kujundamisel, mis nĂ€eb vĂ€lja erinev kompilaatori/interpretatori ja koodi vaatava inimese jaoks. Meetodi rakendamise nĂ€ited on demonstreeritud erinevate kompilatorite ja interpretatorite jaoks, mis on saadaval keeltele C, C++ (gcc ja clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go ja Python.
Meetod pĂ”hineb koodikommentaarides spetsiaalsete Unicode-mĂ€rkide kasutamisel, mis muudavad kahepoolselt suunatud teksti kuvamise jĂ€rjekorda. Selliste juhtmĂ€rkide abil saab ĂŒhe osa tekstist kuvada vasakult paremale ja teise parelt vasakule. IgapĂ€evaelus vĂ”ib selliseid juhtmĂ€rke kasutada nĂ€iteks heebrea vĂ”i araabia keeles kirjutatud ridade lisamiseks koodifaili. Kuid kui kombineerida erineva suunaga stringe ĂŒhes reas, vĂ”ivad paremale suunaga tekstilĂ”igud kattuda juba olemasoleva tavatekstiga, mis kuvatakse vasakult paremale.
Kasutades seda meetodit, saab koodi lisada kahjuliku konstruktsiooni, kuid seejĂ€rel muuta selle konstruktsiooniga tekst vaatamisel kodeerituks, lisades sellele jĂ€rgnevasse kommentaari vĂ”i liitrea sisse paremale suunaga mĂ€rke, mis toob kaasa kahjuliku sisestuse ĂŒlemise kihina tĂ€iesti erinevate mĂ€rkide. Selline kood jÀÀb semantiliselt korrektseks, kuid seda tĂ”lgendatakse ja kuvatakse erinevalt.

Koodi ĂŒlevaatamise protsessis seisab arendaja silmitsi mĂ€rkide visuaalse vĂ€ljundkorra ja nĂ€eb kaasaegses tekstiredaktoris, veebiliideses vĂ”i IDE-s kahtlusi Ă€ratavat kommentaari, kuid kompilaator ja tĂ”lgendaja kasutavad mĂ€rkide loogilist jĂ€rjekorda ning töötlevad pahatahtliku sisendi nii, nagu see on, pööramata tĂ€helepanu kommentaari suunatud tekstile. Probleemiga on seotud erinevad populaarsed koodiredaktorid (VS Code, Emacs, Atom) ning koodi vaatamise liidesed repos (GitHub, Gitlab, BitBucket ja kĂ”ik Atlassiani tooted).

RÔhutatakse mitmeid viise meetodi kasutamiseks pahatahtlike tegevuste elluviimiseks: peidetud vÀljendi "return" lisamine, mis pÔhjustab funktsiooni enneaegse lÔpetamise; kommentaari sisse peidetud vÀljendite kujundamine, mis nÀevad normaaltingimustes vÀlja nagu kehtivad konstruktsioonid (nÀiteks oluliste kontrollide keelamine); muude stringivÀÀrtuste omistamine, mis pÔhjustavad stringide kontrollimise ebaÔnnestumise.
NĂ€iteks vĂ”ib rĂŒndaja pakkuda muudatust, mis sisaldab rida: if access_level != "user{U+202E} {U+2066}// Check if admin{U+2069} {U+2066}" {
mis see kuvatakse liideses ĂŒlevaatamiseks nagu if access_level != «user» { // Kontrolli, kas on administraator
Lisaks on vĂ€lja pakutud veel ĂŒks rĂŒnnakute variant (CVE-2021-42694), mis on seotud omoglĂŒĂŒfidest, vĂ€limuselt sarnastest mĂ€rkidest, kuid erineva tĂ€henduse ja erinevate unicode-koodidega (nĂ€iteks mĂ€rk «É» sarnaneb «a», «ɥ» â «g», «ɩ» â «l»). Selliseid mĂ€rke saab mĂ”nes keeles funktsioonide ja muutujate nimedes kasutada arendajate petmiseks. NĂ€iteks vĂ”ivad olla mÀÀratud kaks funktsiooni, mille nimed on eristamatud, kuid mis tĂ€idavad erinevaid toiminguid. Ilma pĂ”hjalikku analĂŒĂŒsi tegemata pole kohe selge, milline nendest kahest funktsioonist kutsutakse esile antud kohas.

Kaitseks soovitatakse rakendada kompilaatorites, tÔlgendustes ja ehitusvahendites, mis toetavad Unicode mÀrke, veateate vÔi hoiatuse vÀljastamist, kui kommentaarides, stringi literatuurides vÔi identifikaatorites on paarituid juhtimisnÀhte, mis muudavad vÀljundi suunda (U+202A, U+202B, U+202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E ja U+200F). Taolised mÀrgid peaksid olema ka programmi keelte spetsifikatsioonides selgelt keelatud ning neid tuleb arvesse vÔtta koodiredaktorites ja hoidlate haldamise liidestes.
Lisa 1: Haavatavuse kÔrvaldamiseks on ette valmistatud parandused GCC, LLVM/Clang, Rust, Go, Python ja binutils jaoks. Probleem on lahendatud ka GitHubis, Bitbucketis ja Jiras. GitLabi jaoks on paranduse ettevalmistamine pooleli. Probleemse koodi tuvastamiseks on soovitatud kasutada kÀsku: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]' /path/to/source
TĂ€iendav 2: Russ Cox, Plan 9 operatsioonisĂŒsteemi ja Go programmeerimiskeele arendaja, kritiseeris liigset tĂ€helepanu rakendatud rĂŒnnakumeetodile, mis on juba pikka aega tuntud (Go, Rust, C++, Ruby) ning ei ole tĂ”siseltvĂ”etavana kĂ€sitletud. Coxi arvates on probleem peamiselt seotud teabe korrektsusega koodiredaktorites ja veebiliidestes, ning see on lahendatav Ă”ige tööriistade ja koodianalĂŒsaatorite kasutamisega ĂŒlevaatamise ajal. Seega oleks mĂ”istlikum suunata tĂ€helepanu mitte spekulatiivsetele rĂŒnnakutele, vaid keskenduda koodide ja sĂ”ltuvuste ĂŒlevaatusprotsesside parandamisele.
Ras Cox arvab samuti, et kompilaatorid ei ole Ă”ige koht probleemide lahendamiseks, kuna ohtlike sĂŒmbolite keeldumine kompilaatori tasemel jĂ€tab tohutu hulga tööriistu, kus nende sĂŒmbolite kasutamine on endiselt lubatud, nagu ehitussĂŒsteemid, assemblerid, paketihaldurid ja erinevad konfiguratsiooni ning andmete analĂŒsaatorid. NĂ€iteks toob ta vĂ€lja projekti Rust, mis keelas LTR/RTL koodi töötlemise kompilaatoris, kuid ei lisanud parandust paketihaldurisse Cargo, mis vĂ”imaldab lĂ€bi Cargo.toml faili sarnast rĂŒnnakut. Samuti vĂ”ivad rĂŒnnakute allikateks olla failid nagu BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUmakefile, Makefile, go.mod, package.json, pom.xml ja requirements.txt.
Allikas: opennet.ru
