В стандартните библиотеки на езиците 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.


Източник: opennet.ru
