Mã độc lây nhiễm hơn 10 triệu smartphone trên toàn cầu, có cả Việt Nam
GriftHorse có khả năng ngụy trang mạnh mẽ, mạo danh các ứng dụng bình thường được chia sẻ trên kho ứng dụng CH Play dành cho nền tảng Android để qua mặt cơ chế kiểm duyệt của Google. Các công cụ diệt virus trên smartphone cũng không thể phát hiện được mã độc tồn tại bên trong các ứng dụng.
Bản đồ các quốc gia đã có thiết bị bị lây nhiễm GriftHorse, trong đó có cả Việt Nam.
Sau khi ứng dụng chứa mã độc được cài đặt lên thiết bị, các ứng dụng này sẽ thường xuyên hiển thị quảng cáo về những quà tặng hay chương trình khuyến mãi trên smartphone. Nếu người dùng nhấn vào các quảng cáo này sẽ được yêu cầu cung cấp số điện thoại của họ để nhận giải thưởng. Những người dùng nhẹ dạ cả tin điền số điện thoại sẽ vô tình đăng ký vào một dịch vụ nhắn tin với phí sử dụng lên đến 35 USD/tháng hoặc có thể cao hơn. Số tiền này sẽ được chuyển trực tiếp cho nhóm tin tặc đứng sau mã độc GriftHorse.
Danh sách các ứng dụng có chứa mã độc GriftHorse.
Các chuyên gia ước tính hiện đã có hơn 10 triệu smartphone trên 70 quốc gia bị nhiễm mã độc GriftHorse. Các ứng dụng này thuộc nhiều danh mục khác nhau, từ các ứng dụng giải đố, nhắn tin, hẹn hò, game hay các ứng dụng chăm sóc sức khỏe… trong đó có những ứng dụng đã có hơn một triệu lượt tải.
Danh sách các ứng dụng có chứa mã độc GriftHorse.
Để tránh bị phát hiện, tin tặc sử dụng hardcode URL hoặc sử dụng lại các tên miền giống nhau và lọc, phân phối payload độc hại dựa trên vị trí địa lý của địa chỉ IP nạn nhân. Phương pháp này cho phép các tin tặc nhắm mục tiêu vào các quốc gia khác nhau theo những cách riêng.
Biểu đồ danh mục của các ứng dụng mã độc GriftHorse trên CH Play.
Đáng chú ý, các loại mã độc này đã bắt đầu được phát tán từ tháng 11/2020, nhưng đến nay mới được phát hiện. Điều này cho thấy có một lỗ hổng trong việc kiểm duyệt cũng như kiểm tra các loại ứng dụng tồn tại mã độc trên CH Play của Google.
Cách thức hoạt động của GriftHorse
Theo Zimperium, Trojan GriftHorse được xây dựng bằng khung phát triển ứng dụng Apache Cordova. Khung này cho phép các nhà phát triển sử dụng các công nghệ web tiêu chuẩn như HTML5, CSS3 và JavaScript để phát triển ứng dụng trên điện thoại di động với đa nền tảng. Đặc biệt, công nghệ này cho phép nhà phát triển có thể đưa ra các bản cập nhật cho ứng dụng mà không yêu cầu sự tương tác từ người dùng. Tuy nhiên, tính năng này có thể bị lạm dụng để lưu trữ mã độc trên máy chủ và phát triển một ứng dụng thực thi mã trong thời gian thực.
Khi cài đặt và khởi chạy một ứng dụng, các tệp được mã hóa, lưu trữ trong thư mục asset/www của APK và sẽ được giải mã bằng AES/CBC/PKCS5Padding. Sau khi giải mã, tệp index.html được load bằng WebView.
Mã nguồn ứng dụng chứa Key, IV và các loại tệp để giải mã động.
Nội dung của file index.html trước và sau khi giải mã.
Mã nguồn chức năng sẽ nằm trong tệp js/index.js, gọi hàm onDeviceReady bổ sung Google Advertising ID for Android Devices (AAID) vào appConf. Cấu trúc dữ liệu appConf thực hiện bằng AppsFlyerUID được thu thập sau khi khởi chạy AppsFlyer (React Native AppsFlyer plugin) bằng devKey.
Mã nguồn tệp index.js gọi hàm GetData().
Sau đó, mã nguồn sử dụng hàm GetData() để thiết lập giao tiếp giữa ứng dụng và máy chủ C&C (Command and Control) ở giai đoạn đầu, bằng cách mã hóa một request HTTP POST với giá trị của appConf.
Hàm GetData() giao tiếp với máy chủ C&C.
Request và respone với máy chủ được thể hiện trong hình dưới đây, trong đó tham số “d” là bản mã được mã hóa của appConf.
Giao tiếp mạng với máy chủ C&C giai đoạn đầu.
Sau đó, ứng dụng nhận được response dưới dạng mã hóa. Response này sẽ được giải mã bằng AES để thu thập URL C&C trong giai đoạn 2 và thực hiện GET request bằng cách sử dụng chức năng “InAppBrowser” của Cordova để phát hiện ra một URL ở giai đoạn thứ 3. Tiếp đó, ứng dụng bắt đầu gửi thông báo cho người dùng về giải thưởng.
Nội dung được giải mã của POST request tới máy chủ C&C giai đoạn đầu.
Nội dung được giải mã của response từ máy chủ C&C giai đoạn đầu.
Như vậy cứ sau mỗi giờ, sẽ có 5 lần thông báo được hiển thị trên màn hình thiết bị. Mục đích của hành động lặp đi lặp lại này là nhắc nhở sự chú ý của người dùng để đồng ý tham gia giải thưởng và từ đó điều hướng đến ứng dụng.
Thông báo từ ứng dụng thu hút sự chú ý của người dùng.
Tên miền C&C trong giai đoạn 2 luôn giống nhau bất kể ứng dụng hay vị trí địa lý của nạn nhân và request GET tới máy chủ này để điều hướng trình duyệt đến URL giai đoạn 3, cũng là giai đoạn cuối cùng. URL giai đoạn thứ 3 sẽ hiển thị trang cuối cùng, yêu cầu nhập số điện thoại của người dùng và đăng ký một số dịch vụ trả phí.
Giao tiếp với máy chủ C&C giai đoạn 2.
Có 2 kiểu hình thức trên ứng dụng để tương tác với người dùng:
- Hình thức 1: Hiển thị nút “Continue” hoặc “Click” (Tùy thuộc vào vị trí địa lý của người dùng mà ứng dụng hiển thị những ngôn ngữ khác nhau), khi người dùng nhấp vào nút, ứng dụng sẽ bắt đầu gửi SMS.
- Hình thức 2: Hiển thị một yêu cầu nhập và đăng ký số điện thoại của người dùng. Sau đó, hành vi độc hại thực hiện tương tự như hình thức 1.
Ví dụ về URL cuối cùng khi được xem từ trình duyệt.
Các chuyên gia cho biết thêm, mã JavaScript được viết nhúng trong trang web chịu trách nhiệm về hành vi độc hại của ứng dụng. Sự tương tác giữa WebPage và các chức năng trong ứng dụng được hỗ trợ bởi JavaScript Interface, cho phép mã JavaScript bên trong WebView kích hoạt các hành động trong native code. Điều này có thể bao gồm việc thu thập dữ liệu về thiết bị, ví dụ như số IMEI (International Mobile Equipment Identity) và IMSI (International Mobile Subscriber Identity).
Một số khuyến nghị với người dùng
Để tránh nguy cơ trở thành nạn nhân của GriftHorse, Zimperium cho biết khách hàng của Zimperium zIPS sẽ được bảo vệ với công cụ z9 Mobile Threate Defense. Bên cạnh đó, hãng bảo mật này cũng khuyến cáo người dùng nên thực hiện giải pháp phân tích ứng dụng nâng cao z3A để đánh giá rủi ro và các mối đe dọa bảo mật. Bất kỳ ứng dụng nào có liên quan đến mã độc GriftHorse sẽ bị gắn cờ là “Suspicious App Threat” trên thiết bị và trong zConsole.