Lỗ hổng trong thư viện chuẩn Rust

Một lỗ hổng (CVE-2022-21658) đã được xác định trong thư viện chuẩn Rust do tình trạng tương tranh trong hàm std::fs::remove_dir_all(). Nếu chức năng này được sử dụng để xóa các tệp tạm thời trong một ứng dụng đặc quyền, kẻ tấn công có thể xóa các tệp và thư mục hệ thống tùy ý mà kẻ tấn công thường không có quyền truy cập để xóa.

Lỗ hổng này xảy ra do thực hiện không chính xác việc kiểm tra các liên kết tượng trưng trước khi xóa đệ quy các thư mục. Thay vì ngăn chặn việc theo dõi các liên kết tượng trưng, ​​trước tiên, hãy kiểm tra xem tệp có phải là liên kết tượng trưng hay không. Nếu một liên kết được xác định thì nó sẽ bị xóa dưới dạng một tệp và nếu nó là một thư mục thì thao tác xóa nội dung đệ quy sẽ được gọi. Vấn đề là có một chút chậm trễ giữa quá trình kiểm tra và bắt đầu thao tác xóa.

Tại thời điểm việc kiểm tra đã được thực hiện nhưng hoạt động liệt kê các thư mục để xóa vẫn chưa bắt đầu, kẻ tấn công có thể thay thế thư mục đó bằng các tệp tạm thời bằng một liên kết tượng trưng. Nếu nó truy cập đúng lúc, hàm Remove_dir_all() sẽ coi liên kết tượng trưng là một thư mục và bắt đầu xóa nội dung mà liên kết trỏ đến. Mặc dù thực tế là sự thành công của cuộc tấn công phụ thuộc vào độ chính xác của thời điểm đã chọn để thay thế thư mục và đánh đúng thời điểm trong lần đầu tiên là khó xảy ra, nhưng trong quá trình thử nghiệm, các nhà nghiên cứu đã có thể đạt được một cuộc tấn công thành công lặp lại sau khi thực hiện khai thác bên trong. một vài giây.

Tất cả các phiên bản Rust từ 1.0.0 đến 1.58.0 đều bị ảnh hưởng. Sự cố hiện đã được khắc phục ở dạng bản vá (bản sửa lỗi sẽ được đưa vào bản phát hành 1.58.1, dự kiến ​​trong vòng vài giờ). Bạn có thể theo dõi việc loại bỏ lỗ hổng bảo mật trong các bản phân phối trên các trang này: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Tất cả người dùng các chương trình Rust đang chạy với đặc quyền nâng cao và sử dụng chức năng Remove_dir_all nên cập nhật khẩn cấp Rust lên phiên bản 1.58.1. Điều thú vị là bản vá được phát hành không giải quyết được vấn đề trên tất cả các hệ thống; ví dụ: trong REDOX OS và các phiên bản macOS trước 10.10 (Yosemite), lỗ hổng không bị chặn do không có cờ O_NOFOLLOW, cờ này vô hiệu hóa các ký hiệu sau liên kết.

Nguồn: opennet.ru

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