Әзірлеушіге көрінбейтін кодқа өзгертулер енгізу үшін трояндық Source шабуылы

Кембридж университетінің зерттеушілері сараптамадан өткен бастапқы кодқа зиянды кодты үнсіз енгізу әдісін жариялады. Дайындалған шабуыл әдісі (CVE-2021-42574) Trojan Source атауымен ұсынылған және компилятор/аудармашы мен кодты қарап отырған адам үшін басқаша көрінетін мәтінді қалыптастыруға негізделген. Әдістің мысалдары C, C++ (gcc және clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go және Python үшін жеткізілетін әртүрлі компиляторлар мен интерпретаторлар үшін көрсетілген.

Әдіс екі жақты мәтіннің көрсету ретін өзгертетін кодтық түсініктемелерде арнайы Юникод таңбаларын пайдалануға негізделген. Осындай басқару таңбаларының көмегімен мәтіннің кейбір бөліктерін солдан оңға қарай, ал басқаларын оңнан солға қарай көрсетуге болады. Күнделікті тәжірибеде мұндай басқару таңбаларын, мысалы, иврит немесе араб тіліндегі код жолдарын файлға кірістіру үшін пайдалануға болады. Бірақ егер сіз бір жолда әртүрлі мәтін бағыттары бар жолдарды біріктірсеңіз, көрсетілген таңбаларды пайдалана отырып, оңнан солға қарай көрсетілетін мәтін үзінділері солдан оңға қарай көрсетілетін бар қалыпты мәтінді қабаттастыруы мүмкін.

Бұл әдісті қолдана отырып, кодқа зиянды құрылымды қосуға болады, бірақ содан кейін келесі түсініктемеде немесе оңнан солға қарай көрсетілген әріптік таңбалардың ішіне қосу арқылы кодты қарау кезінде осы құрылыммен мәтінді көрінбейтін етіп жасауға болады, бұл толығымен әкеледі. әртүрлі таңбалар зиянды кірістіру үстіне қойылады. Мұндай код семантикалық тұрғыдан дұрыс болып қалады, бірақ басқаша түсіндіріледі және көрсетіледі.

Әзірлеушіге көрінбейтін кодқа өзгертулер енгізу үшін трояндық Source шабуылы

Кодты қарап шығу кезінде әзірлеуші ​​таңбалардың көрнекі ретімен бетпе-бет келіп, қазіргі мәтіндік редакторда, веб-интерфейсте немесе IDE-де күдікті емес түсініктемені көреді, бірақ компилятор мен интерпретатор таңбалардың логикалық тәртібін пайдаланады және түсініктемелердегі екі жақты мәтінге назар аудармай, зиянды кірістіруді сол күйінде өңдеңіз. Мәселе әртүрлі танымал код редакторларына (VS Code, Emacs, Atom), сондай-ақ репозиторийлердегі кодты көруге арналған интерфейстерге (GitHub, Gitlab, BitBucket және барлық Atlassian өнімдері) әсер етеді.

Әзірлеушіге көрінбейтін кодқа өзгертулер енгізу үшін трояндық Source шабуылы

Зиянды әрекеттерді жүзеге асыру үшін әдісті қолданудың бірнеше жолы бар: функцияны мерзімінен бұрын аяқтауға әкелетін жасырын «қайтару» өрнегін қосу; әдетте жарамды құрылымдар ретінде көрінетін өрнектерге түсініктеме беру (мысалы, маңызды тексерулерді өшіру үшін); жолды тексеру сәтсіздігіне әкелетін басқа жол мәндерін тағайындау.

Мысалы, шабуылдаушы келесі жолды қамтитын өзгертуді ұсынуы мүмкін: if access_level != "user{U+202E} {U+2066}// Check, for admin{U+2069} {U+2066}" {

шолу интерфейсінде access_level сияқты көрсетіледі!= “user” { // Әкімші

Сонымен қатар, шабуылдың басқа нұсқасы ұсынылды (CVE-2021-42694), гомоглифтерді, сыртқы түрі ұқсас, бірақ мағынасы жағынан ерекшеленетін және әртүрлі юникод кодтары бар таңбаларды қолдануға байланысты (мысалы, “ɑ” таңбасы “ a”, “ɡ” - “g”, “ɩ” - “l”). Ұқсас таңбаларды кейбір тілдерде әзірлеушілерді адастыру үшін функциялар мен айнымалылар атауларында қолдануға болады. Мысалы, әртүрлі әрекеттерді орындайтын ажыратылмайтын атаулары бар екі функция анықталуы мүмкін. Егжей-тегжейлі талдау болмаса, бұл екі функцияның қайсысы белгілі бір жерде шақырылатыны бірден анық емес.

Әзірлеушіге көрінбейтін кодқа өзгертулер енгізу үшін трояндық Source шабуылы

Қауіпсіздік шарасы ретінде шығыс бағытын өзгертетін түсініктемелерде, жол литералдарында немесе идентификаторларда жұпталмаған басқару таңбалары болса, Юникод таңбаларын қолдайтын компиляторлар, интерпретаторлар және құрастыру құралдары қатені немесе ескертуді көрсету ұсынылады (U+202A, U+202B, U +202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E және U+200F). Сондай-ақ, мұндай таңбаларға бағдарламалау тілінің спецификацияларында нақты тыйым салынуы керек және код редакторлары мен репозиторий интерфейстерінде құрметтелуі керек.

1-қосымша: GCC, LLVM/Clang, Rust, Go, Python және binutils үшін осалдық патчтары дайындалды. GitHub, Bitbucket және Jira да мәселені шешті. GitLab үшін түзету орындалуда. Проблемалық кодты анықтау үшін мына пәрменді пайдалану ұсынылады: grep -r $'[\u061C\u200E\u200F\u202A\u202A\u202C\u202E\u202\u2066\u2067\u2068\u2069\uXNUMX]'/ көзі

2-қосымша: Plan 9 ОЖ және Go бағдарламалау тілін әзірлеушілердің бірі Расс Кокс бұрыннан белгілі (Go, Rust, C++, Ruby) сипатталған шабуыл әдісіне шамадан тыс назар аударуды сынға алды және оған мән берілмеді. . Кокстың пікірінше, мәселе негізінен код редакторлары мен веб-интерфейстердегі ақпаратты дұрыс көрсетуге қатысты, оны шолу кезінде дұрыс құралдар мен код анализаторларын пайдалану арқылы шешуге болады. Сондықтан, алыпсатарлық шабуылдарға назар аударудың орнына, код пен тәуелділікті тексеру процестерін жақсартуға назар аударған дұрыс болар еді.

Рас Кокс сонымен қатар компиляторлар мәселені шешу үшін дұрыс орын емес деп санайды, өйткені компилятор деңгейінде қауіпті белгілерге тыйым салу арқылы осы белгілерді пайдалану қолайлы болып қалатын құралдардың үлкен қабаты қалады, мысалы, құрастыру жүйелері, ассемблерлер, пакет менеджерлері және әртүрлі конфигурация талдаушылары мен деректері. Мысал ретінде компиляторда LTR/RTL кодын өңдеуге тыйым салған, бірақ Cargo.toml файлы арқылы ұқсас шабуылға мүмкіндік беретін Cargo пакетінің менеджеріне түзету қосылмаған Rust жобасы келтірілген. Сол сияқты BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUmakefile, Makefile, go.mod, package.json, pom.xml және талаптар.txt сияқты файлдар шабуылдардың көзі бола алады.

Ақпарат көзі: opennet.ru

пікір қалдыру