Cambridgeko Unibertsitateko ikertzaileek kode gaiztoa parekideek berrikusitako iturburu-kodean detektatu gabe txertatzeko teknika bat argitaratu dute. Trojan Source izeneko eraso-metodoa (CVE-2021-42574), konpiladore/interpretatzailearentzat eta berrikusle batentzat desberdina den testua sortzean oinarritzen da. Metodoaren aplikazioaren adibideak erakusten dira C, C++ (gcc eta clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go eta Python-erako eskuragarri dauden hainbat konpiladore eta interpreterentzat.
Metodoa kode-iruzkinetan Unicode karaktere bereziak erabiltzean oinarritzen da, testu bidirekzionalaren bistaratze-ordena aldatzen dutenak. Kontrol-karaktere hauek testuaren zati batzuk ezkerretik eskuinera bistaratzea ahalbidetzen dute, eta beste batzuk eskuinetik ezkerrera. Eguneroko praktikan, kontrol-karaktere hauek erabil daitezke, adibidez, hebreerazko edo arabierazko kateak kode-fitxategi batean txertatzeko. Hala ere, testu-norabide desberdinak dituzten kateak lerro bakarrean konbinatzen badira karaktere hauek erabiliz, eskuinetik ezkerrera testu-atalak gainjarri daitezke dagoeneko dagoen ezkerretik eskuinera testu normalarekin.
Metodo hau erabiliz, eraikuntza gaizto bat txerta daiteke kodean, baina eraikuntza hori duen testua detektaezina bihur daiteke eskuinetik ezkerrera karaktereak gehituz ondorengo iruzkin bati edo literal baten barruan, eta ondorioz, karaktere guztiz desberdinak txertatze gaiztoaren gainean gainjartzen dira. Kode hori semantikoki zuzena izango da, baina modu ezberdinean interpretatuko eta bistaratuko da.

Kodea berrikustean, garatzaileak karaktereen ordena bisualarekin egingo du topo eta iruzkin kaltegabe bat ikusiko du testu-editore moderno batean, web interfaze batean edo IDE batean. Hala ere, konpiladoreak eta interpretatzaileak karaktereen ordena logikoa erabiliko dute eta txertatze gaiztoa prozesatuko dute dagoen bezala, iruzkineko testu bidirekzionala alde batera utzita. Arazo honek hainbat kode-editore ezagun eragiten ditu (VS Code, Emacs, Atom), baita biltegietan kodea ikusteko interfazeetan ere (GitHub, Gitlab, BitBucket eta Atlassian produktu guztiak).

Metodo hau hainbat modutan erabil daiteke ekintza gaiztoak egiteko: funtzioa goiz amaitzea eragiten duen "return" adierazpen ezkutu bat gehitzea; normalean eraikuntza baliodun gisa ikusten diren adierazpenak komentatzea (adibidez, egiaztapen garrantzitsuak desgaitzeko); kateen balidazio-hutsegiteak eragiten dituzten beste kate-balio batzuk esleitzea.
Adibidez, erasotzaile batek aldaketa bat proposa dezake lerro hau barne hartzen duena: if access_level != "user{U+202E} {U+2066}// Check if admin{U+2069} {U+2066}" {
berrikuspen interfazean bistaratuko dena, baldin eta access_level != "user" { // Egiaztatu ea admin den
Beste eraso aldaera bat (CVE-2021-42694) proposatu da, homoglifoen erabilera dakarrena: itxuraz antzekoak diren baina esanahi desberdinak eta Unicode kode desberdinak dituzten ikurrak (adibidez, "ɑ" ikurra "a"-ren antza du, "ɡ" "g"-ren antza du eta "ɩ" "l"-ren antza du). Ikur horiek hizkuntza batzuetan erabil daitezke funtzio eta aldagai izenetan garatzaileak nahasteko. Adibidez, ekintza desberdinak egiten dituzten izen bereizezinak dituzten bi funtzio defini daitezke. Azterketa zehatzik gabe, ez dago berehala argi bi funtzioetatik zein deitzen den kokapen jakin batean.

Segurtasun neurri gisa, gomendagarria da Unicode karaktereak onartzen dituzten konpilatzaileek, interpreteek eta eraikuntza tresnek errore edo abisu bat sortzea iruzkinek, kate literalek edo identifikatzaileek irteeraren norabidea aldatzen duten kontrol karaktere paregabeak dituztenean (U+202A, U+202B, U+202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E eta U+200F). Karaktere horiek esplizituki debekatu beharko lirateke programazio-lengoaien zehaztapenetan eta kontuan hartu kode-editoreetan eta biltegi-interfazeetan.
1. eguneraketa: Ahultasuna konpontzeko adabakiak prestatu dira GCC, LLVM/Clang, Rust, Go, Python eta binutils-erako. GitHub, Bitbucket eta Jira-k ere konpondu dute arazoa. GitLab-erako konponketa bat prestatzen ari da. Kode problematikoa identifikatzeko, komando hau erabiltzea gomendatzen da: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]' /iturburu/bidea
2. eranskina: Russ Coxek, Plan 9 sistema eragilearen eta Go programazio-lengoaiaren garatzaileetako batek, kritikatu egin zuen deskribatutako eraso-metodoari eskainitako gehiegizko arreta, aspalditik ezaguna dena (Go, Rust, C++, Ruby-n) eta baztertua izan dena. Coxen arabera, arazoa batez ere kode-editoreetan eta web interfazeetan informazioa behar bezala bistaratzeari buruzkoa da, eta berrikuspenean tresna eta kode-analizatzaile egokiak erabiliz konpondu daiteke. Beraz, eraso espekulatiboei arreta jarri beharrean, egokiagoa litzateke kodea eta mendekotasunak berrikusteko prozesuak hobetzean zentratzea.
Russ Coxek ere uste du konpiladoreak ez direla arazoa konpontzeko leku egokia, konpiladore mailan sinbolo arriskutsuak desgaitzeak tresna ugari uzten baititu, non sinbolo horien erabilera baimenduta dagoen, hala nola eraikuntza sistemak, muntatzaileak, pakete kudeatzaileak eta konfigurazio eta datu parser desberdinak. Adibidez, Rust proiektuak, konpiladorean LTR/RTL kodea prozesatzea debekatu zuenak baina Cargo pakete kudeatzailerako konponketa bat ez zuena inplementatu, antzeko eraso bat baimentzen du Cargo.toml fitxategiaren bidez. Era berean, BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUMakefile, Makefile, go.mod, package.json, pom.xml eta requirements.txt bezalako fitxategiak eraso iturri bihur daitezke.
Iturria: opennet.ru
