Ruby vá lỗi engine regex, khắc phục các lỗ hổng thực thi mã từ xa nghiêm trọng trong GitLab
Ruby phát hành bản cập nhật để sửa ba lỗi trong engine Onigmo, vốn là nguyên nhân gây ra bốn lỗ hổng thực thi mã từ xa (RCE) nghiêm trọng trong GitLab, ảnh hưởng đến mọi ứng dụng biên dịch các mẫu regex không đáng tin cậy.
Được dịch tự động từ bản gốc tiếng Anh.
Ruby đã phát hành các phiên bản 4.0.9, 3.4.12 và 3.3.13 để khắc phục ba lỗi trong engine biểu thức chính quy (regular expression) tích hợp sẵn của mình, Onigmo. Những khiếm khuyết cốt lõi này chịu trách nhiệm cho bốn lỗ hổng thực thi mã từ xa (remote code execution - RCE) nghiêm trọng vừa được vá trong GitLab. Các bản vá này cấp thiết đối với bất kỳ nhà phát triển nào đang duy trì các ứng dụng Ruby xử lý chuỗi mẫu do người dùng cung cấp.
Chuyện gì đã xảy ra
Các vấn đề bảo mật bắt nguồn từ cách Ruby biên dịch biểu thức chính quy từ văn bản bị kiểm soát bởi kẻ tấn công. Khi một chương trình truyền chuỗi như vậy vào các phương thức như Regexp.new, Regexp.union hoặc Regexp.compile, hoặc sử dụng nội suy (interpolation) trong một mẫu như /#{input}/, engine có thể làm hỏng bộ nhớ trong quá trình biên dịch. Sự hỏng hóc bộ nhớ này tạo ra con đường dẫn đến việc thực thi mã tùy ý trên máy chủ. Mặc dù GitLab là nạn nhân chính được xác định công khai, Ruby tuyên bố rõ ràng rằng bất kỳ ứng dụng nào thực hiện thao tác này đều dễ bị tổn thương.
GitLab đã phát hiện những lỗ hổng này thông qua chương trình săn lỗi (bug bounty), với nhà nghiên cứu joaxcar báo cáo cả bốn trường hợp. Công ty đã ban hành bốn mã nhận diện Common Vulnerabilities and Exposures (CVE) từ ngày 23 tháng 9 đến ngày 21 tháng 10. Hai lỗ hổng đầu tiên, được tiết lộ vào cuối tháng 9, yêu cầu tài khoản đã đăng nhập và có mức độ nghiêm trọng 9.9/10. Hai lỗ hổng sau đó, CVE-2026-97229 và CVE-2026-110264, không yêu cầu xác thực và nhận điểm mức độ nghiêm trọng tối đa là 10.0. Đáng chú ý, CVE-2026-110264 ảnh hưởng đến mọi phiên bản GitLab từ 7.0 trở đi.
Ruby vẫn chưa gán mã CVE riêng cho các bản vá này, khuyên người dùng nên theo dõi vấn đề thông qua hồ sơ của GitLab thay thế. Quyết định này tạo ra khoảng trống về khả năng hiển thị đối với các trình quét bảo mật dựa trên việc khớp CVE với các phiên bản thư viện cụ thể, vì hồ sơ của GitLab chỉ liệt kê GitLab là sản phẩm bị ảnh hưởng. Ruby lưu ý rằng họ đã gán CVE cho các lỗi tương tự vào năm 2022 và 2024, nhưng hiện tại mô tả các mẫu không đáng tin cậy trong tài liệu của mình chủ yếu là rủi ro từ chối dịch vụ (denial-of-service) chứ không phải mối đe dọa thực thi mã.
Cơ chế hoạt động
Lỗ hổng nằm ở Onigmo, engine biểu thức chính quy được nhúng trong ngôn ngữ Ruby. Khi Ruby biên dịch một biểu thức chính quy, nó chuyển đổi chuỗi mẫu thành một cấu trúc nội bộ dùng cho việc khớp mẫu. Nếu kẻ tấn công cung cấp một mẫu được thiết kế đặc biệt, quá trình biên dịch có thể kích hoạt sự hỏng hóc bộ nhớ. Đây không phải là vấn đề khớp chậm hay cạn kiệt tài nguyên, vốn là những lo ngại điển hình với các regex phức tạp. Thay vào đó, engine không xử lý an toàn một số cấu trúc mẫu nhất định trong giai đoạn xây dựng, cho phép kẻ tấn công ghi đè lên các vị trí bộ nhớ.
Các chiến lược giảm thiểu phổ biến thường thất bại trước loại lỗi cụ thể này. Việc đặt Regexp.timeout không ngăn chặn được sự hỏng hóc bộ nhớ vì lỗi xảy ra trong quá trình biên dịch, trước khi việc khớp mẫu bắt đầu. Tương tự, giới hạn độ dài của chuỗi mẫu đầu vào cũng không đáng tin cậy vì các mẫu ngắn, được xây dựng cẩn thận vẫn có thể kích hoạt các khiếm khuyết cốt lõi của engine. Biện pháp phòng thủ đáng tin cậy duy nhất là tránh hoàn toàn việc biên dịch biểu thức chính quy từ đầu vào không đáng tin cậy hoặc nâng cấp lên phiên bản runtime Ruby đã được vá.
Chi tiết quan trọng
- Các phiên bản Ruby 4.0.9, 3.4.12 và 3.3.13 chứa các bản vá cần thiết cho ba lỗi engine Onigmo.
- Ruby 4.0.8 không đủ an toàn vì thiếu bản vá cho CVE-2026-110264; người dùng phải nâng cấp lên 4.0.9.
- Ruby 3.2 và các phiên bản cũ hơn sẽ không nhận được bản vá, vì Ruby 3.2 đã đạt trạng thái end of life vào ngày 1 tháng 4 năm 2026.
- Các ứng dụng chỉ gặp rủi ro nếu chúng biên dịch regex từ các chuỗi do kẻ tấn công kiểm soát thông qua Regexp.new, Regexp.union, Regexp.compile hoặc nội suy mẫu.
- GitLab đã khắc phục các vấn đề trong các phiên bản 19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10 và 18.11.13.
- Tính đến ngày 23 tháng 10, không có mã CVE nào trong bốn mã liên quan xuất hiện trong danh mục Known Exploited Vulnerabilities của CISA.
Tại sao điều này quan trọng
Đối với các kỹ sư phần mềm, sự cố này nhấn mạnh một mối nguy hiểm dai dẳng trong việc xử lý đầu vào của người dùng cho việc khớp mẫu động. Nhiều nhà phát triển giả định rằng rủi ro của regex chỉ giới hạn ở suy giảm hiệu suất hoặc tấn công từ chối dịch vụ. Sự kiện này chứng minh rằng các vấn đề an toàn bộ nhớ trong giai đoạn biên dịch có thể dẫn đến thực thi mã từ xa hoàn toàn. Nó buộc phải đánh giá lại bất kỳ tính năng nào cho phép người dùng xác định bộ lọc tìm kiếm, quy tắc xác thực hoặc mẫu cấu hình bằng biểu thức chính quy.
Việc thiếu mã CVE dành riêng cho Ruby cũng làm phức tạp hóa việc giám sát bảo mật tự động. Các nhóm phụ thuộc vào trình quét lỗ hổng tiêu chuẩn có thể bỏ sót các bản vá này nếu công cụ của họ chỉ kiểm tra các CVE liên kết trực tiếp với gói ngôn ngữ Ruby. Vì GitLab đóng gói bản sao Ruby riêng, các instance tự quản lý (self-managed) phải cập nhật chính ứng dụng GitLab để nhận bản vá. Chuỗi phụ thuộc này có nghĩa là các trưởng nhóm hạ tầng phải theo dõi các bản cập nhật ngôn ngữ upstream ngay cả khi chúng xuất hiện dưới dạng bản vá cấp ứng dụng trong các dịch vụ đóng gói.
Bạn có thể làm gì
- Nâng cấp Ruby lên phiên bản 4.0.9, 3.4.12 hoặc 3.3.13 ngay lập tức nếu ứng dụng của bạn biên dịch regex từ đầu vào của người dùng.
- Di dời khỏi Ruby 3.2 và các phiên bản cũ hơn, vì những phiên bản này sẽ không nhận được bản vá bảo mật cho các lỗi này.
- Kiểm toán mã nguồn của bạn để tìm các trường hợp sử dụng Regexp.new, Regexp.union, Regexp.compile hoặc nội suy mẫu với dữ liệu không đáng tin cậy.
- Tái cấu trúc các tính năng cho phép mẫu regex do người dùng định nghĩa để sử dụng các giải pháp thay thế an toàn hơn, chẳng hạn như các tùy chọn bộ lọc định sẵn hoặc khớp chuỗi.
- Nếu bạn quản lý các instance GitLab tự host, hãy nâng cấp lên một trong các phiên bản đã được vá, chẳng hạn như 19.5.1 hoặc 18.11.13.
- Triển khai các quy tắc phát hiện do GitLab cung cấp để giám sát các dấu hiệu nỗ lực khai thác trên máy chủ của bạn.



