Phân tích lỗ hổng Zimbra pre auth rce CVE-2022-30333

Phân tích lỗ hổng Zimbra pre auth rce CVE-2022-30333

Tổng quan

  • Tháng 5/2022, Rarlab công bố lỗ hổng CVE-2022-30333 của phần mềm unrar các phiên bản trước 6.12 hoặc trước 6.1.7 chạy trên hệ điều hành Linux hoặc UNIX. Lỗ hổng trên cho phép attacker có thể ghi file ra các thư mục tùy ý trong quá trình giải nén file. Các sản phẩm WinRAR và AndroidRAR không bị ảnh hưởng.
  • Đặc biệt, lỗ hổng trên có thể bị lợi dụng để tấn công vào máy chủ mail Zimbra, từ đó RCE và leo quyền đặc quyền. Zimbra là giải pháp email được sử dụng rộng rãi bởi hơn 200,000 doanh nghiệp, chính phủ và các tổ chức tài chính. Do đó lỗ hổng trên có thể đang được nghiên cứu và sử dụng bởi các nhóm APT trong nhiều chiến dịch tấn công nhằm vào các hệ thống mail Zimbra.
  • Hiện nay cả Rarlab và Zimbra đều đã công bố bản vá cho lỗ hổng CVE-2022-30333

Các phiên bản bị ảnh hưởng

CVE-2022-30333 tồn tại trên ứng dụng unrar phiên bản <= 6.12 hoặc <=6.1.6 chạy trên hệ điều hành Linux hoặc UNIX.

Phân tích chi tiết lỗ hổng CVE-2022-30333

Quá trình giải nén của unrar

  • Một command giải nén thông thường của unrar có dạng như sau
unrar x notavirus.rar /tmp/extract
  • Câu lệnh trên sẽ giải nén tất cả file trong notavirus.rar đến đường dẫn tmp/extract
  • Các phần mềm như Amavis sẽ sử dụng những câu lệnh tương tự như trên để giải nén file trong email và phân tích. Sau khi phân tích các file đã được giải nén sẽ bị phần mềm xóa đi.
  • Symlink (symbolic link) là các file liên kết trực tiếp đến những file khác. Symlink vốn là khái niệm riêng trong Linux, chức năng tương tự như shortcut của Windows. Tuy nhiên từ Windows 10, người dùng có thể dễ dàng tạo symlink trong Windows thông qua chế độ dòng lệnh.
  • Symlink gồm 2 loại: soft link và hard link. Trong đó soft link chỉ đơn giản nhắm vào mục tiêu, khi xóa sort link không ảnh hưởng gì đến các file mà chúng trỏ đến. Tuy nhiên khi ghi 1 nội dung vào sort link, nội dung đó cũng sẽ được ghi vào file mà soft link trỏ đến.
  • Symlink trên Windows và Linux có cấu trúc tương đối khác nhau. Do đó người dùng Linux gần như không thể tạo "Windows" symlink.
  • Để khai thác lỗ hổng trên, attacker sẽ tạo ra 1 file rar độc hại chứa 1 symlink và 1 file độc hại. Khi giải nén file RAR trên, file độc hại sẽ được ghi vào symlink trỏ ra ngoài thư mục giải nén hay attacker có thể ghi file ra các thư mục tùy ý mà user có quyền truy cập.

Debug lỗ hổng CVE-2022-30333

  • Symbolic link hoặc Zip slip attack là những hình thức tấn công kinh điển lợi dụng symlink trong các file nén trên hệ điều hành Unix. Để phòng tránh các hình thức tấn công trên, unrar chặn các symlink trỏ tới đường dẫn tuyệt đối (absolute path) bằng cách kiểm tra ký tự đầu tiên trong target của symlink đó có phải dấu / hay không
    => chỉ có thể tấn công thông qua symlink với target là đường dẫn tương đối (relative path)
  • Từ phiên bản WinRAR 5.0, Rarlab đưa ra định dạng file RAR5, trong đó hỗ trợ chèn symlink vào file rar. Các symlink trong file rar sẽ được xử lý bởi hàm ExtractUnixLink50 trong file ulinks.cpp
    ExtractUnixLink50
  • Hàm IsRelativeSymLinkSafe() kiểm tra relative symbolic links:

extinfo.cpp

extinfo
Hàm trên thực hiện kiểu tra symlink target có chứa "../" (với Linux) và "..\" (với Windows) hay không. Khi hành vi path traversal bị phát hiện, symlink sẽ bị đánh dấu không an toàn => bị skip bởi unrar

  • Symlink target chứa "../" bị unrar phát hiện => có thể bypass bằng chuỗi "..\". Tuy nhiên "..\" được dùng trong windows symlink, có vẻ như không sử dụng được với Linux.
  • Tuy nhiên, để đảm bảo các file rar được tạo trên Windows có thể giải nén được trên Unix, unrar có các hàm thực hiện chức năng chuyển ký tự \ thành /.
    Đoạn code dưới đây sẽ thực hiện chuyển các symlink có kiểu FSREDIR_WINSYMLINK (Windows symlink trong các file rar được tạo trên hệ điều hành windows) => linux symlink
    ulinks.cpp
    ulink
  • Hàm DosSlashToUnix() thực hiện chuyển các dấu "\" thành "/". Do hàm DosSlashToUnix() được gọi sau hàm IsRelativeSymLinkSafe(), ta có thể truyền vào các symlink có target chỉ chứa chuỗi "..\" để bypass quá trình kiểm tra ở IsRelativeSymLinkSafe(), sau đó được convert với hàm DosSlashToUnix() thành các symlink bình thường trên Linux ^.^
  • Ví dụ, symlink "..\..\..\tmp/shell" an toàn với hàm IsRelativeSymLinkSafe(), sau khi được convert sẽ trở thành "../../../tmp/shell", 1 symlink bình thường trên Linux => bypass thành công

Tóm tắt quá trình khai thác

  • Attacker sẽ tạo 1 file evil.rar trên Windows, nén vào đó 1 symlink có tên sl trỏ tới "..\..\..\tmp/shell", 1 thư mục tên sl trong đó có chứa 1 file độc hại như webshell.jsp. Khi được giải nén, file webshell sẽ được ghi vào thư mục mà symlink sl trỏ tới (../../tmp/shell/webshell.jsp) => ghi file thành công.
    Lưu ý, attacker không thể tạo thư mục mới, mà phải ghi vào những thư mục có sẵn trong máy của victim

Ứng dụng để khai thác Zimbra

Mỗi email được gửi trong Zimbra thông thường sẽ được kiểm tra spam và virus trước khi đến mailbox người nhận. Flow xử lý mail của Zimbra như sau:
zimbra
Chú thích:

  • (1) Email tới được xử lý bởi Postfix qua giao thức SMTP
  • (2) Postfix chuyển mail qua Amavisd để kiểm tra. Amavisd sẽ parse email đó, giải nén các file đính kèm.
  • (3) Amavisd gửi các file đã giải nén tới Spam Checker Spamassassin hoặc Antivirus ClamAV để kiểm tra
  • Nếu email an toàn, nó sẽ được chuyển tới Zimbra core để tiếp tục xử lý
    Kịch bản tấn công:
  • Attacker tạo 1 file rar độc hại như trên (file mẫu có thể tải xuống tại đây và đính kèm vào email, gửi tới 1 email Zimbra
    email
  • File rar độc hại sẽ được phân tích và giải nén bởi Amavisd => webshell được ghi trên web directory của Zimbra mail.
    webshell1
    webshell2

Cách khắc phục

  • Update unrar và zimbra lên phiên bản mới nhất: unrar6.1.2zimbra8.8.8

Tài liệu tham khảo

  1. Bài phân tích của Simon Scannell
  2. File rar sample để test lỗ hổng trên linux và zimbra

Subscribe to DEV2SEC

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe