Sự cố Vietcombank, một góc nhìn kỹ thuật
Nhằm góp một tiếng nói độc lập về sự việc này, nhóm nghiên cứu VNSECURITY đã thẩm định quy trình giao dịch trên ngân hàng điện tử của Vietcombank. Trong bài viết này chúng tôi đưa ra hai phương án mà kẻ xấu đã thực hiện để trộm tiền. Chúng tôi đánh giá phương án phishing là khả dĩ nhất. Ngoài ra chúng tôi cũng đã phát hiện một lỗ hổng trong thiết kế của Smart OTP. Chúng tôi không có bằng chứng mạnh mẽ để chứng minh đây là lỗ hổng mà kẻ xấu đã sử dụng, nhưng chúng tôi hi vọng, thông qua các phân tích kỹ thuật, Smart OTP và các sản phẩm Internet Banking khác ở Vietcombank cũng như các ngân hàng khác sẽ được điều chỉnh để an toàn hơn và người dùng cũng hiểu hơn về những rủi ro mà họ đang chịu khi sử dụng các sản phẩm và dịch vụ Internet Banking. Trong bài viết tiếp theo, chúng tôi sẽ bàn về cách triển khai một hệ thống xác thực hai lớp hiện đại chống lại được tấn công phishing.
Giải pháp xác thực 2 lớp của Vietcombank
- Người dùng đăng nhập bằng tên đăng nhập và mật khẩu.
- Tạo giao dịch.
- Nhận và xác thực one-time password (OTP, mật khẩu dùng một lần, còn gọi là mã xác thực).
- Hoàn tất giao dịch.
Theo như đề cập ở trên, nửa đêm ngày 4 rạng sáng ngày 5, nạn nhân bị đánh cắp hơn nửa tỉ đồng, mà không hề nhận được SMS OTP. Vietcombank và C50 cho rằng kẻ xấu bằng cách nào đó đã kích hoạt thành công dịch vụ Smart OTP của nạn nhân [4].
Hướng tấn công số 1: phishing
- Lừa nạn nhân vào trang web giả mạo để lấy thông tin tên người dùng và mật khẩu.
- Tiếp tục lừa nạn nhân trên giao diện trang web giả mạo để lấy SMS OTP.
- Sử dụng SMS OTP để âm thầm kích hoạt Smart OTP.
- Vì Smart OTP có thể sử dụng song song với SMS OTP, nạn nhân không hề biết tài khoản đã hoàn toàn bị kiểm soát.

Hướng tấn công số 2: khai thác lỗ hổng của Smart OTP
Vì tò mò, chúng tôi đã tiến hành kiểm tra ứng dụng Smart OTP và phát hiện một lỗ hổng. Lợi dụng lỗ hổng này, chỉ cần biết số điện thoại của nạn nhân, kẻ xấu có thể kích hoạt Smart OTP của các khách hàng chưa đăng ký dịch vụ Smart OTP. Phương án tấn công như sau:
- Lừa nạn nhân vào trang web giả mạo để lấy thông tin tên người dùng và mật khẩu.
- Sử dụng tên người dùng và mật khẩu để truy vấn số điện thoại của nạn nhân trên trang Internet Banking của Vietcombank.
- Khai thác lỗ hổng để kích hoạt Smart OTP.

- Phần mềm Smart OTP gửi số điện thoại và địa chỉ WiFi MAC address của điện thoại đến máy chủ của VCB.
- Nếu số điện thoại chưa đăng ký, máy chủ VCB sẽ thực hiện hai thao tác:
- Gửi mã xác thực, gọi là N, đến số điện thoại.
- Gửi Encrypt(key=MD5(MD5(N), Y)) về cho ứng dụng, trong đó Y là một chuỗi mà chúng tôi chưa có điều kiện được xác định chính xác. Sau khi trao đổi với Vietcombank, họ cho biết Y là một chuỗi ngẫu nhiên 16 bytes.
- Phần mềm Smart OTP nhận mã xác thực từ người dùng và sử dụng nó để giải mã lấy giá trị Y. Sau đó ứng dụng dùng khóa Y để mã hóa N và gửi lại cho máy chủ VCB.
- Lúc này máy chủ sẽ kiểm tra, nếu thông tin chính xác, máy chủ sẽ trả về một số thông tin, trong đó quan trọng nhất là thông số được đặt tên XFACTOR.
- Tất cả OTP được tạo ra từ XFACTOR. Ai có XFACTOR có thể tự tạo OTP mà không cần thông qua máy chủ VCB nữa.
- Gửi số điện thoại của nạn nhân và một địa chỉ MAC bất kỳ đến máy chủ của VCB.
- Lúc này máy chủ sẽ trả về R = Encrypt(key = MD5(MD5(N)), Y). Vì N là một chuỗi rất ngắn, chỉ có 4 chữ số, do đó kẻ tấn công có thể dò N.
- Với mỗi giá trị dự đoán N’ kẻ tấn công sẽ tính Y’ = Decrypt(key=MD5(N’), data=R). Tùy thuộc vào biên giá trị của Y mà quá trình dò này có thể thực hiện offline. Nếu Y là một chuỗi hoàn toàn ngẫu nhiên, kẻ tấn công có thể sử dụng Y’ và N’ để thực hiện bước 3 và dựa vào phản hồi của máy chủ VCB để tìm N’ = N. Máy chủ VCB có thể ngăn chặn sử dụng Y’ và N’ để dò N, nhưng chúng tôi không có điều kiện để xác minh.
- Sau khi đã có N, kẻ tấn công có thể thực hiện tiếp các bước 3, 4 và 5.
Đại diện Vietcombank xác nhận giao thức mà chúng tôi mô tả ở trên là chính xác (tại thời điểm 14:30 ngày 15/8/2016, chúng tôi nhận thấy Vietcombank đã đổi giao thức, cho nên thông tin ở trên có thể không còn chính xác). Lưu ý chúng tôi xác định được giao thức này bằng cách dịch ngược mã phần mềm Smart OTP, hoàn toàn không tác động đến máy chủ của Vietcombank. Trong quá trình thẩm định Smart OTP vì không có tài khoản VCB và vì hệ thống Smart OTP liên tục thay đổi, chúng tôi không có điều kiện thử nghiệm để biết lỗ hổng mà chúng tôi phát hiện nguy hiểm đến mức nào. Vì lo ngại đây là lỗ hổng mà kẻ tấn công sử dụng để đánh cắp tiền của khách hàng Vietcombank, chúng tôi gửi thông tin cho Vietcombank trước khi có kết luận chính thức.
Vì
- không có tài khoản thử nghiệm (Vietcombank hứa sẽ cung cấp tài khoản thử nghiệm, nhưng chúng tôi không nhận được),
- hệ thống Smart OTP có nhiều thay đổi kể từ khi chúng tôi gửi thông tin cho Vietcombank,
- không có thời gian để tiếp tục công việc thiện nguyện này
Thư viện phần mềm mã hóa mà Smart OTP sử dụng không bồi thêm một khối các số 0 vào cuối Y, khi Y có chiều dài là bội của 8. Nếu như Smart OTP sử dụng Bouncy Castle [6], một thư viện mã hóa rất phổ biến trên Android, phía cuối của Y sẽ có một khối toàn các số 0 và khi đó chỉ cần vài giây là có thể tìm được N.
Nhật ký phát hiện và thông báo lỗ hổng
- 22:30, 12/8/2016: tải app Smart APK về.
- 02:30, 13/8/2016: tìm thấy lỗ hổng thông qua việc dịch ngược app.
- 11:39, 13/8/2016: gửi email thông báo lỗ hổng đến địa chỉ webmaster@vietcombank.com.vn. Đây là địa chỉ email duy nhất mà VNSECURITY tìm thấy trên website http://www.vietcombank.com.vn. Trang “Bảo mật” trên website này “đang được xây dựng”.
- 11:40, 13/8/2016: nhận được thông báo địa chỉ webmaster@vietcombank.com.vn không tồn tại.
- 11:55, 13/8/2016: hỏi thông tin liên lạc của Vietcombank trên diễn đàn Viet-InfoSec.
- 12:40, 13/8/2016: một thành viên Viet-InfoSec cung cấp địa chỉ email của một cán bộ trung tâm CNTT Vietcombank.
- 12:48, 13/8/2016: gửi báo cáo lỗ hổng đến Vietcombank.
- 14:30, 13/8/2016: Vietcombank trả lời đã nhận được thông tin, sẽ trao đổi nội bộ rồi báo lại sớm. Vietcombank hỏi có phải VNSECURITY đã reverse engineer phần mềm Smart OTP.
- 14:39, 13/8/2016: xác nhận với Vietcombank lỗ hổng được phát hiện bằng phương thức reverse engineering.
- 17:04, 13/08/2016: công bố phiên bản đầu tiên của bài viết này, thông tin chi tiết của lỗ hổng được giữ kín.
- 19:15, 13/08/2016: nhận được yêu cầu gián tiếp từ phía Vietcombank đề nghị gỡ bỏ bài viết này xuống. Đề nghị Vietcombank trực tiếp liên lạc qua email.
- 19:40, 13/08/2016: Vietcombank trả lời qua email, cảm ơn VNSECURITY, xác nhận giao thức được mô tả là chính xác, cung cấp thêm một số thông tin, đề nghị VNSECURITY kiểm tra lại.
- 20:03, 13/08/2016: trả lời Vietcombank, chỉ ra sự mong manh dễ vỡ của Smart OTP, bất kể lỗ hổng có khai thác được hay không. Đề nghị Vietcombank cung cấp tài khoản để kiểm tra.
- 20:18, 13/08/2016: nói thêm cho Vietcombank biết cách thiết kế một giao thức OTP an toàn.
- 21:30, 13/08/2016: Vietcombank hứa đến sáng thứ hai ngày 15/08/2016 sẽ cung cấp tài khoản thử nghiệm. Cho đến thời điểm bài viết này được công bố, VNSECURITY vẫn chưa nhận được tài khoản thử nghiệm.
- 23:52, 13/08/2016: Vietcombank xác nhận giao thức Smart OTP không đúng chuẩn và sẽ xem xét phương án thay thế. Vietcombank cho rằng đưa ra giả thuyết về lỗ hổng là hơi sớm.
- 00:22, 14/08/2016: Vietcombank cung cấp thêm thông tin về Y và số lần người dùng có thể thực hiện bước số 3 trong giao thức Smart OTP.
- 00:28, 14/08/2016: một đại diện khác của Vietcombank xác nhận thông tin về Y và số lần người dùng có thể thực hiện bước số 3 trong giao thức Smart OTP. Đề nghị VNSECURITY hỗ trợ “trong thời điểm nhạy cảm này” (nguyên văn).
- 00:45, 14/08/2016: nhận thấy máy chủ Smart OTP đã có một số thay đổi, đề nghị Vietcombank cho biết thêm thông tin về tình trạng hiện tại.
- 00:55, 14/08/2016: Vietcombank cho biết đã thay đổi quy trình đăng ký Smart OTP theo yêu cầu của ngân hàng nhà nước. Vietcombank tái xác nhận sẽ cung cấp tài khoản thử nghiệm vào thứ hai 15/08/2016.
- 00:57, 14/08/2016: cập nhật bài viết này, ghi chú “việc khai thác lỗ hổng với hệ thống hiện tại là rất khó có thể thành công”.
- 15:36, 14/08/2016: Vietcombank xác nhận thêm lần nữa Smart OTP vẫn đang hoạt động, chỉ có một chút thay đổi về quy trình đăng ký, kích hoạt dịch vụ. Đề nghị VNSECURITY hỗ trợ chống phishing.
- 14:30, 15/08/2016: phát hiện Vietcombank đã thay đổi giao thức Smart OTP trên máy chủ, nâng cấp từ phiên bản “22” lên phiên bản “24”. VNSECURITY không được thông báo trước về những thay đổi này.
- 01:30, 16/08/2016: thông báo cho Vietcombank biết VNSECURITY đã dừng việc thẩm định Smart OTP vì không có đủ thời gian để chạy theo những thay đổi không báo trước của Vietcombank. Cảm ơn Vietcombank vì những trao đổi rất cởi mở và cho biết dự định VNSECURITY sẽ công bố thông tin về lỗ hổng trong vài ngày tới.
- 07:30, 16/08/2016: cập nhật bài viết này với thông tin chi tiết về lỗ hổng.