Вразливість у мережевих бібліотеках мов Rust та Go, що дозволяє обійти перевірку IP-адрес.

У стандартних бібліотеках мов Rust та Go виявлено вразливості, пов'язані з некоректною обробкою IP-адрес з восьмирічними цифрами у функціях розбирання адреси. Вразливості дозволяють обійти перевірки допустимих адрес у додатках, наприклад, для організації звернення до адрес loopback-інтерфейсу (127.xxx) або інтранет-підмережам при здійсненні атак SSRF (Server-side request forgery). Вразливості продовжують цикл проблем, раніше виявлених у бібліотеках node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE-2021 ), Data::Validate::IP (Perl, CVE-29921-2021) та Net::Netmask (Perl, CVE-29662-2021).

Відповідно до специфікації рядкові значення 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

Додати коментар або відгук