Pag-atake ng Trojan Source upang ipakilala ang mga pagbabago sa code na hindi nakikita ng developer

Ang mga mananaliksik mula sa University of Cambridge ay nag-publish ng isang pamamaraan para sa tahimik na pagpasok ng malisyosong code sa peer-reviewed source code. Ang inihandang paraan ng pag-atake (CVE-2021-42574) ay ipinakita sa ilalim ng pangalang Pinagmulan ng Trojan at nakabatay sa pagbuo ng teksto na mukhang iba para sa compiler/interpreter at sa taong tumitingin sa code. Ang mga halimbawa ng pamamaraan ay ipinakita para sa iba't ibang compiler at interpreter na ibinigay para sa C, C++ (gcc at clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go at Python.

Ang pamamaraan ay batay sa paggamit ng mga espesyal na Unicode character sa mga komento ng code na nagbabago sa pagkakasunud-sunod ng pagpapakita ng bidirectional na teksto. Sa tulong ng mga naturang control character, ang ilang bahagi ng teksto ay maaaring ipakita mula kaliwa hanggang kanan, habang ang iba - mula kanan hanggang kaliwa. Sa pang-araw-araw na pagsasanay, ang mga naturang control character ay maaaring gamitin, halimbawa, upang magpasok ng mga linya ng code sa Hebrew o Arabic sa isang file. Ngunit kung pagsasamahin mo ang mga linya na may iba't ibang direksyon ng teksto sa isang linya, gamit ang tinukoy na mga character, ang mga sipi ng tekstong ipinapakita mula kanan hanggang kaliwa ay maaaring mag-overlap ng umiiral na regular na teksto na ipinapakita mula kaliwa hanggang kanan.

Gamit ang pamamaraang ito, maaari kang magdagdag ng malisyosong construct sa code, ngunit pagkatapos ay gawin ang text na may ganitong construct na hindi nakikita kapag tinitingnan ang code, sa pamamagitan ng pagdaragdag sa sumusunod na komento o sa loob ng literal na mga character na ipinapakita mula kanan pakaliwa, na hahantong sa ganap na iba't ibang mga character na ipinapatong sa malisyosong insertion. Ang nasabing code ay mananatiling tama sa semantiko, ngunit iba ang pakahulugan at ipapakita.

Pag-atake ng Trojan Source upang ipakilala ang mga pagbabago sa code na hindi nakikita ng developer

Habang sinusuri ang code, haharapin ng developer ang visual order ng mga character at makakakita ng hindi kahina-hinalang komento sa isang modernong text editor, web interface o IDE, ngunit gagamitin ng compiler at interpreter ang lohikal na pagkakasunud-sunod ng mga character at iproseso ang nakakahamak na pagpapasok nang walang pansin, nang hindi binibigyang pansin ang bidirectional na teksto sa mga komento. Ang problema ay nakakaapekto sa iba't ibang mga sikat na editor ng code (VS Code, Emacs, Atom), pati na rin ang mga interface para sa pagtingin ng code sa mga repositoryo (GitHub, Gitlab, BitBucket at lahat ng mga produkto ng Atlassian).

Pag-atake ng Trojan Source upang ipakilala ang mga pagbabago sa code na hindi nakikita ng developer

Mayroong ilang mga paraan upang gamitin ang paraan upang ipatupad ang mga nakakahamak na aksyon: pagdaragdag ng isang nakatagong "return" expression, na humahantong sa pagkumpleto ng function nang maaga; pagkomento ng mga expression na karaniwang makikita bilang mga wastong konstruksyon (halimbawa, upang hindi paganahin ang mahahalagang pagsusuri); pagtatalaga ng iba pang mga halaga ng string na humahantong sa mga pagkabigo sa pagpapatunay ng string.

Halimbawa, maaaring magmungkahi ang isang umaatake ng pagbabago na kinabibilangan ng linya: if access_level != "user{U+202E} {U+2066}// Suriin kung admin{U+2069} {U+2066}" {

na ipapakita sa interface ng pagsusuri na parang access_level != β€œuser” { // Suriin kung admin

Bukod pa rito, iminungkahi ang isa pang variant ng pag-atake (CVE-2021-42694), na nauugnay sa paggamit ng mga homoglyph, mga character na magkatulad sa hitsura, ngunit naiiba ang kahulugan at may iba't ibang mga unicode code (halimbawa, ang character na "Ι‘" ay kahawig ng " a”, β€œΙ‘β€ - β€œg”, β€œΙ©β€ - β€œl”). Ang mga katulad na character ay maaaring gamitin sa ilang mga wika sa mga pangalan ng mga function at variable upang iligaw ang mga developer. Halimbawa, maaaring tukuyin ang dalawang function na may hindi matukoy na mga pangalan na nagsasagawa ng magkaibang mga aksyon. Kung walang detalyadong pagsusuri, hindi agad malinaw kung alin sa dalawang function na ito ang tinatawag sa isang partikular na lugar.

Pag-atake ng Trojan Source upang ipakilala ang mga pagbabago sa code na hindi nakikita ng developer

Bilang panukalang panseguridad, inirerekomenda na ang mga compiler, interpreter, at mga tool sa pagpupulong na sumusuporta sa mga Unicode character ay magpakita ng error o babala kung may mga hindi ipinares na control character sa mga komento, string literal, o identifier na nagbabago sa direksyon ng output (U+202A, U+202B, U +202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E at U+200F). Ang mga naturang character ay dapat ding tahasang ipinagbabawal sa mga detalye ng programming language at dapat igalang sa mga editor ng code at mga interface ng repositoryo.

Addendum 1: Ang mga patch ng kahinaan ay inihanda para sa GCC, LLVM/Clang, Rust, Go, Python at binutils. Inayos din ng GitHub, Bitbucket at Jira ang isyu. Ang isang pag-aayos para sa GitLab ay isinasagawa. Upang matukoy ang problemang code, iminumungkahi na gamitin ang command: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]/' /path pinagmulan

Addendum 2: Si Russ Cox, isa sa mga developer ng Plan 9 OS at ang Go programming language, ay pinuna ang labis na atensyon sa inilarawang paraan ng pag-atake, na matagal nang kilala (Go, Rust, C++, Ruby) at hindi sineseryoso. . Ayon kay Cox, ang problema ay pangunahing may kinalaman sa tamang pagpapakita ng impormasyon sa mga editor ng code at mga web interface, na maaaring malutas sa pamamagitan ng paggamit ng mga tamang tool at code analyzer sa panahon ng pagsusuri. Samakatuwid, sa halip na bigyang pansin ang mga haka-haka na pag-atake, mas angkop na tumuon sa pagpapabuti ng mga proseso ng pagsusuri ng code at dependency.

Naniniwala din si Ras Cox na ang mga compiler ay hindi ang tamang lugar upang ayusin ang problema, dahil sa pamamagitan ng pagbabawal sa mga mapanganib na simbolo sa antas ng compiler, nananatili ang isang malaking layer ng mga tool kung saan ang paggamit ng mga simbolo na ito ay nananatiling katanggap-tanggap, tulad ng mga build system, assembler, mga manager ng package at iba't ibang configuration parser at data. Bilang halimbawa, ibinigay ang Rust project, na nagbabawal sa pagproseso ng LTR/RTL code sa compiler, ngunit hindi nagdagdag ng fix sa Cargo package manager, na nagbibigay-daan sa katulad na pag-atake sa pamamagitan ng Cargo.toml file. Katulad nito, ang mga file gaya ng BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUmakefile, Makefile, go.mod, package.json, pom.xml at requirements.txt ay maaaring maging mapagkukunan ng mga pag-atake.

Pinagmulan: opennet.ru

Magdagdag ng komento