Darmowy
Na próbę
- 1 projekt
- Analiza pakietów i kodu
- Paczki wymyślone i złośliwe
- Podsumowanie podatności
Narzędzia
- Techniczny raport PDF
- Eksport OpenVEX
- SBOM CycloneDX
- Klucz do Twojego CI
Wrzuć plik zależności albo archiwum projektu. Tamiso odrzuca alerty, które Cię nie dotyczą, i mówi po polsku, co poprawić i jak.
Dotyczą Cię 3 z 31 znanych podatności.
Zaktualizuj next z wersji 15.2.2 do 15.2.3 lub nowszej (poprawia CVE-2025-29927). Uruchom npm install next@15.2.3, żeby zaktualizować package.json i plik blokady. Potem uruchom testy i sprawdź, czy aplikacja się uruchamia.
Zaktualizuj path-to-regexp z wersji 0.1.7 do 0.1.10 lub nowszej (poprawia CVE-2024-45296). path-to-regexp to zależność pośrednia, przychodzi przez express: najpierw zaktualizuj express do wersji, która używa path-to-regexp 0.1.10 lub nowszej; w przeciwnym razie dodaj path-to-regexp do overrides w package.json i zainstaluj ponownie przez npm. Potem uruchom testy i sprawdź, czy aplikacja się uruchamia.
Przeczytaj biuletyn i sprawdź, czy Twoja aplikacja używa tej funkcji albo opcji. Jeśli tak, zaktualizuj do 1.6.0. Jeśli nie, możesz zignorować te podatności. Biuletyn: https://osv.dev/vulnerability/GHSA-wf5p-g6vw-rhxx
src/lib/http.ts:1
src/lib/http.ts:2
lodash 4.17.20 CVE-2021-23337
Wstrzyknięcie poleceń przez funkcję template
Odrzucona przez Ciebie: nasz kod nigdy nie wywołuje podatnej części.
Importowany w Twoim kodzie: src/lib/http.ts:2
Nie istnieją w npm. Często to nazwa wymyślona przez AI: ktoś może ją później opublikować ze złośliwym kodem. Jeśli nie pochodzi z prywatnego rejestru, usuń ją.
stripe-checkout-helper-ts3const stripe = new Stripe("sk_l****")
Z tym kluczem każdy może tworzyć płatności i zwroty oraz czytać dane klientów.
2alter table orders disable row level security;
Tabelę znowu może czytać i zmieniać każdy z kluczem anon.
Bez tego nagłówka przeglądarka może jeszcze otworzyć nieszyfrowaną wersję strony.
Pliki .map pozwalają odtworzyć oryginalny kod źródłowy, razem z komentarzami.
https://boutique-martin.fr/_next/static/chunks/main.js.mapJeden projekt na aplikację klienta. Tamiso trzyma historię wersji, sprawdza codziennie od nowa i przygotowuje to, co wysyłasz klientom.
Jedno miejsce na wszystko: plik zależności sprawdza paczki, archiwum .zip albo repozytorium GitHub sprawdza też kod. Tamiso porównuje z Twoimi decyzjami i pokazuje tylko to, co zostało.
Codziennie Tamiso sprawdza ponownie paczki z ostatniej wersji w bazach podatności i w katalogu CISA KEV. Nowa luka pojawia się tutaj i w historii.
Ostatnie automatyczne sprawdzenie 01/11/2026 o 06:00 UTC. 1 nowa luka 30/10.
Kod wysłany jako .zip nie jest przechowywany: codziennie sprawdzamy ponownie tylko paczki. Podepnij repozytorium, żeby kod też był sprawdzany.
Wersje zależności i analizy kodu, od najnowszych.
W src/lib/stripe.ts:3: Tajny klucz Stripe w kodzie. Unieważnij klucz w panelu Stripe, a potem czytaj go ze zmiennej środowiskowej po stronie serwera. Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
W supabase/migrations/003_orders.sql:1: Tabela Supabase bez RLS. Dodaj „alter table … enable row level security;”, a potem reguły, które ograniczają każdy wiersz do właściciela (auth.uid()). Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
W supabase/migrations/003_orders.sql:2: RLS wyłączony na tabeli. Usuń tę linię i włącz RLS z regułami dla każdego użytkownika. Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
Zrób te aktualizacje po kolei i po każdej uruchom testy: - Zaktualizuj next z wersji 15.2.2 do 15.2.3 lub nowszej (poprawia CVE-2025-29927). Uruchom npm install next@15.2.3, żeby zaktualizować package.json i plik blokady. Potem uruchom testy i sprawdź, czy aplikacja się uruchamia. - Zaktualizuj path-to-regexp z wersji 0.1.7 do 0.1.10 lub nowszej (poprawia CVE-2024-45296). path-to-regexp to zależność pośrednia, przychodzi przez express: najpierw zaktualizuj express do wersji, która używa path-to-regexp 0.1.10 lub nowszej; w przeciwnym razie dodaj path-to-regexp do overrides w package.json i zainstaluj ponownie przez npm. Potem uruchom testy i sprawdź, czy aplikacja się uruchamia.
Zaktualizuj next z wersji 15.2.2 do 15.2.3 lub nowszej (poprawia CVE-2025-29927). Uruchom npm install next@15.2.3, żeby zaktualizować package.json i plik blokady. Potem uruchom testy i sprawdź, czy aplikacja się uruchamia.
Zaktualizuj path-to-regexp z wersji 0.1.7 do 0.1.10 lub nowszej (poprawia CVE-2024-45296). path-to-regexp to zależność pośrednia, przychodzi przez express: najpierw zaktualizuj express do wersji, która używa path-to-regexp 0.1.10 lub nowszej; w przeciwnym razie dodaj path-to-regexp do overrides w package.json i zainstaluj ponownie przez npm. Potem uruchom testy i sprawdź, czy aplikacja się uruchamia.
Przeczytaj biuletyn i sprawdź, czy Twoja aplikacja używa tej funkcji albo opcji. Jeśli tak, zaktualizuj do 1.6.0. Jeśli nie, możesz zignorować te podatności. Biuletyn: https://osv.dev/vulnerability/GHSA-wf5p-g6vw-rhxx
src/lib/http.ts:1
src/lib/http.ts:2
Co Tamiso sprawdziło wokół pakietów i kodu oraz czego brakuje, żeby utwardzić projekt.
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
Nie istnieją w npm. Często to nazwa wymyślona przez AI: ktoś może ją później opublikować ze złośliwym kodem. Jeśli nie pochodzi z prywatnego rejestru, usuń ją.
Jeśli to wewnętrzna paczka z prywatnego rejestru, ryzyko i tak istnieje (dependency confusion): zarezerwuj tę nazwę, albo zakres @…, także w publicznym rejestrze i skonfiguruj prywatny rejestr jawnie (.npmrc, --index-url), żeby instalacja nigdy nie szukała gdzie indziej.
stripe-checkout-helper-tsPodatność trafia do „do poprawy”, jeśli jest aktywnie wykorzystywana (katalog CISA KEV, wersja makiety), jeśli jej prawdopodobieństwo wykorzystania EPSS przekracza 10%, jeśli jej waga jest krytyczna albo wysoka przy prawdopodobieństwie wykorzystania co najmniej 1%. Jest odrzucana, jeśli jej waga jest niska albo średnia przy prawdopodobieństwie wykorzystania poniżej 1%, albo jeśli pakiet służy tylko do developmentu. Reszta jest „do sprawdzenia”. Jedna aktualizacja często poprawia kilka podatności, dlatego są pogrupowane według pakietów. Twoja decyzja zawsze wygrywa z regułą. Wyjątek: krytyczna albo bardzo prawdopodobnie wykorzystywana podatność w paczce do developmentu zostaje „do sprawdzenia”, bo ta paczka działa na Waszych komputerach i w CI.
Paczka znana jako złośliwa (baza złośliwych paczek OpenSSF) jest zawsze „do poprawy”, nawet jeśli służy tylko do developmentu: działa już przy instalacji. Ten projekt ma też analizę kodu (01/11/2026): podatność w bezpośredniej paczce, której kod nigdy nie importuje i której według pliku blokady nie potrzebuje żadna inna paczka, spada o jeden poziom, a jeśli analiza AI pokazała, że kod nie używa podatnej części, podatność jest odrzucana z tym powodem. Podatności wykorzystywane aktywnie nigdy nie są tak odrzucane.
Twoje decyzje używają statusów OpenVEX („nie dotyczy” z uzasadnieniem albo „dotyczy”). Eksport OpenVEX zapisuje je w standardowym pliku JSON (tym samym, który czytają vexctl, Trivy i Grype): dołącz go do SBOM dla klientów i audytorów. Podatności bez decyzji mają w nim status „w trakcie analizy”.
Skąd przychodzą dane, przez które funkcje idą i dokąd trafiają. Problemy są w funkcji, w której powstają; wybierz jeden, żeby zostawić tylko jego ścieżkę.
Mapa zostawi wtedy tylko jego ścieżkę: wejście, z którego przychodzą dane, funkcje po drodze i miejsce, do którego trafiają.
3const stripe = new Stripe("sk_l****")
Z tym kluczem każdy może tworzyć płatności i zwroty oraz czytać dane klientów.
Unieważnij klucz w panelu Stripe, a potem czytaj go ze zmiennej środowiskowej po stronie serwera.
1create table orders (id uuid primary key, items jsonb, email text);
Bez Row Level Security publiczny klucz anon Twojej aplikacji wystarczy, żeby czytać i zmieniać całą tabelę.
Dodaj „alter table … enable row level security;”, a potem reguły, które ograniczają każdy wiersz do właściciela (auth.uid()).
2alter table orders disable row level security;
Tabelę znowu może czytać i zmieniać każdy z kluczem anon.
Usuń tę linię i włącz RLS z regułami dla każdego użytkownika.
4const res = await pool.query(`SELECT * FROM products WHERE name LIKE '%${q}%'`)
Jeśli wartość pochodzi od użytkownika, może on czytać albo kasować bazę (SQL injection).
Używaj parametrów (%s, ?, $1) albo ORM zamiast wklejać wartości do zapytania.
Mapa powstaje z czytania kodu (Python, JavaScript i TypeScript), bez uruchamiania go: wywołanie dynamiczne albo dekorator mogą umknąć. Zapisujemy tylko nazwy funkcji i tras oraz numery linii.
Z tym kluczem każdy może tworzyć płatności i zwroty oraz czytać dane klientów.
Unieważnij klucz w panelu Stripe, a potem czytaj go ze zmiennej środowiskowej po stronie serwera.
src/lib/stripe.ts:3const stripe = new Stripe("sk_l****")
W src/lib/stripe.ts:3: Tajny klucz Stripe w kodzie. Unieważnij klucz w panelu Stripe, a potem czytaj go ze zmiennej środowiskowej po stronie serwera. Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
Bez Row Level Security publiczny klucz anon Twojej aplikacji wystarczy, żeby czytać i zmieniać całą tabelę.
Dodaj „alter table … enable row level security;”, a potem reguły, które ograniczają każdy wiersz do właściciela (auth.uid()).
supabase/migrations/003_orders.sql:1create table orders (id uuid primary key, items jsonb, email text);
W supabase/migrations/003_orders.sql:1: Tabela Supabase bez RLS. Dodaj „alter table … enable row level security;”, a potem reguły, które ograniczają każdy wiersz do właściciela (auth.uid()). Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
Tabelę znowu może czytać i zmieniać każdy z kluczem anon.
Usuń tę linię i włącz RLS z regułami dla każdego użytkownika.
supabase/migrations/003_orders.sql:2alter table orders disable row level security;
W supabase/migrations/003_orders.sql:2: RLS wyłączony na tabeli. Usuń tę linię i włącz RLS z regułami dla każdego użytkownika. Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
Jeśli wartość pochodzi od użytkownika, może on czytać albo kasować bazę (SQL injection).
Używaj parametrów (%s, ?, $1) albo ORM zamiast wklejać wartości do zapytania.
src/lib/products.ts:4const res = await pool.query(`SELECT * FROM products WHERE name LIKE '%${q}%'`)
Dane wysłane przez użytkownika w src/app/api/search/route.ts:4, przekazane przez searchProducts (src/app/api/search/route.ts:5), użyte tutaj bez sprawdzenia.
W src/lib/products.ts:4: Zapytanie SQL sklejane z tekstu użytkownika. Używaj parametrów (%s, ?, $1) albo ORM zamiast wklejać wartości do zapytania. Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
Klucze i hasła wpisane w kod (Stripe, AWS, GitHub, GitLab, OpenAI, Anthropic, Hugging Face, SendGrid, Slack, Telegram, Google, tokeny npm i PyPI, adresy baz danych z hasłem, klucze prywatne, pliki .env), tajny klucz aplikacji wpisany na sztywno, sekrety wystawione przeglądarce (NEXT_PUBLIC_, VITE_…), klucz service_role Supabase po stronie przeglądarki, tabele Supabase bez RLS albo z otwartymi regułami (we wszystkich migracjach projektu), reguły Firebase otwarte albo w „trybie testowym”, widoki i funkcje Supabase omijające RLS, zapytania SQL i polecenia systemowe sklejane z tekstu, zapytania, pliki i przekierowania wybierane przez użytkownika (także gdy wartość przechodzi przez zmienną kilka linii wyżej), dane zapisywane bez wyboru pól, wczytywanie danych, które może wykonać kod, hasła haszowane MD5 albo porównywane ze stałą wartością, osłabiona ochrona CSRF albo ciasteczka sesji, tokeny w localStorage albo losowane przez Math.random, włączony tryb debug, wyłączona weryfikacja TLS albo JWT, CORS otwarty z danymi logowania i HTML wstawiany bez oczyszczenia. Przykładowe wartości (your-key, xxxx), domyślne hasła lokalne, komentarze, testy i konfiguracje testowe nie są zgłaszane, z wyjątkiem sekretów.
W projekcie analiza zapisuje też, które paczki są importowane w kodzie: podatność w paczce, której kod nigdy nie importuje i której według pliku blokady nie potrzebuje żadna inna paczka, spada o jeden poziom, z powodem. Znalezione pliki zależności (package-lock.json, requirements.txt, composer.lock…) od razu dają nową wersję analizy zależności.
Kod jest czytany w pamięci i zapominany: Tamiso zatrzymuje tylko nazwę pliku, linię i krótki fragment z zamaskowanymi sekretami. Katalogi zależności i budowania (node_modules, dist…) są pomijane. Analiza regułami nie zastępuje przeglądu bezpieczeństwa.
Ciasteczko bez Secure może iść bez szyfrowania, bez HttpOnly odczyta je wstrzyknięty skrypt, bez SameSite jest wysyłane z zapytaniami z innych stron.
Dodaj Secure, HttpOnly i SameSite=Lax do ciasteczek sesji.
session : Secure, SameSiteTamiso znalazło problem bezpieczeństwa na mojej stronie https://boutique-martin.fr: Ciasteczko bez zabezpieczeń (session : Secure, SameSite). Ciasteczko bez Secure może iść bez szyfrowania, bez HttpOnly odczyta je wstrzyknięty skrypt, bez SameSite jest wysyłane z zapytaniami z innych stron. Popraw to w kodzie albo konfiguracji projektu: Dodaj Secure, HttpOnly i SameSite=Lax do ciasteczek sesji. Napisz, co zmieniłeś i co muszę ustawić sam u hostingu.
Bez tego nagłówka przeglądarka może jeszcze otworzyć nieszyfrowaną wersję strony.
Dodaj nagłówek Strict-Transport-Security: max-age=31536000; includeSubDomains.
Tamiso znalazło problem bezpieczeństwa na mojej stronie https://boutique-martin.fr: Brak nagłówka Strict-Transport-Security (https://boutique-martin.fr). Bez tego nagłówka przeglądarka może jeszcze otworzyć nieszyfrowaną wersję strony. Popraw to w kodzie albo konfiguracji projektu: Dodaj nagłówek Strict-Transport-Security: max-age=31536000; includeSubDomains. Napisz, co zmieniłeś i co muszę ustawić sam u hostingu.
Wersja http:// nie przekierowuje na https://: w publicznym Wi-Fi ktoś może podejrzeć albo zmienić to, co widzi odwiedzający.
Włącz automatyczne przekierowanie na HTTPS w ustawieniach hostingu.
http://boutique-martin.fr/Tamiso znalazło problem bezpieczeństwa na mojej stronie https://boutique-martin.fr: Strona działa też bez HTTPS (http://boutique-martin.fr/). Wersja http:// nie przekierowuje na https://: w publicznym Wi-Fi ktoś może podejrzeć albo zmienić to, co widzi odwiedzający. Popraw to w kodzie albo konfiguracji projektu: Włącz automatyczne przekierowanie na HTTPS w ustawieniach hostingu. Napisz, co zmieniłeś i co muszę ustawić sam u hostingu.
Pliki .map pozwalają odtworzyć oryginalny kod źródłowy, razem z komentarzami.
Wyłącz mapy źródeł na produkcji (na przykład productionBrowserSourceMaps: false, build.sourcemap: false) albo udostępniaj je tylko narzędziu do śledzenia błędów.
https://boutique-martin.fr/_next/static/chunks/main.js.mapTamiso znalazło problem bezpieczeństwa na mojej stronie https://boutique-martin.fr: Kod źródłowy opublikowany razem z mapami źródeł (https://boutique-martin.fr/_next/static/chunks/main.js.map). Pliki .map pozwalają odtworzyć oryginalny kod źródłowy, razem z komentarzami. Popraw to w kodzie albo konfiguracji projektu: Wyłącz mapy źródeł na produkcji (na przykład productionBrowserSourceMaps: false, build.sourcemap: false) albo udostępniaj je tylko narzędziu do śledzenia błędów. Napisz, co zmieniłeś i co muszę ustawić sam u hostingu.
Ten nagłówek ogranicza skrypty, które strona może wczytać: mocno zmniejsza skutki luki XSS.
Dodaj politykę Content-Security-Policy: zacznij od default-src 'self', potem dopisz potrzebne domeny.
Tamiso znalazło problem bezpieczeństwa na mojej stronie https://boutique-martin.fr: Brak nagłówka Content-Security-Policy (https://boutique-martin.fr). Ten nagłówek ogranicza skrypty, które strona może wczytać: mocno zmniejsza skutki luki XSS. Popraw to w kodzie albo konfiguracji projektu: Dodaj politykę Content-Security-Policy: zacznij od default-src 'self', potem dopisz potrzebne domeny. Napisz, co zmieniłeś i co muszę ustawić sam u hostingu.
Inna strona może wyświetlić Twoją w przezroczystej ramce i skłonić odwiedzających do kliknięć bez ich wiedzy (clickjacking).
Dodaj Content-Security-Policy: frame-ancestors 'self' (albo X-Frame-Options: DENY).
Tamiso znalazło problem bezpieczeństwa na mojej stronie https://boutique-martin.fr: Stronę można wyświetlić w ramce innej strony (https://boutique-martin.fr). Inna strona może wyświetlić Twoją w przezroczystej ramce i skłonić odwiedzających do kliknięć bez ich wiedzy (clickjacking). Popraw to w kodzie albo konfiguracji projektu: Dodaj Content-Security-Policy: frame-ancestors 'self' (albo X-Frame-Options: DENY). Napisz, co zmieniłeś i co muszę ustawić sam u hostingu.
Pełny adres Twoich stron (z parametrami) może trafiać do serwisów, które te strony wywołują.
Dodaj nagłówek Referrer-Policy: strict-origin-when-cross-origin.
Tamiso znalazło problem bezpieczeństwa na mojej stronie https://boutique-martin.fr: Brak nagłówka Referrer-Policy (https://boutique-martin.fr). Pełny adres Twoich stron (z parametrami) może trafiać do serwisów, które te strony wywołują. Popraw to w kodzie albo konfiguracji projektu: Dodaj nagłówek Referrer-Policy: strict-origin-when-cross-origin. Napisz, co zmieniłeś i co muszę ustawić sam u hostingu.
Ktoś, kto znajdzie lukę, nie wie, do kogo napisać. Dla produktu sprzedawanego w UE Cyber Resilience Act wymaga kontaktu do zgłaszania podatności.
Opublikuj /.well-known/security.txt z co najmniej linią Contact: i linią Expires: (RFC 9116).
Tamiso znalazło problem bezpieczeństwa na mojej stronie https://boutique-martin.fr: Brak pliku security.txt (https://boutique-martin.fr). Ktoś, kto znajdzie lukę, nie wie, do kogo napisać. Dla produktu sprzedawanego w UE Cyber Resilience Act wymaga kontaktu do zgłaszania podatności. Popraw to w kodzie albo konfiguracji projektu: Opublikuj /.well-known/security.txt z co najmniej linią Contact: i linią Expires: (RFC 9116). Napisz, co zmieniłeś i co muszę ustawić sam u hostingu.
Każdy skan szuka też wrażliwych plików (.env, .git, kopie, logi), trybu debug i konsol, narzędzi administracyjnych, dokumentacji API i GraphQL, otwartych przekierowań, listowanych katalogów, starych wersji TLS, security.txt i CORS. Wszystko tylko do odczytu, tylko na Twojej domenie: bez logowania, bez wysyłania formularzy, bez zmiany danych.
Zostaw kod weryfikacyjny na miejscu: sprawdzamy go przed każdym pełnym skanem.
|
Atelier Lumen
Bezpieczeństwo Twojej aplikacji: Boulangerie Martin, boutique-en-lignePrzygotowany dla: Claire Martin. Wersja z 01/11/2026: 142 przeanalizowane paczki. Przeanalizowaliśmy też kod projektu.
2 aktualizacje zaplanowane
Żadna znana luka nie jest teraz wykorzystywana przeciw komponentom Twojej aplikacji. 2 komponenty mają znaną lukę do obsłużenia: aktualizujemy je do 15/11/2026. Kod zawiera tajny klucz do usunięcia i wymiany. 2aktualizacje do zrobienia
1pakiet do sprawdzenia
31znanych luk, w tym 28 odrzuconych
4poważne problemy w kodzie
Co poprawiamy
Co sprawdzamy
Rejestr obsługi podatnościTerminy od wykrycia: 7 dni dla podatności aktywnie wykorzystywanej albo krytycznej, 30 dni dla wysokiej wagi, 90 dni dla średniej, 180 dni dla niskiej.
Co sprawdziliśmyKomponenty142 paczki sprawdzone w bazach OSV i FIRST EPSS oraz w katalogu CISA KEV.
Paczki wymyślone albo złośliweJedna paczka, której nie ma w rejestrze, często wymyślona przez AI.
Klucze i hasłaJeden tajny klucz w kodzie: do usunięcia i wymiany.
Kod aplikacji3 poważne problemy do poprawy (dostęp do danych, wstrzyknięcie albo konfiguracja).
Lukę odrzucamy, gdy nie dotyczy Twojej aplikacji: nieużywana część komponentu, bardzo małe ryzyko w praktyce albo decyzja sprawdzona przez nasz zespół. Lista 28 odrzuconych luk z powodem każdej jest dostępna na prośbę w Atelier Lumen. Ten raport nie zastępuje audytu bezpieczeństwa. Źródła: OSV, FIRST EPSS, CISA KEV (katalog z makiety), PyPI, npm.
Atelier Lumen
Analiza wykonana w Tamiso
|
Każdy projekt w jednym miejscu: stan zależności i kodu, codzienna kontrola i historia wersji. Zobacz szczegóły
Na próbę
Narzędzia
Dla twórców działających w pojedynkę
Narzędzia ponad plan Darmowy
Dla agencji i małych zespołów
Narzędzia ponad plan Indie
Dla producentów oprogramowania i urządzeń IoT
Narzędzia ponad plan Studio
W płatnych planach AI jest częścią analizy. Przegląda alerty w Twoim kodzie i odrzuca fałszywe, sprawdza, czy Twój kod naprawdę wywołuje podatną część paczki, wyjaśnia każdą lukę prostym językiem i tłumaczy opisy z baz. Plan darmowy analizuje na podstawie publicznych baz i naszych reguł, bez wysyłania Twojego kodu do modelu AI.
Rocznie, 2 miesiące gratis: Indie 190 €, Studio 590 €, Wydawca 1 490 € rocznie netto. Płatne plany ruszają wkrótce: zarezerwuj swój, bez płacenia dziś. Pro i Partner (konsultanci, agencje, audytorzy) wyceniamy indywidualnie. Zarezerwuj plan