AlertIT — podatności CVE na żywo
Serwis, który w czasie rzeczywistym pokazuje nowo publikowane podatności CVE — bez odświeżania strony, bez limitów API, w utwardzonym kontenerze Docker.
- Node.js
- Express
- Server-Sent Events
- CVE JSON 5
- Docker
- nginx
- Cloudflare
O projekcie
AlertIT śledzi oficjalne repozytorium CVE (CVEProject/cvelistV5) i pokazuje nowe podatności w chwili ich publikacji — w jednym, czytelnym miejscu, bez ręcznego odświeżania. Powstał z codziennej potrzeby: zamiast przeglądać kanały RSS i biuletyny producentów, chciałem od razu widzieć, co nowego pojawiło się w bazie CVE i jak bardzo jest groźne.
Najważniejsze funkcje
- Feed na żywo — nowe rekordy trafiają do przeglądarki przez Server-Sent Events; pasek statusu pokazuje stan połączenia i odliczanie do kolejnego sprawdzenia.
- Widok dnia — wszystkie CVE opublikowane danego dnia (strefa Europe/Warsaw) z nawigacją do 30 dni wstecz.
- Filtry według krytyczności CVSS — krytyczne, wysokie, średnie, niskie, bez oceny — oraz sortowanie od najgroźniejszych.
- Wyszukiwarka — po numerze CVE, producencie lub produkcie, a w trybie zaawansowanym także po zakresie dat i przedziale oceny CVSS.
- Szczegóły podatności — produkty i wersje, CNA, daty publikacji, linki do NVD i CVE.org oraz tłumaczenie opisu na polski.
- Podsumowanie dnia i powiadomienia w przeglądarce.
Jak to działa
Backend w Node.js regularnie (domyślnie co 90 s) pobiera tylko początek dziennika zmian deltaLog.json — zapytaniem HTTP Range z nagłówkiem If-None-Match, więc gdy nic się nie zmieniło, odpowiedź to lekkie 304. Z nowych paczek wybiera nowo opublikowane rekordy, pobiera je, parsuje zgodnie ze schematem CVE JSON 5 i rozsyła do wszystkich podłączonych przeglądarek.
Dni, których jeszcze nie ma lokalnie, są dociągane i zapisywane po stronie serwera — przeglądarka nigdy nie łączy się bezpośrednio z GitHubem. Aplikacja nie korzysta z GitHub API, więc nie dotyczą jej limity zapytań i nie potrzebuje tokena.
Bezpieczeństwo
- Dane z repozytorium są traktowane jako niezaufane: sanityzacja po stronie serwera, a w przeglądarce renderowanie wyłącznie przez
textContent. - Ruch wychodzący tylko do zahardkodowanych hostów; adresy rekordów budowane ze zwalidowanego numeru CVE, a nie z linków w pobieranych danych (brak SSRF).
- Ścisły Content Security Policy i rate limiting API.
- Kontener bez uprawnień roota, z systemem plików tylko do odczytu,
cap_drop: ALLino-new-privileges; ruch publiczny przez Cloudflare.