Уязвимость в сетевых библиотеках языков 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

Добавить комментарий