https://open.substack.com/pub/veric...?utm_source=post&comments=true&utm_medium=web
Giới thiệu
Hôm 27/3, cộng đồng an ninh thông tin Việt cho biết hai ứng dụng ngân hàng nổi tiếng – BIDV SmartBanking và Agribank Plus khai thác API iOS ẩn để dò tìm những app khác cài trên iPhone người dùng.
Hành vi này được @opa334, nhà phát triển của TrollStore, lần đầu nêu trên
infosec.exchange cách đây hai ngày và sau đó được nhắc đến trong
bài đăng trên Facebook của J2TEAM. Vụ việc nhanh chóng gây xôn xao vì nó cho thấy sự vi phạm chính sách của Apple và xâm phạm quyền riêng tư người dùng.

Thông tin ban đầu trong bài đăng trên Facebook đã nêu nghi ngờ việc vi phạm này do giải pháp bảo mật di động
BShield Mobile Security gây ra, dẫn đến hiểu lầm ảnh hưởng đến uy tín của BShield và Verichains.
Do đó, chúng tôi đã tiến hành phân tích kỹ thuật hai ứng dụng ngân hàng được đề cập:
BIDV SmartBanking (v5.2.62, cập nhật ngày 14/03/2025) và
Agribank Plus (v5.1.8, cập nhật ngày 25/03/2025). Bài viết này trình bày chi tiết phân tích và đánh giá các tác động đối với người dùng cũng như các ứng dụng ngân hàng.
Phân tích kĩ thuật
Phân tích Cơ chế làm rối (Obfuscation)
Để che giấu việc sử dụng API ẩn, trong ứng dụng ngân hàng có sử dụng một phương pháp mã hóa XOR rất yếu nhằm làm rối các chuỗi nhạy cảm như tên API và định danh bundle của ứng dụng. Kỹ thuật này nhằm che giấu các chuỗi API khỏi các công cụ phân tích tĩnh của Apple, khiến việc phát hiện lạm dụng API khó khăn hơn. Trong quá trình chạy, các chuỗi đã được mã hóa sẽ được giải mã bằng cách thực hiện phép XOR với khoá để khôi phục về giá trị ban đầu.


Khóa được sử dụng là “
94826663” trên ứng dụng BIDV (“
41818020” trên ứng dụng Agribank) và dữ liệu mã hóa được lưu trữ trong phần ‘data’. Hàm giải mã, có tên
RE_Decrypt_10233F108, có thể được biểu diễn trong Python như sau:


Trích các chuỗi đã được giải mã từ dữ liệu đã được mã hóa
Từ các chuỗi đã được giải mã, chúng tôi nhận thấy đoạn mã này có khả năng là một phần của mô đun có tên ‘
VNPay Runtime Protection’. Quay trở lại đoạn mã xử lý:

Đoạn mã hoạt động như sau:
- Tạo metadata cho các hằng số được lưu trữ trong vùng dữ liệu (data section).
- Gọi swift_initStaticObject để khởi tạo đối tượng static, giá trị được lưu ở một vị trí khác trong phần dữ liệu (trong trường hợp này, kết quả sẽ là một đối tượng String của Swift).
- Gọi RE_Decrypt_10233F108 để giải mã các chuỗi nhằm xử lý tiếp theo.
Mã này có thể đơn giản hóa thành
v40 = dlopen(XOR_DECRYPT(X), 1), với X là chuỗi được mã hóa trong vùng dữ liệu. Vi dụ:

Đoạn mã mẫu gọi API ẩn từ các chuỗi đã được giải mã
Đoạn mã trên tương đương với việc gọi hàm csops từ /usr/lib/libSystem.B.dylib:
"/usr/lib/libSystem.B.dylib".csops(a1, a2, a3, a4);
Tương tự cho các API ẩn khác:

Phân tích API ẩn lấy thông tin ứng dụng đã cài đặt trên thiết bị


Đoạn mã kiểm tra TrollStore và các ứng dụng khác.
Đoạn mã trên kiểm tra ứng dụng đã được cài đặt trên thiết bị người dùng bằng cách gọi API iOS ẩn
SBSLaunchApplicationWithIdentifier với Bundle ID của app. Thông thường, nhà phát triển khởi chạy ứng dụng qua các scheme được hỗ trợ. Tuy nhiên, API này trực tiếp khởi chạy bất kỳ app nào nếu app gọi có “Entitlement” do Apple cấp. Do đó, API ẩn này có thể được dùng như một kênh phụ (side-channel) để xác minh sự tồn tại của app qua mã lỗi trả về.
Lưu ý: API này từ SpringBoard là API ẩn và không được Apple cung cấp chính thức cho các nhà phát triển, nên việc sử dụng nó vi phạm chính sách của App Store.
Danh sách một số app được kiểm tra:
- org.coolstar.SileoStore
- com.opa334.Dopamine.roothide
- com.roothide.manager
- com.cokepokes.AppStorePlus
- _xyz.willy.Zebra* com.opa334.Dopamine
- com.kahsooa.piqwkk.dummy
Ảnh chụp màn hình LLDB bên dưới tại breakpoint trong
SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions hiển thị việc kiểm tra
"com.opa334.Dopamine.roothide".


SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions được gọi từ
SBSLaunchApplicationWithIdentifier.
Dựa vào các mã lỗi mà nó trả về của API
SBSLaunchApplicationWithIdentifier:
• Nếu đã cài đặt: trả về lỗi
security policy error (chính sách bảo mật - mã lỗi
9) do thiếu chứng nhận của Apple.
• Nếu không cài đặt: trả về
application not found (không tìm thấy ứng dụng - mã lỗi
7).
Đây là một hình thức khai thác lỗ hổng kênh phụ, sử dụng API ẩn của iOS để kiểm tra xem một ứng dụng có được cài đặt hay không. Hành động khai thác này được thực hiện trong class có tên
VNPShieldBridgingManager.
Khi ứng dụng ngân hàng khai thác API này, console log của ứng dụng sẽ hiển thị nhiều thông báo lỗi về việc ứng dụng đang cố gắng khởi chạy app khác.

Thảo luận Chính sách App Store của Apple
Theo Hướng dẫn Đánh giá App Store của Apple (
Mục 2.5.1 và
5. Legal), việc sử dụng các API ẩn, không công khai (riêng tư) mà không có sự chấp thuận của Apple và người dùng vi phạm các tiêu chuẩn minh bạch dữ liệu, quyền kiểm soát của người dùng và tiêu chuẩn bảo mật, từ đó làm suy yếu lòng tin của người dùng.
Cụ thể, mục 2.5.1 quy định rằng các ứng dụng "chỉ được sử dụng API công khai" và phải sử dụng chúng một cách nghiêm ngặt theo mục đích đã được định sẵn. Bất kỳ việc sử dụng các framework hệ thống nội bộ chưa được tiết lộ hoặc các chức năng ẩn nào cũng sẽ dẫn đến việc ứng dụng bị từ chối hoặc gỡ bỏ. Apple thi hành những quy định này nhằm duy trì sự ổn định của ứng dụng, bảo vệ quyền riêng tư của người dùng và đảm bảo an ninh cho nền tảng.
Hành vi tìm cách vượt qua các hạn chế của iOS hoặc thu thập dữ liệu không được phép (ví dụ như danh sách các ứng dụng đã cài đặt) là một vi phạm nghiêm trọng, gây ra những dấu hiệu cảnh báo nghiêm trọng đối với Apple cũng như người dùng quan tâm đến bảo mật. Những hành vi này có thể dẫn đến việc ứng dụng bị cấm hoặc gỡ bỏ khỏi App Store, ảnh hưởng tới hàng triệu khách hàng của ngân hàng.
Trong bài phân tích này, chúng tôi xác nhận private API SBSLaunchApplicationWithIdentifier có thể được sử dụng như một kênh phụ (side channel) để xác định sự tồn tại của các ứng dụng thông qua mã lỗi trả về, hoạt động trên các phiên bản iOS mới nhất trên thiết bị mới chưa jailbreak. Theo chương trình tiền thưởng bảo mật của Apple (Apple Security Bounty Program), khai thác lỗ hổng này thuộc nhóm “Tấn công thiết bị thông qua ứng dụng do người dùng cài đặt - Truy cập trái phép vào dữ liệu nhạy cảm” với mức tiền thưởng 5.000 USD.

Kết luận
Phân tích kỹ thuật cho thấy hai ứng dụng ngân hàng BIDV SmartBanking (v5.2.62, cập nhật ngày 14/03/2025) và Agribank Plus (v5.1.8, cập nhật ngày 25/03/2025), được phát triển bởi VNPay, sử dụng các giải pháp bảo vệ ứng dụng thương mại DexProtector/Licel and Dexguard/iXGuard, kèm theo một mô đun tự phát triển có khả năng được đặt tên “
VNPay Runtime Protection” hay “
VNPShield”.
Mô đun này khai thác lỗ hổng kênh phụ (side-channel) của một API ẩn của hệ điều hành iOS
SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions để xác định ứng dụng được người dùng cài đặt trên thiết bị iPhone/iPad, đồng thời sử dụng cơ chế mã hóa che giấu các chuỗi API ẩn này. Lỗ hổng kênh phụ (side-channel) này ảnh hưởng phiên bản iOS mới nhất trên thiết bị iPhone/iPad không jailbreak. Theo chương trình tiền thưởng bảo mật của Apple (
Apple Security Bounty Program), lỗ hổng kênh phụ này thuộc nhóm “Tấn công thiết bị thông qua ứng dụng do người dùng cài đặt - Truy cập trái phép vào dữ liệu nhạy cảm” với mức tiền thưởng 5.000 USD.
Những hành vi trên vi phạm nghiêm trọng chính sách của Apple App Store và gây rủi ro lớn nếu Apple cấm hay gỡ bỏ ứng dụng, ảnh hưởng tới hàng triệu khách hàng của ngân hàng.