CWE-94: Kiểm soát không phù hợp việc tạo mã ("Code Injection")

CWE-94 là gì?

Sản phẩm sử dụng dữ liệu đầu vào chịu ảnh hưởng từ bên ngoài để tạo một phần hoặc toàn bộ đoạn mã nhưng không vô hiệu hóa đúng cách cú pháp hoặc các thành phần khác có thể làm thay đổi hành vi dự kiến của mã.

Thống kê dữ liệu

THỨ HẠNG OWASP TOP 10:20255 — A05:2025 — Injection
TỔNG SỐ CVE LIÊN QUAN (365 NGÀY)871
MỨC TRỪU TƯỢNGCơ bản
KHẢ NĂNG KHAI THÁCTrung bình

Số lượng lỗ hổng nằm trong CWE-94

871 lỗ hổngTăng 273,8% so với cùng kỳ

Số lượng lỗ hổng trong CISA KEV của CWE-94

11 lỗ hổngTăng 37,5% so với cùng kỳ

Định nghĩa chính thức

TheoMitre CWE

Chi tiết kỹ thuật

Điểm yếu này xảy ra khi dữ liệu từ một thành phần thượng nguồn được đưa vào mã tạo động và vẫn có thể ảnh hưởng đến cú pháp, luồng điều khiển hoặc các thao tác được thực thi. Mã kết quả có thể thực hiện những hành động vượt quá mục đích của sản phẩm, đặc biệt khi dữ liệu đầu vào đến cơ chế đánh giá hoặc thực thi mà không bị giới hạn nghiêm ngặt về các cấu trúc được phép. Bản ghi xác định giai đoạn triển khai là nơi điểm yếu được hình thành, đồng thời nêu các ngôn ngữ thông dịch và công nghệ AI/ML là những bối cảnh áp dụng, với mức phổ biến lần lượt là đôi khi và chưa xác định.

Đặc điểm

Đây là một điểm yếu cơ sở, đơn giản, trong đó giá trị chịu ảnh hưởng từ bên ngoài đi vào mã được tạo động. Đặc điểm cốt lõi là không giới hạn hoặc không vô hiệu hóa đúng cú pháp đặc biệt, khiến dữ liệu đầu vào có thể thay đổi luồng điều khiển dự kiến hoặc gọi các thao tác vốn không được phép. Bản ghi cũng dùng thuật ngữ liên quan "Code Injection" và gắn điểm yếu này với môi trường thông dịch cùng các ứng dụng AI/ML.

Hậu quả thường gặp

Các hậu quả có thể gồm vượt qua xác thực hoặc cơ chế bảo vệ khác khi mã chèn kiểm soát quyết định truy cập, giành đặc quyền hoặc giả mạo danh tính khác, và thực thi mã hoặc lệnh trái phép. Việc này có thể ảnh hưởng đến tính bí mật, toàn vẹn và khả dụng, bao gồm thực thi mã tùy ý và làm mất tính toàn vẹn dữ liệu. Các hành động do mã chèn thực hiện cũng có thể không được ghi nhật ký, khiến hoạt động bị che giấu và làm suy yếu khả năng quy trách nhiệm.

Dữ liệu MITRE CWE chính thức
Tác độngPhạm viDiễn giải
Vượt qua cơ chế bảo vệKiểm soát truy cậpIn some cases, injectable code controls authentication; this may lead to a remote vulnerability.
Chiếm đặc quyền hoặc mạo danhKiểm soát truy cậpInjected code can access resources that the attacker is directly prevented from accessing.
Thực thi mã hoặc lệnh trái phépTính toàn vẹn, Tính bí mật, Tính sẵn sàngWhen a product allows a user's input to contain code syntax, it might be possible for an attacker to craft the code in such a way that it will alter the intended control flow of the product. As a result, code injection can often result in the execution of arbitrary code. Code injection attacks can also lead to loss of data integrity in nearly all cases, since the control-plane data injected is always incidental to data recall or writing.
Che giấu hoạt độngChống chối bỏOften the actions performed by injected control code are unlogged.

Biện pháp giảm thiểu rủi ro

Kiến trúc và thiết kế: Tái cấu trúc sản phẩm để không cần tạo mã động. Nếu không thể tránh việc tạo mã động, hãy chạy mã trong jail hoặc sandbox có ranh giới nghiêm ngặt, chẳng hạn môi trường sử dụng chroot hoặc AppArmor; biện pháp này chỉ giới hạn tác động lên hệ điều hành, có thể không khả thi và không được tạo ra các điểm yếu liên quan đến jail như CWE-243.

Triển khai: Coi mọi dữ liệu đầu vào là độc hại và áp dụng kiểm tra allowlist nghiêm ngặt, chỉ chấp nhận các giá trị phù hợp với độ dài, kiểu, phạm vi, cú pháp, tính nhất quán và quy tắc nghiệp vụ yêu cầu. Không chỉ dựa vào denylist hoặc việc tìm dữ liệu sai định dạng. Hãy giới hạn các cấu trúc mã được phép, vì kiểm tra một giá trị chỉ gồm chữ và số vẫn có thể cho phép tham chiếu đến các hàm nguy hiểm như system, exec hoặc exit. Đối với Python, bản ghi nêu ast.literal_eval như một lựa chọn thay cho eval vì được thiết kế để không thực thi mã, nhưng đánh dấu cách làm này là không được khuyến nghị do dữ liệu lồng sâu vẫn có thể gây tiêu thụ quá mức bộ nhớ hoặc ngăn xếp.

Kiểm thử và vận hành: Sử dụng fuzzing, kiểm thử độ bền và fault injection với nhiều dữ liệu đa dạng, đồng thời kiểm tra để sản phẩm không mất ổn định, bị treo hoặc tạo kết quả sai. Sử dụng môi trường có lan truyền taint tự động và ngăn thực thi lệnh với biến bị taint, chẳng hạn tùy chọn -T của Perl, nhưng phải xác thực cẩn thận trước khi coi dữ liệu là đã hết taint. Biện pháp kiểm soát taint này được bản ghi liệt kê ở cả hardening biên dịch hoặc xây dựng và hardening môi trường.

Dữ liệu MITRE CWE chính thức
  1. Tái cấu trúc · Kiến trúc và thiết kếRefactor your program so that you do not have to dynamically generate code.
  2. Kiến trúc và thiết kếRun your code in a "jail" or similar sandbox environment that enforces strict boundaries between the process and the operating system. This may effectively restrict which code can be executed by your product. Examples include the Unix chroot jail and AppArmor. In general, managed code may provide some protection. This may not be a feasible solution, and it only limits the impact to the operating system; the rest of your application may still be subject to compromise. Be careful to avoid CWE-243 and other weaknesses related to jails.
  3. Kiểm tra dữ liệu đầu vào · Hiện thực hóaAssume all input is malicious. Use an "accept known good" input validation strategy, i.e., use a list of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. When performing input validation, consider all potentially relevant properties, including length, type of input, the full range of acceptable values, missing or extra inputs, syntax, consistency across related fields, and conformance to business rules. As an example of business rule logic, "boat" may be syntactically valid because it only contains alphanumeric characters, but it is not valid if the input is only expected to contain colors such as "red" or "blue." Do not rely exclusively on looking for malicious or malformed inputs. This is likely to miss at least one undesirable input, especially if the code's environment changes. This can give attackers enough room to bypass the intended validation. However, denylists can be useful for detecting potential attacks or determining which inputs are so malformed that they should be rejected outright. To reduce the likelihood of code injection, use stringent allowlists that limit which constructs are allowed. If you are dynamically constructing code that invokes a function, then verifying that the input is alphanumeric might be insufficient. An attacker might still be able to reference a dangerous function that you did not intend to allow, such as system(), exec(), or exit().
  4. Kiểm thửUse dynamic tools and techniques that interact with the product using large test suites with many diverse inputs, such as fuzz testing (fuzzing), robustness testing, and fault injection. The product's operation may slow down, but it should not become unstable, crash, or generate incorrect results.
  5. Gia cố quá trình biên dịch hoặc xây dựng · Vận hànhRun the code in an environment that performs automatic taint propagation and prevents any command execution that uses tainted variables, such as Perl's "-T" switch. This will force the program to perform validation steps that remove the taint, although you must be careful to correctly validate your inputs so that you do not accidentally mark dangerous inputs as untainted (see CWE-183 and CWE-184).
  6. Gia cố môi trường · Vận hànhRun the code in an environment that performs automatic taint propagation and prevents any command execution that uses tainted variables, such as Perl's "-T" switch. This will force the program to perform validation steps that remove the taint, although you must be careful to correctly validate your inputs so that you do not accidentally mark dangerous inputs as untainted (see CWE-183 and CWE-184).
  7. Hiện thực hóa · Hiệu quả: Thực hành phổ biến không được khuyến nghịFor Python programs, it is frequently encouraged to use the ast.literal_eval() function instead of eval, since it is intentionally designed to avoid executing code. However, an adversary could still cause excessive memory or stack consumption via deeply nested structures [REF-1372], so the python documentation discourages use of ast.literal_eval() on untrusted data [REF-1373].

Cách phát hiện trong hệ thống

Phân tích tĩnh tự động, thường được triển khai dưới dạng SAST, có thể phát hiện một số trường hợp mà không cần thực thi sản phẩm. Phương pháp này có thể lập mô hình luồng dữ liệu và luồng điều khiển, rồi tìm đường đi từ nguồn đầu vào đến các sink nơi dữ liệu tương tác với thành phần bên ngoài hoặc lớp thấp hơn như hệ điều hành. Khả năng bao phủ bị giới hạn bởi những mẫu mà công cụ có thể lập mô hình, nên không chứng minh được rằng mọi trường hợp đều đã được phát hiện.

Dữ liệu MITRE CWE chính thức
Phương phápCách làmHiệu quả
Phân tích tĩnh tự độngAutomated static analysis, commonly referred to as Static Application Security Testing (SAST), can find some instances of this weakness by analyzing source code (or binary/compiled code) without having to execute it. Typically, this is done by building a model of data flow and control flow, then searching for potentially-vulnerable patterns that connect "sources" (origins of input) with "sinks" (destinations where the data interacts with external components, a lower layer such as the OS, etc.)Cao

Lỗ hổng điển hình

Bản ghi chính thức cung cấp các ví dụ tiêu biểu, không phải danh sách đầy đủ. Các ví dụ gồm những framework ứng dụng LLM hoặc AI đưa dữ liệu người dùng hay phản hồi được nhà cung cấp tạo ra vào exec hoặc eval của Python, như CVE-2023-29374, CVE-2024-5565 và CVE-2024-4181. Những ví dụ khác liên quan đến việc đánh giá hoặc chèn mã trực tiếp trong Python, PHP và Perl, gồm CVE-2022-2054, CVE-2008-5071, CVE-2002-1750, CVE-2008-5305, CVE-2002-1752, CVE-2002-1753, CVE-2005-1527, CVE-2005-2837, CVE-2005-1921, CVE-2005-2498, CVE-2005-3302, CVE-2007-1253, CVE-2001-1471, CVE-2002-0495, CVE-2005-1876, CVE-2005-1894 và CVE-2003-0395. Tập ví dụ còn có CVE-2021-22204, trong đó điểm yếu xử lý ranh giới chuỗi ở thượng nguồn dẫn đến chèn mã khi đánh giá, và CVE-2020-8218, được mô tả là chèn mã trong một sản phẩm VPN; bản ghi cung cấp nêu cả hai đã bị khai thác ngoài thực tế.

Dữ liệu MITRE CWE chính thức

Dưới đây là các lỗ hổng tiêu biểu liên quan đến CWE-94, dựa theo mức độ ưu tiên

Nguồn (4)

CWE™ Program, operated by The MITRE Corporation. Copyright © 2006–2026, The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. CWE Terms of Use.

Tìm hiểu thêm

Kiểm tra chuyên sâu cùng giải pháp quản lý rủi ro Web toàn diện

Giải pháp CyStack VulnScan liên tục phát hiện tài sản, xác minh lỗ hổng và giúp đội ngũ bảo mật ưu tiên khắc phục cho toàn bộ doanh nghiệp.

Khám phá CyStack VulnScan