Trong máy chủ thư Exim
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
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
Nguồn: opennet.ru