Lỗi datamodel-code-generator: khi tệp mô tả API trở thành đường đưa mã vào dự án
CVE-2026-127208 cho thấy JSON Schema từ bên ngoài cần được kiểm soát khi dùng để sinh mã Python. Bản vá đã có trước ngày công bố lỗ hổng.
Một tệp JSON Schema thường được xem như tài liệu mô tả dữ liệu. Với công cụ sinh mã, nó còn có thể quyết định câu lệnh nào xuất hiện trong tệp Python đầu ra. Hồ sơ CVE-2026-127208 công bố ngày 12/11/2026 ghi nhận một lỗi chèn mã trong datamodel-code-generator trước phiên bản 0.84.0 khi xử lý một thuộc tính mở rộng. Đây là lý do để rà cả đường đưa schema vào quy trình build và bước sau đó đưa mã sinh ra vào ứng dụng.
Tệp mô tả dữ liệu bắt đầu ảnh hưởng mã ở đâu?
JSON Schema có thể mô tả rằng một trường là chuỗi, một trường là danh sách hoặc một thuộc tính là bắt buộc. Công cụ đọc mô tả đó để sinh lớp và kiểu dữ liệu cho Python. Lợi ích là tránh chép tay hợp đồng giữa hai hệ thống. Khi tài liệu API thêm trường, đội phát triển có thể dựng lại mô hình thay vì chỉnh từng lớp và có nguy cơ bỏ sót một nơi sử dụng.
Ngoài các kiểu chuẩn, công cụ có thuộc tính mở rộng để chỉ định kiểu Python. Trong hồ sơ CVE-2026-127208, thuộc tính liên quan là x-python-type. Công cụ phân tích biểu thức kiểu thành cây cú pháp, tức biểu diễn các thành phần mà Python nhận ra trong biểu thức. Việc kiểm tra cây cú pháp cần bảo đảm những phần được chấp nhận có thể xuất hiện an toàn trong ngữ cảnh đích. Theo hồ sơ, một dạng hằng chuỗi ở bên trong chỉ mục có thể vượt qua các bước kiểm tra ở các bản bị ảnh hưởng. Một schema được chuẩn bị có chủ đích vì vậy có thể dẫn đến thực thi mã tùy ý.
Điểm dễ bỏ qua là tính hợp lệ của JSON và tính an toàn của mã đầu ra là hai việc khác nhau. Trình phân tích có thể đọc một tệp JSON đúng định dạng trong khi giá trị bên trong vẫn không phù hợp để chuyển thành mã. Với một tính năng mở rộng cho phép biểu diễn kiểu riêng, đội xây công cụ cần định nghĩa rõ tập cấu trúc được hỗ trợ và kiểm tra cả các phần lồng nhau. Đội sử dụng công cụ cũng cần xem tài liệu đầu vào như dữ liệu có tác động lên bản build.
Mốc công bố lỗ hổng khác mốc phát hành bản sửa
Hồ sơ nêu dải ảnh hưởng là trước 0.84.0. Trang gói trên PyPI ghi tệp phát hành 0.84.0 được tải lên ngày 15/10/2026. Điều mới trong tháng 11 là thông tin công khai về lỗ hổng, không phải lần đầu có bản sửa. Đội đã nâng phiên bản từ tháng 10 vẫn nên xác nhận tác vụ sinh mã đang dùng đúng bản. Một phiên bản hiện trên máy kỹ sư không nói được container hoặc tác vụ tự động đang chạy bản nào.
Ngược lại, chỉ thấy tên công cụ trong tệp khóa phụ thuộc chưa đủ để kết luận một dịch vụ công khai cho phép người ngoài chạy mã. Cần xác định ai có thể thay đổi schema, quy trình nào chạy công cụ và mã sinh ra được dùng ở đâu. Một dự án chỉ sinh mã từ schema được lưu và duyệt trong cùng kho có bề mặt khác một dịch vụ cho người dùng tải tài liệu OpenAPI lên rồi tự dựng SDK. Cùng một thư viện, quyền kiểm soát đầu vào và cách sử dụng đầu ra sẽ quyết định mức phơi nhiễm.
Lần theo hai đường: schema đi vào và mã đi ra
Hãy hình dung một đội tích hợp tải schema từ đối tác mỗi đêm và tự mở đề xuất cập nhật SDK. Schema có thể đi qua URL của đối tác, kho cache và thư mục tạm trước khi tới trình sinh mã. Sau đó, mã mới có thể được đưa vào bài kiểm tra nhập mô-đun, đóng gói hoặc hợp nhất. Nên ghi rõ tác vụ nào chỉ đọc văn bản và tác vụ nào chạy Python từ đầu ra. Tách chúng giúp giảm số công việc cần quyền truy cập kho, khóa ký hoặc thông tin triển khai.
Sau khi nâng công cụ, hãy dựng lại mã từ bản schema đã được kiểm tra và so với đầu ra đang lưu. Sự khác biệt do nâng phiên bản có thể là hợp lệ, nên cần đối chiếu với thiết kế kiểu dữ liệu và những tệp dự kiến thay đổi. Khi nguồn schema nằm ngoài tổ chức, lưu phiên bản hoặc dấu kiểm tra nội dung cùng lần sinh mã sẽ giúp truy nguyên nếu đối tác thay tệp ở cùng địa chỉ.
Đưa kiểm soát về đúng chỗ trong CI
Một pipeline có thể dùng môi trường tạm với quyền tối thiểu để sinh mã từ tài liệu bên ngoài, sau đó đưa bản khác biệt qua bước duyệt trước khi chạy hoặc phân phối. Khi đội thực sự cần thuộc tính mở rộng, có thể quy định kiểu nào được dùng và thử cả trường hợp bị từ chối. Các biện pháp này bổ sung cho bản vá, vì một schema dù không khai thác lỗi vẫn có thể làm SDK đổi kiểu dữ liệu hoặc làm hỏng tính tương thích của ứng dụng.
Nếu dự án từng dùng bản cũ với tài liệu chưa kiểm soát, hãy xác định các lần sinh mã liên quan và kiểm tra nơi đầu ra đã được chạy. Việc công bố CVE không chứng minh dự án đã bị xâm nhập; ngược lại, thay phiên bản hôm nay không xóa đầu ra đã tạo hôm qua. Hai câu hỏi đáng trả lời là ai có thể đưa schema vào hệ thống và quy trình nào đã tin vào mã được sinh từ đó.
Khi xác minh đường dẫn, đừng quên tệp được schema tham chiếu. Nếu quy trình cho phép tìm tài liệu phụ ở ngoài kho, nguồn chính đã được duyệt vẫn có thể thay đổi hành vi khi tài liệu phụ đổi. Giữ bản chụp đầu vào của từng lần build giúp nhóm tái tạo kết quả và xác định nhanh những bản phát hành cần kiểm tra.
Nguồn: NVD, CVE-2026-127208; PyPI, datamodel-code-generator 0.84.0.
Ảnh minh họa: Ví dụ mã Python trong trình biên tập, không phải mã khai thác hoặc mã do công cụ trong bài sinh ra. MikeRun (Michael A. Rundel) qua Wikimedia Commons, CC BY-SA 4.0.