Các lỗ hổng xác thực và leo thang đặc quyền OpenBSD trong smtpd, ldapd và Radiald

Công ty Qualys tiết lộ bốn lỗ hổng trong OpenBSD, một trong số đó cho phép bạn kết nối từ xa mà không cần xác thực với một số dịch vụ mạng và ba dịch vụ còn lại tăng đặc quyền của bạn trong hệ thống. Báo cáo của Qualys ghi nhận phản hồi nhanh chóng của các nhà phát triển OpenBSD - mọi vấn đề đều được giải quyết loại bỏ в MởBSD 6.5 и MởBSD 6.6 trong vòng 40 giờ sau khi có thông báo riêng.

Lỗ hổng có thể khai thác từ xa là do lỗi gọi trình xử lý xác thực trong thư viện libc, gọi
chương trình /usr/libexec/auth/login_style truyền đối số trên dòng lệnh. Bao gồm cả khi gọi login_style bằng tham số tùy chọn “-s service”, có thể chuyển tên giao thức. Nếu bạn sử dụng ký tự "-" ở đầu tên người dùng, tên này sẽ được coi là một tùy chọn khi chạy login_style. Theo đó, nếu bạn chỉ định “-schallenge” hoặc “-schallenge:passwd” làm tên người dùng trong quá trình xác thực thì login_style sẽ coi yêu cầu đó là yêu cầu sử dụng trình xử lý S/Khóa.

Vấn đề là giao thức S/Key trong login_style chỉ được hỗ trợ chính thức nhưng thực tế bị bỏ qua với đầu ra là dấu hiệu xác thực thành công. Do đó, kẻ tấn công có thể, bằng cách đóng giả là người dùng "-thử thách", bỏ qua xác thực và giành quyền truy cập mà không cần cung cấp mật khẩu hoặc khóa. Tất cả các dịch vụ mạng sử dụng lệnh gọi libc tiêu chuẩn để xác thực đều có khả năng bị ảnh hưởng bởi sự cố. Ví dụ: khả năng bỏ qua xác thực được hỗ trợ trong smtpd (AUTH PLAIN), ldapd và Radiald.

Lỗ hổng này không xuất hiện trong sshd vì nó có lớp bảo vệ bổ sung để kiểm tra sự hiện diện của người dùng trong hệ thống. Tuy nhiên, sshd có thể được sử dụng để kiểm tra lỗ hổng của hệ thống - khi truy cập vào tên người dùng "-sresponse:passwd", kết nối bị treo do sshd đang đợi login_passwd trả về các tham số thử thách và login_passwd đang đợi các tham số bị thiếu để được gửi đi (tên "-sresponse" được coi là một tùy chọn). Kẻ tấn công cục bộ có thể cố gắng bỏ qua xác thực trong tiện ích su, nhưng việc chuyển tên "-sresponse" khiến quá trình gặp sự cố do trả về con trỏ rỗng khi thực thi hàm getpwnam_r("-schallenge", ...).

Các lỗ hổng khác:

  • CVE-2019-19520 Leo thang đặc quyền cục bộ thông qua thao tác với tiện ích xlock được cung cấp cùng với cờ sgid, thay đổi nhóm thành "auth". Trong mã xlock, việc xác định lại đường dẫn đến thư viện chỉ bị cấm khi mã định danh người dùng (setuid) bị thay đổi, điều này cho phép kẻ tấn công thay đổi biến môi trường “LIBGL_DRIVERS_PATH” và tổ chức tải thư viện dùng chung của hắn, mã này sẽ được thực thi sau khi nâng cao đặc quyền cho nhóm “auth”.
  • CVE-2019-19522 - Cho phép người dùng cục bộ là thành viên của nhóm "auth" chạy mã với quyền root khi xác thực S/Key hoặc YubiKey được bật trên hệ thống (không hoạt động theo mặc định). Việc tham gia nhóm “auth”, có thể được truy cập bằng cách khai thác lỗ hổng nêu trên trong xlock, cho phép bạn ghi tệp vào thư mục /etc/skey và /var/db/yubikey. Ví dụ: kẻ tấn công có thể thêm tệp mới /etc/skey/root để tạo khóa một lần để xác thực với tư cách là người dùng root thông qua S/Key.
  • CVE-2019-19519 - khả năng tăng giới hạn tài nguyên thông qua thao tác với tiện ích su. Khi tùy chọn "-L" được chỉ định, khiến các nỗ lực xác thực được lặp lại theo chu kỳ nếu không thành công, lớp người dùng chỉ được đặt một lần và không được đặt lại trong các lần thử tiếp theo. Kẻ tấn công có thể thực thi “su -l -L” trong lần thử đầu tiên để nhập thông tin đăng nhập của người khác bằng một lớp tài khoản khác, nhưng trong lần thử thứ hai, kẻ tấn công có thể xác thực thành công với tư cách là chính mình. Trong tình huống này, người dùng sẽ phải tuân theo các giới hạn dựa trên lớp người dùng được chỉ định trong lần thử đầu tiên (ví dụ: số lượng quy trình hoặc kích thước bộ nhớ tối đa cho một quy trình). Phương pháp này chỉ hoạt động để mượn giới hạn từ người dùng không có đặc quyền, vì người dùng root phải thuộc nhóm bánh xe).

Ngoài ra, có thể ghi nhận thực hiện trong OpenBSD, một phương pháp mới để kiểm tra tính hợp lệ của các lệnh gọi hệ thống, điều này càng làm phức tạp thêm việc khai thác các lỗ hổng. Phương thức này cho phép các lệnh gọi hệ thống chỉ được thực thi nếu chúng được truy cập từ các vùng bộ nhớ đã đăng ký trước đó. Để đánh dấu vùng nhớ đề xuất cuộc gọi hệ thống mới msyscall().

Nguồn: opennet.ru