Telegram stał się jednym z najważniejszych źródeł danych do analizy cyberzagrożeń w czasie rzeczywistym. Aktorzy zagrożeń powiązani z państwami, kolektywy haktywistów i grupy przestępcze przeprowadzające ataki na cele rządowe, infrastrukturę krytyczną i obronność rutynowo ogłaszają operacje przed ich przeprowadzeniem lub bezpośrednio po nim – wymieniając ofiary, deklarując wektory ataków i publikując dowody. Problem stanowią jednak wolumen i struktura: setki kanałów, tysiące wiadomości dziennie, prawie wszystkie w nieustrukturyzowanym języku naturalnym, zmieszane z szumem, repostami i dezinformacją.

Corvus.Sense został zbudowany do rozwiązania tego problemu w skali produkcyjnej. Jego rdzeń stanowi wieloetapowy potok LLM, który pobiera surowe strumienie wiadomości z Telegrama i produkuje ustrukturyzowane rekordy analizy zagrożeń z klasyfikacją sektora, atrybucją geograficzną, tagowaniem wektora ataku i wynikami pewności – w czasie poniżej 90 sekund od publikacji wiadomości. Niniejszy artykuł opisuje architekturę tego potoku i uzasadnienie każdej decyzji projektowej.

Dlaczego LLM, a nie ekstrakcja oparta na regułach

Pierwszą decyzją projektową był wybór między deterministyczną ekstrakcją (wyrażenia regularne, dopasowywanie słów kluczowych, rozpoznawanie nazwanych jednostek) a generatywnym wnioskodawstwem LLM do klasyfikacji. Obie metody ocenialiśmy szeroko na oznaczonym zbiorze danych zawierającym 12 000 potwierdzonych ogłoszeń ataków z 34 kanałów Telegrama. Wnioski były jednoznaczne.

Systemy oparte na regułach osiągały akceptowalną precyzję dla dobrze znanych grup aktorów ze spójnymi wzorcami publikacji, ale zawodziły w przypadku nowych aktorów, code-switchingu (wiadomości mieszające język ukraiński, rosyjski i angielski), skrótów, celowej obfuskacji i zmienności stylistycznej. Wskaźniki fałszywych negatywów powyżej 30% dla kanałów nowych aktorów czyniły ekstrakcję opartą na regułach operacyjnie niewystarczającą – pominięcie co trzeciego prawdziwego ogłoszenia ataku nie jest akceptowalnym produktem wywiadowczym.

Klasyfikacja oparta na LLM osiągnęła ponad 91% F1 na tym samym zbiorze ewaluacyjnym, w tym na wiadomościach z code-switchingiem i kanałach nowych aktorów nieobecnych w danych treningowych. Kompromisem jest opóźnienie i koszt na wiadomość, które oba rozwiązujemy poprzez opisaną poniżej architekturę potoku.

Etap 1 potoku: pobieranie i wstępne przetwarzanie

Corvus.Sense łączy się z kanałami Telegrama przez API Telegrama, korzystając z dedykowanych kont serwisowych. Każdy skonfigurowany kanał jest odpytywany w konfigurowalnym interwale (domyślnie 30 sekund). Nowe wiadomości od ostatniego znacznika czasu odpytywania są pobierane, deduplikowane względem indeksu ID wiadomości i umieszczane w kolejce do przetworzenia.

Wstępne przetwarzanie rozwiązuje kilka problemów jakości danych przed przystąpieniem do wnioskowania. Wiadomości krótsze niż 20 tokenów są odrzucane – nie zawierają wystarczającej treści semantycznej do klasyfikacji. Przekazane wiadomości (forwardy) są śledzone wraz z kanałem źródłowym; jeśli oryginał został już przetworzony, przekazanie jest oznaczane jako duplikat i pomijane, zapobiegając generowaniu przez to samo ogłoszenie wielu rekordów alertów. Wiadomości zawierające wyłącznie media (obrazy, wideo bez podpisu) trafiają do oddzielnej kolejki dla potoku opartego na wizji, wykraczającego poza zakres tego artykułu.

Na każdej wiadomości uruchamiane jest wykrywanie języka (ISO 639-1). Ten tag jest przekazywany dalej do promptu LLM, umożliwiając używanie odpowiednich językowo przykładów few-shot w prompcie klasyfikacyjnym.

Etap 2 potoku: binarna klasyfikacja trafności

Pełne wywołanie klasyfikacji LLM jest kosztowne w stosunku do wolumenu przetwarzanych wiadomości. Przed każdym wnioskowaniem LLM uruchamiana jest bramka lekkiego klasyfikatora binarnego, który filtruje treści nieoperacyjne. Ten klasyfikator to dostrojony model enkodera (350M parametrów) wytrenowany do rozróżniania operacyjnych ogłoszeń ataków od komentarzy, repostów prasowych, ogłoszeń rekrutacyjnych, propagandy i ogólnych treści kanałów.

Klasyfikator binarny działa w czasie poniżej 200 milisekund na wiadomość na sprzęcie do wnioskowania opartym wyłącznie na CPU. Na produkcyjnym zbiorze ewaluacyjnym osiąga 94,3% precyzji i 89,7% czułości. Wartość czułości celowo nie jest podwyższana – koszt fałszywego negatywu na tym etapie (prawdziwe ogłoszenie, które nie trafia do klasyfikacji LLM) jest wysoki, więc próg jest ustawiony konserwatywnie w celu maksymalizacji czułości. Fałszywe alarmy na tym etapie powodują pełne wywołanie wnioskowania LLM, co stanowi kontrolowany kompromis.

Kluczowa obserwacja: Bramka binarna nie jest wąskim gardłem dokładności – jest filtrem kosztów. Dokładność zapewnia etap LLM. Bramka istnieje po to, aby LLM obsługiwał wyłącznie kandydujące wiadomości operacyjne, co redukuje dzienne wywołania LLM o około 78% w porównaniu z uruchamianiem wnioskowania LLM na pełnym strumieniu wiadomości.

Etap 3 potoku: klasyfikacja i wzbogacanie przez LLM

Wiadomości, które przejdą bramę binarną, trafiają do etapu klasyfikacji LLM. Corvus.Sense używa promptu ze strukturyzowanym wyjściem, który instruuje model do wyodrębniania i klasyfikowania każdego z następujących pól z tekstu wiadomości:

Organizacja ofiary. Nazwana lub domniemana organizacja docelowa, znormalizowana do formy kanonicznej. Gdy wiadomość wymienia konkretną organizację (np. ministerstwo, przedsiębiorstwo użyteczności publicznej lub instytucję finansową), jej nazwa jest wyodrębniana dosłownie. Gdy ofiara jest jedynie sugerowana przez sektor i geografię bez konkretnej nazwy, pole jest wypełniane wartością null i oznaczane do weryfikacji przez analityka.

Klasyfikacja sektora. Jedna z ośmiu stałych etykiet taksonomii: infrastruktura krytyczna, finanse, rząd, telekomunikacja, energetyka, obronność, ochrona zdrowia lub transport. Stała taksonomia jest celowym wyborem – otwarta klasyfikacja produkuje niespójne etykiety, których nie można niezawodnie agregować. LLM otrzymuje definicje każdej kategorii i jest instruowany do wybrania jednej najlepiej pasującej etykiety.

Atrybucja geograficzna. Kod kraju ISO 3166-1 alpha-2 dla kraju działania ofiary. Gdy jako cele wymieniane jest wiele krajów, wszystkie są wyodrębniane jako tablica. Model jest wyraźnie instruowany, aby odróżniać kraj ofiary od domniemanego kraju pochodzenia aktora – co jest częstym źródłem błędów w naiwnych podejściach do ekstrakcji.

Wektor ataku. Jedna z sześciu kategorii wektorów: DDoS, defacement, eksfiltracja danych, ransomware, kradzież danych uwierzytelniających lub kompromitacja łańcucha dostaw. Ataki wielowektorowe są reprezentowane jako tablica.

Wyniki pewności. Dla każdego wyodrębnionego pola model zwraca wynik pewności od 0 do 1. Prompt instruuje model do reprezentowania rzeczywistej epistemicznej niepewności – wiadomość mówiąca „zaatakujemy ukraińską energetykę" daje wysoką pewność co do geografii (UA) i sektora (energetyka), ale niższą co do wektora ataku (niesprecyzowany) i organizacji ofiary (nie wymieniona). Wyniki nie są kalibrowane post hoc; są bezpośrednio pochodną reprezentacji niepewności modelu podczas generowania.

Prompt LLM jest skonstruowany tak, aby produkować odpowiedź JSON zgodną ze ścisłym schematem. Parsowanie odpowiedzi waliduje schemat po otrzymaniu; wadliwe odpowiedzi uruchamiają automatyczne ponowienie z dodatkową instrukcją dotyczącą korekty błędu formatowania. Logika ponawiania ogranicza się do dwóch prób; wiadomości, które nadal produkują wadliwe wyjście po dwóch próbach, są oznaczane do weryfikacji przez analityka i usuwane z automatycznego przetwarzania.

Kluczowa obserwacja: Ograniczenie taksonomii dla sektora i wektora ataku jest kluczowe dla operacyjnej użyteczności. LLM pozostawiony do generowania etykiet klasyfikacji w wolnym tekście będzie produkował niespójne synonimy – „sieć elektroenergetyczna", „infrastruktura elektryczna" i „sektor użyteczności publicznej" odnoszą się do celów z sektora energetycznego, ale nie można ich agregować bez kroku normalizacji. Ograniczenie do stałego zestawu etykiet podczas wnioskowania eliminuje tę całą klasę problemów jakości danych w dalszych etapach.

Budowa grafu łańcucha ataków

Każdy sklasyfikowany rekord wiadomości jest zapisywany do bazy danych grafu łańcucha ataków po klasyfikacji LLM. Graf modeluje krajobraz zagrożeń jako graf właściwości z trzema typami węzłów: aktorzy zagrożeń, organizacje ofiar i zdarzenia ataków. Krawędzie reprezentują relacje: „przeprowadził" (aktor do zdarzenia), „atakował" (zdarzenie do ofiary) i „użył wektora" (zdarzenie do węzła taksonomii wektora ataku).

Gdy dociera nowy sklasyfikowany rekord, silnik grafu dokonuje rozwiązywania jednostek: sprawdza, czy nazwana organizacja ofiary już istnieje jako węzeł (używając rozmytego dopasowywania nazw i ujednoznaczniania kodu kraju) oraz czy źródłowy kanał Telegrama mapuje się na znany profil aktora. Jeśli oba się rozwiążą, tworzona jest krawędź łącząca węzeł aktora z węzłem ofiary przez nowy węzeł zdarzenia ataku. Jeśli aktor jest nowy (kanał nie jest jeszcze zmapowany na profil), tworzony jest tymczasowy węzeł aktora do weryfikacji przez analityka.

Graf umożliwia zapytania, których płaskie bazy danych rekordów nie są w stanie efektywnie obsługiwać. Przykłady z przepływów pracy analityków: „Pokaż wszystkie organizacje z sektora energetycznego atakowane przez tego aktora w ciągu ostatnich 90 dni z podziałem na wektory ataków." „Którzy aktorzy atakowali zarówno organizacje z sektora obronności, jak i finansowego w Polsce w tym miesiącu?" „Jaki jest rozkład czasowy ataków tej grupy w stosunku do zdarzeń kinetycznych w teatrze działań?" Zapytania te działają jako przejścia po grafie, zwracając wyniki w ciągu sekund na grafach zawierających dziesiątki tysięcy węzłów.

Monitorowanie zagrożeń oparte na OSINT na tym poziomie struktury nie było możliwe przed zastosowaniem ekstrakcji opartej na LLM na skali i dokładności potrzebnych do ciągłego zasilania grafu z otwartych źródeł. Poprzednie podejścia wymagały znacznego ręcznego nakładu pracy analityka na rekord, co ograniczało gęstość i aktualność grafu.

Analiza wzorca aktywności dla grup aktorów zagrożeń

Gdy profil aktora zagrożeń zgromadzi wystarczającą historię w grafie (zazwyczaj 7 lub więcej dni pobierania danych), Corvus.Sense oblicza metryki wzorca aktywności. Są one pochodną właściwości temporalnych i strukturalnych węzłów zdarzeń ataków aktora w grafie.

Rozkład godzin aktywności. Znaczniki czasu zdarzeń ataków są grupowane według godziny UTC i dnia tygodnia. Większość grup powiązanych z państwami działa w godzinach pracy w swojej strefie czasowej; odchylenia od tego wzorca (nietypowe wzrosty w późnych godzinach nocnych, skoki w weekendy) mogą wskazywać na zmiany tempa operacyjnego lub zaangażowanie wielu geograficznie rozproszonych podgrup. Histogram godzin aktywności jest aktualizowany codziennie.

Mapa cieplna preferencji celów. Stosunek ataków według sektora i geografii jest obliczany na podstawie pełnej historii zdarzeń aktora. Ujawnia to spójne preferencje targetowania – aktor, który w 73% przypadków atakował ukraińską infrastrukturę energetyczną, jest wyraźnie wyspecjalizowany, a nowe ogłoszenia ataków na cele energetyczne od tego aktora powinny otrzymywać podwyższony priorytet niezależnie od wyniku pewności.

Śledzenie ewolucji TTP. Rozkłady wektorów ataków są obliczane w ruchomych oknach 30-dniowych i porównywane z historyczną linią bazową aktora. Grupa, która historycznie przeprowadzała operacje DDoS, a teraz jest klasyfikowana jako prowadząca zdarzenia eksfiltracji danych, reprezentuje zmianę TTP – sygnał wywiadowczy wysokiej wartości wskazujący na rozwój możliwości lub zmianę celów.

Kluczowa obserwacja: Analiza wzorca aktywności jest najbardziej wartościowa nie do potwierdzania tego, co już wiadomo o aktorze zagrożeń, lecz do wykrywania zmian w jego zachowaniu. Stabilne wzorce są użytecznymi liniami bazowymi; odchylenia od tych wzorców to sygnał, który wymaga uwagi analityka i potencjalnej eskalacji do starszych odbiorców produktów wywiadowczych.

Automatyczne generowanie streszczeń dla kadry zarządzającej

Corvus.Sense zawiera automatyczny potok generowania streszczeń, który produkuje czytelne dla człowieka produkty wywiadowcze na podstawie ustrukturyzowanych danych z grafu. Streszczenia są generowane według konfigurowalnego harmonogramu (codziennie, tygodniowo lub na żądanie) lub wyzwalane przez zdarzenia progowe (liczba ataków przez śledzonego aktora przekraczająca skonfigurowany limit w oknie czasowym).

Potok generowania streszczeń odpytuje graf w zakresie aktora, sektora lub obszaru geograficznego zdefiniowanego przez szablon raportu, pobiera ustrukturyzowane rekordy zdarzeń i metryki wzorca aktywności, a następnie przekazuje ten ustrukturyzowany kontekst do modelu generującego z promptem syntezy narracyjnej. Wynikiem jest prozatorski brief wywiadowczy w rejestrze odpowiednim dla kadry zarządzającej – bez JSON, bez etykiet pól, bez wyników pewności, chyba że są one analitycznie istotne.

Co kluczowe, model generowania streszczeń działa na ustrukturyzowanych danych pobranych z grafu, a nie na surowym tekście wiadomości z Telegrama. Ta architektoniczna separacja zapobiega halucynacjom z wieloznacznego materiału źródłowego: model generujący może odwoływać się wyłącznie do zdarzeń istniejących jako zwalidowane sklasyfikowane rekordy w grafie. Jeśli deklarowany atak nie przeszedł kontroli jakości klasyfikacji, nie pojawia się w streszczeniu.

Ocenianie pewności i obsługa niepewności

Każdy sklasyfikowany rekord w Corvus.Sense zawiera wyniki pewności na poziomie pola. Wyniki te przepływają do wszystkich konsumentów dalszych etapów: panel analityka wyświetla pewność wizualnie, reguły alertów można skonfigurować tak, aby wyzwalały się tylko powyżej minimalnego progu dla każdego pola, a eksport STIX mapuje wyniki pewności na właściwość confidence STIX.

Rekordy, w których jakiekolwiek pole krytyczne (sektor, geografia lub atrybucja aktora) spada poniżej skonfigurowanego progu, są umieszczane w kolejce weryfikacji analityka zamiast generowania automatycznych alertów. Próg jest konfigurowalny dla każdego wdrożenia: instalacje wysokiej czułości monitorujące infrastrukturę krytyczną mogą obniżać progi w celu maksymalizacji czułości; szersze wdrożenia monitoringowe mogą podnosić progi w celu ograniczenia wolumenu kolejki analityka.

Dla pól, gdzie pewność LLM jest graniczna (domyślnie między 0,65 a 0,80), Corvus.Sense opcjonalnie przesyła wiadomość do drugiego niezależnego przejścia LLM z inną formułą promptu. Gdy oba przejścia zgadzają się co do wartości pola, wynik pewności jest podwyższany; gdy się nie zgadzają, pole jest oznaczane jako sporne i obie wartości kandydujące są przedstawiane analitykowi.

Konfigurowanie Corvus.Sense do śledzenia konkretnego aktora zagrożeń

Poniższa sekwencja opisuje, jak skonfigurować Corvus.Sense do ukierunkowanego monitorowania nazwanej grupy hakerskiej na jej kanałach Telegrama.

Krok 1 – Zidentyfikuj kanały Telegrama aktora. Skompiluj numeryczne ID kanałów i nazwy @użytkownika dla wszystkich znanych kanałów prowadzonych przez lub powiązanych z docelową grupą, w tym kanały lustrzane i zapasowe. Corvus.Sense akceptuje oba formaty.

Krok 2 – Utwórz profil aktora. W panelu Aktorzy utwórz nowy profil z kanoniczną nazwą grupy i znane aliasy. Przypisz ID technik MITRE ATT&CK odzwierciedlające znane TTP grupy. Powiąż identyfikatory kanałów z tym profilem. Od tego momentu wszystkie wiadomości z tych kanałów są powiązane z węzłem tego aktora w grafie.

Krok 3 – Skonfiguruj zakres sektora i geografii. Wybierz sektory i kody krajów, które chcesz monitorować dla tego aktora. Ataki poza zakresem są nadal pobierane i klasyfikowane, ale wykluczane z generowania alertów specyficznych dla aktora. Pozwala to na szerokie pobieranie danych przy jednoczesnym utrzymaniu wolumenu alertów skupionego na operacyjnie istotnych zdarzeniach.

Krok 4 – Ustaw progi pewności i dostarczanie alertów. Skonfiguruj minimalne progi pewności dla każdego pola. Dla sektorów obronności i infrastruktury krytycznej niższe progi (0,65) maksymalizują czułość. Skonfiguruj dostarczanie alertów na e-mail, webhook lub punkt końcowy integracji SIEM. Corvus.Sense obsługuje formaty alertów CEF i JSON do integracji z SIEM.

Krok 5 – Przeglądaj i poprawiaj wstępne klasyfikacje. Przez pierwsze 72 godziny przeglądaj wszystkie sklasyfikowane rekordy w kolejce analityka dla tego aktora niezależnie od wyniku pewności. Narzędzia do korekty inline umożliwiają edycję na poziomie pola. Korekty są rejestrowane i mogą być przesłane w celu poprawy kalibracji modelu dla wzorców językowych tego aktora z czasem.

Krok 6 – Włącz analizę wzorca aktywności. Po 7 dniach zgromadzonych danych zdarzeń włącz widok wzorca aktywności. Rozkłady godzin aktywności, mapy cieplne preferencji celów i histogramy TTP są obliczane z grafu i aktualizowane codziennie. Ten widok jest głównym wkładem do przewidywania przyszłego zachowania targetowania.

Krok 7 – Eksportuj ustrukturyzowaną analizę. Użyj eksportu profilu aktora, aby wygenerować produkty wywiadowcze w formacie JSON, PDF lub pakietu STIX 2.1. Eksport STIX mapuje dane profilu aktora na obiekty Threat Actor i Campaign STIX do udostępniania przez TAXII lub importu do zewnętrznych platform CTI.