# StreamRat: khi kênh phát tán là quảng cáo trả tiền và trang đích dạy nạn nhân vượt qua chính cảnh báo bảo mật

## Tóm tắt

Ngày 02/09/2026, ThreatFabric công bố **StreamRat** — một trojan ngân hàng Android mới, phát tán qua **quảng cáo Meta và TikTok** mạo danh một dịch vụ xem TV miễn phí, nhắm vào người dùng nói tiếng Tây Ban Nha. Một chiến dịch quảng cáo tiếp cận khoảng **570.000 người dùng Meta** chỉ trong ba tuần, từ 11/06 đến 03/07/2026.

Hai điểm đáng đặt làm trục cho bài này.

**Thứ nhất, kênh phát tán là quảng cáo trả tiền.** Như Malwarebytes chỉ ra, chúng ta vẫn thường cảnh báo người dùng đừng click link đáng ngờ trong tin nhắn hay email — nhưng quảng cáo độc hại khó nhận ra hơn nhiều, vì **nó xuất hiện đúng trong luồng nội dung mà người dùng vốn kỳ vọng thấy quảng cáo, video và gợi ý**. Malwarebytes gọi chiến dịch này là minh chứng hoàn hảo cho việc kiểm duyệt quảng cáo sau khi đăng là không đủ để bảo vệ người dùng mạng xã hội.

**Thứ hai, trang đích không phải một trang tải file mà là một hệ thống dẫn dắt.** Nó phát hiện hệ điều hành, phát hiện ứng dụng mà nạn nhân dùng để mở link, rồi hiển thị bộ hướng dẫn phù hợp — **được thiết kế riêng để dẫn người dùng qua từng bước một của chính các cảnh báo bảo mật** mà lẽ ra phải khiến họ dừng lại và suy nghĩ.

> **Một lưu ý quan trọng về con số 570.000.** Đây là **reach của quảng cáo**, không phải số lượt tải hay số máy bị nhiễm. Malwarebytes nêu rõ điều này, và chúng tôi giữ nguyên sự phân biệt đó. Con số này cho thấy **tốc độ mà quảng cáo trả tiền có thể đưa một chiêu lừa đảo tới trước mặt một lượng người dùng rất lớn**, chứ không phải quy mô lây nhiễm thực tế.

**Hành động ưu tiên: bổ sung vào nội dung đào tạo nhận thức một cảnh báo cụ thể — một ứng dụng xin đồng thời quyền cài đặt ứng dụng khác và quyền tạo kết nối VPN là tín hiệu rủi ro nghiêm trọng, bất kể nó tự giới thiệu là gì.**

* * *

## Bối cảnh: một actor, ba họ mã độc

ThreatFabric phát hiện chiến dịch vào cuối tháng 07/2026, khi đang theo dõi các nhà quảng cáo trong hệ sinh thái Meta sử dụng mồi chủ đề streaming TV mà họ đã quen thuộc từ nghiên cứu trước về các chiến dịch IPTV. Chiến dịch được đặt tên **"Steamtv Esp."**

Khi lần theo payload, họ tìm thấy một chi tiết nối các mảnh lại với nhau: file được lấy từ **một repository GitHub thuộc cùng người dùng đã từng phát tán trojan Mirax**, và dropper rất giống dropper trước đó dùng để triển khai payload Mirax. Nhưng payload cuối lần này là một trojan chưa từng được ghi nhận.

Những điểm chính về actor này:

*   Đã sử dụng **ít nhất ba họ mã độc tài chính khác nhau: GodFather, Mirax và StreamRat**
    
*   Dựa trên code của control panel, **StreamRat được phát triển như một sản phẩm Malware-as-a-Service**
    
*   Phần lớn nạn nhân được ghi nhận nằm ở **Tây Ban Nha**
    

* * *

## Chuỗi lây nhiễm

### Giai đoạn 1: Chuẩn bị chiến dịch quảng cáo

Kẻ tấn công dựng một website rồi mua quảng cáo Meta với chủ đề dịch vụ streaming. Một chiến dịch tiếp cận khoảng 570.000 người dùng Meta trong khoảng 11/06 – 03/07/2026.

![Banner quảng cáo](https://www.threatfabric.com/hs-fs/hubfs/Threatfabric/images/blog/2026-StreamRat/pngs/StreamRat1.png?width=3450&height=1941&name=StreamRat1.png align="center")

*Banner quảng cáo trong chiến dịch "Steamtv Esp." (nguồn: ThreatFabric).*

Theo dữ liệu chiến dịch, mục tiêu chính là người dùng Meta tại Tây Ban Nha. ThreatFabric không xác định được nền tảng Meta nào là trọng tâm, nhưng đánh giá các banner **nhiều khả năng hiển thị trên cả Facebook lẫn Instagram**. Cùng bộ banner cũng được dùng để phát tán qua TikTok.

### Giai đoạn 2: Trang đích — một hệ thống dẫn dắt, không phải một trang tải file

Đây là phần tôi cho là đáng phân tích kỹ nhất, vì nó cho thấy mức độ đầu tư vào khâu social engineering.

![Trang phishing](https://www.threatfabric.com/hs-fs/hubfs/Threatfabric/images/blog/2026-StreamRat/pngs/StreamRat2.png?width=3450&height=1941&name=StreamRat2.png align="center")

*Website giả mạo dịch vụ streaming (nguồn: ThreatFabric).*

**Bước lọc thứ nhất — hệ điều hành.** Website dùng JavaScript kiểm tra nạn nhân có đang dùng thiết bị Android hay không. Nếu phát hiện hệ điều hành khác, trang hiển thị lỗi và **chặn việc tải xuống đơn giản bằng cách ẩn nút tải**.

![Chặn thiết bị không phải Android](https://www.threatfabric.com/hs-fs/hubfs/Threatfabric/images/blog/2026-StreamRat/pngs/StreamRat3.png?width=3450&height=1941&name=StreamRat3.png align="center")

*Thông báo lỗi hiển thị cho thiết bị không phải Android (nguồn: ThreatFabric).*

**Bước lọc thứ hai — ứng dụng nguồn.** Nếu là Android, nút tải xuất hiện. Khi nạn nhân nhấn vào, họ được chuyển tới một trang tên `r1edmi.html`. Mục đích của trang này là xác định nạn nhân đã mở link bằng ứng dụng nào: **Instagram, TikTok, Facebook, hay một trình duyệt độc lập**. Hướng dẫn hiển thị sẽ khác nhau tùy kết quả đó; mặc định là bộ hướng dẫn sáu bước cho Chrome.

![Hướng dẫn cấp quyền](https://www.threatfabric.com/hs-fs/hubfs/Threatfabric/images/blog/2026-StreamRat/pngs/StreamRat5.png?width=3450&height=1941&name=StreamRat5.png align="center")

*Hướng dẫn từng bước dẫn nạn nhân bật cài đặt từ nguồn không rõ và cấp quyền Accessibility (nguồn: ThreatFabric).*

Nội dung hướng dẫn, không có gì bất ngờ, dẫn nạn nhân qua việc **bật cài đặt ứng dụng từ nguồn không rõ trong Chrome và cấp quyền Accessibility Services**.

Malwarebytes mô tả điểm này rất chính xác: đây không phải một trang tải file độc hại thông thường, mà là một trang **được thiết kế để huấn luyện người dùng đi qua chính các cảnh báo bảo mật vốn có nhiệm vụ khiến họ dừng lại và suy nghĩ**.

**Backend riêng và thông báo real-time.** Đồng thời với việc chuyển trang, script gọi một backend API **gửi thông báo qua Telegram**. Trong lúc hiển thị hướng dẫn, trang cũng truy vấn backend API để lấy **URL payload đang hoạt động** — nghĩa là địa chỉ tải có thể thay đổi mà không cần sửa trang.

![Control panel của trang phát tán](https://www.threatfabric.com/hs-fs/hubfs/Threatfabric/images/blog/2026-StreamRat/pngs/StreamRat6.png?width=3450&height=1941&name=StreamRat6.png align="center")

*Trang phát tán có control panel riêng (nguồn: ThreatFabric).*

Chi tiết đáng chú ý: **bản thân website phát tán có control panel riêng**. Đây không phải một trang tĩnh được dựng lên rồi bỏ đó.

Sau khi nhận được URL, script chỉ thị trình duyệt tải file tên `app.apk`.

### Giai đoạn 3: Dropper

![Giao diện dropper](https://www.threatfabric.com/hs-fs/hubfs/Threatfabric/images/blog/2026-StreamRat/pngs/str3.png?width=313&height=696&name=str3.png align="center")

*Giao diện dropper (nguồn: ThreatFabric).*

Giao diện dropper được dựng từ **các trang HTML có JavaScript nhúng**, mỗi trang được nạp ở một giai đoạn cụ thể:

```plaintext
set_launcher.html     Kiểm tra và yêu cầu đặt dropper làm Home app mặc định
index.html            Trang chính, tự động kích hoạt quá trình tải payload
vpn_required.html     Giai đoạn yêu cầu quyền VPN
```

**Chiếm quyền launcher mặc định.** `set_launcher.html` kiểm tra dropper có phải Home application mặc định của thiết bị hay không. Nếu chưa, nạn nhân được yêu cầu đặt dropper làm launcher mặc định. **Từ thời điểm đó trở đi, mỗi lần nạn nhân nhấn nút HOME, họ bị đưa trở lại giao diện dropper.**

Đây là kỹ thuật ép buộc rất mạnh và đáng được nhấn riêng. Nút HOME là đường thoát bản năng của người dùng Android khi thấy có gì đó bất thường — chiếm nó đồng nghĩa với việc loại bỏ lối ra dễ nhất.

**Tải và cài payload.** `index.html` tự động kích hoạt quá trình tải trong component Android bằng một URL nhúng sẵn trong trang. Payload được lưu vào **thẻ nhớ, trong thư mục Downloads**, với tên `update_{timestamp}.apk`.

ThreatFabric lưu ý một chi tiết đáng chú ý về mặt điều tra: dropper lưu payload vào **thư mục Downloads công khai thay vì private storage của ứng dụng**. Với đội phân tích, đây là dấu vết còn lại trên đĩa và có thể truy xuất được.

Tiếp theo, dropper xin quyền cài ứng dụng từ nguồn không rõ và cài payload bằng **cơ chế session-based package installation** của Android.

**Dọn dẹp sau khi xong.** Sau khi payload khởi chạy, dropper **tắt kết nối VPN chặn mạng**, chờ tới khi payload có được quyền Accessibility Services, rồi **tự gỡ mình khỏi vai trò Home application mặc định**.

### Giai đoạn 4: StreamRat

Ngay sau khi khởi chạy, StreamRat xin quyền Accessibility Services. Khi được cấp, trojan kết nối tới máy chủ C2.

Sau một trao đổi ngắn, bot nhận lệnh **id 35**, yêu cầu gửi danh sách toàn bộ ứng dụng đã cài. StreamRat thu thập danh sách, **chia thành các chunk tối đa 50 mục**, chunk cuối đánh dấu `isLast=true`, với **độ trễ 10 mili giây giữa mỗi chunk**.

Song song, trojan bắt dữ liệu nạn nhân nhập và liên tục giám sát ứng dụng nào đang hiển thị trên màn hình. Mỗi khi ứng dụng foreground thay đổi, StreamRat gửi hai request — `maintenance_check` và `injection_check` — **cả hai đều chứa package name của ứng dụng đang hiển thị**.

Từ thời điểm này, các bước tiếp theo phụ thuộc vào hành động của operator.

* * *

## Chặn Internet bằng VPN giả

Đây là kỹ thuật mà ThreatFabric mô tả là **một TTP tương đối mới, đã được quan sát trên nhiều dropper khác nhau và có vẻ đang ngày càng phổ biến**.

![Màn hình yêu cầu VPN](https://www.threatfabric.com/hs-fs/hubfs/Threatfabric/images/blog/2026-StreamRat/pngs/str1.png?width=313&height=696&name=str1.png align="center")

*Màn hình yêu cầu quyền VPN trong dropper (nguồn: ThreatFabric).*

**Cơ chế.** Ở một giai đoạn trước khi tải payload cuối, dropper xin quyền tạo kết nối VPN. Nếu được cấp, nó thiết lập kết nối VPN và **định tuyến toàn bộ traffic thiết bị qua đó, nhưng loại trừ chính dropper khỏi VPN**. Đồng thời, **không có xử lý traffic nào diễn ra và traffic không được chuyển tiếp đi đâu cả**.

Sau khi payload được cài và chạy thành công, dropper tắt VPN để payload liên lạc với C2 bình thường.

**Mục đích theo đánh giá của ThreatFabric.** Họ cho rằng kỹ thuật này nhằm tạm thời tước kết nối Internet của các ứng dụng khác, **có khả năng ngăn sản phẩm bảo mật thực hiện kiểm tra payload dựa trên đám mây**. Google Play Protect là mục tiêu hợp lý, vì nó bật mặc định trên thiết bị Android được chứng nhận Play Protect và thực hiện phân tích bổ sung với ứng dụng cài từ nguồn không rõ.

**Nhưng ThreatFabric đánh giá rất cẩn trọng, và đây là mức chúng tôi giữ nguyên:** Play Protect cũng cung cấp detection offline cho các ứng dụng có hại đã biết, nghĩa là cơ chế này **không vô hiệu hóa hoàn toàn khả năng bảo vệ của nó**. Họ đánh giá kỹ thuật này **nhiều khả năng nhằm giảm hiệu quả của các cơ chế reputation và phân tích code trực tuyến hơn là bypass Play Protect hoàn toàn**.

**Một hệ quả vận hành ThreatFabric suy ra.** Đây là suy luận của họ chứ không phải quan sát, nhưng nó có giá trị điều tra cụ thể: việc mất kết nối cũng có thể nhìn thấy được với nạn nhân, vì các ứng dụng như messenger và dịch vụ trực tuyến khác sẽ tạm thời ngừng hoạt động. Và **nếu kẻ tấn công đang hướng dẫn nạn nhân qua quá trình lây nhiễm theo thời gian thực, liên lạc nhiều khả năng phải tiếp tục qua một cuộc gọi thoại di động thông thường** chứ không phải qua messenger hay dịch vụ gọi của mạng xã hội vốn bị ảnh hưởng bởi việc gián đoạn mạng.

Với đội điều tra xử lý một vụ việc nghi ngờ, điều này gợi ý một hướng hỏi cụ thể: nạn nhân có nhận cuộc gọi thoại nào trong lúc cài đặt không, và có nhận thấy các ứng dụng khác mất mạng không.

**Và đây là heuristic đáng giá nhất mà báo cáo tạo ra.** ThreatFabric kết luận rằng bất kể động cơ chính xác đằng sau kỹ thuật này là gì, **sự kết hợp của một ứng dụng khai báo cả khả năng cài đặt package lẫn chức năng VPN nên được coi là một tín hiệu rủi ro đáng chú ý và cần được xem xét kỹ hơn**.

Đây là một quy tắc cụ thể, dùng được ngay trong quy trình app vetting hoặc cấu hình giải pháp bảo vệ thiết bị di động, và nó không phụ thuộc vào việc biết trước hash hay tên họ mã độc nào.

* * *

## Năng lực của StreamRat

### Giao thức C2

![Giao thức C2](https://www.threatfabric.com/hs-fs/hubfs/Threatfabric/images/blog/2026-StreamRat/pngs/StreamRat7.png?width=3450&height=1941&name=StreamRat7.png align="center")

*Giao tiếp C2 của StreamRat (nguồn: ThreatFabric).*

Bot gửi một GET request để nâng cấp kết nối lên WebSocket. Ngoài header `Upgrade: websocket`, request chứa **ba header tùy chỉnh**:

```plaintext
X-Device-Id        Định danh thiết bị duy nhất
X-Device-Model     Nhà sản xuất và model thiết bị
X-Api-Level        Android SDK / API level
```

Trên nền WebSocket là một **giao thức kiểu RPC**, hỗ trợ cả định dạng plain-text lẫn binary-text theo cả hai chiều. Bot gửi device fingerprint dưới dạng chuỗi JSON thông thường, còn danh sách ứng dụng và frame screencast được truyền dưới dạng binary-text.

```plaintext
# Format lệnh nhị phân từ server
2 byte đầu     opcode
4 byte tiếp    command identifier (dùng lại trong response)
từ byte 6      payload
 
# Format response nhị phân từ bot
4 byte đầu     command identifier
1 byte tiếp    trạng thái thực thi (0 = thành công, 1 = lỗi)
4 byte tiếp    độ dài payload
từ byte 9      dữ liệu payload
```

**Điểm yếu thiết kế duy nhất:** địa chỉ C2 được **hardcode trong trojan và không được thiết kế để thay đổi động**. Bot tag cũng vậy. Với đội phòng thủ, điều này nghĩa là chặn được C2 là cắt được bot — khác với các họ mã độc dùng dead drop resolver hay fallback đa tầng.

### VNC và HVNC

StreamRat hỗ trợ stream màn hình theo hai chế độ, và **khác biệt giữa chúng có ý nghĩa trực tiếp với người dùng**.

**VNC — qua MediaProjection API.** Khi nhận lệnh từ C2, bot khởi chạy hộp thoại xin quyền chụp màn hình gốc của Android, rồi **tự động tương tác với hộp thoại đó**, chọn chế độ toàn màn hình và tùy chọn chia sẻ mọi ứng dụng thay vì chỉ ứng dụng StreamRat.

Sau khi được cấp quyền, bot dùng các cơ chế Android tiêu chuẩn như `createVirtualDisplay()` và `ImageReader` để lấy bản sao màn hình, encode frame thành ảnh WebP.

Hai chi tiết triển khai đáng chú ý:

*   **Frame trùng lặp không được truyền.** Bot tính checksum Adler-32 trên nội dung liên quan của mỗi frame; nếu trùng với frame trước, frame mới bị loại bỏ.
    
*   **Nén mạnh theo mặc định.** Màn hình được **scale xuống 35% kích thước gốc** rồi encode WebP với **quality 40%**. ThreatFabric đánh giá đây là mức nén khá mạnh nhưng nhiều khả năng đủ để tương tác từ xa hiệu quả trong khi giảm đáng kể băng thông. Khi một overlay tĩnh đang hoạt động, bot chuyển sang `WEBP_LOSSLESS` để giữ chất lượng tối đa; kích thước frame giới hạn 20 MB. **HVNC — qua Accessibility** `takeScreenshot()`**.** Ở chế độ này, bot chụp màn hình **mỗi 200 mili giây** qua Accessibility API, scale xuống 35%, encode WebP quality 40%, gửi về C2 theo cùng format frame.
    

**Khác biệt then chốt giữa hai chế độ là khả năng nhìn thấy được với nạn nhân.** Việc chụp màn hình qua Accessibility API **không trực tiếp hiển thị cho người dùng**, trong khi screencast qua MediaProjection thường có thể nhận ra qua **chỉ báo chia sẻ màn hình hiển thị trên thanh trạng thái Android**.

Đây là điểm đáng nói với người dùng cuối: sự vắng mặt của chỉ báo chia sẻ màn hình **không phải bằng chứng cho thấy không có ai đang xem màn hình của bạn**.

### Accessibility Node Viewer

Chức năng này có thể xem như một dạng **screencast bằng văn bản**: thay vì nhận bitmap màn hình nạn nhân, operator nhận một biểu diễn được dựng lại từ các phần tử `AccessibilityNodeInfo`.

ThreatFabric đánh giá đây là **một trong những cách nhanh nhất để thu thập, truyền và hiển thị nội dung đang có trên màn hình nạn nhân**. Quy trình:

1.  Dump toàn bộ cây phần tử UI qua Accessibility Service API, bao gồm bounds và text kèm theo
    
2.  Serialize cấu trúc thành đối tượng JSON
    
3.  Tính **checksum Adler-32** trên dữ liệu JSON đã serialize
    
4.  So với checksum của lần dump trước; nếu trùng thì loại bỏ Việc dùng **Adler-32 để khử trùng lặp ở cả hai chỗ** — frame VNC và UI tree dump — là chi tiết mà ThreatFabric nhấn mạnh trong phần kết luận: tối ưu hóa này giảm truyền dữ liệu thừa và tải backend, và **những lựa chọn kỹ thuật như vậy nhất quán với developer có kinh nghiệm xây cho quy mô lớn hơn là với một tác giả mã độc thiếu kinh nghiệm**.
    

### Overlay

**Nhóm tự động.** Mỗi khi trạng thái màn hình thay đổi do một ứng dụng không phải hệ thống, bot gửi `maintenance_check` và `injection_check` kèm package name. Server trả về cấu hình overlay.

Với `injection_response`, nội dung overlay được trích từ trường `html`, lưu vào local storage dưới thư mục `injections` với tên `<package_name>.html`. Một Activity chứa WebView được khởi chạy, JavaScript được bật cùng một JavaScript interface do code Android cung cấp, file HTML được nạp vào WebView **rồi bị xóa**. Interface này lộ ra một hàm duy nhất, `saveAndClose`, để overlay trả dữ liệu nạn nhân nhập về component Android.

**Nhóm tức thời.** Đây là các overlay tĩnh kích hoạt theo yêu cầu, với mục đích chính là **đánh lạc hướng hoặc đánh lừa nạn nhân trong khi operator điều khiển thiết bị từ xa qua Accessibility**:

*   **Black overlay** — phủ khoảng **98% màn hình** bằng một lớp đen. Chạm của nạn nhân bị chặn, trong khi operator vẫn quan sát được màn hình và điều khiển thiết bị.
    
*   **Fake update overlay** — hoạt động tương tự black overlay, chỉ khác về mặt hình ảnh: nạn nhân thấy một màn hình giống giao diện cập nhật hệ thống hợp lệ.
    
*   **Custom overlay** — sinh từ một trang HTML do operator cung cấp.
    
*   **Injection overlay** — overlay tương tác đầy đủ dùng WebView với JavaScript interface.
    
    ![Màn hình cập nhật giả](https://www.threatfabric.com/hs-fs/hubfs/Threatfabric/images/blog/2026-StreamRat/pngs/Android%20Update%20Installation%20Screen.png?width=313&height=556&name=Android%20Update%20Installation%20Screen.png align="center")
    
    *Overlay giả màn hình cài đặt cập nhật Android (nguồn: ThreatFabric).*
    

### Bộ lệnh

StreamRat hỗ trợ 21 lệnh từ C2. Một số lệnh đáng chú ý:

| Lệnh | Mô tả |
| --- | --- |
| 1 | Thực thi lệnh shell |
| 4 | Dán văn bản chỉ định qua ClipboardManager hoặc Accessibility action |
| 16 | Điều khiển từ xa qua `performGlobalAction()` — hỗ trợ `lock_screen`, `back`, `home`, `click`, `swipe`, `swipe_path`, `recents`, `notifications` |
| 17–19 | Tap tại tọa độ, swipe giữa hai điểm, custom swipe theo JSON |
| 24–25 | Khóa màn hình, đánh thức thiết bị |
| 32 | Điều khiển chụp màn hình — start/stop và chọn giữa VNC (MediaProjection) và HVNC (Accessibility `takeScreenshot()`) |
| 33 | Điều khiển Accessibility Node Viewer |
| 34 | Điều khiển overlay tĩnh — black screen, update screen, custom screen; **đồng thời điều khiển cơ chế chống gỡ cài đặt** |
| 35 | Điều khiển ứng dụng và thông báo — khởi chạy app theo package name, trích icon, lấy danh sách app, **tạo thông báo giả với tiêu đề, nội dung, icon và URL chỉ định** |
| 36 | Khởi chạy overlay HTML injection |
| **37** | **Mở khóa thiết bị bằng PIN hoặc pattern đã chặn được trước đó** |
| **38** | **Bật hoặc tắt việc tự động chấp nhận yêu cầu quyền MediaProjection** |

Lệnh 37 và 38 đáng được nhấn riêng. Lệnh 37 nghĩa là StreamRat không chỉ ăn cắp mã khóa màn hình mà còn **dùng lại nó để mở khóa thiết bị**. Lệnh 38 nghĩa là operator có thể tắt luôn bước xin phép mà người dùng lẽ ra nhìn thấy.

* * *

## Panel: bằng chứng cho mô hình Malware-as-a-Service

![Panel StreamRat](https://www.threatfabric.com/hs-fs/hubfs/Threatfabric/images/blog/2026-StreamRat/pngs/StreamRat11.png?width=3450&height=1941&name=StreamRat11.png align="center")

*Giao diện panel StreamRat được ThreatFabric dựng lại từ code; toàn bộ dữ liệu nạn nhân hiển thị là dữ liệu tổng hợp (nguồn: ThreatFabric).*

ThreatFabric xác định được nhiều máy chủ thuộc hạ tầng StreamRat, trong đó một máy chủ host panel điều khiển. Họ phân tích code panel và dựng lại giao diện như operator nhìn thấy, giữ nguyên UI, style và navigation gốc — với toàn bộ dữ liệu nạn nhân là dữ liệu tổng hợp.

Panel gồm chín trang:

| Trang | Nội dung |
| --- | --- |
| **Devices** | Tổng quan mọi thiết bị nhiễm — nhà sản xuất và model, khu vực, mức pin, phiên bản Android/API level, **PIN hoặc pattern đã chặn được nếu có**, và trạng thái Accessibility Services hiện tại |
| **Statistics** | Dữ liệu thống kê nhóm theo nhiều tham số |
| **Injections** | Quản lý overlay injection |
| **Maintenance** | Quản lý overlay tĩnh |
| **Logs** | Lịch sử lệnh đã thực thi |
| **Builder** | **Trình tạo payload StreamRat** |
| **Dropper-builder** | **Trình tạo dropper StreamRat** |
| **Users** | Quản lý truy cập — **ba vai trò: user, supervisor và admin** |
| **Settings** | Cấu hình Telegram bot và chat dùng cho thông báo |

Ba chi tiết trong bảng này là bằng chứng rõ ràng cho mô hình MaaS: có builder cho **cả payload lẫn dropper**, và **phân tách vai trò ba cấp** — thứ mà ThreatFabric đánh giá là được thiết kế cho mô hình MaaS, cho phép operator và administrator cấp cao hơn có mức truy cập khác nhau.

ThreatFabric kết luận cả trojan lẫn panel đều được thiết kế quanh mô hình MaaS, **để khách hàng chịu trách nhiệm chính trong việc thiết lập kênh phân phối**.

* * *

## IOC

> IOC lấy từ báo cáo ThreatFabric ngày 02/09/2026 và bài phân tích của Malwarebytes. IP đã defang.
> 
> **Lưu ý:** bộ IOC file khá mỏng — chỉ hai hash. Phần giá trị hơn nằm ở các artifact hành vi bên dưới.

**Mẫu (SHA-256)**

```plaintext
e0714788b4e2518b0d9d4cbf18c7217bb97718e01689d77338f1cc4a230fcb6c
    Tên ứng dụng: StrεαmTV Pro
 
ba83cc3c9535690191018edf73ca5c6001609df9919462796aa2e551f142e4d3
    Tên ứng dụng: Sistema de vídeo
```

> **Chi tiết đáng chú ý trong tên ứng dụng:** "StrεαmTV Pro" dùng **ký tự Hy Lạp thay cho chữ Latin** — `ε` (epsilon) thay `e` và `α` (alpha) thay `a`. Đây là kỹ thuật homoglyph cơ bản, nhằm né các quy tắc so khớp chuỗi đơn giản và khiến việc tìm kiếm theo tên trở nên khó hơn.

**C2**

```plaintext
45.147.28[.]59
193.32.2[.]245
```

**Detection của Malwarebytes for Android**

```plaintext
Android/Trojan.Agent.ACRAEEF8A36H36
Android/Trojan.Agent.ACR02DB0614H7
Android/Trojan.Dropper.ACR9B7ECE83D1
```

**Artifact hành vi — phần dùng được nhất**

```plaintext
# Trên thiết bị — giai đoạn dropper
Ứng dụng xin đồng thời quyền cài đặt package VÀ quyền tạo VPN
Ứng dụng yêu cầu được đặt làm Home application mặc định
Kết nối VPN hoạt động nhưng không chuyển tiếp traffic đi đâu
File update_{timestamp}.apk trong thư mục Downloads công khai
Ba trang dropper: index.html, set_launcher.html, vpn_required.html
 
# Trên thiết bị — giai đoạn payload
Thư mục injections chứa file <package_name>.html tạm thời
Overlay phủ khoảng 98% màn hình chặn chạm của người dùng
Overlay giả màn hình cập nhật hệ thống Android
Chỉ báo chia sẻ màn hình xuất hiện khi không có phiên họp hay ghi màn hình nào
 
# Trên mạng
GET request nâng cấp WebSocket với ba header tùy chỉnh:
  X-Device-Id, X-Device-Model, X-Api-Level
Endpoint: maintenance_check, injection_check
Danh sách app gửi theo chunk 50 mục, delay 10 ms, chunk cuối có isLast=true
Frame WebP scale 35%, quality 40%, giới hạn 20 MB
HVNC: chụp màn hình chu kỳ 200 ms
 
# Trên trang phát tán
Trang r1edmi.html xác định app nguồn
Backend API trả URL payload động và gửi thông báo Telegram
File tải về đặt tên app.apk
```

* * *

## Nhận định

**Điểm yếu bị khai thác ở đây không phải một lỗ hổng Android mà là chính quy trình cấp quyền của Android — và trang đích được xây riêng để dẫn người dùng qua từng bước một.**

Đây là điều làm StreamRat đáng chú ý hơn năng lực kỹ thuật của nó. Mọi thứ trong chuỗi này đều yêu cầu nạn nhân chủ động đồng ý: bật cài đặt từ nguồn không rõ, cấp quyền Accessibility, đặt một ứng dụng lạ làm launcher mặc định, cho phép tạo VPN. Android hỏi đúng những câu cần hỏi.

Vấn đề là kẻ tấn công đã chuẩn bị sẵn câu trả lời cho từng câu hỏi đó, và **hiển thị bộ hướng dẫn phù hợp với đúng ứng dụng mà nạn nhân đang dùng**. Đây không phải chuyện "người dùng bất cẩn" — đây là một quy trình huấn luyện ngược được xây dựng có chủ đích, với backend riêng, control panel riêng và thông báo real-time.

**Heuristic đáng giá nhất từ báo cáo này** là kết luận của ThreatFabric: một ứng dụng khai báo **cả khả năng cài đặt package lẫn chức năng VPN** nên được coi là tín hiệu rủi ro đáng chú ý. Đây là loại quy tắc hiếm gặp — cụ thể, không phụ thuộc vào hash hay tên họ mã độc, và áp dụng được cho cả các mẫu chưa biết. Nếu tổ chức bạn có giải pháp bảo vệ thiết bị di động hoặc quy trình vetting ứng dụng, đây là thứ nên đưa vào ngay.

**Về chỉ báo chia sẻ màn hình.** Chi tiết HVNC dùng `takeScreenshot()` của Accessibility thay vì MediaProjection có một hệ quả cần nói rõ với người dùng: **sự vắng mặt của chỉ báo chia sẻ màn hình không phải bằng chứng cho thấy không ai đang xem màn hình của bạn**. Nhiều nội dung hướng dẫn an toàn di động dạy người dùng để ý chỉ báo này; với StreamRat ở chế độ HVNC, nó không xuất hiện.

**Về mức độ trưởng thành của dự án.** Ba dấu hiệu chỉ cùng một hướng: khử trùng lặp bằng Adler-32 ở hai chỗ khác nhau, nén frame được tinh chỉnh với hai chế độ tùy ngữ cảnh, và panel có builder cho cả payload lẫn dropper cùng phân quyền ba cấp. ThreatFabric kết luận StreamRat được phát triển bởi những người có kinh nghiệm trước đó trong hệ sinh thái mã độc Android, và bằng chứng ủng hộ kết luận đó.

Điểm yếu thiết kế duy nhất là **C2 hardcode, không đổi động**. Với đội phòng thủ, đây là tin tốt hiếm hoi: chặn được địa chỉ C2 là cắt được bot.

### Liên hệ Việt Nam

**Cần ghi rõ trước:** ThreatFabric xác định phần lớn nạn nhân nằm ở **Tây Ban Nha**, và chiến dịch nhắm người dùng nói tiếng Tây Ban Nha. **Việt Nam không nằm trong phạm vi được ghi nhận**, và chúng tôi không suy diễn thêm.

Tuy nhiên, mô hình này rất dễ tái sử dụng ở thị trường trong nước, vì bốn lý do.

**Kênh phát tán khớp hoàn toàn.** Quảng cáo trên Facebook, Instagram và TikTok là kênh tiếp cận chính của phần lớn người dùng internet Việt Nam. Một chiến dịch quảng cáo trả tiền có thể đưa nội dung tới hàng trăm nghìn người trong vài tuần — như chính con số 570.000 trong ba tuần đã cho thấy.

**Mồi khớp thị hiếu.** ThreatFabric đã có nghiên cứu trước về các chiến dịch IPTV nhắm người hâm mộ bóng đá ở nhiều quốc gia. Mồi "xem bóng đá miễn phí" hoặc "xem phim miễn phí" là loại nội dung có sức hút rất lớn tại Việt Nam, và nó không cần bản địa hóa phức tạp để hiệu quả.

**Sideload APK đã là thói quen.** Trong nước, việc cài ứng dụng từ file APK ngoài Play Store là hành vi phổ biến — ứng dụng không có trên store, ứng dụng "mod", ứng dụng tải từ nhóm chat hoặc diễn đàn. Bước "bật cài đặt từ nguồn không rõ", vốn là rào cản tâm lý với người dùng ở nhiều thị trường, lại là thao tác quen thuộc với không ít người dùng Việt Nam.

**Và vì đây là MaaS, rào cản gia nhập rất thấp.** ThreatFabric nói rõ mô hình này **để khách hàng chịu trách nhiệm chính trong việc thiết lập kênh phân phối**. Payload, dropper và panel đã có sẵn với builder tích hợp. Việc bản địa hóa trang đích sang tiếng Việt và mua quảng cáo nhắm người dùng Việt Nam không đòi hỏi năng lực kỹ thuật nào từ phía khách hàng.

**Với tổ chức có mô hình BYOD**, cần lưu ý phạm vi thiệt hại: một thiết bị cá nhân nhiễm StreamRat có đầy đủ năng lực VNC và HVNC, nghĩa là **mọi thứ hiển thị trên màn hình đều nhìn thấy được với operator** — bao gồm email công việc, ứng dụng nội bộ và mã xác thực hai yếu tố. Accessibility Node Viewer còn cung cấp cả nội dung văn bản ở dạng có cấu trúc, nhanh và nhẹ hơn ảnh màn hình.

* * *

## Khuyến nghị

*   **Đưa vào đào tạo nhận thức một cảnh báo cụ thể:** ứng dụng xin đồng thời quyền cài đặt ứng dụng khác và quyền tạo VPN là tín hiệu rủi ro nghiêm trọng — và tương tự với yêu cầu được đặt làm launcher mặc định.
    
*   **Dạy người dùng rằng chỉ báo chia sẻ màn hình không phải bằng chứng đáng tin cậy:** chế độ HVNC của StreamRat chụp màn hình qua Accessibility và không kích hoạt chỉ báo nào.
    
*   **Áp dụng heuristic của ThreatFabric vào quy trình vetting ứng dụng** hoặc cấu hình giải pháp bảo vệ thiết bị di động: kết hợp khai báo khả năng cài package với chức năng VPN cần được xem xét kỹ.
    
*   **Chặn hai địa chỉ C2 trong danh sách IOC** — vì StreamRat hardcode C2 và không hỗ trợ đổi động, đây là biện pháp hiệu quả bất thường so với các họ mã độc Android khác.
    
*   **Với chính sách BYOD:** yêu cầu đăng ký MDM cho mọi thiết bị truy cập email hoặc ứng dụng nội bộ, và giám sát việc cấp quyền Accessibility cho ứng dụng ngoài danh mục phê duyệt.
    
*   **Nếu nghi ngờ thiết bị đã nhiễm:** ngắt Wi-Fi và dữ liệu di động, thu hồi quyền Accessibility của ứng dụng nghi ngờ rồi gỡ nó, **đổi toàn bộ mật khẩu và mã khóa màn hình từ một thiết bị khác**, và liên hệ ngân hàng nếu đã dùng ứng dụng ngân hàng trên máy đó. Cân nhắc khôi phục cài đặt gốc nếu không chắc chắn đã gỡ sạch.
    

* * *

## Tài liệu tham khảo

*   ThreatFabric — [Uncovering StreamRat: From Meta Ads to Full Device Takeover](https://www.threatfabric.com/blogs/from-meta-ads-to-full-device-takeover-uncovering-streamrat) (02/09/2026) — báo cáo gốc, kèm bảng lệnh bot và IOC
    
*   Malwarebytes — [StreamRat Android malware spreads through Meta and TikTok ads](https://www.malwarebytes.com/blog/news/2026/09/streamrat-android-malware-spreads-through-meta-and-tiktok-ads), Pieter Arntz (03/09/2026)
    
*   ThreatFabric — [IPTV campaigns target football fans across multiple countries](https://www.threatfabric.com/blogs/iptv-campaigns-target-football-fans-across-multiple-countries) — nghiên cứu trước về mồi chủ đề streaming
    
*   ThreatFabric — [Sturnus banking trojan bypassing WhatsApp, Telegram and Signal](https://www.threatfabric.com/blogs/sturnus-banking-trojan-bypassing-whatsapp-telegram-and-signal) — họ mã độc có giao thức C2 tương đồng một phần
    
*   Malwarebytes — [Sideloading on Android: What it is, why it's risky, and how to do it more safely](https://www.malwarebytes.com/blog/how-to/2026/08/sideloading-on-android-what-it-is-why-its-risky-and-how-to-do-it-more-safely)
