Kerentanan di perpustakaan jaringan bahasa Rust dan Go yang memungkinkan Anda melewati verifikasi alamat IP

Kerentanan terkait dengan pemrosesan alamat IP yang salah dengan digit oktal dalam fungsi penguraian alamat telah diidentifikasi di perpustakaan standar bahasa Rust dan Go. Kerentanan memungkinkan untuk melewati pemeriksaan alamat yang valid dalam aplikasi, misalnya, untuk mengatur akses ke alamat antarmuka loopback (127.xxx) atau subnet intranet saat melakukan serangan SSRF (Pemalsuan permintaan sisi server). Kerentanan melanjutkan siklus masalah yang sebelumnya diidentifikasi di perpustakaan node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE- 2021-29921 ), Data::Validasi::IP (Perl, CVE-2021-29662) dan Net::Netmask (Perl, CVE-2021-29424).

Menurut spesifikasinya, nilai string alamat IP yang dimulai dengan nol harus ditafsirkan sebagai bilangan oktal, tetapi banyak perpustakaan tidak memperhitungkan hal ini dan hanya membuang nol, memperlakukan nilainya sebagai bilangan desimal. Misalnya angka 0177 dalam oktal sama dengan 127 dalam desimal. Penyerang dapat meminta sumber daya dengan menentukan nilai "0177.0.0.1", yang dalam notasi desimal sesuai dengan "127.0.0.1". Jika perpustakaan bermasalah digunakan, aplikasi tidak akan mendeteksi bahwa alamat 0177.0.0.1 ada di subnet 127.0.0.1/8, namun nyatanya, saat mengirim permintaan, ia dapat mengakses alamat β€œ0177.0.0.1”, yang mana fungsi jaringan akan diproses sebagai 127.0.0.1. Dengan cara yang sama, Anda dapat menipu pemeriksaan akses ke alamat intranet dengan menentukan nilai seperti β€œ012.0.0.1” (setara dengan β€œ10.0.0.1”).

Di Rust, perpustakaan standar "std::net" terpengaruh oleh masalah (CVE-2021-29922). Pengurai alamat IP perpustakaan ini membuang angka nol sebelum nilai dalam alamat, tetapi hanya jika tidak lebih dari tiga digit yang ditentukan, misalnya, β€œ0177.0.0.1” akan dianggap sebagai nilai yang tidak valid, dan hasil yang salah akan dikembalikan sebagai respons terhadap 010.8.8.8 dan 127.0.026.1 . Aplikasi yang menggunakan std::net::IpAddr saat mengurai alamat yang ditentukan pengguna berpotensi rentan terhadap serangan SSRF (Pemalsuan permintaan sisi server), RFI (Remote File Inclusion), dan LFI (Local File Inclusion). Kerentanan telah diperbaiki di cabang Rust 1.53.0.

Kerentanan di perpustakaan jaringan bahasa Rust dan Go yang memungkinkan Anda melewati verifikasi alamat IP

Di Go, perpustakaan standar "net" terpengaruh (CVE-2021-29923). Fungsi bawaan net.ParseCIDR melewatkan angka nol di depan sebelum bilangan oktal alih-alih memprosesnya. Misalnya, penyerang dapat meneruskan nilai 00000177.0.0.1, yang jika diperiksa di fungsi net.ParseCIDR(00000177.0.0.1/24), akan diuraikan sebagai 177.0.0.1/24, dan bukan 127.0.0.1/24. Masalahnya juga terjadi pada platform Kubernetes. Kerentanan telah diperbaiki pada rilis Go 1.16.3 dan beta 1.17.

Kerentanan di perpustakaan jaringan bahasa Rust dan Go yang memungkinkan Anda melewati verifikasi alamat IP


Sumber: opennet.ru

Tambah komentar