MikroORM là một trong những ORM (Object-Relational Mapping) dành cho TypeScript và Node.js được cộng đồng lập trình viên vô cùng ưa chuộng nhờ kiến trúc Data Mapper, Unit of Work và Identity Map bài bản. Khi sử dụng ORM, chúng ta thường có xu hướng tin rằng hệ thống đã tự động bảo vệ ứng dụng khỏi các rủi ro kinh điển như SQL Injection.
Tuy nhiên, vào cuối tháng 3 năm 2026, cộng đồng bảo mật đã gióng lên hồi chuông cảnh báo với hai lỗ hổng cực kỳ nghiêm trọng được phát hiện trên MikroORM. Bài viết này sẽ phân tích chi tiết bản chất của các lỗ hổng này và cách bảo vệ ứng dụng của bạn.

1. Tâm Điểm: Lỗ Hổng SQL Injection (CVE-2026-34220)
Đây là lỗ hổng đáng sợ nhất với điểm số CVSS chạm ngưỡng 9.8 (Critical). Nó phá vỡ hoàn toàn niềm tin rằng "dùng ORM là miễn nhiễm với SQL Injection".
Bản chất của lỗ hổng
Trong các phiên bản bị ảnh hưởng (<= 6.6.9 và <= 7.0.5), MikroORM có một tính năng cho phép chèn các "đoạn SQL thô" (raw SQL query fragments) vào truy vấn. Vấn đề nằm ở chỗ hệ thống nhận diện các đối tượng SQL thô này bằng kỹ thuật duck-typing (kiểm tra xem object có chứa một số thuộc tính cụ thể hay không).
Kẻ tấn công có thể lợi dụng điều này bằng cách tạo ra một payload (thường là qua JSON) giả mạo cấu trúc của một object nội bộ. Khi MikroORM đọc object này, nó bị đánh lừa và tin rằng đây là một đoạn SQL thô hợp lệ do hệ thống tạo ra, từ đó thực thi nó trực tiếp xuống cơ sở dữ liệu.
Vùng ảnh hưởng (Attack Surface)
Lỗ hổng sẽ bị khai thác nếu ứng dụng của bạn nhận trực tiếp dữ liệu từ người dùng (ví dụ: req.body) và truyền thẳng vào các API ghi (write APIs) của MikroORM như:
-
wrap(entity).assign(userInput)tiếp nối bằngem.flush() -
em.nativeUpdate() -
em.nativeInsert() -
em.create()tiếp nối bằngem.flush()
Hậu quả: Kẻ tấn công có thể chèn các câu lệnh SQL độc hại để đánh cắp dữ liệu nhạy cảm, thay đổi quyền hạn hoặc thậm chí xóa sạch toàn bộ Database (Drop table).
Cơ chế vá lỗi
Đội ngũ phát triển MikroORM đã khắc phục bằng cách thay thế cơ chế duck-typing bằng các Symbol-based markers. Trong JavaScript/TypeScript, Symbol là một kiểu dữ liệu nguyên thủy độc nhất và không thể bị sao chép hoặc giả mạo thông qua các chuỗi JSON từ input của người dùng.
2. Rủi Ro Tiềm Ẩn: Prototype Pollution (CVE-2026-34221)
Bên cạnh SQL Injection, MikroORM cũng dính phải một lỗ hổng Prototype Pollution nằm ở hàm helper dùng nội bộ là Utils.merge.
Bản chất của lỗ hổng
Khi MikroORM thực hiện gộp (merge) các cấu trúc object, hàm Utils.merge đã thiếu đi cơ chế lọc (sanitize) các từ khóa đặc biệt như __proto__, constructor hay prototype.
Nếu một input không đáng tin cậy đi qua hàm này, kẻ tấn công có thể viết đè lên các thuộc tính mặc định của mọi Object trong JavaScript.
Hậu quả
Tùy thuộc vào logic của ứng dụng, Prototype Pollution có thể dẫn đến từ chối dịch vụ (Denial of Service - DoS), thay đổi hành vi logic của app, hoặc tạo ra bàn đạp để xây dựng các chuỗi tấn công phức tạp hơn (bao gồm cả SQL Injection).
3. Bài Học Rút Ra & Cách Khắc Phục
Bảo mật không phải là một đích đến, mà là một quá trình liên tục. Dưới đây là những hành động bạn cần thực hiện ngay:
Cập nhật phiên bản ngay lập tức
Hai lỗ hổng trên đã được vá hoàn toàn. Hãy cập nhật package @mikro-orm/core lên các phiên bản an toàn:
-
Nếu bạn đang dùng v6: Nâng cấp lên
6.6.10 -
Nếu bạn đang dùng v7: Nâng cấp lên
7.0.6
Đừng bao giờ tin tưởng User Input (Anti-Pattern cảnh báo)
Việc lấy toàn bộ payload từ client và ném thẳng vào ORM (kiểu wrap(user).assign(req.body)) là một thực hành vô cùng tồi tệ. Nó không chỉ mở đường cho lỗ hổng SQL Injection nói trên mà còn gây ra lỗi Mass Assignment (kẻ tấn công có thể tự thăng cấp tài khoản thành admin nếu truyền thêm field isAdmin: true).
Thiết lập hàng rào Validation mạnh mẽ
Luôn luôn xác thực và giới hạn cấu trúc dữ liệu đầu vào. Hãy sử dụng mô hình DTO (Data Transfer Object) kết hợp với các thư viện validation schema mạnh mẽ trước khi cho dữ liệu chạm tới tầng Database:
-
Zod hoặc Yup (rất phù hợp cho TypeScript).
-
Class-Validator (nếu bạn dùng kiến trúc hướng đối tượng như NestJS).
Kết luận: Ngay cả những công cụ được bảo trì tốt nhất cũng có lúc tồn tại lỗ hổng. Sự kiện CVE-2026-34220 của MikroORM là một lời nhắc nhở đắt giá dành cho các kỹ sư phần mềm: ORM chỉ là công cụ hỗ trợ giao tiếp với cơ sở dữ liệu, nó không phải là một chiếc khiên ma thuật thay thế cho các nguyên tắc bảo mật cơ bản. Trách nhiệm làm sạch và kiểm soát dữ liệu luôn nằm ở tầng logic của ứng dụng.








