Khi nghĩ đến việc che giấu các request trên mobile app, có thể người ta sẽ nghĩ đến Certificate Pinning. Kỹ thuật này khá phổ biến, nó sẽ góp phần làm cản bước những người có ý định phân tích request từ mobile app, chống lại cuộc tấn công MITM do app sẽ chỉ thực hiện kết nối khi thông tin chứng chỉ của server khớp với thông tin chứng chỉ được ghim trong app.

Cert Pinning khá tốt, tuy nhiên hiện nay có nhiều script công khai giúp bypass Certificate Pinning mà không cần biết đến logic triển khai, và để góp phần che giấu các request thì giải pháp có thể được sử dụng là triển khai Certificate Transparency (CT). CT sẽ giúp kiểm tra tính tin cậy của chứng chỉ, từ đó có thể ngăn chặn các kết nối tới các proxy tool (ví dụ như burp suite), vì các chứng chỉ của các proxy này sẽ bị coi là “pha kè”, không hợp lệ.

Certificate Transparency là một tiêu chuẩn bảo mật để theo dõi và kiểm tra việc cấp chứng chỉ kỹ thuật số. Khi Certificate Authorities (CA) cấp một chứng chỉ SSL/TLS, đồng thời nó cũng gửi 1 bản thông tin về chứng chỉ đó đến CT Log. CT Log là một cơ sở dữ liệu công khai, ai cũng có thể truy cập và xem thông tin về các chứng chỉ được cấp. Như vậy, khi người dùng kết nối đến website nào đó, trình duyệt có thể so sánh thông tin chứng chỉ nhận được với thông tin tại CT log, nếu thông tin không có trong trong CT log hoặc có nhưng chứng chỉ đã hết hạn thì trình duyệt có thể thông báo lỗi “NET::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED” tới người dùng (một tính năng trên Chrome Android 99+).

Các app mobile có thể triển khai CT để thêm một lớp phòng thủ. Trong trường hợp đã triển khai CT và app chạy trên một máy điện thoại được cấu hình proxy trỏ tới địa chỉ của máy tính chạy Burp Suite (hoặc 1 proxy tool khác), quá trình kết nối tới server có https có thể tóm tắt qua các bước sau:
1. Client (mobile app) và proxy, proxy và server thực hiện quá trình bắt tay 3 bước (three way handshake) để thiết lập kết nối
2. TLS handshake:
2.1 Client gửi “hello” message đến proxy sau đó proxy gửi hello message đến server
2.2 Server gửi lại cho proxy 1 message có chứa SSL certificate của server, proxy gửi lại client một message có chứa SSL certificate fake của proxy 🙂
2.3 Client kiểm tra certificate nhận được từ proxy, xác mình cert với CA. Do đã triển khai CT, client sẽ làm thêm 1 bước là tìm kiếm thông tin của cert trong CT log. Bước này sẽ trả về kết quả lỗi do cert tạo bởi Burp Suite không có trong CT log (các thông tin cert có trong CT log được gửi từ các CA uy tín, không phải từ các proxy tool – ví dụ như Burp Suite). Kết quả là kết nối bị từ chối

Khi dùng CT, request sẽ bị chậm hơn do phải check certificate

Khi không dùng CT
Khi dùng CT

Theo như thử nghiệm nho nhỏ của mình thì 1 request sẽ bị chậm đi khoảng 200ms
Với Certificate Pining thì gần như không có sự khác biệt với việc không pin

Không rõ tại sao nhưng Google chrome trên android có triển khai CT, nhưng request không chậm như vậy 🙁
Nhưng để khắc phục vấn đề chậm khoảng 200ms này, có thể triển khai CT để chỉ check một vài request đầu tiên khi mở app, thường các request này sẽ là request lấy config, hoặc đăng nhập…nếu các request này lỗi thì app sẽ không thực hiện gửi các request khác nữa. Vậy là OK 😀

Thư viện CT mình dùng: https://github.com/appmattus/certificatetransparency

Categorized in: