Trojas avota uzbrukums, lai ieviestu izstrādātājam neredzamas izmaiņas kodā

Pētnieki no Kembridžas universitātes ir publicējuÅ”i paņēmienu ļaunprātÄ«ga koda klusai ievietoÅ”anai salÄ«dzinoŔā avota kodā. Sagatavotā uzbrukuma metode (CVE-2021-42574) tiek prezentēta ar nosaukumu Trojan Source, un tā ir balstÄ«ta uz tāda teksta veidoÅ”anu, kas kompilatoram/tulkam un personai, kas skatās kodu, izskatās savādāk. Metodes piemēri ir parādÄ«ti dažādiem kompilatoriem un tulkiem, kas nodroÅ”ināti C, C++ (gcc un clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go un Python.

Metode ir balstÄ«ta uz Ä«paÅ”u unikoda rakstzÄ«mju izmantoÅ”anu koda komentāros, kas maina divvirzienu teksta attēloÅ”anas secÄ«bu. Ar Ŕādu vadÄ«bas rakstzÄ«mju palÄ«dzÄ«bu dažas teksta daļas var attēlot no kreisās puses uz labo, bet citas - no labās uz kreiso. Ikdienas praksē Ŕādas kontroles rakstzÄ«mes var izmantot, piemēram, lai failā ievietotu koda rindas ebreju vai arābu valodā. Bet, ja vienā rindā apvienojat rindas ar dažādiem teksta virzieniem, izmantojot norādÄ«tās rakstzÄ«mes, teksta fragmenti, kas tiek rādÄ«ti no labās puses uz kreiso pusi, var pārklāties ar esoÅ”o parasto tekstu, kas tiek rādÄ«ts no kreisās puses uz labo.

Izmantojot Å”o metodi, kodam var pievienot ļaunprātÄ«gu konstrukciju, bet pēc tam tekstu ar Å”o konstrukciju padarÄ«t neredzamu, skatot kodu, pievienojot sekojoÅ”ajā komentārā vai burtiskajās rakstzÄ«mēs, kas parādÄ«tas no labās uz kreiso pusi, kas novedÄ«s pie pilnÄ«gas dažādas rakstzÄ«mes tiek uzliktas uz ļaunprātÄ«gas ievietoÅ”anas. Šāds kods paliks semantiski pareizs, taču tiks interpretēts un attēlots atŔķirÄ«gi.

Trojas avota uzbrukums, lai ieviestu izstrādātājam neredzamas izmaiņas kodā

Pārskatot kodu, izstrādātājs saskarsies ar rakstzÄ«mju vizuālo secÄ«bu un modernā teksta redaktorā, tÄ«mekļa saskarnē vai IDE redzēs neaizdomÄ«gu komentāru, bet kompilators un tulks izmantos rakstzÄ«mju loÄ£isko secÄ«bu un apstrādājiet ļaunprātÄ«go ievietojumu tādu, kāds tas ir, nepievērÅ”ot uzmanÄ«bu divvirzienu tekstam komentāros. Problēma skar dažādus populārus kodu redaktorus (VS Code, Emacs, Atom), kā arÄ« saskarnes koda skatÄ«Å”anai krātuvēs (GitHub, Gitlab, BitBucket un visi Atlassian produkti).

Trojas avota uzbrukums, lai ieviestu izstrādātājam neredzamas izmaiņas kodā

Ir vairāki veidi, kā izmantot metodi, lai Ä«stenotu ļaunprātÄ«gas darbÄ«bas: pievienojot slēpto ā€œatgrieÅ”anāsā€ izteiksmi, kas noved pie funkcijas pabeigÅ”anas pirms laika; komentējot izteiksmes, kas parasti bÅ«tu redzamas kā derÄ«gas konstrukcijas (piemēram, lai atspējotu svarÄ«gas pārbaudes); citu virkņu vērtÄ«bu pieŔķirÅ”ana, kas izraisa virknes validācijas kļūmes.

Piemēram, uzbrucējs var ierosināt izmaiņas, kas ietver rindiņu: if access_level != "user{U+202E} {U+2066}// Pārbaudiet, vai admin{U+2069} {U+2066}" {

kas tiks parādÄ«ts pārskatÄ«Å”anas saskarnē it kā piekļuves_lÄ«menis != ā€œlietotājsā€ { // Pārbaudiet, vai administrators

Turklāt ir piedāvāts vēl viens uzbrukuma variants (CVE-2021-42694), kas saistÄ«ts ar homoglifu izmantoÅ”anu, rakstzÄ«mēm, kas pēc izskata ir lÄ«dzÄ«gas, bet atŔķiras pēc nozÄ«mes un kurām ir atŔķirÄ«gi unikoda kodi (piemēram, rakstzÄ«me ā€œÉ‘ā€ atgādina ā€œ aā€, ā€œÉ”ā€ - ā€œgā€, ā€œÉ©ā€ - ā€œlā€). LÄ«dzÄ«gas rakstzÄ«mes dažās valodās var izmantot funkciju un mainÄ«go nosaukumos, lai maldinātu izstrādātājus. Piemēram, var definēt divas funkcijas ar neatŔķiramiem nosaukumiem, kas veic dažādas darbÄ«bas. Bez detalizētas analÄ«zes nav uzreiz skaidrs, kura no Ŕīm divām funkcijām tiek izsaukta konkrētā vietā.

Trojas avota uzbrukums, lai ieviestu izstrādātājam neredzamas izmaiņas kodā

DroŔības nolÅ«kos ir ieteicams kompilatoriem, tulkiem un montāžas rÄ«kiem, kas atbalsta unikoda rakstzÄ«mes, parādÄ«t kļūdu vai brÄ«dinājumu, ja komentāros, virkņu literāļos vai identifikatoros ir nesapārotas vadÄ«bas rakstzÄ«mes, kas maina izvades virzienu (U+202A, U+202B, U +202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E un U+200F). Šādas rakstzÄ«mes bÅ«tu arÄ« nepārprotami jāaizliedz programmÄ“Å”anas valodas specifikācijās, un tās bÅ«tu jāievēro kodu redaktoros un repozitoriju saskarnēs.

1. pielikums: ir sagatavoti ievainojamÄ«bas ielāpi GCC, LLVM/Clang, Rust, Go, Python un binutils. Problēmu atrisināja arÄ« GitHub, Bitbucket un Jira. Notiek GitLab laboÅ”ana. Lai identificētu problemātisko kodu, ieteicams izmantot komandu: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]' /path/to/ avots

2. papildinājums: Russ Cox, viens no Plan 9 OS un programmÄ“Å”anas valodas Go izstrādātājiem, kritizēja pārmērÄ«go uzmanÄ«bu aprakstÄ«tajai uzbrukuma metodei, kas jau sen ir zināma (Go, Rust, C++, Ruby) un netika uztverta nopietni. . Pēc Koksa domām, problēma galvenokārt attiecas uz pareizu informācijas parādÄ«Å”anu kodu redaktoros un tÄ«mekļa saskarnēs, ko var atrisināt, pārskatÄ«Å”anas laikā izmantojot pareizos rÄ«kus un kodu analizatorus. Tāpēc tā vietā, lai pievērstu uzmanÄ«bu spekulatÄ«viem uzbrukumiem, bÅ«tu pareizāk koncentrēties uz koda un atkarÄ«bas pārskatÄ«Å”anas procesu uzlaboÅ”anu.

Rass Kokss arÄ« uzskata, ka kompilatori nav Ä«stā vieta problēmas novērÅ”anai, jo, aizliedzot bÄ«stamus simbolus kompilatoru lÄ«menÄ«, paliek milzÄ«gs rÄ«ku slānis, kurā Å”o simbolu izmantoÅ”ana joprojām ir pieņemama, piemēram, bÅ«vÄ“Å”anas sistēmas, montieri, pakotņu pārvaldnieki un dažādi konfigurācijas parseri un dati. Kā piemērs ir dots projekts Rust, kas aizliedza apstrādāt LTR/RTL kodu kompilatorā, bet nepievienoja labojumu Cargo pakotņu pārvaldniekam, kas pieļauj lÄ«dzÄ«gu uzbrukumu caur Cargo.toml failu. LÄ«dzÄ«gi faili, piemēram, BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUmakefile, Makefile, go.mod, package.json, pom.xml un prasÄ«bas.txt, var kļūt par uzbrukumu avotiem.

Avots: opennet.ru

Pievieno komentāru