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.
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).
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Ä.
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