Skip to main content

Vọc thử các ứng dụng ngân hàng trực tuyến

Nhân dịp vấn đề an toàn giao dịch ngân hàng trực tuyến đang nóng, mình làm một vài bài thử nghiệm với các dịch vụ của 5 ngân hàng lớn trong nước: BIDV, Vietcombank, ACB, Techcombank và Sacombank. Các bài thử nghiệm sẽ là (hoặc tua xuống cuối bài để xem nhanh nên xài ngân hàng nào thì an toàn :P):
  1. Trang web
    • TLS: phải bật
    • SSL Server Test: phải từ A trở lên
    • HPKP: phải sử dụng
    • hoặc phải mã hóa tên và mật khẩu bằng Javascript trước khi đăng nhập
  2. Ứng dụng di động: lúc đầu mình tính kiểm tra riêng Android và iOS nhưng thực tế thấy ứng dụng mỗi ngân hàng ở hai nền tảng khá giống nhau nên gom lại chung cho gọn

Giới thiệu

TLS trước đây còn có rào cản về chi phí tuy nhiên gần đây đã có chứng chỉ miễn phí từ Let's Encrypt nên không còn lý do gì nữa để không làm việc này. TLS là bước cơ bản nhất để bảo mật thông tin giữa ngân hàng và người sử dụng.

SSL Server Test là bài kiểm tra máy chủ web bao gồm phần mềm, cấu hình TLS và chứng chỉ. Bài kiểm tra này sẽ cho điểm trang web, tối đa là điểm A. Điểm càng cao càng tốt.

HPKP là một phần mở rộng cho HTTP cho phép các trang web bảo vệ mình khỏi các cuộc tấn công dạng MITM (man in the middle / người trung gian). Cách tấn công này nôm na là kẻ tấn công can thiệp vào giữa kết nối của người dùng và ngân hàng sau đó bí mật ngăn chặn và thay đổi thông tin qua lại giữa hai bên. HPKP vẫn còn khá mới và chưa được hỗ trợ rộng khắp, người dùng cần sử dụng phiên bản khá mới của các trình duyệt để được bảo vệ (ví dụ: Chrome 46, Firefox 35 trở lên).

Certificate/Public Key Pinning có ý tưởng gần giống HPKP nhưng thay vì thực hiện kiểm tra ở trình duyệt thì mỗi ứng dụng tự kiểm tra khi kết nối với máy chủ. Do ứng dụng được phát hành bởi chính ngân hàng nên đội phát triển có thể nắm rõ máy chủ ngân hàng sử dụng chứng chỉ gì, phát hành bởi đơn vị nào, từ đó thực hiện Pinning đảm bảo thông tin của người sử dụng không bị lộ với bên thứ ba.

Trong trường hợp không sử dụng Pinning thì ứng dụng cần phải mã hóa tất cả các thông tin nhạy cảm như tên, mật khẩu đăng nhập theo cả hai hướng (gửi lên / nhận về) để bảo vệ người sử dụng.

Kết quả

Mỗi bước kiểm tra có thể có kết quả là:
  • PASS
  • BAD: yêu cầu nên có mà không sử dụng
  • FAIL: yêu cầu phải có mà không sử dụng

Trang web

  • TLS: có PASS
  • SSL Server Test: không kiểm tra được do HTTPS cổng 81
  • HPKP: không cài đặt BAD
  • Mã hóa: có nhưng vẫn có thể lấy được mật khẩu (xài base64) FAIL
  • TLS: có PASS
  • SSL Server Test: A PASS
  • HPKP: không cài đặt BAD
  • Mã hóa: không thực hiện FAIL

  • TLS: có PASS
  • SSL Server Test: B FAIL
  • HPKP: không cài đặt BAD
  • Mã hóa: không thực hiện FAIL
Trang web của ACB bị điểm B vì nhiều lý do tuy nhiên nặng nhất là do cấu hình phần mềm đang hỗ trợ một công nghệ đã cũ và có điểm yếu (DH, chi tiết xem thêm trang tổng hợp về ACB tại SSL Labs).

  • TLS: có PASS
  • SSL Server Test: A- PASS
  • HPKP: không cài đặt BAD
  • Mã hóa: không thực hiện FAIL
  • TLS: có PASS
  • SSL Server Test: A- PASS
  • HPKP: không cài đặt BAD
  • Mã hóa: có nhưng vẫn có thể lấy được tên đăng nhập PASS

Ứng dụng di động

BIDV (Android, iOS)
  • TLS: có PASS
  • Pinning (ebank.bidv.com.vn): có PASS
Ứng dụng BIDV (iOS) thực hiện Pinning
và báo lỗi kết nối trong trường hợp bị tấn công

Vietcombank (AndroidiOS)
  • TLS: có PASS
  • Pinning (vcbmobilebankingp2.smartlink.com.vn): không cài đặt BAD
  • Mã hóa: có nhưng vẫn có thể lấy được tên đăng nhập PASS

ACB (AndroidiOS)
  • TLS: có PASS
  • Pinning: không cài đặt BAD
  • Mã khóa: không thực hiện FAIL
adapter=ACBAdapter&procedure=submitAuthentication&compressResponse&parameters=%5B%7B%22username%22%3A%220901234567%22%2C%22password%22%3A%22qwerty1%22%2C%22device%22%3A%22xxx%22%2C%22ip%22%3A%22xxx%22%7D%5D&__wl_deviceCtx=xxx&isAjaxRequest=true&x=xxx
Ứng dụng của ACB ngoài ra còn thực hiện tự cập nhật sau khi cài đặt từ kho ứng dụng, mặc dù dữ liệu cập nhật có vẻ được mã hóa tuy nhiên do không Pinning nên kẻ xấu rất có thể vẫn có cách chèn mã độc vào quá trình cập nhật này.


Techcombank (AndroidiOS)
  • TLS: có PASS
  • Pinning (m.techcombank.com.vn): không cài đặt BAD
  • Mã khóa: không thực hiện FAIL
{"origin":"MAPP","traceNo":"xxx","AuditData":{"device":"xxx","deviceId":"xxx","otherDeviceId":"xxx","application":"MAPP","applicationVersion":"1.1.2.5"},"identification":"0901234567","credential":"qwerty1","identificationType":"0","credentialType":"0","UnstructuredData":[{"Key":"DeviceToken","Value":"xxx"}]}

Sacombank (Android, iOS)
  • TLS: có PASS
  • Pinning (www.msacombank.com.vn): không cài đặt BAD
  • Mã hóa: có nhưng vẫn có thể lấy được tên đăng nhập PASS

Kiểm tra thêm

Mình cũng hơi rảnh nên quyết định thử thêm Citibank với HSBC.

  • Citibank Vietnam Web
    • TLS: có
    • SSL Test A-
    • Không có HPKP
    • Không mã hóa khi gửi thông tin
    • Tổng kết: FAIL
  • Citibank Vietnam (Android, iOS)
    • TLS: có
    • Pinning (mobile.citibank.com.vn): không
    • Mã hóa: có
    • Tổng kết: PASS
    • Ứng dụng này dùng WebView mà không Pinning nên có thể tấn công bằng cách chèn mã độc vào các đoạn Javascript khi tải ứng dụng.
  • HSBC Vietnam Web
    • TLS: có
    • SSL Test C (chứng chỉ + thuật toán yếu)
    • Không có HPKP
    • Không mã hóa khi gửi thông tin 
    • Tổng kết: FAIL
  • HSBC (Android, iOS)
    • TLS: có
    • Pinning (services.mobile.hsbc.com + www.hsbc.com.vn): có
    • Tổng kết: PASS
    • Ứng dụng này của HSBC toàn cầu, mình chọn kết nối vào HSBC Việt Nam thì thấy ứng dụng áp dụng Pinning cho cả hai máy chủ luôn. Tuy vậy vẫn có một số thông tin theo dõi người dùng (sử dụng mạng gì, thiết bị gì, đang vào trang nào) có thể bị nghe lén (máy chủ dc.webtrends.com)

Thông báo lỗi của ứng dụng HSBC khi bị tấn công

Kết luận


Như vậy là chỉ có 1 trang web qua được bài kiểm tra (Sacombank) và cả 5 trang đều không xài HPKP. Như đã nói ở trên, đây là chức năng khá mới và đa số người dùng cũng chưa sử dụng trình duyệt phiên bản đủ mới để hưởng lợi từ việc này. Trên thế giới cũng còn nhiều trang web tài chính chưa bắt đầu sử dụng HPKP (ví dụ như PayPal, HSBC US).

Về ứng dụng di động, 2 ứng dụng không qua được bài kiểm tra (ACBTechcombank) và 1 ứng dụng duy nhất có sử dụng kỹ thuật Pinning là BIDV.

Bảng xếp hạng chung cuộc:
  1. Sacombank: chưa áp dụng các công nghệ mới nhất nhưng vẫn an toàn
  2. BIDV, Vietcombank: ứng dụng của ngân hàng này an toàn hơn web của họ
  3. ACB, Techcombank: về chót. Nên hạn chế sử dụng nếu đang kết nối qua mạng công cộng (wifi quán cà phê, wifi không bảo mật).
Bài này đã được thay đổi do lỗi khi chạy thử web của BIDV dẫn đến thay đổi thứ tự bảng tổng kết cuối cùng (kết quả cũ là BIDV số 1, kết quả cập nhật là Sacombank vượt lên!).

Xem thảo luận + gạch đá ở tinhte.vn.

Comments

Popular posts from this blog

Flutter: Fixing Firebase header not found with Notification Service Extension

If you follow the FCM tutorial Send an image in the notification payload and encountered this error message: 'FirebaseMessaging/FirebaseMessaging.h' file not found You are on the right place, I'm going to show you how to fix it. My app was working fine but one day it stopped compiling. Apparently Flutter 1.20 changed the way it uses CocoaPod so the service extension no longer has the proper library configured. After some tinkering, I came up with this pod config, it has to be added to ios/Podfile below the main Runner target. target 'FcmImage' do use_frameworks! use_modular_headers! require File.expand_path('../.symlinks/plugins/firebase_core/ios/firebase_sdk_version.rb', __FILE__) firebase_sdk_version = firebase_sdk_version! pod 'Firebase/Messaging', "~> #{firebase_sdk_version}" end FcmImage is my extension name, replace it with yours We can use a hardcoded version for Firebase/Messaging pod but doing so m

IMAP module for PHP in Mac OS X Mountain Lion

So here it comes again. I have recently upgraded to Mountain Lion and for whatever reason, Apple decided to nuked all my previous PHP (among other things) configurations so I have to setup IMAP in PHP again. A simple Google search may point you to this post with detailed instruction for Lion however, some steps have been changed a bit... Step 1: Install prerequisites You may choose to download Xcode ( FREE ) from the App Store then go to menu Xcode > menu item Preferences > tab Downloads, select to install Command Line Tools OR you can go to Apple Developer  to get it, you may need to login. Step 2: Compile IMAP Get the IMAP source code from University of Washington website . Please do me a favor and check that website for the latest version, it's good practice. If you that laz y , try to click the "y" to get direct link to 2007f version. Extract the package and open the Terminal to the new directory before executing these command: make osx EXTRACFLAG

OAuth with Google, Twitter and... Facebook!

This is sick! Just a few days ago, I ran into OAuth as I want to get my GMail feed based on Google Data API . I succeeded. With a little help of an OAuth open source ( here , available in several programming languages). Then I remember that I once heard that Twitter also uses OAuth as an authentication option so I turned into Twitter and had a good read. Finally, I found out that they are basically the same (hehe, it's obvious since OAuth 1.0 is a worldwide standard). I had an idea of writing a universal class which can handle both Google and Twitter OAuth functionalities. It's not too hard. I took most of the idea from the PHP example ( here , PHP only). I also made a small script which accepts URI to send and intercept response from Google & Twitter servers. At that moment, I was so excited with all the ideas but actually it has no real world benefit so I just left it there... Until today, in the F8 (says "fate") conference of Facebook, I was stunned fin