V balíčku NPM node-netmask, který má přibližně 3 miliony stažení týdně a je používán jako závislost více než 270 tisíci projektů na GitHubu, byla zjištěna zranitelnost (CVE-2021-28918), která umožňuje obejít kontroly, v nichž je síťová maska použita k určení zařazení do adresních rozsahů nebo k filtrování. Problém byl odstraněn ve verzi node-netmask 2.0.0.
Zranitelnost umožňuje zpracovat externí IP adresu jako adresu z vnitřní sítě a naopak, a při určité logice využití modulu node-netmask v aplikaci provést útoky SSRF (Server-side request forgery), RFI (Remote File Inclusion) a LFI (Local File Inclusion) k přístupu k prostředkům ve vnitřní síti a zahrnutí do řetězce provádění externích nebo lokálních souborů. Problém spočívá v tom, že podle specifikace by se měla řetězcová hodnota adresy začínající nulou interpretovat jako osmičková čísla, ale modul 'node-netmask' tuto vlastnost nezohledňuje a zpracovává je jako desetinná čísla.
Například útočník může požadovat místní prostředek tak, že uvede hodnotu '0177.0.0.1', která odpovídá '127.0.0.1', ale modul 'node-netmask' tuto nulu vyhodí a zpracuje '0177.0.0.1' jako '177.0.0.1', což v aplikaci při hodnocení pravidel přístupu neumožní určit shodu s '127.0.0.1'. Podobně útočník může uvést adresu '0127.0.0.1', která by měla odpovídat '87.0.0.1', ale v modulu 'node-netmask' bude zpracována jako '127.0.0.1'. Podobný trik lze použít i k obraně kontrol přístupu k intranetovým adresám, když se uvedou hodnoty jako '012.0.0.1' (ekvivalent '10.0.0.1', ale při kontrole bude zpracována jako '12.0.0.1').
Výzkumníci, kteří problém odhalili, označují problém za katastrofální a uvádějí několik scénářů útoků, ale většina z nich se zdá být spekulativní. Například se hovoří o možnosti útoku na aplikaci postavenou na Node.js, která vytváří vnější spojení pro požadování prostředku na základě parametrů nebo dat vstupního požadavku, ale konkrétní aplikace nejsou zmíněny a podrobnosti nejsou uvedeny. I když se najdou aplikace, které provádějí stahování prostředků na základě zadaných IP adress, není zcela jasné, jak by bylo možné zranitelnost prakticky využít bez připojení k lokální síti nebo bez získání kontroly nad 'zrcadlovými' IP adresami.
Výzkumníci pouze předpokládají, že vlastníci 87.0.0.1 (Telecom Italia) a 0177.0.0.1 (Brasil Telecom) mohou mít schopnost obejít omezení přístupu k 127.0.0.1. Realističtějším scénářem je využití zranitelnosti k obcházení různých blokovacích seznamů implementovaných na straně aplikace. Problém může být také použit pro výměnu definice intranetových rozsahů v NPM modulu „private-ip“.
Zdroj: opennet.ru
