Уязвимость в сетевых библиотеках языков Rust и Go, позволяющая обойти проверку IP-адресов

Candellmans

Мастер
Сообщения
7,955
Реакции
8,482
В стандартных библиотеках языков 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.

0_1628418530.png

В языке 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.

0_1628419145.png


Opennet
 
Назад
Сверху Снизу