Thông qua một phân tích bảo mật toàn diện được thực hiện bởi OPSWAT Trong Red Team, các nhà nghiên cứu bảo mật Thai Do và Minh Pham đã xác định được nhiều lỗ hổng ảnh hưởng đến nền tảng Rack Ruby, cụ thể là CVE-2025-25184 , CVE-2025-27111 và CVE-2025-27610 .
Bài viết này cung cấp tổng quan chi tiết về các lỗ hổng này, đặc biệt tập trung vào CVE-2025-27610. Bài viết này xem xét nguyên nhân gốc rễ, đánh giá các tác động tiềm ẩn và phác thảo các chiến lược giảm thiểu hiệu quả để bảo mật các ứng dụng dựa trên khuôn khổ Rack.
Tổng quan về Rack
Rack là một giao diện mô-đun kết nối các máy chủ web với các ứng dụng web dựa trên Ruby. Nó chuẩn hóa tương tác giữa các thành phần này bằng cách gói các yêu cầu và phản hồi HTTP thành một lệnh gọi phương thức duy nhất, đơn giản hóa quy trình phát triển và thúc đẩy khả năng tương thích trên nhiều khuôn khổ và máy chủ khác nhau.
Rack được sử dụng bởi nhiều khung và thư viện web Ruby, chẳng hạn như Ruby on Rails và Sinatra. Nó có sẵn dưới dạng Ruby Gem. Việc áp dụng Rack rộng rãi trên toàn cầu, với hơn một tỷ lượt tải xuống trên toàn cầu, làm nổi bật vai trò không thể thiếu của nó trong hệ sinh thái phát triển Ruby. Các thành phần phần mềm trung gian như Rack::Static và Rack::Sendfile nâng cao hiệu quả bằng cách xử lý việc phân phối nội dung tĩnh và tối ưu hóa việc truyền tệp. Do sự tích hợp rộng rãi này, các lỗ hổng được phát hiện trong Rack gây ra những tác động đáng kể đến bảo mật, có khả năng ảnh hưởng đến nhiều ứng dụng và hệ thống trên toàn thế giới.
Phát hiện lỗ hổng bảo mật trong Rack
Trong quá trình nghiên cứu bảo mật gần đây được thực hiện trên nền tảng phần mềm trung gian Rack, OPSWAT Các nhà nghiên cứu Thai Do và Minh Pham đã xác định một số lỗ hổng gây ra rủi ro bảo mật đáng kể cho các ứng dụng web dựa trên Ruby:
- CVE-2025-25184: Thai Do phát hiện ra lỗ hổng cho phép kẻ tấn công thực hiện chèn nhật ký thông qua các ký tự CRLF (Carriage Return Line Feed), có khả năng thao túng các mục nhật ký.
- CVE-2025-27111: Minh Pham đã phát hiện ra một lỗ hổng bảo mật cho phép kẻ tấn công chèn và thao túng nội dung nhật ký thông qua các giá trị tiêu đề độc hại.
- CVE-2025-27610: Minh Pham cũng xác định lỗ hổng Path Traversal, có thể cho phép kẻ tấn công truy cập trái phép vào các tệp nằm ngoài thư mục tệp tĩnh được chỉ định, gây ra mối đe dọa bảo mật đáng kể.
Trong số các lỗ hổng này, CVE-2025-27610 đặc biệt nghiêm trọng vì nó có thể cho phép kẻ tấn công chưa xác thực lấy thông tin nhạy cảm, bao gồm tệp cấu hình, thông tin xác thực và dữ liệu bí mật, do đó dẫn đến vi phạm dữ liệu. Lỗ hổng này đã được chỉ định điểm CVSS là 7,5, xếp loại là rủi ro nghiêm trọng cao.
Lỗ hổng bao gồm tệp cục bộ và Rack::Static
Hiểu về Rack::Static
Rack::Static là một phần mềm trung gian thiết yếu trong các ứng dụng Rack được sử dụng chủ yếu để phục vụ các tệp tĩnh như JavaScript, CSS và hình ảnh một cách hiệu quả. Bằng cách tận dụng Rack::Static, các nhà phát triển có thể tích hợp liền mạch việc phục vụ nội dung tĩnh vào các ứng dụng Ruby mà không cần phải dựa vào cấu hình máy chủ web bổ sung.
Khi cấu hình Rack::Static, có hai tùy chọn thiết yếu nổi bật - :urls và :root . Hiểu và sử dụng đúng các tùy chọn này giúp đơn giản hóa và hợp lý hóa đáng kể quy trình phục vụ tệp tĩnh.
1. Tùy chọn :urls
Tùy chọn :urls chỉ định đường dẫn URL nào mà ứng dụng Rack sẽ xử lý dưới dạng tài sản tĩnh. Nó được cung cấp dưới dạng một mảng chuỗi, mỗi chuỗi đại diện cho một tiền tố đường dẫn kích hoạt xử lý tệp tĩnh.
Chẳng hạn:
Trong cấu hình này, các yêu cầu đến /images , /css hoặc /js được chặn và xử lý bởi Rack::Static . Bất kỳ tệp nào khớp với các đường dẫn này sẽ được phục vụ trực tiếp từ hệ thống tệp.
2. Tùy chọn :root
Tùy chọn :root xác định thư mục cơ sở mà các tệp tĩnh sẽ được phục vụ. Thư mục này liên quan đến thư mục làm việc hiện tại của ứng dụng Rack của bạn.
Với ví dụ trước:
Khi có yêu cầu được gửi tới /assets/logo.png , Rack::Static sẽ cố gắng phục vụ tệp nằm tại public/assets/logo.png .
Ví dụ thực tế
Việc triển khai hiệu quả Rack::Static thông qua các tùy chọn :urls và :root mang lại phương pháp có tổ chức và hiệu suất cao để phục vụ nội dung tĩnh trong các ứng dụng web Ruby:
Trong trường hợp này, các yêu cầu đến /assets/* và /favicon.ico sẽ tự động được xử lý bởi Rack::Static. Tất cả các tệp tương ứng phải nằm trong thư mục public/assets và public/favicon.ico.
Chi tiết kỹ thuật CVE-2025-27610
Trong quá trình phân tích bảo mật mở rộng của Rack::Static , Minh Pham đã phát hiện ra một lỗ hổng đáng kể liên quan đến việc xử lý không đúng tùy chọn :root. Cụ thể, khi tham số :root không được định nghĩa rõ ràng, Rack sẽ mặc định giá trị này cho thư mục làm việc hiện tại bằng cách gán cho nó giá trị Dir.pwd, ngầm định chỉ định nó là thư mục gốc web cho ứng dụng Rack.
Điều quan trọng là Rack::Static nối trực tiếp các đường dẫn URL đến với thư mục :root được chỉ định mà không có đủ xác thực hoặc vệ sinh. Do đó, nếu tùy chọn :root không được xác định hoặc cấu hình sai so với tùy chọn :urls, kẻ tấn công chưa được xác thực có thể khai thác lỗ hổng này thông qua các kỹ thuật duyệt đường dẫn để truy cập các tệp nhạy cảm bên ngoài thư mục web dự định.
Phần sau đây cung cấp phân tích chi tiết về quy trình xử lý yêu cầu của Rack::Static, minh họa rõ ràng cách khai thác lỗ hổng này.
Đường dẫn duyệt và lỗ hổng bao gồm tệp cục bộ trong Rack::Static
Để hiểu sâu hơn về cách phần mềm trung gian Rack::Static xử lý các yêu cầu, Minh Pham đã tiến hành phân tích kỹ lưỡng mã nguồn của Rack. Trong quá trình khởi tạo lớp Rack::Static, anh ấy nhận thấy rằng nếu tùy chọn :root không được định nghĩa rõ ràng, Rack::Static sẽ mặc định phục vụ các tệp từ thư mục làm việc hiện tại (Dir.pwd). Do đó, việc bỏ qua tùy chọn này sẽ khiến phần mềm trung gian ngầm sử dụng thư mục mà ứng dụng được thực thi.
Sau khi khởi tạo, người ta xác định rằng khi Rack::Static nhận được yêu cầu HTTP đến, phương thức call sẽ được gọi.
Sau đó, Rack::Static chuyển giao hoạt động phục vụ tệp cho Rack::Files, hoạt động này sẽ cố gắng định vị và phục vụ tệp dựa trên đường dẫn tệp được xây dựng bắt nguồn từ thư mục :root được cấu hình và PATH_INFO do người dùng cung cấp.
Đầu tiên, bằng cách gọi các phương thức can_serve(path) và overwrite_file_path(path), phần mềm trung gian sẽ kiểm tra env["PATH_INFO"] để xác định xem yêu cầu đến có khớp với bất kỳ tiền tố URL nào được cấu hình hay không (ví dụ: /static, /public).
Nếu điều kiện được đáp ứng, Rack::Static sẽ xây dựng đường dẫn tệp bằng cách kết hợp thư mục gốc được cấu hình (:root) với PATH_INFO do người dùng cung cấp. Việc xây dựng này xảy ra mà không có quá trình chuẩn hóa hoặc vệ sinh đầy đủ của đường dẫn đầu vào. Cụ thể, phần mềm trung gian trực tiếp nối PATH_INFO từ yêu cầu đến với thư mục được chỉ định bởi tùy chọn :root, dẫn đến lỗ hổng do xác thực không đủ của đường dẫn được cung cấp
Minh Pham phát hiện ra rằng do không có quá trình vệ sinh hoặc xác thực phù hợp trong quy trình làm việc này, nếu PATH_INFO do người dùng cung cấp chứa các chuỗi duyệt thư mục và tùy chọn :root không được xác định rõ ràng thì đường dẫn tệp được xây dựng có thể giải quyết đến một vị trí bên ngoài thư mục gốc dự định, có khả năng làm lộ các tệp nhạy cảm.
CVE-2025-27610 Bằng chứng về khái niệm
Để chứng minh lỗ hổng này trong Rack::Static, chúng tôi đã phát triển một ứng dụng web dựa trên Ruby sử dụng Rack phiên bản 3.1.10. Trong các trường hợp ứng dụng không xác định rõ ràng tùy chọn :root, kẻ tấn công chưa xác thực có thể khai thác lỗ hổng này để truy cập dữ liệu nhạy cảm, chẳng hạn như thông tin xác thực, tệp cấu hình hoặc tệp cơ sở dữ liệu, có khả năng dẫn đến vi phạm dữ liệu đáng kể.
Vui lòng tham khảo video sau để biết thông tin chi tiết về tác động đáng kể liên quan đến lỗ hổng này:
Giảm nhẹ và hướng dẫn
Để giảm thiểu các lỗ hổng mà chúng tôi đã thảo luận ở trên, hãy đảm bảo hệ thống của bạn được cập nhật lên phiên bản mới nhất của Rack.
MetaDefender Core sử dụng công cụ SBOM có thể phát hiện ra lỗ hổng này.
OPSWAT MetaDefender Core , được trang bị SBOM tiên tiến ( Software Khả năng của Bill of Materials), cho phép các tổ chức có cách tiếp cận chủ động trong việc giải quyết các rủi ro bảo mật. Bằng cách quét các ứng dụng phần mềm và các phụ thuộc của chúng, MetaDefender Core xác định các lỗ hổng đã biết, chẳng hạn như CVE-2025-27610, CVE-2025-27111 và CVE-2025-25184, trong các thành phần được liệt kê. Điều này trao quyền cho các nhóm phát triển và bảo mật ưu tiên các nỗ lực vá lỗi, giảm thiểu các rủi ro bảo mật tiềm ẩn trước khi chúng có thể bị các tác nhân độc hại khai thác.
Dưới đây là ảnh chụp màn hình của CVE-2025-27610, CVE-2025-27111 và CVE-2025-25184, được phát hiện bởi MetaDefender Core với SBOM: