Mới đây, người ta đã thông báo rằng một lỗ hổng nghiêm trọng đã được phát hiện trong kho lưu trữ gói RubyGems.org (lỗ hổng này đã được ghi nhận trong danh mục CVE-2022-29176), cho phép , mà không cần sự cho phép thích hợp, thay thế các gói của người khác trong kho lưu trữ bằng cách thực hiện thao tác gỡ bỏ (yank) một gói hợp lệ và tải lên một tệp khác có cùng tên và số phiên bản để thay thế.
Người ta cho rằng lỗ hổng này là do một lỗi trong trình xử lý hành động "yank" , trong đó xử lý phần tên sau dấu gạch ngang như là tên nền tảng, dẫn đến việc có thể bắt đầu quá trình xóa các gói bên ngoài có phần tên trùng khớp với phần tên cho đến ký tự gạch ngang.
Cụ thể, trong mã xử lý thao tác "yank", lệnh gọi 'find_by!(full_name: "#{rubygem.name}-#{slug}")' được sử dụng để tìm kiếm các gói, trong khi tham số "slug" được truyền cho chủ sở hữu gói để xác định phiên bản cần xóa.
Chủ sở hữu của gói "rails-html" có thể đã chỉ định "sanitizer-1.2.3" thay vì phiên bản "1.2.3", điều này sẽ khiến thao tác áp dụng cho "rails-html-sanitizer-1.2.3" gói ″ từ người khác. »
Một lời khuyên bảo mật cho Rubygems.org đã được xuất bản ngày hôm qua.
Lời khuyên liên quan đến một lỗi cho phép người dùng độc hại khai thác một số viên ngọc nhất định và tải lên các tệp khác nhau có cùng tên, số phiên bản và nền tảng khác nhau.
Chúng ta hãy xem xét sâu hơn để xem điều gì đã xảy ra trong quá trình trích xuất. Như một cái cớ, chúng ta hãy tưởng tượng một tình huống trong đó chúng tôi tạo ra một viên ngọc có tên "rails-html" với mục đích có được quyền truy cập trái phép vào viên đá quý "rails-html-sanitizer" được sử dụng rộng rãi.
Theo thông tin được biết, cần phải đáp ứng ba điều kiện để khai thác thành công lỗ hổng này:
- Cuộc tấn công chỉ có thể được thực hiện trên các gói có ký tự gạch nối trong tên của chúng.
- Kẻ tấn công sẽ có thể đặt một gói đá quý với một phần của tên lên đến ký tự gạch nối. Ví dụ: nếu cuộc tấn công chống lại gói "rails-html-sanitizer", thì kẻ tấn công phải đưa gói "rails-html" của riêng chúng vào kho lưu trữ.
- Gói bị tấn công phải được tạo trong 30 ngày qua hoặc không được cập nhật trong 100 ngày.
Vấn đề này được một nhà nghiên cứu bảo mật phát hiện trong khuôn khổ chương trình thưởng của HackerOne nhằm tìm kiếm các lỗ hổng bảo mật trong các dự án mã nguồn mở nổi tiếng.
Sự cố đã được khắc phục trên RubyGems.org vào ngày 5 tháng 5 , và theo các nhà phát triển, họ vẫn chưa tìm thấy bất kỳ dấu vết nào về việc khai thác lỗ hổng này trong nhật ký trong suốt 18 tháng qua. Tuy nhiên, cho đến nay chỉ mới tiến hành một cuộc kiểm tra sơ bộ, và một cuộc kiểm tra chuyên sâu hơn đang được lên kế hoạch cho tương lai.
Hiện tại, chúng tôi cho rằng lỗ hổng này vẫn chưa được khai thác.
RubyGems.org gửi email đến tất cả chủ sở hữu đá quý khi phiên bản đá quý được phát hành hoặc gỡ bỏ. Chúng tôi chưa nhận được bất kỳ email hỗ trợ nào từ các chủ sở hữu đá quý cho biết rằng đá quý của họ đã được khai thác mà không được phép.
Một cuộc kiểm tra các thay đổi về đá quý trong 18 tháng qua không tìm thấy ví dụ nào về việc sử dụng lỗ hổng này một cách độc hại. Việc kiểm tra thêm để biết bất kỳ trường hợp nào có thể sử dụng khai thác này không tìm thấy trường hợp nào về việc khai thác này được sử dụng để chiếm lấy một viên ngọc mà không có sự cho phép trong lịch sử của RubyGems. Chúng tôi không thể đảm bảo rằng nó sẽ không bao giờ xảy ra, nhưng có vẻ như nó không có khả năng xảy ra.
Để xác minh các dự án của bạn, bạn nên phân tích lịch sử hoạt động trong tệp Gemfile.lock Hoạt động độc hại được thể hiện khi có các thay đổi có cùng tên và phiên bản hoặc thay đổi nền tảng (ví dụ: khi gói xxx-1.2.3 . 1.2.3 được cập nhật thành xxx-XNUMX-xxx).
Để giải quyết vấn nạn giả mạo các gói ẩn trong hệ thống tích hợp liên tục hoặc khi xuất bản dự án, các nhà phát triển nên sử dụng Bundler với tùy chọn "--frozen" hoặc "--deployment" để xác nhận các phụ thuộc.
Cuối cùng, nếu bạn muốn tìm hiểu thêm về vấn đề này , bạn có thể xem chi tiết tại liên kết sau.