Testy penetracyjne Node.js / Express: prototype pollution, npm supply-chain i bezpieczeństwo backendu JavaScript
Node.js dominuje w nowoczesnym ekosystemie backendu JavaScript, ale jego dynamiczna natura i ogromny ekosystem npm tworzą unikalne powierzchnie ataku: prototype pollution, RCE przez deserializację, SSRF przez klientów HTTP (axios, node-fetch) oraz ryzyka supply-chain powiązane z zależnościami tranzytywnymi. Matproof Sentinel wykonuje ukierunkowane pentesty Node.js / Express z proof-of-exploit oraz raportami gotowymi do audytów już od 149 EUR.
Dlaczego Node.js wymaga szczególnej uwagi pentestowej
Ekosystem Node.js doświadczył w latach 2023-2024 poważnych incydentów ilustrujących strukturalne ryzyka tego modelu. Podatność HTTP/2 Rapid Reset (CVE-2023-44487, CVSS 7.5) umożliwiła masowe ataki DDoS na eksponowane serwery Node.js, czyli Cloudflare wykrył ataki o natężeniu 398 milionów żądań na sekundę. Luka w jsonwebtoken (CVE-2022-23529) dotknęła praktycznie wszystkich aplikacji Node.js używających najczęściej wdrażanej biblioteki JWT. Najnowsza CVE-2024-39338 w axios wystawiła setki tysięcy aplikacji na SSRF przez zniekształcone względne adresy URL. Poza konkretnymi CVE, wzorce Node.js, takie jak dynamiczna manipulacja właściwości przez JSON.parse oraz rozległe użycie spread operatora, tworzą unikalne wektory dla prototype pollution potencjalnie prowadzące do RCE.
- CVE-2023-44487 (HTTP/2 Rapid Reset, CVSS 7.5): masowe DDoS przeciw eksponowanym serwerom Node.js HTTP/2, Cloudflare, Google i AWS raportowały w 2023 ataki rzędu 398M żądań/s.
- CVE-2022-23529 (jsonwebtoken): bypass walidacji podpisu JWT w najczęściej używanej bibliotece do uwierzytelniania Node.js, dotyczy około 9 milionów cotygodniowych pobrań z npm.
- CVE-2024-39338 (axios SSRF): zniekształcone względne adresy URL umożliwiają ataki SSRF na wewnętrzne endpointy (AWS metadata, usługi wewnętrzne) przez najczęściej używanego klienta HTTP w Node.js (60M+ cotygodniowych pobrań).
- Prototype pollution: wzorzec ataku specyficzny dla Node.js, eksploatowany w popularnych bibliotekach (lodash, jQuery, async) w celu eskalacji do RCE, wykryty w 13% aplikacji Node.js skanowanych przez Snyk w 2024.
- Ryzyka npm supply-chain: 1,2 miliona pakietów npm, około 75% z zależnościami tranzytywnymi; znaczące incydenty: event-stream (2018), ua-parser-js (2021), color.js / faker.js (2022).
- Express.js, najczęściej wdrażany framework Node.js, nie zawiera domyślnych zabezpieczeń przed CSRF, XSS ani injection. Odpowiedzialność za każde security middleware spoczywa na deweloperze.
- Dla fintechów objętych DORA art. 24 lub SaaS objętych NIS2 udokumentowany pentest Node.js stanowi standard zgodności.
Co konkretnie testujemy w aplikacji Node.js / Express
- Prototype pollution: injection właściwości do Object.prototype przez JSON.parse, body-parser, qs.parse lub Object.assign, ścieżki eskalacji do RCE przez gadget chains (lodash.template, w stylu kibana).
- Podatności jsonwebtoken: akceptowany algorytm 'none', algorithm confusion HS256/RS256, jwt-decode używany do weryfikacji (antywzorzec), brak walidacji 'exp' i 'iat'.
- npm supply chain: pełny audyt zależności (npm audit --production), pakiety z podejrzanymi skryptami post-install, zależności z niezałatanymi CVE w package-lock.json.
- SSRF przez klientów HTTP: axios (CVE-2024-39338), node-fetch, got, request, bypass walidacji URL przez względne adresy URL, IPv6, kodowanie Unicode, DNS rebinding requests.
- Header injection (CRLF injection): wstrzyknięcie carriage return w nagłówkach HTTP przez parametry użytkownika. Express do 4.18.2 podatny zgodnie z CVE-2022-24999.
- Konfiguracja HTTP/2: ekspozycja na CVE-2023-44487 (Rapid Reset), jeśli HTTP/2 włączone bez stream-level rate-limiting; weryfikacja zabezpieczeń settings_max_concurrent_streams.
- NoSQL injection przez mongoose / mongodb: operatory $ne, $gt, $where w zapytaniach użytkownika; bypass uwierzytelniania przez wstrzyknięty $or/$and; manipulacja arbitralnymi operatorami $set.
- Niebezpieczna deserializacja: użycie node-serialize (znana podatność), eval() z danymi użytkownika, vm.runInNewContext bez sandboxa, child_process.exec z inputem użytkownika.
- Konfiguracja Express: middleware uwierzytelniające w złej kolejności, brak helmet (nagłówki bezpieczeństwa), express-rate-limit nieskonfigurowany, cookie-parser bez secret, express-session ze store in-memory na produkcji.
- Logowanie danych wrażliwych: Winston / Pino skonfigurowane do logowania pełnych nagłówków Authorization, ciał żądań zawierających hasła, parametrów query z tokenami.
Sample finding
Możliwy do wykorzystania Prototype Pollution prowadzący do RCE w body-parser z gadget chain lodash
Aplikacja Express używa body-parser do przetwarzania żądań JSON bez restrykcyjnej konfiguracji. Testowanie ujawnia, że atakujący może wysłać payload JSON zawierający klucz '__proto__', który globalnie zatruwa Object.prototype. Przykładowo POST /api/profile z body {"__proto__": {"polluted": true}} powoduje, że wszystkie obiekty JavaScript w późniejszym wykonaniu dziedziczą właściwość 'polluted'. Aplikacja używa również lodash.template z częściowo kontrolowanym przez użytkownika szablonem w funkcji generowania raportu, co tworzy klasyczny łańcuch eksploatacji (gadget chain): prototype pollution prowadzi do lodash.template, a następnie do RCE. Test wykazuje wykonanie dowolnego kodu z uprawnieniami procesu Node.js.
Fix: Natychmiastowa aktualizacja do wersji z patchami: body-parser >= 1.20.3, lodash >= 4.17.21. Skonfiguruj body-parser z opcją { strict: true, reviver: function (key, value) { if (key === '__proto__' || key === 'constructor') return undefined; return value; } }, aby blokować wrażliwe klucze. Zastąp lodash.template bibliotekami szablonów w sandboxie (handlebars w trybie strict lub ESLint z regułami no-prototype-builtins). Wprowadź Object.freeze(Object.prototype) przy starcie aplikacji, aby blokować jakiekolwiek root-level pollution. Ustaw strict CSP policy z wyłączonym 'unsafe-eval'. Włącz tryb strict ECMAScript przez 'use strict' we wszystkich modułach.
Reference: CVE-2022-24999 (qs prototype pollution) · CWE-1321 (Prototype Pollution) · OWASP A08:2021 (Software and Data Integrity Failures) · Snyk Research: Prototype Pollution Attacks in Node.js · NIST SP 800-218 (SSDF)
Porównanie opcji pentestu Node.js
| — | Free scan | Matproof Sentinel | Traditional consultancy |
|---|---|---|---|
| Automated scan engine | ✓ (3-min preview) | ✓ Full scan | ✗ Manual only |
| OWASP Top 10 coverage | Partial | ✓ Complete | ✓ Complete |
| Proof-of-exploit evidence | ✗ | ✓ Per finding | ✓ Per finding |
| Regulatory mapping (DORA/NIS2/ISO 27001) | ✗ | ✓ Automated | ✓ Manual |
| Audit-ready PDF report | ✗ | ✓ Instant | ✓ 2–4 weeks delivery |
| Continuous / recurring scans | ✗ | ✓ Per deploy | ✗ Annual engagement |
| Time to first result | ~3 min | ~30 min full scan | 2–4 weeks |
| Price | €0 | From €149 | €8,000–€25,000 |
| Source code review (SAST) | ✗ | ✓ On Growth plan | ✓ Scoped engagement |
| API testing (REST/GraphQL) | ✗ | ✓ Automated | ✓ Manual |
Pakiety pentestów Node.js
- 1 full pentest scan
- AI-prioritized findings with CVSS 3.1
- Proof-of-exploit per finding
- Audit-ready PDF report
- Regulatory mapping (DORA, NIS2, ISO 27001)
- Unlimited scans (up to 3 domains)
- Continuous monitoring
- CI/CD integration (GitHub, GitLab)
- All regulatory mappings
- Priority support
- Unlimited scans + domains
- Authenticated / White-Box testing
- API & cloud infrastructure tests
- Dedicated security account manager
- 24h SLA response time
Najczęściej zadawane pytania o pentest Node.js / Express
Jaka jest różnica między pentestem Node.js a standardowym npm-audit?
npm audit identyfikuje znane CVE w zainstalowanych zależnościach przez bazę GitHub Advisory. Pentest Node.js idzie dalej: testujemy wzorce specyficzne dla runtime (prototype pollution, SSRF przez klientów HTTP, deserializacja), konfigurację middleware Express oraz wykazujemy rzeczywistą eksploatowalność z proof-of-exploit. npm audit raportuje 'jest CVE'. Pentest wykazuje 'oto jak jest eksploatowane w waszym kodzie'.
Jak audytujecie łańcuch dostaw npm?
Nasz proces obejmuje cztery warstwy: (1) statyczna analiza package-lock.json w celu identyfikacji wszystkich zależności tranzytywnych (często 800-2000+ na projekt); (2) krzyżowe odniesienie do NVD, GitHub Advisory i Snyk Database dla niezałatanych CVE; (3) detekcja podejrzanych pakietów (typosquatting, skrypty post-install, nowe pakiety o niskim pobraniu); (4) rekomendacje pinningu i migracji do utrzymywanych alternatyw. W końcowym raporcie dostarczamy pełne mapowanie ryzyk supply-chain.
Moja aplikacja Node.js używa NestJS / Fastify / Koa zamiast Express. Czy pentest ma zastosowanie?
Tak. Pokrywamy cały ekosystem Node.js: NestJS, Fastify, Koa, Hapi, AdonisJS, RedwoodJS oraz Next.js (po stronie API routes). Klasy podatności są w dużej mierze wspólne (prototype pollution, deserializacja, SSRF, supply-chain), ale adaptujemy wektory testowe do każdego frameworka.
Czy pentest może testować nasze API GraphQL w Node.js (Apollo, GraphQL Yoga)?
Tak. API GraphQL w Node.js wymagają specyficznych testów wykraczających poza tradycyjny OWASP API Top 10: query depth limiting (DoS przez zagnieżdżone zapytania), introspection na produkcji (wyciek schematu), ataki batch query oraz autoryzacja na poziomie resolverów.
Jak obsługujecie testy Node.js na architekturach serverless (Lambda, Vercel, Cloudflare Workers)?
Testujemy serverlessowe funkcje Node.js jak każdy endpoint HTTP, ze szczególną uwagą na specyfikę: timing cold-start side-channel, wyciek zmiennych środowiskowych przez stack traces, eskalacja uprawnień IAM role (Lambda), niezamierzone współdzielenie stanu między wywołaniami.
Jak długo trwa kompletny pentest Node.js?
Pełny zautomatyzowany skan (pokrywający 7 głównych klas podatności Node.js) trwa około 60 minut dla typowej aplikacji Express. Dla bardziej złożonych aplikacji (mikroserwisy Node.js, GraphQL) 2-4 godziny. Raport gotowy do audytu w ciągu 24 godzin.
Go deeper — related blog articles
Zabezpiecz swoją aplikację Node.js już teraz
Pierwszy skan w 3 minuty, kompletny pentest Node.js w 60 minut z proof-of-exploit dla każdego znaleziska. Raport gotowy do audytów DORA / NIS2 / ISO 27001 już od 149 EUR.
Rozpocznij darmowy skan