Lỗ hổng nghiêm trọng trong Exim cho phép thực thi mã trên máy chủ với quyền root

Trong máy chủ thư Exim xác định phê bình sự dễ bị tổn thương (CVE-2019-10149), điều này có thể dẫn đến việc thực thi mã từ xa trên máy chủ có quyền root khi xử lý một yêu cầu được tạo đặc biệt. Khả năng khai thác sự cố đã được ghi nhận trong các phiên bản từ 4.87 đến 4.91 hoặc khi xây dựng với tùy chọn EXPERIMENTAL_EVENT.

Trong cấu hình mặc định, cuộc tấn công có thể được thực hiện mà không có sự phức tạp không cần thiết đối với người dùng cục bộ vì ACL "xác minh = người nhận" được áp dụng, thực hiện kiểm tra bổ sung cho các địa chỉ bên ngoài. Một cuộc tấn công từ xa có thể xảy ra khi cài đặt bị thay đổi, chẳng hạn như đóng vai trò là MX phụ cho một miền khác, xóa ACL "xác minh=người nhận" hoặc một số thay đổi nhất định đối với local_part_suffix). Một cuộc tấn công từ xa cũng có thể xảy ra nếu kẻ tấn công có thể duy trì kết nối với máy chủ trong 7 ngày (ví dụ: gửi một byte mỗi phút để bỏ qua thời gian chờ). Đồng thời, có thể có các vectơ tấn công đơn giản hơn để khai thác vấn đề từ xa.

Lỗ hổng này xảy ra do việc xác minh không chính xác địa chỉ người nhận trong hàm Deliver_message() được xác định trong tệp /src/deliver.c. Bằng cách thao túng định dạng địa chỉ, kẻ tấn công có thể thay thế dữ liệu của mình thành các đối số của lệnh được gọi thông qua hàm execv() với quyền root. Hoạt động không yêu cầu sử dụng các kỹ thuật phức tạp dùng để tràn bộ đệm hoặc hỏng bộ nhớ; chỉ cần thay thế ký tự đơn giản là đủ.

Vấn đề liên quan đến việc sử dụng cấu trúc để chuyển đổi địa chỉ:

Deliver_localpart=expand_string(
string_sprintf("${local_part:%s}", new->address));
Deliver_domain=expand_string(
string_sprintf("${domain:%s}", new->address));

Hàm Expand_string() là một trình kết hợp quá phức tạp, bao gồm cả việc nhận dạng lệnh “${run{command đối số}”, dẫn đến việc khởi chạy một trình xử lý bên ngoài. Do đó, để tấn công trong phiên SMTP, người dùng cục bộ chỉ cần gửi lệnh như 'RCPT TO “username+${run{...}}@localhost”', trong đó localhost là một trong các máy chủ từ danh sách local_domains, và tên người dùng là tên của người dùng cục bộ hiện có.

Nếu máy chủ hoạt động như một dịch vụ chuyển tiếp thư thì chỉ cần gửi lệnh 'RCPT TO "${run{...}}@relaydomain.com"' từ xa là đủ, trong đó Relaydomain.com là một trong các máy chủ được liệt kê trong Relay_to_domains phần cài đặt. Vì Exim không mặc định bỏ chế độ đặc quyền (deliver_drop_privilege = false), nên các lệnh được truyền qua "${run{...}}" sẽ được thực thi dưới quyền root.

Điều đáng chú ý là lỗ hổng này loại bỏ trong bản phát hành 4.92 được phát hành vào tháng XNUMX mà không nhấn mạnh rằng bản sửa lỗi có thể dẫn đến các vấn đề bảo mật. Không có lý do gì để tin rằng các nhà phát triển Exim đã cố tình che giấu lỗ hổng vì sự cố đã được khắc phục trong quá trình thực hiện. sửa lỗi lỗi xảy ra khi truyền địa chỉ không chính xác và lỗ hổng này đã được Qualys xác định trong quá trình kiểm tra các thay đổi trong Exim.

Bản sửa lỗi cho các phiên bản trước vẫn tiếp tục được sử dụng trong các bản phân phối hiện chỉ có sẵn dưới dạng . Các bản phát hành khắc phục cho các chi nhánh trước đây để khắc phục sự cố được lên lịch vào ngày 11 tháng XNUMX. Cập nhật gói đã sẵn sàng cho Debian, Ubuntu, openSUSE. Arch Linux и Fedora Họ cung cấp phiên bản 4.92, trong đó vấn đề không xuất hiện. Vấn đề về RHEL và CentOS không nhạy cảm, vì Exim không có trong kho gói thông thường của họ.

Nguồn: opennet.ru

Thêm một lời nhận xét