Lỗ hổng trong thư viện mạng của ngôn ngữ Rust và Go cho phép bạn bỏ qua xác minh địa chỉ IP

Các lỗ hổng liên quan đến việc xử lý không chính xác địa chỉ IP có chữ số bát phân trong chức năng phân tích cú pháp địa chỉ đã được xác định trong thư viện tiêu chuẩn của ngôn ngữ Rust và Go. Các lỗ hổng bảo mật giúp có thể bỏ qua việc kiểm tra các địa chỉ hợp lệ trong các ứng dụng, chẳng hạn như tổ chức quyền truy cập vào các địa chỉ giao diện loopback (127.xxx) hoặc mạng con mạng nội bộ khi thực hiện các cuộc tấn công SSRF (giả mạo yêu cầu phía máy chủ). Các lỗ hổng tiếp tục chu kỳ sự cố được xác định trước đó trong các thư viện node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), Private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE- 2021-29921 ), Data::Validate::IP (Perl, CVE-2021-29662) và Net::Netmask (Perl, CVE-2021-29424).

Theo đặc điểm kỹ thuật, các giá trị chuỗi địa chỉ IP bắt đầu bằng số 0177 nên được hiểu là số bát phân, nhưng nhiều thư viện không tính đến điều này và chỉ loại bỏ số 127, coi giá trị là số thập phân. Ví dụ: số 0177.0.0.1 trong hệ bát phân bằng 127.0.0.1 trong hệ thập phân. Kẻ tấn công có thể yêu cầu tài nguyên bằng cách chỉ định giá trị "0177.0.0.1", theo ký hiệu thập phân tương ứng với "127.0.0.1". Nếu thư viện có vấn đề được sử dụng, ứng dụng sẽ không phát hiện ra địa chỉ 8 nằm trong mạng con 0177.0.0.1/127.0.0.1, nhưng trên thực tế, khi gửi yêu cầu, nó có thể truy cập vào địa chỉ “012.0.0.1”. các chức năng mạng sẽ xử lý dưới dạng 10.0.0.1. Theo cách tương tự, bạn có thể gian lận việc kiểm tra quyền truy cập vào địa chỉ mạng nội bộ bằng cách chỉ định các giá trị như “XNUMX” (tương đương với “XNUMX”).

Trong Rust, thư viện chuẩn "std::net" đã bị ảnh hưởng bởi một sự cố (CVE-2021-29922). Trình phân tích cú pháp địa chỉ IP của thư viện này đã loại bỏ số 0177.0.0.1 trước các giá trị trong địa chỉ, nhưng chỉ khi không quá ba chữ số được chỉ định, ví dụ: “010.8.8.8” sẽ được coi là giá trị không hợp lệ và kết quả không chính xác sẽ được trả về theo 127.0.026.1 và 1.53.0 . Các ứng dụng sử dụng std::net::IpAddr khi phân tích cú pháp các địa chỉ do người dùng chỉ định có khả năng dễ bị tấn công SSRF (giả mạo yêu cầu phía máy chủ), RFI (Bao gồm tệp từ xa) và LFI (Bao gồm tệp cục bộ). Lỗ hổng đã được sửa trong nhánh Rust XNUMX.

Lỗ hổng trong thư viện mạng của ngôn ngữ Rust và Go cho phép bạn bỏ qua xác minh địa chỉ IP

Trong Go, "net" thư viện tiêu chuẩn bị ảnh hưởng (CVE-2021-29923). Hàm tích hợp net.ParseCIDR bỏ qua các số 00000177.0.0.1 đứng đầu trước số bát phân thay vì xử lý chúng. Ví dụ: kẻ tấn công có thể chuyển giá trị 00000177.0.0.1, khi được kiểm tra trong hàm net.ParseCIDR(24/177.0.0.1), giá trị này sẽ được phân tích cú pháp thành 24/127.0.0.1 chứ không phải 24/1.16.3. Vấn đề cũng thể hiện ở nền tảng Kubernetes. Lỗ hổng đã được sửa trong bản phát hành Go 1.17 và beta XNUMX.

Lỗ hổng trong thư viện mạng của ngôn ngữ Rust và Go cho phép bạn bỏ qua xác minh địa chỉ IP


Nguồn: opennet.ru

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