-
09/04/2020
-
132
-
1.869 bài viết
11 lỗ hổng nghiêm trọng trong vm2 đe dọa hàng loạt hệ thống Node.js
Một loạt lỗ hổng bảo mật đặc biệt nghiêm trọng vừa được phát hiện trong thư viện vm2, cơ chế sandbox phổ biến của hệ sinh thái Node.js, khiến hàng loạt nền tảng thực thi mã trực tuyến, hệ thống CI/CD và dịch vụ đa tenant đối mặt nguy cơ bị chiếm quyền hoàn toàn.
Theo công bố mới nhất từ dự án vm2 trên GitHub, có tới 11 lỗ hổng bảo mật ảnh hưởng đến tất cả phiên bản vm2 từ 3.11.1 trở về trước. Đáng lo ngại, toàn bộ các lỗi này đều cho phép tin tặc thoát khỏi môi trường sandbox để thực thi mã tùy ý trên máy chủ gốc, từ đó phá vỡ hoàn toàn mô hình bảo mật cốt lõi mà vm2 theo đuổi suốt nhiều năm qua. Các lỗ hổng được ghi nhận đều có mức độ nghiêm trọng rất cao với điểm CVSS chủ yếu từ 9.1 đến 10.0. Trong đó, có hai lỗ hổng vẫn chưa có bản vá chính thức, làm gia tăng thêm mức độ rủi ro đối với các hệ thống đang triển khai vm2.
Theo công bố mới nhất từ dự án vm2 trên GitHub, có tới 11 lỗ hổng bảo mật ảnh hưởng đến tất cả phiên bản vm2 từ 3.11.1 trở về trước. Đáng lo ngại, toàn bộ các lỗi này đều cho phép tin tặc thoát khỏi môi trường sandbox để thực thi mã tùy ý trên máy chủ gốc, từ đó phá vỡ hoàn toàn mô hình bảo mật cốt lõi mà vm2 theo đuổi suốt nhiều năm qua. Các lỗ hổng được ghi nhận đều có mức độ nghiêm trọng rất cao với điểm CVSS chủ yếu từ 9.1 đến 10.0. Trong đó, có hai lỗ hổng vẫn chưa có bản vá chính thức, làm gia tăng thêm mức độ rủi ro đối với các hệ thống đang triển khai vm2.
Ảnh: Bleeping Computer
vm2 là một package npm được sử dụng rộng rãi để chạy mã JavaScript không tin cậy trong môi trường cô lập. Công nghệ này xuất hiện trong nhiều nền tảng cho phép người dùng chạy code trực tiếp trên web, các hệ thống plugin, dịch vụ SaaS đa người dùng, pipeline CI/CD và cả nhiều sản phẩm AI có khả năng thực thi script động.
Toàn bộ mô hình bảo mật của vm2 được xây dựng trên một nguyên tắc đơn giản rằng mã độc chỉ được phép hoạt động trong sandbox và không thể truy cập hệ điều hành thật. Tuy nhiên, các nghiên cứu mới cho thấy lớp cô lập này không còn mang tính tuyệt đối khi có thể bị xuyên thủng thông qua nhiều kỹ thuật khác nhau, trải dài từ thao túng prototype JavaScript, lạm dụng Promise species cho tới khai thác WebAssembly và cơ chế exception mới của Node.js.
Toàn bộ mô hình bảo mật của vm2 được xây dựng trên một nguyên tắc đơn giản rằng mã độc chỉ được phép hoạt động trong sandbox và không thể truy cập hệ điều hành thật. Tuy nhiên, các nghiên cứu mới cho thấy lớp cô lập này không còn mang tính tuyệt đối khi có thể bị xuyên thủng thông qua nhiều kỹ thuật khác nhau, trải dài từ thao túng prototype JavaScript, lạm dụng Promise species cho tới khai thác WebAssembly và cơ chế exception mới của Node.js.
Các lỗ hổng trong thư viện Node.js vm2
Nghiêm trọng nhất là CVE-2026-24118, lỗ hổng cho phép khai thác hành vi của __lookupGetter__ để “bẻ khóa” cơ chế cô lập, từ đó thoát khỏi sandbox và chạm trực tiếp vào môi trường host. Đi song song với đó, CVE-2026-24120 lại mở ra một hướng tấn công nguy hiểm hơn khi lợi dụng cơ chế Promise species để vượt qua các rào chắn bảo vệ, rồi âm thầm kích hoạt child_process.execSync, biến một đoạn mã tưởng như bị cô lập thành công cụ thực thi lệnh hệ thống trên máy chủ. Hai lỗ hổng này, dù khai thác theo những cơ chế hoàn toàn khác nhau, lại cùng dẫn đến một điểm chung: phá vỡ lớp sandbox vốn được xem là “tuyến phòng thủ cuối cùng” của vm2 và mở đường trực tiếp cho kịch bản RCE trên host.
Một lỗ hổng đáng chú ý khác là CVE-2026-24781, khai thác mô-đun util của Node.js để thực hiện kiểm tra nội bộ các object, từ đó làm lộ các đối tượng nguyên gốc từ máy chủ. Khi đã truy cập được lớp dữ liệu này, kẻ tấn công có thể vượt qua cơ chế proxy isolation của vm2, phá vỡ hoàn toàn rào chắn giữa sandbox và môi trường host.
Không dừng lại ở các API cũ, những cơ chế JavaScript hiện đại cũng trở thành bề mặt tấn công mới. CVE-2026-26332 khai thác sự kết hợp giữa DisposableStack và cơ chế SuppressedError trong Node.js v24 để từng bước làm lộ đối tượng Function từ phía host. Khi đạt được quyền truy cập này, sandbox gần như mất hoàn toàn khả năng kiểm soát thực thi mã.
Sang Node.js v25, CVE-2026-26956 tiếp tục mở rộng bề mặt tấn công khi lợi dụng lệnh try_table của WebAssembly để vượt qua toàn bộ cơ chế sanitize của vm2. Điểm đáng lo ngại là kỹ thuật này không chỉ dừng ở việc thoát sandbox, mà trong thử nghiệm thực tế đã cho phép thực thi mã ở cấp độ root trên hệ thống.
Song song với đó, nhiều lỗ hổng khác lại tập trung vào chuỗi prototype và cơ chế nạp module của Node.js như CVE-2026-43997 và CVE-2026-44006. Hai lỗ hổng khai thác util.inspect kết hợp prototype traversal để tiếp tục mở đường thoát khỏi sandbox, từng bước đưa mã độc quay trở lại ngữ cảnh host. Trong khi đó, CVE-2026-43999 cho phép vượt qua cơ chế chặn module built-in của vm2 bằng cách gọi trực tiếp Module._load(), ngay cả khi các module nhạy cảm như child_process đã bị chặn trong cấu hình.
Một vấn đề mang tính hệ thống khác là CVE-2026-44005, liên quan đến prototype pollution. Lỗ hổng này cho phép kẻ tấn công sửa đổi các prototype dùng chung như Object.prototype hoặc Function.prototype, từ đó ảnh hưởng không chỉ sandbox mà cả toàn bộ tiến trình Node.js, tạo ra rủi ro lan rộng ngoài phạm vi ban đầu. Bên cạnh đó, một lỗi cấu hình nghiêm trọng được theo dõi với mã GHSA-8hg8-63c5-gwmx cho thấy khi bật tùy chọn nesting: true, cơ chế require: false gần như bị vô hiệu hóa. Điều này cho phép mã độc tạo các VM lồng nhau, vượt qua mọi giới hạn và đạt được thực thi mã từ xa dù sandbox vẫn đang được bật.
Đáng lo ngại nhất là hai lỗ hổng CVE-2026-44008 và CVE-2026-44009 hiện vẫn chưa có bản vá trên các phiên bản đến 3.11.1. Hai lỗi này khai thác cách vm2 xử lý array species cùng logic ngoại lệ, từ đó làm lộ các đối tượng phía host và khôi phục quyền truy cập tới Function constructor, thành phần cốt lõi có thể dẫn tới phá vỡ hoàn toàn cơ chế cô lập và thực thi mã tùy ý trên hệ thống.
Một lỗ hổng đáng chú ý khác là CVE-2026-24781, khai thác mô-đun util của Node.js để thực hiện kiểm tra nội bộ các object, từ đó làm lộ các đối tượng nguyên gốc từ máy chủ. Khi đã truy cập được lớp dữ liệu này, kẻ tấn công có thể vượt qua cơ chế proxy isolation của vm2, phá vỡ hoàn toàn rào chắn giữa sandbox và môi trường host.
Không dừng lại ở các API cũ, những cơ chế JavaScript hiện đại cũng trở thành bề mặt tấn công mới. CVE-2026-26332 khai thác sự kết hợp giữa DisposableStack và cơ chế SuppressedError trong Node.js v24 để từng bước làm lộ đối tượng Function từ phía host. Khi đạt được quyền truy cập này, sandbox gần như mất hoàn toàn khả năng kiểm soát thực thi mã.
Sang Node.js v25, CVE-2026-26956 tiếp tục mở rộng bề mặt tấn công khi lợi dụng lệnh try_table của WebAssembly để vượt qua toàn bộ cơ chế sanitize của vm2. Điểm đáng lo ngại là kỹ thuật này không chỉ dừng ở việc thoát sandbox, mà trong thử nghiệm thực tế đã cho phép thực thi mã ở cấp độ root trên hệ thống.
Song song với đó, nhiều lỗ hổng khác lại tập trung vào chuỗi prototype và cơ chế nạp module của Node.js như CVE-2026-43997 và CVE-2026-44006. Hai lỗ hổng khai thác util.inspect kết hợp prototype traversal để tiếp tục mở đường thoát khỏi sandbox, từng bước đưa mã độc quay trở lại ngữ cảnh host. Trong khi đó, CVE-2026-43999 cho phép vượt qua cơ chế chặn module built-in của vm2 bằng cách gọi trực tiếp Module._load(), ngay cả khi các module nhạy cảm như child_process đã bị chặn trong cấu hình.
Một vấn đề mang tính hệ thống khác là CVE-2026-44005, liên quan đến prototype pollution. Lỗ hổng này cho phép kẻ tấn công sửa đổi các prototype dùng chung như Object.prototype hoặc Function.prototype, từ đó ảnh hưởng không chỉ sandbox mà cả toàn bộ tiến trình Node.js, tạo ra rủi ro lan rộng ngoài phạm vi ban đầu. Bên cạnh đó, một lỗi cấu hình nghiêm trọng được theo dõi với mã GHSA-8hg8-63c5-gwmx cho thấy khi bật tùy chọn nesting: true, cơ chế require: false gần như bị vô hiệu hóa. Điều này cho phép mã độc tạo các VM lồng nhau, vượt qua mọi giới hạn và đạt được thực thi mã từ xa dù sandbox vẫn đang được bật.
Đáng lo ngại nhất là hai lỗ hổng CVE-2026-44008 và CVE-2026-44009 hiện vẫn chưa có bản vá trên các phiên bản đến 3.11.1. Hai lỗi này khai thác cách vm2 xử lý array species cùng logic ngoại lệ, từ đó làm lộ các đối tượng phía host và khôi phục quyền truy cập tới Function constructor, thành phần cốt lõi có thể dẫn tới phá vỡ hoàn toàn cơ chế cô lập và thực thi mã tùy ý trên hệ thống.
Sự xuất hiện liên tiếp của hàng loạt lỗ hổng cho thấy vm2 đang đối mặt với một vấn đề mang tính kiến trúc khi mô hình sandbox thuần JavaScript không còn theo kịp sự phát triển nhanh của Node.js và các cơ chế nội tại như prototype, Promise hay WebAssembly. Khi runtime ngày càng phức tạp, các lớp cô lập ở tầng ứng dụng dễ bị vượt qua, khiến khả năng đảm bảo an toàn của sandbox này dần suy giảm trong các môi trường hiện đại.
Các chuyên gia khuyến nghị quản trị viên cần cập nhật ngay vm2 lên phiên bản 3.11.1 để xử lý các lỗ hổng đã có bản vá, đồng thời tránh sử dụng cấu hình nesting: true hoặc các wildcard built-in kiểu ['*', '-child_process'] trong môi trường chạy mã không tin cậy.
Với những hệ thống yêu cầu mức cô lập cao, các tổ chức nên cân nhắc chuyển sang các cơ chế cách ly ở cấp kernel như Docker, gVisor hoặc Firecracker microVM thay vì tiếp tục phụ thuộc vào sandbox JavaScript.
Tổng hợp