Dasturchiga ko'rinmaydigan kodga o'zgartirishlar kiritish uchun troyan manba hujumi

Kembrij universiteti tadqiqotchilari ko‘rib chiqiladigan manba kodiga zararli kodni jimgina kiritish usulini chop etdi. Tayyorlangan hujum usuli (CVE-2021-42574) Trojan Source nomi ostida taqdim etilgan va kompilyator/tarjimon va kodni ko'rayotgan shaxs uchun boshqacha ko'rinadigan matnni shakllantirishga asoslangan. Usulning misollari C, C++ (gcc va clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go va Python uchun taqdim etilgan turli kompilyatorlar va tarjimonlar uchun ko'rsatilgan.

Usul ikki tomonlama matnni ko'rsatish tartibini o'zgartiradigan kod izohlarida maxsus Unicode belgilaridan foydalanishga asoslangan. Bunday boshqaruv belgilari yordamida matnning ba'zi qismlari chapdan o'ngga, boshqalari esa o'ngdan chapga ko'rsatilishi mumkin. Kundalik amaliyotda bunday boshqaruv belgilaridan, masalan, faylga ibroniy yoki arab tilidagi kod satrlarini kiritish uchun foydalanish mumkin. Agar siz bir qatorda turli matn yo'nalishlari bo'lgan satrlarni birlashtirsangiz, belgilangan belgilardan foydalangan holda, o'ngdan chapga ko'rsatilgan matn qismlari chapdan o'ngga ko'rsatiladigan mavjud oddiy matnni qoplashi mumkin.

Ushbu usuldan foydalanib, siz kodga zararli konstruksiyani qo'shishingiz mumkin, lekin keyin quyidagi izohga yoki o'ngdan chapga ko'rsatilgan harfiy belgilarni qo'shish orqali kodni ko'rishda ushbu konstruktsiyali matnni ko'rinmas holga keltiring, bu butunlay olib keladi. turli belgilar zararli kiritish ustiga qo'yilgan. Bunday kod semantik jihatdan to'g'ri bo'lib qoladi, lekin boshqacha talqin qilinadi va ko'rsatiladi.

Dasturchiga ko'rinmaydigan kodga o'zgartirishlar kiritish uchun troyan manba hujumi

Kodni ko'rib chiqishda dasturchi belgilarning vizual tartibiga duch keladi va zamonaviy matn muharriri, veb-interfeys yoki IDEda shubhali bo'lmagan izohni ko'radi, ammo kompilyator va tarjimon belgilarning mantiqiy tartibidan foydalanadi va izohlardagi ikki tomonlama matnga e'tibor bermasdan, zararli qo'shishni avvalgidek qayta ishlang. Muammo turli xil mashhur kod muharrirlariga (VS Code, Emacs, Atom), shuningdek, omborlardagi kodlarni ko'rish interfeyslariga (GitHub, Gitlab, BitBucket va barcha Atlassian mahsulotlari) ta'sir qiladi.

Dasturchiga ko'rinmaydigan kodga o'zgartirishlar kiritish uchun troyan manba hujumi

Zararli harakatlarni amalga oshirish uchun usuldan foydalanishning bir necha yo'li mavjud: funktsiyani muddatidan oldin bajarishga olib keladigan yashirin "qaytish" ifodasini qo'shish; odatda yaroqli tuzilmalar sifatida ko'rinadigan iboralarni sharhlash (masalan, muhim tekshiruvlarni o'chirish uchun); satrni tekshirishda xatoliklarga olib keladigan boshqa satr qiymatlarini belgilash.

Masalan, tajovuzkor qatorni o'z ichiga olgan o'zgartirishni taklif qilishi mumkin: if access_level != "user{U+202E} {U+2066}// Admin{U+2069} {U+2066}" { ekanligini tekshiring.

Bu ko'rib chiqish interfeysida go'yo access_level != “user” { // Admin ekanligini tekshiring

Bundan tashqari, hujumning yana bir varianti taklif qilingan (CVE-2021-42694), gomogliflardan foydalanish bilan bog'liq bo'lib, ular tashqi ko'rinishida o'xshash, ammo ma'nosi bilan farqlanadi va turli unicode kodlariga ega (masalan, "ɑ" belgisi " a", "ɡ" - "g", "ɩ" - "l"). Shunga o'xshash belgilar ba'zi tillarda ishlab chiquvchilarni chalg'itish uchun funktsiyalar va o'zgaruvchilar nomlarida ishlatilishi mumkin. Masalan, bir-biridan farq qilib bo'lmaydigan nomga ega bo'lgan ikkita funktsiya belgilanishi mumkin, ular turli xil harakatlarni bajaradilar. Batafsil tahlil qilmasdan, bu ikki funktsiyadan qaysi biri ma'lum bir joyda chaqirilishi darhol aniq emas.

Dasturchiga ko'rinmaydigan kodga o'zgartirishlar kiritish uchun troyan manba hujumi

Xavfsizlik chorasi sifatida Unicode belgilarini qo'llab-quvvatlaydigan kompilyatorlar, tarjimonlar va yig'ish vositalariga chiqish yo'nalishini o'zgartiruvchi izohlarda, satr harflarida yoki identifikatorlarda juftlashtirilmagan boshqaruv belgilari mavjud bo'lsa, xato yoki ogohlantirishni ko'rsatishi tavsiya etiladi (U+202A, U+202B, U +202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E va U+200F). Bunday belgilar dasturlash tili spetsifikatsiyalarida ham aniq taqiqlangan bo'lishi kerak va kod muharrirlari va ombor interfeyslarida hurmat qilinishi kerak.

1-qo'shimcha: GCC, LLVM/Clang, Rust, Go, Python va binutils uchun zaiflik yamoqlari tayyorlangan. GitHub, Bitbucket va Jira ham muammoni hal qildi. GitLab uchun tuzatish ishlari olib borilmoqda. Muammoli kodni aniqlash uchun quyidagi buyruqdan foydalanish tavsiya etiladi: grep -r $'[\u061C\u200E\u200F\u202A\u202C\u202D\u202E\u202\u2066\u2067\u2068\u2069\uXNUMX]'/ manba

2-qo'shimcha: Plan 9 OS va Go dasturlash tilini ishlab chiquvchilardan biri Russ Koks uzoq vaqtdan beri ma'lum bo'lgan (Go, Rust, C++, Ruby) va jiddiy qabul qilinmagan tasvirlangan hujum usuliga haddan tashqari e'tiborni tanqid qildi. . Koksning so'zlariga ko'ra, muammo asosan kod muharrirlari va veb-interfeyslarda ma'lumotni to'g'ri ko'rsatish bilan bog'liq bo'lib, ularni ko'rib chiqish jarayonida to'g'ri vositalar va kod analizatorlari yordamida hal qilish mumkin. Shuning uchun, spekulyativ hujumlarga e'tiborni jalb qilish o'rniga, kod va qaramlikni ko'rib chiqish jarayonlarini takomillashtirishga e'tibor qaratish maqsadga muvofiq bo'ladi.

Ras Koks, shuningdek, kompilyatorlar muammoni hal qilish uchun to'g'ri joy emas deb hisoblaydi, chunki kompilyator darajasida xavfli belgilarni taqiqlash orqali ushbu belgilardan foydalanish maqbul bo'lib qoladigan vositalarning katta qatlami qolmoqda, masalan, qurish tizimlari, assemblerlar, paket menejerlari va turli xil konfiguratsiya tahlilchilari va ma'lumotlar. Misol sifatida, kompilyatorda LTR/RTL kodini qayta ishlashni taqiqlovchi Rust loyihasi berilgan, ammo Cargo paketi menejeriga tuzatish kiritilmagan, bu esa Cargo.toml fayli orqali xuddi shunday hujumga imkon beradi. Xuddi shunday, BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUmakefile, Makefile, go.mod, package.json, pom.xml va requirements.txt kabi fayllar hujumlar manbasiga aylanishi mumkin.

Manba: opennet.ru

a Izoh qo'shish