W dniu wczorajszym opublikowaliśmy artykuł nawiązujący do oficjalnego komunikatu Notepad++ dotyczącego poważnego i nietypowego ataku na łańcuch dostaw narzędzia. Pojawiły się już pierwsze, ale potwierdzone analizy.
TLDR:
- Analiza ataku na Notepad++ potwierdza nieuprawniony dostęp przez ponad pół roku
- Potencjalne wskaźniki naruszeń i techniki działania wskazują na chińską grupę APT – Lotus Blossom
- W artykule publikujemy także techniki weryfikacji i usunięcia infekcji
Współczesny krajobraz cyberbezpieczeństwa przechodzi fundamentalną transformację, w której zaufanie do dostawców oprogramowania staje się jednym z najbardziej newralgicznych wektorów ataku. Incydent związany z naruszeniem infrastruktury Notepad++, stanowi podręcznikowy przykład operacji typu Advanced Persistent Threat (APT), ukierunkowanej na infiltrację środowisk technicznych poprzez zaufane kanały dystrybucji.
Narzędzia takie jak Notepad++ są “świętym Graalem” dla grup szpiegowskich i hakerskich. Są one powszechnie używane przez administratorów systemów, programistów (w tym DevOps) oraz inżynierów bezpieczeństwa. Są to osoby posiadające podwyższone uprawnienia w infrastrukturze IT. W przeciwieństwie do masowych kampanii ransomware, operacja ta charakteryzowała się chirurgiczną precyzją, celując w konkretne ofiary poprzez manipulację ruchem sieciowym na poziomie serwera aktualizacji (zewnętrzny dostawca). Zrozumienie technicznego przebiegu ataku wymaga szczegółowej analizy osi czasu, która ujawnia nie tylko moment infekcji, ale także adaptacyjność grupy przestępczej w obliczu zmieniających się warunków w infrastrukturze ofiary. Atak nie polegał na wstrzyknięciu kodu do repozytorium projektu (typowo dla supply chain), lecz na przejęciu kontroli nad mechanizmem dystrybucji aktualizacji (tzw. update server hijacking).
I faza ataku (czerwiec – wrzesień 2025)
Początkowa faza ataku rozpoczęła się w czerwcu 2025 roku. Napastnicy uzyskali nieautoryzowany dostęp do serwera współdzielonego (a dokładnie shared hosting), na którym hostowana była domena notepad-plus-plus[.]org. Kluczowym celem był skrypt PHP odpowiedzialny za obsługę mechanizmu automatycznych aktualizacji – getDownloadUrl.php. W typowym scenariuszu, aplikacja Notepad++ (poprzez proces GUP.exe) wysyła zapytanie do tego skryptu, przekazując w parametrach obecną wersję oprogramowania. Skrypt w odpowiedzi zwraca adres URL do manifestu aktualizacji (czyli pliku XML) oraz instalatora. Napastnicy zmodyfikowali ten proces na poziomie skryptów uruchamianych przez serwer. Mechanizm ataku w tej fazie opierał się na warunkowym przekierowaniu. Skrypt, zamiast serwować oficjalne linki wszystkim użytkownikom, analizował adresy IP oraz nagłówki zapytań przychodzących. Jeśli cel znajdował się na liście “interesujących” ofiar (np. należał do sektora rządowego, telekomunikacyjnego lub zbrojeniowego), serwer zwracał spreparowany plik XML. Ten złośliwy manifest wskazywał na instalator hostowany na infrastrukturze kontrolowanej przez atakujących jako plik update.exe pod adresem IP 95[.]179.213.0, a nie na oficjalne repozytorium GitHub.
Rys. 1. Schemat działania złośliwego update.exe, źródło
Analiza update.exe wykazała, że to tak naprawdę instalator NSIS, co wskazuje potencjalnie na chińską grupę APT, która w ten sposób dostarcza początkowy payload ataku.
Instalator po pobraniu i uruchomieniu tworzy ukryty katalog w lokalizacji %AppData%\Bluetooth\. Wybór nazwy “Bluetooth” w katalogu AppData jest celowym zabiegiem socjotechnicznym – użytkownicy i mniej doświadczeni administratorzy często ignorują foldery o nazwach systemowych. Do utworzonego katalogu wypakowywane są cztery pliki, które tworzą kompletny ekosystem startowy malware’u. Co ciekawe, pliki tam umieszczone mają zmieniony atrybut folderu na
[NSIS].nsi
Opis: skrypt instalacyjny NSIS
SHA-256: 8ea8b83645fba6e23d48075a0d3fc73ad2ba515b4536710cda4f1f232718f53e
[BluetoothService.exe]
Opis: usługa Bitdefender Submission Wizard używana do DLL sideloading
SHA-256: 2da00de67720f5f13b17e9d985fe70f10f153da60c9ab1086fe58f069a156924
[BluetoothService]
Opis: zaszyfrowany shellcode
SHA-256: 77bfea78def679aa1117f569a35e8fd1542df21f7e00e27f192c907e61d63a2e
[log.dll]
Opis: złośliwy DLL załadowany przez BluetoothService.exe
SHA-256: 3bdc4c0637591533f1d4198a72a33426c01f69bd2e15ceee547866f65e26b7ad
DLL Side-loading
Najciekawszym elementem łańcucha infekcji jest wykorzystanie prawdziwego oprogramowania antywirusowego przeciwko samemu systemowi. Grupa Lotus Blossom wykorzystała plik wykonywalny opisany jako Bitdefender Submission Wizard, który został przemianowany na usługę BluetoothService.exe.
Dlaczego ta technika jest skuteczna? W systemie Windows, gdy aplikacja próbuje załadować bibliotekę DLL bez podania pełnej ścieżki (co jest częstą praktyką programistyczną), system przeszukuje lokalizacje w określonej kolejności (tzw. DLL Search Order). Dotychczas, zwykle pierwszym miejscem, w którym system szuka biblioteki, jest katalog, z którego uruchomiono aplikację. Aktualnie priorytet otwiera przekierowanie DLL. Legalna aplikacja Bitdefender wymaga do działania biblioteki o nazwie log.dll. Hakerzy zatem umieścili w katalogu %AppData%\Bluetooth\ zarówno legalny plik wykonywalny (BluetoothService.exe), jak i swoją złośliwą wersję biblioteki log.dll. Złośliwa biblioteka log.dll jest spreparowana, aby “pasować” do oczekiwań procesu ładującego. Eksportuje ona dwie kluczowe funkcje, które są wywoływane przez Bitdefender Submission Wizard
- LogInit – funkcja inicjalizująca. W złośliwej wersji odpowiada ona za odczytanie zaszyfrowanego pliku z shellcodem (plik o nazwie BluetoothService) do pamięci operacyjnej.
- LogWrite – w oryginale służyłaby do zapisu logów. W wersji od grupy Lotus Blossom funkcja ta zawiera logikę deszyfrującą (LCG) oraz instrukcję skoku (JMP/CALL) do odszyfrowanego kodu, przekazując mu sterowanie.
Rys. 2. Zawartość funkcji LogWrite, źródło
Takie podejście sprawia, że w menedżerze zadań widoczny jest proces podpisany cyfrowo certyfikatem Bitdefender, co usypia czujność wielu systemów monitorujących.
Algorytm deszyfrowania shellcode’u
Shellcode zawarty w pliku BluetoothService (czyli bez rozszerzenia) jest zaszyfrowany, aby uniknąć analizy statycznej (sygnaturowej). Deszyfrowanie odbywa się wewnątrz funkcji LogWrite przy użyciu niestandardowego generatora LCG. Parametry tego algorytmu zostały zidentyfikowane przez badaczy Rapid7:
Typ algorytmu: Linear Congruential Generator (LCG)
Stała Mnożenia (Multiplier): $0x19660D$
Stała Inkrementacji (Increment): $0x3C6EF35F$
Ponownie, zastosowanie niestandardowych stałych w algorytmie LCG jest charakterystyczne dla grup APT, które unikają standardowych implementacji kryptograficznych (jak np. AES w trybie ECB/CBC) na etapie loadera, aby zmniejszyć entropię kodu i uniknąć heurystyk wykrywających funkcje kryptograficzne.
Backdoor Chrysalis i Reflective Loading
Po skutecznym załadowaniu i odszyfrowaniu, uruchamiany jest właściwy ładunek (payload) – backdoor o nazwie Chrysalis. Jest to zaawansowane, modułowe narzędzie szpiegowskie, które nie było wcześniej dokumentowane w publicznych repozytoriach, co potwierdza jego charakter jako narzędzia celowanego (bespoke malware) przez grupy APT. Chrysalis operuje całkowicie w pamięci operacyjnej jako moduł PE (ang. Portable Executable), ale bez zapisywania swojej struktury na dysku w formie jawnej. Po przejęciu kontroli przez shellcode, następuje drugi etap deszyfrowania samego modułu backdoora.
Identyfikatory Rapid7:
Klucz deszyfrujący: zahardkodowany ciąg znaków gQ2JR&9;.6
Operacje: sekwencja XOR, dodawania i odejmowania.
Po odszyfrowaniu, kod wykonuje ręczną inicjalizację środowiska C Runtime, co jest niezbędne do działania załadowanych bibliotek, z których korzysta malware. Jest to rzadka cecha, świadcząca o wysokim poziomie kompetencji programistycznych twórców – większość malware’u stara się unikać zależności od CRT, aby zmniejszyć rozmiar kodu, zwłaszcza po obfuskacji.
Obfuskacja kodu
Z tego co zaobserwowano, backdoor nie posiada standardowej tabeli IAT, którą można łatwo przeanalizować narzędziami typu PEStudio. Zamiast tego, funkcje systemowe są rozwiązywane dynamicznie w czasie rzeczywistym. Malware parsuje strukturę PEB (Process Environment Block), a konkretnie listę InMemoryOrderModuleList, aby znaleźć załadowane moduły systemowe takie jak kernel32.dll i ntdll.dll itp. Nazwy funkcji nie są przechowywane jako ciągi tekstowe. Zamiast tego, malware oblicza hash nazwy każdej eksportowanej funkcji w znalezionym module i porównuje go z zaszytą listą hashów. Większość malware’u używa prostego szyfrowania ciągów znaków (np. XOR jednym bajtem). Chrysalis idzie o krok dalej, stosując schemat zaciemniania zależny od pozycji znaku (ang. position-dependent character obfuscation). Oznacza to, że litera ‘A’ na początku stringa zostanie zaszyfrowana do innej wartości niż litera ‘A’ na jego końcu. Technika ta skutecznie uniemożliwia automatyczną ekstrakcję ciągów znaków (np. nazw DLL: oleaut32.dll, advapi32.dll, wininet.dll) za pomocą prostych skryptów w Pythonie czy narzędzia strings (pzdr Gynvael!)
Persystencja
Konfiguracja backdoora jest zaszyta w pliku BluetoothService (tym samym, który zawiera shellcode) pod offsetem 0x30808. Jest ona zaszyfrowana algorytmem RC4 z kluczem qwhvb^435h&*7. W celu zapewnienia persystencji, Chrysalis wykorzystuje dwie metody:
- Usługa Windows (Service): jest to metoda preferowana. Malware instaluje się jako usługa systemowa, co pozwala na działanie w tle nawet bez zalogowanego użytkownika.
- Rejestr (Registry Run Key): metoda zapasowa (ang. fallback), wykorzystywana gdy malware nie posiada uprawnień do utworzenia usługi.
Rys. 3. Funkcja hashująca, źródło
Dla zapewnienia, że w systemie działa tylko jedna instancja szkodnika, tworzony jest nazwany obiekt synchronizacji – mutex: Global\Jdhfv_1.0.1.6.
Komunikacja z serwerem C2
Analiza ruchu sieciowego generowanego przez Chrysalis ujawnia zaawansowane techniki ukrywania transmisji. Ruch został zaprojektowany tak, aby wyglądał na legitną komunikację z nowoczesnymi usługami chmurowymi lub API sztucznej inteligencji. Adresy URL wykorzystywane do komunikacji z serwerem C2 naśladują endpointy API popularnego chińskiego LLM – Deepseek, o którym pisaliśmy co najmniej kilka razy.
Przykładowy schemat URL: https://api[.]skycloudcenter.com/a/chat/s/{GUID}
Metoda HTTP: POST
Port: 443 (HTTPS)
Używana funkcja API: HttpSendRequestA (z biblioteki wininet.dll)
Rys. 4. Lista komend C2, źródło
Dzięki takiej strukturze, analityk bezpieczeństwa przeglądający logi proxy może uznać ten ruch za poprawną interakcję użytkownika z chatbotem AI, co jest obecnie powszechnym zjawiskiem… wszędzie. Jednak dane przesyłane wewnątrz tunelu HTTP są dodatkowo szyfrowane algorytmem RC4 ze stałym kluczem sieciowym vAuig34%^325hGV. Podczas pierwszego kontaktu z serwerem C2 malware wysyła pakiet identyfikacyjny zawierający szczegółowe informacje o zainfekowanej maszynie. Unikalny identyfikator (GUID) jest generowany przy użyciu hasha FNV-1A (reprezentowanego jako ASCII), obliczanego na podstawie nazwy komputera, nazwy użytkownika i wersji systemu operacyjnego. Struktura przesyłanego bufora danych (przed zaszyfrowaniem) wygląda następująco:
….<127.0.0.1>..
Ta szczegółowość pozwala operatorom Lotus Blossom na szybką ocenę wartości celu (np. czy na komputerze zainstalowane są specyficzne systemy antywirusowe, co może sugerować środowisko o podwyższonym rygorze bezpieczeństwa).
II faza ataku (wrzesień – grudzień 2025)
Krytycznym momentem w przebiegu incydentu był dzień 2 września 2025 roku. Administratorzy hostingu przeprowadzili wtedy planową konserwację serwera, obejmującą aktualizację jądra systemu operacyjnego oraz firmware. Działanie to, choć nieświadomie wymierzone w napastników, odcięło im bezpośredni dostęp do shella lub backdoora zainstalowanego na poziomie systemu plików serwera Linux. Mimo utraty bezpośredniej kontroli nad maszyną, grupa Lotus Blossom utrzymała zdolność operacyjną. Przed utratą dostępu, hakerzy zdołali wyeksfiltrować poświadczenia do usług wewnętrznych działających w ramach tego samego konta hostingowego. Pozwoliło im to na dalszą manipulację skryptami i konfiguracją serwera WWW bez konieczności posiadania dostępu root/admin do samej maszyny. Stan ten trwał aż do 2 grudnia 2025 roku, kiedy to ostatecznie zmigrowano usługi do nowego dostawcy i zresetowano wszystkie klucze dostępowe, kończąc tym samym trwającą pół roku kampanię APT.
Zauważono także istnienie dwóch dodatkowych loaderów.
C:\ProgramData\USOShared\svchost.exe-nostdlib -run
C:\ProgramData\USOShared\conf.c
Rys. 5. Schemat dodatkowych loaderów, źródło
Atrybucja grupy APT Lotus Blossom
Atrybucja w cyberbezpieczeństwie jest procesem złożonym, jednak w przypadku tego incydentu dowody wskazują na grupę Lotus Blossom (znaną również pod nazwami Billbug, Thrip, Spring Dragon). Jest to grupa związana z interesami Chińskiej Republiki Ludowej, aktywna od co najmniej 2009 roku. Ich tradycyjne cele obejmują rządy, siły zbrojne i organizacje telekomunikacyjne w Azji Południowo-Wschodniej. Użycie customowego backdoora Chrysalis, technik DLL side-loadingu (ulubiona taktyka chińskich grup APT) oraz infrastruktury sieciowej powiązanej z wcześniejszymi kampaniami (domeny takie jak skycloudcenter[.]com) pozwala z wysokim prawdopodobieństwem przypisać ten atak właśnie im. Fakt, że celem stał się Notepad++ – narzędzie globalne – może sugerować rozszerzenie zakresu operacyjnego grupy lub próbę dotarcia do zachodnich podmiotów technologicznych poprzez ich łańcuch dostaw.
Wskaźniki naruszeń (IoC)
Tabela 1: Wskaźniki plikowe (SHA-256)
Tabela 2: Wskaźniki sieciowe
Metodyka wykrywania na stacji roboczej
Aby wykryć “złośliwość na kompie”, należy przeprowadzić następujące kroki weryfikacyjne (nasza propozycja):
- Weryfikacja systemu plików:
- Sprawdź istnienie katalogu %AppData%\Bluetooth\. W systemie Windows ścieżka ta zazwyczaj rozwija się do C:\Users\[NazwaUżytkownika]\AppData\Roaming\Bluetooth\.
- Obecność plików wykonywalnych w tym katalogu (szczególnie BluetoothService.exe i log.dll) jest krytycznym wskaźnikiem
- Analiza procesów i Mutexów:
- Użyj narzędzia takiego jak Process Explorer lub Process Hacker (Np. SysInternals).
- Szukaj procesu BluetoothService.exe. Jeśli jest uruchomiony z katalogu AppData, to jest to złośliwe wykonanie.
- Sprawdź handlery pod kątem Mutexa o nazwie: Global\Jdhfv_1.0.1. Jego obecność potwierdza aktywną infekcję.
- Analiza logów aktualizatora (GUP):
- Należy przeanalizować zachowanie procesu GUP.exe (updater Notepad++).
- Alarmujące jest łączenie się tego procesu z domenami innymi niż notepad-plus-plus.org lub github.com.
- Podejrzanym zachowaniem jest uruchamianie przez GUP.exe plików z katalogu %TEMP% o nazwach update.exe lub AutoUpdater.exe
Przygotowaliśmy także skrypt PowerShell do automatycznej weryfikacji powyższego. Pobieramy i uruchamiamy z Internetu. To bezpieczne, prawda?
Skrypt dostępny jest tutaj: https://github.com/tturba/ioc-notepad/blob/main/poc-verify.ps1
Zapytania KQL
Dla organizacji korzystających z Microsoft Defender for Endpoint, poniższe zapytanie KQL pozwoli zidentyfikować maszyny, na których uruchomiono podatne wersje Notepad++ lub gdzie wystąpiła podejrzana aktywność aktualizacyjna:
// Wykrywanie uruchomienia Notepad++ w wersji podatnej na atak
let lookback = 30d;
let CleanVersion = dynamic([„8.8.9”, „8.9.1”, „8.9.2”]);
DeviceProcessEvents
| where TimeGenerated >= ago(lookback)
| where ActionType == „ProcessCreated”
| where InitiatingProcessVersionInfoInternalFileName == „notepad++.exe”
| summarize arg_max(TimeGenerated, *) by DeviceName
| where not (InitiatingProcessVersionInfoProductVersion has_any (CleanVersion))
| distinct DeviceName
| where TimeGenerated > ago(lookback)
//| where RemoteUrl has “notepad-plus-plus.org”
| where DeviceName has_any (VurnableNPPVersion)
| summarize arg_max(TimeGenerated, *) by DeviceName
Jak się bronić? Co zrobić gdy jednak jest infekcja?
Jeśli na komputerze zidentyfikowano folder %AppData%\Bluetooth\ lub powiązane z nim procesy, należy uznać maszynę za całkowicie zhackowaną. Backdoor Chrysalis umożliwia kradzież plików, haseł i instalację kolejnych narzędzi (np. Cobalt Strike). Zastosuj poniższe techniki od razu:
- Izolacja sieciowa: natychmiast odłącz komputer od sieci (wyjmij kabel RJ45, wyłącz Wi-Fi), aby przerwać komunikację z C2 i zapobiec eksfiltracji danych lub rozprzestrzenianiu się malware’u w sieci lokalnej (lateral movement).
- Brak zaufania do czyszczenia: próba “wyczyszczenia” antywirusowego jest ryzykowna. Ze względu na zaawansowane techniki persystencji (serwisy Windows, rejestr) i możliwość pobrania dodatkowych modułów, jedynym pewnym sposobem jest pełna reinstalacja systemu operacyjnego (formatowanie dysku).
- Rotacja poświadczeń: wszystkie hasła, które były wpisywane lub zapisane na zainfekowanym komputerze (przeglądarki, menedżery haseł, klienci VPN/SSH), muszą zostać zmienione z poziomu innego, bezpiecznego urządzenia.
Twórcy Notepad++ wprowadzili istotne zmiany w architekturze bezpieczeństwa, aby zapobiec podobnym atakom w przyszłości, więc należy bezwzględnie zaktualizować Notepad++ do wersji v8.9.1 lub nowszej. Wersje te posiadają poprawiony mechanizm WinGup. Jeśli musisz zainstalować Notepad++ w środowisku o podwyższonym ryzyku, nie polegaj na auto-updaterze. Pobierz instalator bezpośrednio z oficjalnego repozytorium GitHub. Sprawdź sumę kontrolną (SHA-256) pobranego pliku i porównaj ją z wartościami opublikowanymi przez autora na stronie projektu. Kliknij prawym przyciskiem na plik -> Właściwości -> Podpisy cyfrowe. Upewnij się, że plik jest podpisany ważnym certyfikatem wystawionym dla Notepad++ (zazwyczaj przez GlobalSign).
Źródła:
https://www.rapid7.com/blog/post/tr-chrysalis-backdoor-dive-into-lotus-blossoms-toolkit
https://github.com/CreamyG31337/chrysalis-ioc-triage
https://socradar.io/blog/notepad-infrastructure-hijacked
~Tomek Turba