E-mail potwierdzony
Sprawdzamy shop.example.com
Możesz zamknąć tę kartę. Raport otworzy się pod linkiem z maila.
- Wczytujemy stronę
- Pobieramy pliki JavaScript
- Rozpoznajemy framework i biblioteki
- Sprawdzamy znane podatności
- Szukamy kluczy i map źródeł
- Sprawdzamy nagłówki, ciasteczka i TLS
- Piszemy raport
Raport bezpieczeństwa
shop.example.com
Od czego zaczęlibyśmy
- Unieważnijcie jeszcze dziś klucz Stripe z main.js i przenieście wywołania, które go potrzebują, na backend.
- Aktualizujcie Angulara 15 po jednej wersji głównej aż do 22; każdy krok zamyka znane błędy XSS we frameworku.
- Wyłączcie publiczne mapy źródeł i dodajcie Content Security Policy, zanim zacznie się aktualizacja.
Co wykryliśmy
- FrameworkPrzestarzałe
- Angular 15.2.10Bez wsparcia długoterminowego od 18 maja 2024.
- Renderowanie
- Angular SSR (Express)
- Serwer
- nginx 1.18.0
- CDN
- Cloudflare
- JavaScript
- 12 plików, 3.4 MB
- BibliotekiPrzestarzałe
- lodash 4.17.15, moment 2.29.1, RxJS 7.8.0moment.js: W trybie utrzymania od 2020; autorzy polecają Luxon, date-fns albo Temporal API.
Jak odejść od Angular 15, moment.js
Przenosimy przestarzałe fronty na aktualne technologie ekran po ekranie, a Wasz zespół w tym czasie dalej wdraża nowe funkcje. Dostajecie plan migracji z kolejnością modułów i wyceną czasu.
Wyniki (10)
Krytyczne 2
KrytyczneAngular 15 nie dostaje już poprawek bezpieczeństwaFramework
Co znaleźliśmy
<app-root ng-version="15.2.10">Czym to grozi
Wsparcie długoterminowe Angulara 15 skończyło się w maju 2024. Podatności znalezione od tego czasu są łatane tylko w wersjach 20, 21 i 22, więc Wasza aplikacja pozostaje na nie podatna.
Jak to naprawić
Aktualizujcie po jednej wersji głównej przez ng update (15 → 16 → … → 22) i uruchamiajcie testy po każdym kroku. Od Angulara 17 możecie też przejść na nowy control flow i sygnały.
ng update @angular/core@16 @angular/cli@16KrytyczneTajny klucz Stripe w paczce JavaScriptKlucze i tokeny
Co znaleźliśmy
main.4f2a9c1e.js, linia 1: sk_live_51H••••••••••••••••3kQ (nigdy nie zapisujemy pełnej wartości)Czym to grozi
Każdy, kto otworzy stronę, odczyta ten klucz i może nim robić zwroty, czytać dane klientów albo tworzyć obciążenia na Waszym koncie Stripe.
Jak to naprawić
Unieważnijcie klucz w panelu Stripe jeszcze dziś i wygenerujcie nowy. Wszystkie wywołania, które go potrzebują, przenieście na backend; frontend powinien używać tylko klucza publicznego (pk_live_…).
Wysokie 3
WysokieMapy źródeł są dostępne publicznieKod źródłowy
Co znaleźliśmy
GET /main.4f2a9c1e.js.map → 200 OK (2.1 MB) i 11 kolejnych plików .mapCzym to grozi
Mapy źródeł odtwarzają oryginalny kod TypeScript: nazwy plików, komentarze, wewnętrzne endpointy i logikę biznesową. Z nimi atakującemu dużo łatwiej znaleźć kolejną słabość.
Jak to naprawić
Wyłączcie mapy źródeł w konfiguracji produkcyjnej. Jeśli są potrzebne do śledzenia błędów, wysyłajcie je w trakcie buildu do Sentry (lub podobnego narzędzia) i nie wgrywajcie na serwer.
// angular.json → configurations.production
"sourceMap": falseWysokieOchrona przed XSS wyłączona w 3 miejscachXSS
Co znaleźliśmy
bypassSecurityTrustHtml ×2 (chunk-product.8a1d.js), bypassSecurityTrustResourceUrl ×1 (chunk-cms.19bc.js)Czym to grozi
Te wywołania każą Angularowi pominąć sanityzację. Jeśli wartość pochodzi od użytkownika, z CMS-a albo z API, atakujący może wstrzyknąć skrypt, który uruchomi się w przeglądarkach Waszych klientów.
Jak to naprawić
Sprawdźcie, skąd pochodzi każda wartość. HTML z CMS-a podpinajcie przez [innerHTML] i zostawcie sanityzację Angularowi. bypassSecurityTrust* zostawcie tylko dla wartości budowanych przez Wasz własny kod i opiszcie, dlaczego.
WysokieBrak Content Security PolicyNagłówki
Co znaleźliśmy
Nagłówki odpowiedzi / nie zawierają Content-Security-PolicyCzym to grozi
Bez CSP przeglądarka uruchomi każdy wstrzyknięty skrypt. CSP to druga linia obrony, gdy błąd XSS jednak się prześlizgnie.
Jak to naprawić
Zacznijcie od polityki w trybie report-only, poprawcie zgłoszone naruszenia, potem ją egzekwujcie. Angular 19+ sam dodaje nonce (autoCsp); w starszych wersjach użyjcie ngCspNonce.
Content-Security-Policy: script-src 'self' 'nonce-{random}'; object-src 'none'; base-uri 'self'Średnie 3
ŚrednieWewnętrzny adres API w stanie SSRWyciek danych
Co znaleźliśmy
<script id="ng-state"> zawiera "apiBase":"http://10.0.3.14:8080"Czym to grozi
Strona podaje każdemu odwiedzającemu prywatny adres Waszego serwera API. Sam w sobie nie otwiera drogi do systemu, ale pokazuje mapę sieci wewnętrznej.
Jak to naprawić
Nie umieszczajcie konfiguracji w TransferState. Po stronie klienta używajcie ścieżki względnej (/api), a wewnętrzny adres trzymajcie tylko w zmiennych środowiskowych serwera.
Średnielodash 4.17.15: 1 znana podatnośćBiblioteki
Co znaleźliśmy
lodash 4.17.15 w vendor.3c7e.js (CVE-2020-8203, prototype pollution)Czym to grozi
Kod, który łączy dane od użytkownika przez _.zipObjectDeep, może zmienić działanie każdego obiektu w aplikacji.
Jak to naprawić
Zaktualizujcie lodash do 4.17.21 lub nowszej wersji i dodajcie npm audit do CI, żeby znane podatności zatrzymywały build.
npm install lodash@^4.17.21ŚrednieCiasteczko sesji czytelne z JavaScriptuCiasteczka
Co znaleźliśmy
Set-Cookie: sid=…; Path=/; Secure (brak HttpOnly i SameSite)Czym to grozi
Bez HttpOnly wystarczy jeden błąd XSS, żeby przejąć zalogowaną sesję. Bez SameSite ciasteczko idzie też z żądaniami z innych stron (CSRF).
Jak to naprawić
Ustawiajcie na backendzie ciasteczko sesji z HttpOnly, Secure i SameSite=Lax (albo Strict).
Niskie 2
Niskie2 zewnętrzne skrypty bez sprawdzania integralnościSkrypty zewnętrzne
Co znaleźliśmy
cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.js, cdn.jsdelivr.net/npm/chart.js@3Czym to grozi
Jeśli CDN albo paczka zostanie przejęta, zmieniony skrypt uruchomi się na Waszej stronie z pełnym dostępem do niej. Tak było z polyfill.io w 2024 roku.
Jak to naprawić
Zainstalujcie te biblioteki z npm i dołączcie do aplikacji albo dodajcie atrybuty integrity i crossorigin z przypiętą wersją.
NiskieBrak pliku security.txtZgłaszanie luk
Co znaleźliśmy
GET /.well-known/security.txt → 404Czym to grozi
Badacz, który znajdzie podatność, nie wie, jak ją Wam zgłosić, więc zgłoszenia giną albo trafiają najpierw do publicznej wiadomości.
Jak to naprawić
Opublikujcie krótki plik z adresem kontaktowym i datą ważności.
Contact: mailto:security@shop.example.com
Expires: 2027-09-30T00:00:00.000ZZaliczone 6
- HTTP przekierowuje na HTTPS
- Włączone tylko TLS 1.2 i 1.3
- Certyfikat ważny do 14 stycznia 2027
- Angular działa w trybie produkcyjnym
- X-Content-Type-Options: nosniff
- Ochrona przed clickjackingiem (frame-ancestors)
Ten test obejmuje to, co widać publicznie: stronę, jej pliki JavaScript i odpowiedzi HTTP. Nie obejmuje repozytorium kodu, stron za logowaniem ani backendu.
Sprawdzimy też to, czego skan nie widzi
Ten test widzi tylko to, co Wasza strona pokazuje publicznie. Sprawdzimy też kod, panel administracyjny i integracje, załatamy znalezione luki i zaplanujemy odejście od Angular 15.
Porozmawiajmy o wynikach