В стандартных бибилиотеках языков 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”. В случае использования проблемной библиотеки, приложение не определит вхождение адреса в подсеть 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.
В языке 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.