Kerentanan dalam pustaka rangkaian bahasa Rust dan Go yang membolehkan anda memintas pengesahan alamat IP

Kerentanan yang berkaitan dengan pemprosesan alamat IP yang salah dengan digit perlapanan dalam fungsi penghuraian alamat telah dikenal pasti dalam perpustakaan standard bahasa Rust dan Go. Kerentanan memungkinkan untuk memintas semakan untuk alamat yang sah dalam aplikasi, contohnya, untuk mengatur akses kepada alamat antara muka gelung balik (127.xxx) atau subnet intranet apabila menjalankan serangan SSRF (Pemalsuan permintaan sisi pelayan). Kerentanan meneruskan kitaran masalah yang dikenal pasti sebelum ini dalam nod-netmask perpustakaan (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE- 2021-29921 ), Data::Sahkan::IP (Perl, CVE-2021-29662) dan Net::Netmask (Perl, CVE-2021-29424).

Mengikut spesifikasi, nilai rentetan alamat IP yang bermula dengan sifar harus ditafsirkan sebagai nombor perlapanan, tetapi banyak perpustakaan tidak mengambil kira ini dan hanya membuang sifar, menganggap nilai sebagai nombor perpuluhan. Sebagai contoh, nombor 0177 dalam perlapanan adalah sama dengan 127 dalam perpuluhan. Penyerang boleh meminta sumber dengan menyatakan nilai "0177.0.0.1", yang dalam tatatanda perpuluhan sepadan dengan "127.0.0.1". Jika perpustakaan bermasalah digunakan, aplikasi tidak akan mengesan bahawa alamat 0177.0.0.1 berada dalam subnet 127.0.0.1/8, tetapi sebenarnya, apabila menghantar permintaan, ia boleh mengakses alamat "0177.0.0.1", yang mana fungsi rangkaian akan diproses sebagai 127.0.0.1. Dengan cara yang sama, anda boleh menipu semakan akses kepada alamat intranet dengan menentukan nilai seperti β€œ012.0.0.1” (bersamaan dengan β€œ10.0.0.1”).

Dalam Rust, pustaka standard "std::net" telah terjejas oleh isu (CVE-2021-29922). Penghurai alamat IP pustaka ini membuang sifar sebelum nilai dalam alamat, tetapi hanya jika tidak lebih daripada tiga digit dinyatakan, sebagai contoh, "0177.0.0.1" akan dianggap sebagai nilai yang tidak sah dan hasil yang salah akan dikembalikan sebagai jawapan kepada 010.8.8.8 dan 127.0.026.1 . Aplikasi yang menggunakan std::net::IpAddr semasa menghuraikan alamat yang ditentukan pengguna berpotensi terdedah kepada serangan SSRF (Pemalsuan permintaan sisi pelayan), RFI (Kemasukan Fail Jauh) dan LFI (Kemasukan Fail Tempatan). Kerentanan telah diperbaiki dalam cawangan Rust 1.53.0.

Kerentanan dalam pustaka rangkaian bahasa Rust dan Go yang membolehkan anda memintas pengesahan alamat IP

Dalam Go, perpustakaan standard "bersih" terjejas (CVE-2021-29923). Fungsi terbina dalam net.ParseCIDR melangkau sifar pendahuluan sebelum nombor perlapanan dan bukannya memprosesnya. Sebagai contoh, penyerang boleh melepasi nilai 00000177.0.0.1, yang, apabila disemak dalam fungsi net.ParseCIDR(00000177.0.0.1/24), akan dihuraikan sebagai 177.0.0.1/24 dan bukan 127.0.0.1/24. Masalahnya juga nyata dalam platform Kubernetes. Kerentanan diperbaiki dalam keluaran Go 1.16.3 dan beta 1.17.

Kerentanan dalam pustaka rangkaian bahasa Rust dan Go yang membolehkan anda memintas pengesahan alamat IP


Sumber: opennet.ru

Tambah komen