В NPM пакета node-netmask, който има около 3 милиона изтегляния на седмица и се използва като зависимост от над 270 хиляди проекта в GitHub, е открита уязвимост (CVE-2021-28918), която позволява заобикаляне на проверки, в които мрежовата маска се използва за определяне на принадлежност към адресни диапазони или за филтриране. Проблемът е решен в версията node-netmask 2.0.0.
Уязвимостта позволява обработката на външен IP адрес като адрес от вътрешната мрежа и обратно, а при определена логика на използване на модула node-netmask в приложението, може да се извършат атаки SSRF (Server-side request forgery), RFI (Remote File Inclusion) и LFI (Local File Inclusion) за достъп до ресурси във вътрешната мрежа и включване в изпълнението на външни или локални файлове. Проблемът е в това, че в съответствие със спецификацията, стринговите стойности на адреси, които започват с нула, трябва да се интерпретират като осмични числа, но модулът „node-netmask“ не отчита тази особеност и ги обработва като десетични числа.
Например, атакуващият може да поиска локален ресурс, указвайки стойността „0177.0.0.1“, която съответства на „127.0.0.1“, но модулът „node-netmask“ ще игнорира нулата и ще обработи 0177.0.0.1 като „177.0.0.1“, което при оценка на правилата за достъп в приложението няма да даде възможност да се определи равенството с „127.0.0.1“. Аналогично, атакуващият може да укаже адрес „0127.0.0.1“, който трябва да съвпада с „87.0.0.1“, но в модула „node-netmask“ ще бъде обработен като „127.0.0.1“. По подобен начин може да се заобиколи проверката за достъп до интранет адреси, като се посочат стойности като „012.0.0.1“ (еквивалент на „10.0.0.1“, но при проверка ще бъде обработен като 12.0.0.1).
Изследователите, които откриха проблема, го наричат катастрофален и представят няколко сценария за атаки, но повечето от тях изглеждат хипотетични. Например, се говори за възможността да се атакува приложение на базата на Node.js, което установява външни връзки, за да поиска ресурс на базата на параметри или входни данни, но конкретно приложение не се споменава и не се детайлизира. Дори и да се открият приложения, които зареждат ресурси на базата на подадени IP адреси, не е съвсем ясно как може да се приложи уязвимостта на практика без свързване с локалната мрежа или без контрол върху „зеркалните“ IP адреси.
Изследователите само предполагат, че собствениците на 87.0.0.1 (Telecom Italia) и 0177.0.0.1 (Brasil Telecom) имат способността да заобиколят ограничението за достъп до 127.0.0.1. По-реалистичен сценарий е използването на уязвимост за заобикаляне на различни списъци за блокиране, реализирани на страната на приложението. Проблемът може също да се използва за обмен на определението на интранет диапазони в NPM модула „private-ip“.
Източник: opennet.ru
