В популярном npm-пакете node-netmask нашли уязвимость, которая позволяет обойти ограничение доступа к IP-адресам и провести атаку SSRF, RFI или LFI на приложение на базе Node.js. Уже выпущен патч.
Библиотека выполняет парсинг IP-адресов при обращении к сетевым ресурсам через приложение. С ней работают более 279 тысяч проектов на GitHub.
Уязвимость CVE-2021-28918 спровоцирована ошибкой в реализации проверки входных данных. Она проявляется при обработке IP-адресов смешанного формата.
Спецификации IETF предполагают, что адреса IPv4 в текстовом виде могут быть представлены в том числе в десятичном и восьмеричном форматах. В последнем строковое значение адреса начинается с нуля. Браузеры обычно отслеживают префикс «0» в адресной строке и автоматически совершают перевод IP-адреса в десятичный формат. Однако netmask отбрасывает префикс и обрабатывает все части адреса как десятичные числа.
Это позволяет хакерам запросить ресурс, указав IP-адрес как 0177.0.0.1, и тогда уязвимый модуль обработает его как внешний адрес 177.0.0.1. Уязвимое приложение может загрузить ресурс в обход запретов. Кроме того, при обращении к приложению на базе Node.js хакер может указать localhost-адрес как 0127.0.0.1, и тогда модуль netmask обработает его как публичный 127.0.0.1.
Уязвимость позволяет также обойти проверку разрешений на доступ к интранет-адресам, VPN, контейнерам и узлам локальной сети путем ввода IP-адреса 012.0.0.1 (10.0.0.1), который воспринимается как 12.0.0.1.
Подобного рода уязвимости опасны возможностью атак динамического подключения файлов с других серверов, включения в цепочку выполнения локальных файлов и подмены адресов на стороне сервера.