• XSS.stack #1 – первый литературный журнал от юзеров форума

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

corax

Премиум
Premium
Регистрация
29.04.2020
Сообщения
1 009
Решения
1
Реакции
628
Гарант сделки
1
Депозит
0.16
В стандартных библиотеках языков 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.

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

https://sick.codes/sick-2021-016/
https://sick.codes/sick-2021-015/
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Сишечка устарела, говорили они. Дырявая, кривая, куча ошибок. Не то что богоподобные Rust и Go. Где все ошибки ловит линтер и анализатор еще на момент набора погроммистом кода.
 
Сишечка устарела, говорили они. Дырявая, кривая, куча ошибок. Не то что богоподобные Rust и Go. Где все ошибки ловит линтер и анализатор еще на момент набора погроммистом кода.
Если меня не подводит память, про подобную ошибку уже писали в прошлом году. То ли в браузерах её использовали, то ли при рассылках.
 
В стандартных библиотеках языков 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.

4b62919c1b.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.


7460d2b9c5.png



 
Сишечка устарела, говорили они. Дырявая, кривая, куча ошибок. Не то что богоподобные Rust и Go. Где все ошибки ловит линтер и анализатор еще на момент набора погроммистом кода.
Вот я тебя никак не пойму, ты вроде модератор, а сам разводишь этот ЯП срач, причем на пустом месте.
Потом ведь придётся тереть пол треда и писать "Ребята давайте жить дружно!".
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вот я тебя никак не пойму, ты вроде модератор, а сам разводишь этот ЯП срач, причем на пустом месте.
Всегда интересно пообщаться за ЯП, да и тут редко бывают срачи с оскорблениями. Так, обсудить опять ООП нужен / не нужен, и подобное.
Но ты прав, от модера нельзя в таком участвовать.
 
Всегда интересно пообщаться за ЯП, да и тут редко бывают срачи с оскорблениями. Так, обсудить опять ООП нужен / не нужен, и подобное.
Но ты прав, от модера нельзя в таком участвовать.
Ну если интересно, то ИМХО из первого сообщения, ваша Сишечка рядом с Эрлангом в плане сети и рядом не стояла (как и го и раст). Да и этой уязвимости там не наблюдается ;)
 
Если меня не подводит память, про подобную ошибку уже писали в прошлом году. То ли в браузерах её использовали, то ли при рассылках.
если я вас правильно понял, то это было связано со спамом, а именно с тем, что спамеры использовали восьмеричные и шестнадцатеричные ip адреса и многие спам-фильтры их пропускали
 
если я вас правильно понял, то это было связано со спамом, а именно с тем, что спамеры использовали восьмеричные и шестнадцатеричные ip адреса и многие спам-фильтры их пропускали
А, ну да. Не то же самое, но похожее. Память уже не та, старею видать.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх