Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² сСтСвых Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… языков Rust ΠΈ Go, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ IP-адрСсов

Π’ стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… языков Rust ΠΈ Go выявлСны уязвимости, связанныС с Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ IP-адрСсов с Π²ΠΎΡΡŒΠΌΠΈΡ€ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ Π² функциях Ρ€Π°Π·Π±ΠΎΡ€Π° адрСса. Уязвимости ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ допустимых адрСсов Π² прилоТСниях, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ обращСния ΠΊ адрСсам loopback-интСрфСйса (127.x.x.x) ΠΈΠ»ΠΈ ΠΈΠ½Ρ‚Ρ€Π°Π½Π΅Ρ‚-подсСтям ΠΏΡ€ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π°Ρ‚Π°ΠΊ SSRF (Server-side request forgery). Уязвимости ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Ρ†ΠΈΠΊΠ» ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ρ€Π°Π½Π΅Π΅ выявлСнных Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE-2021-29921), Data::Validate::IP (Perl, CVE-2021-29662) ΠΈ Net::Netmask (Perl, CVE-2021-29424).

Π’ соотвСтствии со спСцификациСй строковыС значСния IP-адрСсов, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с нуля, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ числа, Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Π°Π½Π½ΡƒΡŽ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈ просто ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ ноль, обрабатывая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ дСсятичноС число. НапримСр, число 0177 Π² Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ систСмС Ρ€Π°Π²Π½ΠΎ 127 Π² дСсятичной. ΠΡ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ рСсурс, ΡƒΠΊΠ°Π·Π°Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ «0177.0.0.1», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² дСсятичном прСдставлСнии соотвСтствуСт «127.0.0.1». Π’ случаС использования ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ адрСса 0177.0.0.1 Π² ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ 127.0.0.1/8, Π½ΠΎ фактичСски ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ запроса ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ адрСсу «0177.0.0.1», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сСтСвыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ 127.0.0.1. ΠŸΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΌΠ°Π½ΡƒΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ обращСния ΠΊ ΠΈΠ½Ρ‚Ρ€Π°Π½Π΅Ρ‚-адрСсам, ΡƒΠΊΠ°Π·Π°Π² значСния ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ «012.0.0.1» (эквивалСнт «10.0.0.1»).

Π’ Rust ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ оказалась ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π° стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° «std::net» (CVE-2021-29922). ΠŸΠ°Ρ€ΡΠ΅Ρ€ IP-адрСсов Π΄Π°Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ отбрасывал ноль ΠΏΠ΅Ρ€Π΅Π΄ значСниями Π² адрСсС, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Ρ‘Ρ… Ρ†ΠΈΡ„Ρ€, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «0177.0.0.1» Π±ΡƒΠ΄Π΅Ρ‚ воспринято ΠΊΠ°ΠΊ нСдопустимоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° 010.8.8.8 ΠΈ 127.0.026.1 Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ std::net::IpAddr ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ адрСсов ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ Π°Ρ‚Π°ΠΊΠ°ΠΌ SSRF (Server-side request forgery), RFI (Remote File Inclusion) ΠΈ LFI (Local File Inclusion). Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ устранСна Π² Π²Π΅Ρ‚ΠΊΠ΅ Rust 1.53.0.

Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² сСтСвых Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… языков Rust ΠΈ Go, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ IP-адрСсов

Π’ языкС Go ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π° стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° «net» (CVE-2021-29923). ВстроСнная функция net.ParseCIDR пропускаСт Π½ΡƒΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΌΠΈ числами, вмСсто ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. НапримСр, Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 00000177.0.0.1, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ net.ParseCIDR(00000177.0.0.1/24) Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½ΠΎ ΠΊΠ°ΠΊ 177.0.0.1/24, Π° Π½Π΅ 127.0.0.1/24. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ числС проявляСтся Π² ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Kubernetes. Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ устранСна Π² выпускС Go 1.16.3 ΠΈ Π±Π΅Ρ‚Π°-вСрсии 1.17.

Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² сСтСвых Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… языков Rust ΠΈ Go, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ IP-адрСсов


Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru