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

Кембридж университетінің зерттеушілері тексерілген бастапқы кодқа зиянды кодты анықталмайтын енгізу әдісін жариялады. Троян көзі ретінде белгілі шабуыл әдісі (CVE-2021-42574) компилятор/аудармашы және адам шолушыға ұқсамайтын мәтінді жасауға негізделген. Әдіс қолданбасының мысалдары 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 + 202B, u + 202), u + 202E, u + 2066, u + 2067, 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\u202A\u202A\u202C\u202C\u202E\u2066\u2067\u2068\u2068\u2068\u2069\u2069\u2069\u2069/source/"

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

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

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