Rust va Go tillarining tarmoq kutubxonalarida IP-manzil tekshiruvini chetlab o'tishga imkon beruvchi zaiflik

Rust va Go tillarining standart kutubxonalarida manzillarni tahlil qilish funksiyalarida sakkizlik raqamli IP manzillarni noto‘g‘ri qayta ishlash bilan bog‘liq zaifliklar aniqlangan. Zaifliklar ilovalardagi haqiqiy manzillarni tekshirishni chetlab o'tishga imkon beradi, masalan, SSRF (Server tomoni so'rovini qalbakilashtirish) hujumlarini amalga oshirishda orqaga qaytish interfeysi manzillari (127.xxx) yoki intranet quyi tarmoqlariga kirishni tashkil qilish. Zaifliklar tugun-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE-) kutubxonalarida ilgari aniqlangan muammolar tsiklini davom ettiradi. 2021-29921 ), Data::Validate ::IP (Perl, CVE-2021-29662) va Net::Netmask (Perl, CVE-2021-29424).

Spetsifikatsiyaga ko'ra, IP-manzil satrining noldan boshlanadigan qiymatlari sakkizlik sonlar sifatida talqin qilinishi kerak, ammo ko'pgina kutubxonalar buni hisobga olmaydilar va qiymatni o'nlik son sifatida ko'rib, noldan voz kechishadi. Misol uchun, sakkizta 0177 soni o'nlik kasrda 127 ga teng. Buzg'unchi o'nli belgida "0177.0.0.1" ga mos keladigan "127.0.0.1" qiymatini ko'rsatish orqali resurs so'rashi mumkin. Agar muammoli kutubxona ishlatilsa, dastur 0177.0.0.1 manzili 127.0.0.1/8 quyi tarmog'ida ekanligini aniqlamaydi, lekin aslida so'rov yuborilganda u "0177.0.0.1" manziliga kirishi mumkin. tarmoq funktsiyalari 127.0.0.1 sifatida ishlaydi. Xuddi shunday, siz "012.0.0.1" ("10.0.0.1" ga ekvivalent) kabi qiymatlarni belgilash orqali intranet manzillariga kirishni tekshirishni aldashingiz mumkin.

Rust'da "std::net" standart kutubxonasiga muammo ta'sir qildi (CVE-2021-29922). Ushbu kutubxonaning IP-manzil tahlilchisi manzildagi qiymatlardan oldin nolni olib tashladi, lekin faqat uchta raqamdan ko'p bo'lmagan holda, masalan, "0177.0.0.1" noto'g'ri qiymat va noto'g'ri natija sifatida qabul qilinadi. 010.8.8.8 va 127.0.026.1 ga javob qaytariladi. Foydalanuvchi tomonidan ko'rsatilgan manzillarni tahlil qilishda std::net::IpAddr-dan foydalanadigan ilovalar SSRF (Server tomoni so'rovini soxtalashtirish), RFI (Remote File Inclusion) va LFI (Local File Inclusion) hujumlariga moyil bo'lishi mumkin. Zaiflik Rust 1.53.0 filialida tuzatildi.

Rust va Go tillarining tarmoq kutubxonalarida IP-manzil tekshiruvini chetlab o'tishga imkon beruvchi zaiflik

Go'da standart kutubxona "net" ta'sir qiladi (CVE-2021-29923). Net.ParseCIDR o'rnatilgan funksiyasi sakkizlik sonlar oldidagi nollarni qayta ishlash o'rniga ularni o'tkazib yuboradi. Masalan, tajovuzkor 00000177.0.0.1 qiymatidan o'tishi mumkin, bu qiymat net.ParseCIDR(00000177.0.0.1/24) funksiyasida tekshirilganda 177.0.0.1/24 emas, 127.0.0.1/24 sifatida tahlil qilinadi. Muammo Kubernetes platformasida ham o'zini namoyon qiladi. Zaiflik Go 1.16.3 va beta 1.17 da tuzatilgan.

Rust va Go tillarining tarmoq kutubxonalarida IP-manzil tekshiruvini chetlab o'tishga imkon beruvchi zaiflik


Manba: opennet.ru

a Izoh qo'shish