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
và 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
Đăng nhận xét