Đã vá Exim - vá lại. Thực thi lệnh từ xa mới trong Exim 4.92 trong một yêu cầu

Đã vá Exim - vá lại. Thực thi lệnh từ xa mới trong Exim 4.92 trong một yêu cầu

Gần đây hơn, vào đầu mùa hè, đã có nhiều lời kêu gọi cập nhật Exim lên phiên bản 4.92 do lỗ hổng CVE-2019-10149 (Cập nhật khẩn cấp Exim lên 4.92 - có sự lây nhiễm đang hoạt động / Tin tức CNTT Sudo Null). Và gần đây hóa ra phần mềm độc hại Sustes đã quyết định lợi dụng lỗ hổng này.

Giờ đây tất cả những ai cập nhật khẩn cấp đều có thể “vui mừng” trở lại: vào ngày 21 tháng 2019 năm XNUMX, nhà nghiên cứu Zerons đã phát hiện ra một lỗ hổng nghiêm trọng trong Exim Mail Transfer Agent (MTA) khi sử dụng TLS cho các phiên bản từ 4.80 4.92.1 để bao gồm, cho phép từ xa thực thi mã với quyền đặc quyền (CVE-2019-15846).

Tính dễ bị tổn thương

Lỗ hổng xuất hiện khi sử dụng cả thư viện GnuTLS và OpenSSL khi thiết lập kết nối TLS an toàn.

Theo nhà phát triển Heiko Schlittermann, tệp cấu hình trong Exim không sử dụng TLS theo mặc định, nhưng nhiều bản phân phối tạo ra các chứng chỉ cần thiết trong quá trình cài đặt và cho phép kết nối an toàn. Ngoài ra các phiên bản Exim mới hơn còn có tùy chọn cài đặt tls_advertise_hosts=* và tạo ra các chứng chỉ cần thiết.

phụ thuộc vào cấu hình. Hầu hết các bản phân phối đều bật tính năng này theo mặc định, nhưng Exim cần có chứng chỉ+khóa để hoạt động như một máy chủ TLS. Có lẽ Distro tạo Chứng chỉ trong quá trình thiết lập. Các Exim mới hơn có tùy chọn tls_advertise_hosts được đặt mặc định là "*" và tạo chứng chỉ tự ký, nếu không có chứng chỉ nào được cung cấp.

Bản thân lỗ hổng này nằm ở việc xử lý không chính xác SNI (Chỉ báo tên máy chủ, một công nghệ được giới thiệu vào năm 2003 trong RFC 3546 để khách hàng yêu cầu chứng chỉ chính xác cho tên miền, Phân phối tiêu chuẩn TLS SNI / Blog của Nhóm WEBO / Tin tức CNTT Sudo Null) trong quá trình bắt tay TLS. Kẻ tấn công chỉ cần gửi SNI kết thúc bằng dấu gạch chéo ngược ("") và ký tự null ("").

Các nhà nghiên cứu từ Qualys đã phát hiện ra một lỗi trong hàm string_printing(tls_in.sni), liên quan đến việc thoát sai dấu “”. Kết quả là dấu gạch chéo ngược được ghi không thoát vào tệp tiêu đề bộ đệm in. Sau đó, tệp này được đọc với quyền đặc quyền bằng hàm spool_read_header(), dẫn đến tràn vùng nhớ heap.

Điều đáng chú ý là hiện tại, các nhà phát triển Exim đã tạo ra một PoC chứa lỗ hổng bằng cách thực thi các lệnh trên một máy chủ có lỗ hổng từ xa, nhưng nó vẫn chưa được công khai. Do lỗi dễ khai thác nên việc này chỉ là vấn đề thời gian và khá ngắn.

Một nghiên cứu chi tiết hơn của Qualys có thể được tìm thấy đây.

Đã vá Exim - vá lại. Thực thi lệnh từ xa mới trong Exim 4.92 trong một yêu cầu

Sử dụng SNI trong TLS

Số lượng máy chủ công cộng có nguy cơ bị tấn công

Theo thống kê từ một nhà cung cấp hosting lớn E-Soft Inc Tính đến ngày 1 tháng 4.92, trên các máy chủ thuê, phiên bản 70 được sử dụng trên hơn XNUMX% máy chủ.

phiên bản
Số lượng máy chủ
Tỷ lệ phần trăm

4.92.1
6471
1.28%

4.92
376436
74.22%

4.91
58179
11.47%

4.9
5732
1.13%

4.89
10700
2.11%

4.87
14177
2.80%

4.84
9937
1.96%

Các phiên bản khác
25568
5.04%

Thống kê công ty E-Soft Inc

Nếu bạn sử dụng công cụ tìm kiếm Shodan, sau đó trong số 5,250,000 trong cơ sở dữ liệu máy chủ:

  • khoảng 3,500,000 sử dụng Exim 4.92 (khoảng 1,380,000 sử dụng SSL/TLS);
  • hơn 74,000 sử dụng 4.92.1 (khoảng 25,000 sử dụng SSL/TLS).

Do đó, số lượng máy chủ dễ bị tấn công tiềm ẩn của Exim được biết đến và có thể truy cập công khai là khoảng 1.5M.

Đã vá Exim - vá lại. Thực thi lệnh từ xa mới trong Exim 4.92 trong một yêu cầu

Tìm kiếm máy chủ Exim ở Shodan

sự bảo vệ

  • Tùy chọn đơn giản nhất nhưng không được khuyến nghị là không sử dụng TLS, điều này sẽ dẫn đến việc các email được chuyển tiếp rõ ràng.
  • Để tránh khai thác lỗ hổng, tốt nhất nên cập nhật lên phiên bản Exim Internet Mailer 4.92.2.
  • Nếu không thể cập nhật hoặc cài đặt phiên bản đã vá, bạn có thể đặt ACL trong cấu hình Exim cho tùy chọn acl_smtp_mail với các quy tắc sau:
    # to be prepended to your mail acl (the ACL referenced
    # by the acl_smtp_mail main config option)
    deny    condition = ${if eq{}{${substr{-1}{1}{$tls_in_sni}}}}
    deny    condition = ${if eq{}{${substr{-1}{1}{$tls_in_peerdn}}}}

Nguồn: www.habr.com