21 marca 2025 roku opublikowano krytyczną podatność we frameworku Next.js. Jest to popularne narzędzie oparte na Reactcie, które umożliwia m.in. renderowanie stron po stronie serwera. Tylko w tym tygodniu zostało ono pobrane z npm-a około 10 milionów razy.

Podatności zdarzają się nawet w najlepszym oprogramowaniu. W tym przypadku szczególnie uderzające jest jednak to, jak banalna była ta luka w tak powszechnie używanym frameworku. Dotyczyła ona jednak wyłącznie rozwiązań self-hosted.

Aby zrozumieć tę podatność, musimy najpierw wyjaśnić, jaką rolę pełnią middleware w aplikacjach webowych. W wielu aplikacjach umożliwiają one wykonanie określonych działań na otrzymanym zapytaniu, zanim trafi ono do właściwego kodu obsługującego dany endpoint. Z tego powodu często umieszcza się w nich powtarzalne mechanizmy przetwarzania zapytań, takie jak autoryzacja dostępu do zasobów.

Wracając do podatności uwagę badaczy zwrócił ten fragment kodu, co dokładniej opisują w swoim artykule. Logika tego bypassu zmieniała się w kolejnych wersjach, co może świadczyć o tym, że nie był to zapomniany element kodu.

W funkcji odpowiedzialnej za obsługę middleware znajduje się pobranie wartości nagłówka HTTP o nazwie x-middleware-subrequest, który pozwala ominąć middleware podczas wykonywania żądania. W rezultacie możliwe jest m.in. pominięcie autoryzacji. Oryginalnie nagłówek ten był wykorzystywany przez Next.js do identyfikacji zapytań wewnętrznych oraz zapobiegania nieskończonym pętlom.

W ten sposób zapewne miliony aplikacji stały się podatne, a exploit dla odpowiedniej wersji Next.js można zapisać w jednej krótkiej linijce:

curl -H "x-middleware-subrequest: middleware" https://target.local

Z całą pewnością możemy tu mówić o banalności niektórych luk bezpieczeństwa. Jednocześnie może to zachęcać początkujących badaczy do angażowania się w poprawę bezpieczeństwa otwartego oprogramowania oraz przypominać administratorom i programistom o konieczności dbania o bezpieczeństwo ich aplikacji.