Kiểm toán kho lưu trữ gói trung tâm của hệ sinh thái Ruby

Kiểm toán kho lưu trữ gói trung tâm của hệ sinh thái Ruby


Ruby Central đã thuê Trail of Bits để thực hiện đánh giá bảo mật và phân tích cạnh tranh cho RubyGems.org, hệ thống quản lý gói chính thức cho các ứng dụng Ruby. Với hơn 184 tỷ lượt tải xuống cho đến nay, RubyGems.org là cơ sở hạ tầng quan trọng cho hệ sinh thái ngôn ngữ Ruby.

Đánh giá của chúng tôi, được thực hiện trong năm tuần kỹ sư vào tháng 8 và tháng 9 năm 2024, đã phát hiện ra ba mươi ba vấn đề, bao gồm một phát hiện mức độ nghiêm trọng cao liên quan đến mã hóa StartTLS tùy chọn trong trình gửi thư SMTP và một phát hiện rủi ro trung bình đáng chú ý liên quan đến việc thiếu phê duyệt nhiều bên cho việc triển khai sản xuất. Chúng tôi cũng tìm thấy các mẫu vấn đề không thể khai thác ngay lập tức, nhưng có thể gộp lại thành các lỗ hổng nghiêm trọng hơn nếu không được giải quyết; chúng bao gồm các quyền IAM quá rộng, phân tách vai trò không đầy đủ và việc phơi bày công khai các dịch vụ không cần thiết. Các đề xuất của chúng tôi bao gồm các bản sửa lỗi và giảm thiểu cho các vấn đề đã xác định và các bước để triển khai các công cụ kiểm tra bảo mật như Semgrep, Burp Suite Professional và Ruzzy.

Blog này khám phá quá trình kiểm tra, các phát hiện và những điểm rút ra chính của chúng tôi, những điều này tác động đến mọi nhà phát triển Ruby dựa vào RubyGems.org cho các phần phụ thuộc của họ – từ các nhà phát triển độc lập kéo các gem cho các dự án phụ đến các doanh nghiệp quản lý các ứng dụng quan trọng phục vụ hàng triệu người dùng.

Tại sao lại là RubyGems?

RubyGems.org là kho lưu trữ gói trung tâm cho hệ sinh thái Ruby, đóng vai trò thiết yếu tương tự như npm đối với JavaScript hoặc PyPI đối với Python. Là nền tảng phân phối chính thức cho các thư viện Ruby, bảo mật của nó ảnh hưởng trực tiếp đến hàng triệu ứng dụng, từ các dự án mã nguồn mở nhỏ đến các hệ thống doanh nghiệp.

Kiến trúc của nền tảng tuân theo các thông lệ tốt nhất trong ngành: một ứng dụng web ba tầng được xây dựng trên các framework và thư viện tiêu chuẩn, với sự tách biệt rõ ràng giữa giao diện người dùng, phần phụ trợ và các lớp cơ sở dữ liệu. Nền tảng vững chắc này cho phép chúng tôi tập trung đánh giá bảo mật vào các khu vực có rủi ro cao hơn như xuất bản đáng tin cậy và cấu hình cơ sở hạ tầng.

Phạm vi và kết quả kiểm toán

Ba kỹ sư đã dành năm tuần kỹ sư để xem xét mã trong kho lưu trữ `rubygems.org` và `rubygems-terraform`. Đánh giá của chúng tôi bao gồm các lỗ hổng ứng dụng web, cấu hình cơ sở hạ tầng, cơ chế xác thực và kiểm soát truy cập.

Trong phần kiểm toán, chúng tôi tập trung vào việc trả lời một số câu hỏi, bao gồm nhưng không giới hạn ở:

  • RubyGems có dễ bị tấn công bởi các lỗ hổng web phổ biến như tấn công XSS (cross-site scripting), CSRF (cross-site request forgery), SQL injection (SQLi) và SSRF (server-side request forgery) không?
  • Kẻ tấn công có thể bỏ qua xác thực trong giao diện web RubyGems không?
  • Người dùng chưa được xác thực có thể thực hiện các thao tác trái phép trong giao diện web RubyGems không?
  • Kiểm soát truy cập có được thực thi đúng cách không?
  • API nội bộ và đặc quyền có được tăng cường chống lại truy cập bên ngoài và trái phép không?
  • RubyGems có giải mã dữ liệu không tin cậy một cách an toàn không?
  • Bí mật có được quản lý và lưu trữ an toàn không?
  • Các dịch vụ AWS có được cấu hình an toàn không?

Trong số 33 vấn đề bảo mật mà chúng tôi xác định được, có một lỗ hổng nghiêm trọng cao trong hệ thống email của RubyGems có thể cho phép chặn các email nhạy cảm tiềm ẩn. RubyGems.org sử dụng Rails’ ActionMailer với SendGrid SMTP để gửi email. Hiện tại, cấu hình SMTP trong `config/initializers/sendgrid.rb uses enable_starttls_auto: true`, cố gắng thiết lập giao tiếp được mã hóa thông qua StartTLS nhưng quay lại truyền không được mã hóa nếu kết nối an toàn không thành công. Điều này tạo ra một lỗ hổng bảo mật, trong đó kẻ tấn công định vị giữa máy chủ ứng dụng RubyGems và máy chủ SMTP có thể thực hiện tấn công giảm cấp bằng cách loại bỏ các lệnh StartTLS trong quá trình bắt tay ban đầu hoặc trả về các lỗi không được hỗ trợ, buộc giao tiếp quay lại kênh không được mã hóa.

Khắc phục được đề xuất cho vấn đề này là thay thế `enable_starttls_auto` bằng `enable_starttls`, thực thi mã hóa TLS nghiêm ngặt mà không có tùy chọn dự phòng – nếu không thể truyền an toàn, email sẽ không được gửi. Để bảo mật lâu dài, chúng tôi cũng khuyên rằng quy tắc `action-mailer-insecure-tls` Semgrep nên được triển khai trong các hệ thống CI để nắm bắt các vấn đề tương tự.

Chúng tôi cũng phát hiện ra ba vấn đề thú vị trên toàn bộ cơ sở mã:

  • Thư viện RubyGems có chức năng cho phép khai thác giải tuần tự hóa bằng cách lưu trữ dữ liệu Marshaled cùng với các tệp gem. Vấn đề này không ảnh hưởng đến dịch vụ RubyGems.org (do đó là thông tin), nhưng nó cung cấp cho kẻ tấn công một con đường để khai thác người dùng Ruby.
  • Các vấn đề phổ biến nhất bắt nguồn từ việc trộn cơ sở hạ tầng dưới dạng mã (IaC) với các thay đổi cơ sở hạ tầng thủ công. Bốn phát hiện (TOB-RGM-16, TOB-RGM-20, TOB-RGM-21, TOB-RGM-29) tiết lộ cách tiếp cận kết hợp này tạo ra các khoảng trống bảo mật. Mặc dù Ruby Central đã di chuyển sang IaC đầy đủ khi quá trình kiểm tra của chúng tôi bắt đầu, nhưng những phát hiện này làm nổi bật lý do tại sao các tổ chức nên cam kết hoàn toàn với quản lý cơ sở hạ tầng tự động.
  • Chúng tôi cũng xác định được một số lỗ hổng SSRF. Mặc dù những vấn đề này có mức độ nghiêm trọng thấp, nhưng chúng vẫn đáng lo ngại vì chúng dễ bị bỏ qua trong quá trình phát triển và khó khắc phục đúng cách. Sự phức tạp đến từ việc cần cân bằng kiểm soát bảo mật với chức năng hợp pháp – chỉ chặn các yêu cầu là không khả thi, nhưng cho phép chúng yêu cầu xác thực cẩn thận rất dễ bị sai.

Các đề xuất của chúng tôi nhấn mạnh một cách tiếp cận hai tầng: các bản sửa lỗi ngắn hạn tập trung vào việc tăng cường bảo mật ngay lập tức (như hạn chế quyền, bật yêu cầu MFA và xóa các tài nguyên không sử dụng) và các cải tiến chiến lược dài hạn về các phương pháp bảo mật. Các khuyến nghị dài hạn kêu gọi tự động hóa, đặc biệt là xung quanh quản lý tài nguyên thông qua Terraform, đánh giá bảo mật thường xuyên và tích hợp các công cụ kiểm tra bảo mật.

Đánh giá RubyGems so với các trình quản lý gói khác

Phân tích cạnh tranh của chúng tôi tập trung vào việc đánh giá RubyGems bằng cách so sánh nó chủ yếu với Tài liệu Nguyên tắc về Bảo mật Kho lưu trữ Gói với một sự nhấn mạnh nhỏ vào việc so sánh RubyGems với bốn trình quản lý gói khác (PyPI, npm, Go Packages, Cargo). Chúng tôi đã đánh giá các cơ chế xác thực và ủy quyền, các công cụ dòng lệnh và các khả năng chung của RubyGems. Mặc dù RubyGems thể hiện chức năng tương đương với các trình quản lý gói khác, nhưng chúng tôi đã xác định được 19 lĩnh vực cụ thể có thể được cải thiện.

Những cải tiến này sẽ tăng cường cơ sở hạ tầng Xuất bản đáng tin cậy của RubyGems và mở rộng các nền tảng được hỗ trợ, giúp các nhà phát triển xuất bản và sử dụng các gói Ruby một cách an toàn và dễ dàng hơn.

Kiểm tra tự động: Phân tích tĩnh, kiểm tra động và fuzzing

Phương pháp kiểm tra bảo mật nhiều lớp của chúng tôi cho Ruby Central kết hợp các công cụ tự động với phân tích thủ công. Chúng tôi đã sử dụng Semgrep để thực hiện phân tích tĩnh, cho phép chúng tôi phát hiện các vấn đề như cấu hình cookie không an toàn, các mẫu giải tuần tự hóa không an toàn và các cấu hình sai cơ sở hạ tầng AWS tiềm ẩn trước khi chúng đến sản xuất.

Chúng tôi đã tùy chỉnh các quy tắc Semgrep dành riêng cho nhu cầu của Ruby Central và cung cấp chúng trong báo cáo của chúng tôi, để chúng có thể được tích hợp vào quy trình CI/CD để kiểm tra bảo mật liên tục. Bạn có thể đọc thêm về bộ quy tắc Semgrep tùy chỉnh không ngừng mở rộng của chúng tôi trong bài đăng trên blog gần đây của chúng tôi.

Đối với phân tích động, chúng tôi đã triển khai Burp Suite Professional để chủ động kiểm tra giao diện web của RubyGems, tập trung vào các vấn đề ủy quyền, lỗ hổng SSRF và bảo mật điểm cuối API. Các tiện ích mở rộng chính như Turbo Intruder đã giúp xác định các điều kiện chủng tộc tiềm ẩn, trong khi Active Scan++ tìm thấy các vấn đề sâu hơn như lỗ hổng chèn mã mù.

Đối với các mối quan tâm bảo mật cấp thấp hơn, chúng tôi đã sử dụng fuzzing có hướng dẫn vùng phủ sóng của mình, Ruzzy, để kiểm tra các thành phần quan trọng xử lý đầu vào không tin cậy. Chúng tôi đặc biệt tập trung vào thư viện CBOR được sử dụng trong chức năng WebAuthn, nơi các lỗi hỏng bộ nhớ có thể đặc biệt nguy hiểm.

Kho vũ khí thử nghiệm toàn diện này hiện cung cấp cho nhóm của Ruby Central các công cụ và kiến thức để:

  1. Phát hiện các vấn đề bảo mật trong quá trình phát triển bằng các kiểm tra tự động
  2. Liên tục theo dõi các lỗ hổng mới
  3. Kiểm tra các thành phần quan trọng xử lý đầu vào của người dùng
  4. Xây dựng thử nghiệm bảo mật vào quy trình phát triển của họ
  5. Mở rộng quy mô thử nghiệm bảo mật của họ khi cơ sở mã và cơ sở hạ tầng liên quan phát triển

Bảo mật các gói Ruby

Trong quá trình đánh giá này, chúng tôi đã xem xét cách một số phương pháp bảo mật được đề xuất, chẳng hạn như yêu cầu phê duyệt kép đối với việc triển khai sản xuất, không phải lúc nào cũng áp dụng được do các yếu tố như quy mô của nhóm phát triển. Vì điều này, chúng tôi đã đưa ra các giải pháp thay thế (như cho phép truy cập “break-glass” vào tài nguyên sản xuất) trong khi lưu ý những hạn chế của chúng, giúp nhóm Ruby Central tìm ra các giải pháp khả thi để tăng cường trình quản lý gói của họ. Chúng tôi hy vọng công việc của chúng tôi sẽ giúp bảo vệ hàng triệu nhà phát triển và công ty dựa vào các gói Ruby cho các ứng dụng của họ. Chúng tôi mong muốn được làm việc lại với nhóm Ruby Central.


Chia sẻ với

Share on facebook
Share on twitter
Share on linkedin
Share on pinterest

Bài viết liên quan

Trong những tuần cuối cùng của một quý kinh doanh, có một điều kỳ lạ thường xảy ra. Dù các …

Các tổ chức đang ngày càng chú trọng việc tăng cường khả năng phòng thủ trước các mối đe dọa …

Sendmarc vừa công bố Rob Bowker sẽ đảm nhận vị trí lãnh đạo khu vực Bắc Mỹ, mở ra một …

6 Bí quyết vàng để bảo vệ an ninh vật lý theo chuẩn CMMC Chữ C đầu tiên trong CMMC là …