CVE-2024-42009
Shut up, be better
Overview
Roundcube là một ứng dụng webmail mã nguồn mở, cung cấp giao diện thân thiện và dễ sử dụng cho việc quản lý email thông qua trình duyệt web.
Lỗ hổng bảo mật CVE-2024-42009 trong Roundcube cho phép Desanitization trong quá trình chuẩn bị nội dung email để hiển thị tại hàm message_body(). Vấn đề này có thể bị kẻ tấn công lợi dụng để smuggle (lén đưa) payload XSS vào nội dung email, vượt qua bước lọc ban đầu mà không bị phát hiện. Sau đó, payload này có thể biến thành một thuộc tính sự kiện (event handler) mới nhờ các thao tác chỉnh sửa về sau.
Affected Software
Roundcube Webmail trước 1.5.7 và 1.6.x trước 1.6.7.
Lỗ hổng này được đánh giá là nghiêm trọng (High) với điểm CVSS v3.1 là 7.5. Kẻ tấn công từ xa có thể khai thác lỗ hổng này mà không cần xác thực (không cần tài khoản) và không cần sự tương tác của người dùng. Việc khai thác thành công lỗ hổng này có thể dẫn đến:
Mất mát dữ liệu (Confidentiality: High): Kẻ tấn công có thể truy cập và đánh cắp dữ liệu nhạy cảm trong email của nạn nhân.
Thay đổi dữ liệu (Integrity: High): Kẻ tấn công có thể thay đổi nội dung hoặc giả mạo email thông qua việc thực thi mã độc trong trình duyệt của nạn nhân.
Tấn công từ chối dịch vụ (Availability: Medium): Kẻ tấn công có thể làm treo trình duyệt hoặc ảnh hưởng đến khả năng hiển thị email của nạn nhân.
Kẻ tấn công có thể thực thi các lệnh trong trình duyệt dẫn đến nguy cơ chiếm quyền điều khiển phiên làm việc của nạn nhân hoặc tiếp tục khai thác sâu vào hệ thống.
Technical Analysis
Lỗ hổng Desanitization trong quá trình chuẩn bị nội dung email để hiển thị tại hàm message_body(). Vấn đề này có thể bị kẻ tấn công lợi dụng để smuggle (lén đưa) payload XSS vào nội dung email, vượt qua bước lọc ban đầu mà không bị phát hiện. Sau đó, payload này có thể biến thành một thuộc tính sự kiện (event handler) mới nhờ các thao tác chỉnh sửa về sau.
Tại tệp program/actions/mail/show.php :
Dòng 728 chịu trách nhiệm chỉnh sửa, sanitize biến $body -> Gây Desanitization
Dòng 731 chịu trách nhiệm Hiển thị nội dung HTML sau khi Desanitization

Phân tích sâu vào hàm chịu trách nhiệm Desanitization html4inline() ở file web\webmail\program\actions\mail\index.php ta thấy được:
Hàm html4inline() sẽ loại bỏ các thành phần như <!DOCTYPE>, <head>, và thay thế thẻ <body> thành <div> vì trang chính đã có sẵn một thẻ <body>. Hàm này còn thực hiện thao tác loại bỏ các thuộc tính cũ như bgcolor, text, background và chuyển đổi chúng thành các thuộc tính CSS hợp lệ.
Lỗ hổng nằm ở việc phân tích cú pháp thuộc tính <body> trong hàm html4inline() chỉ sử dụng một biểu thức chính quy bằng dòng 1205 một cách đơn giản mà không kiểm tra ngữ cảnh chính xác:

Từ dòng 1208 đến 1246 khi xử lí các CSS attribute của tag body:
Biến $attrs lúc này sẽ chứa toàn bộ các thuộc tính của thẻ <body> dưới dạng chuỗi. Một biểu thức chính quy (regex) khác sẽ được sử dụng để trích xuất các thuộc tính cũ (legacy attributes) từ $attrs. Nếu tập trung vào regex xử lý thuộc tính bgcolor dòng 1213, ta có thể thấy rằng nó hỗ trợ tất cả các loại dấu phân cách: dấu nháy đơn, dấu nháy kép hoặc không có dấu nháy.
Tuy nhiên, regex này có lỗi nghiêm trọng! Nó không kiểm tra xem liệu chuỗi bgcolor=... có thực sự là một thuộc tính hay chỉ là một phần trong giá trị của một thuộc tính khác. Chuỗi bgcolor=something hoàn toàn có thể vô tình xuất hiện bên trong giá trị của một thuộc tính hợp lệ khác. Ngoài ra, regex cũng không kiểm tra xem dấu nháy mở và đóng có đồng bộ hay không (cùng loại hoặc có đủ hay không). Việc phân tích cú pháp thiếu chặt chẽ này có thể bị lợi dụng để phá vỡ cấu trúc HTML an toàn ban đầu, bởi vì mọi chuỗi khớp với regex đều sẽ bị loại bỏ. Nếu trong quá trình loại bỏ đó mà số lượng dấu nháy trở nên lẻ, các phần phía sau có thể thoát ra ngoài và trở thành những thuộc tính HTML mới, bao gồm cả các event handler độc hại, dẫn đến XSS.

Ví dụ điển hình như sau: bgcolor bị regex khớp bên trong một giá trị thuộc tính, sau đó dấu nháy đóng cũng bị loại bỏ. Kết quả là phần onload ẩn bên trong thuộc tính name sẽ trở thành một thuộc tính mới do mất cân bằng dấu nháy:
Sau khi bị preg_replace() xử lý:
Vì hàm html4inline() chỉ thực hiện sau bước lọc HTML, nên các thuộc tính độc hại sinh ra theo cách này sẽ không bị loại bỏ. Tiếp đó, thẻ <body> chỉ đơn giản được thay thế bằng <div> thông qua phép thay thế chuỗi (str_replace('<body', '<div')). Điều này có nghĩa là kẻ tấn công chỉ cần điều chỉnh payload XSS của mình để phù hợp với <div> (do <div> không hỗ trợ onload). Thay vào đó, chúng có thể tận dụng thuộc tính sự kiện onanimationstart, một thuộc tính hợp lệ của <div>, kết hợp với animation có sẵn trong Bootstrap (mà Roundcube đang sử dụng) để thực thi mã độc.
Điều nguy hiểm chỉ với một email đơn giản chứa đoạn payload trên, kẻ tấn công đã có thể thực thi JavaScript trực tiếp trong trình duyệt của nạn nhân, từ đó chiếm đoạt email hoặc dữ liệu nhạy cảm khác.
Exploit
Bước 1: Tạo script dùng để gửi mail có chứa payload XSS dùng để cướp cookie người dùng và gửi tới server attacker:

Bước 2: Tạo ra Server dùng để nhận thông tin cookie được gửi tới:

Bước 3: Dùng python để chạy file Exploit:

Bước 4: Get Cookie người dùng:

Last updated
