Authentication bypass vulnerability in Bouncy Castle

 

Tổng quan

-         Lỗ hổng có ID CVE: CVE-2020-28052

-         Lỗ hổng tồn tại trong class OpenBSDBcrypt của thư viện Bouncy Castle, lỗ hổng cho phép vượt qua xác thực. Class OpenBSDBcrypt sử dụng thuật toán Bcrypt để băm mật khẩu, nhưng trong phương thức kiểm tra mật khẩu của hàm OpenBSDBcrypt.doCheckPassword đã có sai sót dẫn đến kẻ tấn công có thể vượt qua xác thực.

Nguyên nhân dẫn đến vượt qua xác thực trong hàm OpenBSDBcrypt.doCheckPassword

-         Hàm doCheckPassword thực hiện một thuật toán kiểm tra thiếu sót, hàm này chỉ kiểm tra indexOf (vị trí đầu tiên của ký tự) từ 0 đến 59 thay vì kiểm tra các ký tự ở vị trí từ 0 đến 59 có khớp hay không. Cho nên kẻ tấn công không cần sử dụng mật khẩu khớp từng byte với giá trị băm được lưu trữ cũng có thể truy cập vào hệ thống.

Hình thức tấn công

-         Giá trị băm do hàm Bcrypt băm có độ dài 60 byte. Trong 60 byte đó sẽ chứa một trong 64 giá trị từ [“0-9”, “A-Z”, “a-z”, “.”, “/”] và có dạng như hình

-         Hacker sẽ phải brute-force mật khẩu để có thể vượt qua xác thực. Thử nghiệm trong 1000 lần thử cho thấy 20% mật khẩu ngẫu nhiên sẽ vượt qua được xác thực.

-         Cùng đọc và phân tích thuật toán mà hàm doCheckPassword đã xử dụng để xác thực mật khẩu.

·        bcryptString sẽ là giá trị băm được lưu trong db với kiểu String

·        password là giá trị cần xác thực dạng plantext kiểu byte

·        thực hiện lấy giá trị salt bằng hàm decodeSaltString của ký tự từ 8-29 của bcryptString

·        sử dụng salt vừa tạo để băm password ra dạng mã băm

·        isEqual sẽ là True khi độ dài của bcryptString newBcryptString bằng nhau và bằng 60

·        vòng for sẽ chạy giá trị i từ 0-59

·        đọc kỹ cách dùng của hàm indexOf() ta sẽ thấy khi i là kiểu int thì hàm sẽ thực hiện tìm vị trí của giá trị char(i) trong string ứng với nó. Có nghĩa i sẽ chạy từ 0x00 đến 0x3b, so với bảng mã Ascii sẽ nhìn ra được dòng code này so sánh vị trí đầu tiên của những những giá trị nào của 2 string.

·        vì vậy hacker chỉ cần viết tools bruteforce mật khẩu vì chính hàm OpenBSDBcrypt.doCheckPassword của thư viện đang có những thiếu sót.

-         PoC

·        Thực hiện target 1 password ngẫu nhiên và cùng tìm xem bao nhiêu password khác có thể bypass được qua xác thực. Tôi chạy thử 100 trường hợp sinh password random và kết quả là có 7/100 mật khẩu có thể xác thực được qua target ban đầu.


Mức độ ảnh hưởng

-         Được đánh giá với mức độ rủi ro cao – CVSS:8.1

-         Ảnh hưởng trên thư viện Councy Castle BC Java 1.65 và 1.66

-         Có thể sử dụng cho các cuộc tấn công vượt qua xác thực dịch vụ sử dụng thư viện này.

Cách khắc phục

-         Sử dụng thư viện Bouncy Castle BC Java 1.67 trở lên.

Nhận xét

Bài đăng phổ biến từ blog này

Lỗ hổng Kerberos Bronze Bit (Phần 1 - Giới thiệu lỗ hổng)

Lỗ hổng Kerberos Bronze Bit (Phần 2 - Tiến hành khai thác)

Rà soát backdoor trên Microsoft Exchange Server