CWE-88: Vô hiệu hóa không đúng các dấu phân cách đối số trong một lệnh ("Chèn đối số")

CWE-88 là gì?

Sản phẩm tạo một chuỗi lệnh để thành phần khác thực thi nhưng không phân tách đúng các đối số, tùy chọn hoặc cờ dự kiến trong chuỗi đó. Dữ liệu không tin cậy có thể làm phát sinh các đối số ngoài ý muốn.

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)117
MỨC TRỪU TƯỢNGCơ bản

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

117 lỗ hổngTăng 588,2% so với cùng kỳ

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

2 lỗ hổng

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

TheoMitre CWE

Chi tiết kỹ thuật

Khi lắp ghép lệnh bằng cách nội suy vào một chuỗi, nhà phát triển có thể nghĩ rằng việc ngăn chèn thêm lệnh, chẳng hạn bằng cách xử lý ký tự đặc biệt của shell, là đủ. Tuy nhiên, thành phần nhận lệnh vẫn có thể diễn giải các dấu phân cách đối số trong dữ liệu không tin cậy và xem chúng là các tham số mới. Các tham số thừa có thể thay đổi logic thực thi và, tùy chức năng mà lệnh hỗ trợ, dẫn đến đọc hoặc sửa dữ liệu, thực thi mã hoặc lệnh không được phép, hay hành vi ngoài dự kiến khác.

Đặc điểm

Điểm đặc trưng của điểm yếu này là việc ghép lệnh và dữ liệu vào một chuỗi dựa trên giả định rằng chỉ các đối số do nhà phát triển cung cấp sẽ được xử lý. Dù chuỗi đã ngăn các lệnh riêng biệt hoặc ký tự đặc biệt của shell, đầu vào vẫn có thể chứa dấu phân cách đối số, khoảng trắng, dấu ngoặc kép hoặc dạng tương tự để tạo thêm tùy chọn và cờ. Điểm yếu phát sinh trong giai đoạn triển khai và không phụ thuộc vào ngôn ngữ hay công nghệ cụ thể; bản ghi cho biết PHP là một nền tảng thường gặp.

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

Kẻ tấn công có thể thêm các đối số để thực thi mã hoặc lệnh không được phép, thay đổi logic thực thi, đọc dữ liệu ứng dụng hoặc sửa dữ liệu ứng dụng. Bản ghi cũng liên hệ điểm yếu này với ảnh hưởng đến tính sẵn sàng và các hành vi ngoài dự kiến khác, nhưng không nêu tác động cụ thể hơn cho các trường hợp đó.

Dữ liệu MITRE CWE chính thức
Tác độngPhạm viDiễn giải
Thực thi mã hoặc lệnh trái phép, Thay đổi logic thực thi, Đọc dữ liệu ứng dụng, Thay đổi dữ liệu ứng dụngTính bí mật, Tính toàn vẹn, Tính sẵn sàng, KhácAn attacker could include arguments that allow unintended commands or code to be executed, allow sensitive data to be read or modified or could cause other unintended behavior.

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

  • Tham số hóa việc tạo lệnh: Tránh xây dựng một chuỗi duy nhất chứa lệnh và các đối số. Sử dụng API nhận các đối số độc lập, chẳng hạn một mảng đối số, để việc đặt dấu ngoặc hoặc thoát ký tự được xử lý phù hợp. Bản ghi nêu escapeshellarg với system và mảng đối số với exec trong PHP, cũng như chuyển từ system sang exec trong C, làm ví dụ.
  • Xác thực tại các giao diện xác định: Xác định dữ liệu không tin cậy từ tham số, cookie, mạng, biến môi trường, header, nội dung, thành phần URL, email, tệp, cơ sở dữ liệu và hệ thống bên ngoài. Giả định mọi đầu vào đều có thể độc hại và dùng allowlist theo nguyên tắc chỉ chấp nhận giá trị hợp lệ, kiểm tra độ dài, kiểu, phạm vi, giá trị thiếu hoặc thừa, cú pháp, tính nhất quán và quy tắc nghiệp vụ. Không chỉ dựa vào denylist, dù denylist vẫn có thể hỗ trợ phát hiện tấn công hoặc loại bỏ đầu vào rõ ràng sai định dạng.
  • Chuẩn hóa và kiểm tra kiểu: Chuyển đầu vào trực tiếp sang kiểu dữ liệu dự kiến, sau đó kiểm tra phạm vi và quan hệ giữa các trường. Giải mã và canonicalize đầu vào về biểu diễn nội bộ của ứng dụng trước khi xác thực, tránh giải mã hai lần, và có thể canonicalize lặp lại đến khi đầu vào không còn thay đổi, đồng thời lưu ý rằng việc này có thể sửa nội dung được mã hóa hợp lệ.
  • Bảo toàn cách diễn giải tại giao diện: Dùng cùng một bảng mã giữa các thành phần trao đổi dữ liệu và chỉ rõ bảng mã khi giao thức cho phép. Khi kết hợp dữ liệu từ nhiều nguồn, hãy xác thực kết quả sau khi kết hợp, không chỉ từng phần riêng lẻ.
  • Kiểm thử rộng: Trong giai đoạn kiểm thử, dùng fuzzing, kiểm thử độ bền và fault injection với các bộ đầu vào lớn, đa dạng. Sản phẩm không được trở nên mất ổn định, bị dừng, hoặc tạo kết quả sai trong các kiểm thử này.
Dữ liệu MITRE CWE chính thức
  1. Tham số hóa · Hiện thực hóa · Hiệu quả: CaoWhere possible, avoid building a single string that contains the command and its arguments. Some languages or frameworks have functions that support specifying independent arguments, e.g. as an array, which is used to automatically perform the appropriate quoting or escaping while building the command. For example, in PHP, escapeshellarg() can be used to escape a single argument to system(), or exec() can be called with an array of arguments. In C, code can often be refactored from using system() - which accepts a single string - to using exec(), which requires separate function arguments for each parameter.
  2. Kiểm tra dữ liệu đầu vào · Kiến trúc và thiết kếUnderstand all the potential areas where untrusted inputs can enter your product: parameters or arguments, cookies, anything read from the network, environment variables, request headers as well as content, URL components, e-mail, files, databases, and any external systems that provide data to the application. Perform input validation at well-defined interfaces.
  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.
  4. Hiện thực hóaDirectly convert your input type into the expected data type, such as using a conversion function that translates a string into a number. After converting to the expected data type, ensure that the input's values fall within the expected range of allowable values and that multi-field consistencies are maintained.
  5. Hiện thực hóaInputs should be decoded and canonicalized to the application's current internal representation before being validated (CWE-180, CWE-181). Make sure that your application does not inadvertently decode the same input twice (CWE-174). Such errors could be used to bypass allowlist schemes by introducing dangerous inputs after they have been checked. Use libraries such as the OWASP ESAPI Canonicalization control. Consider performing repeated canonicalization until your input does not change any more. This will avoid double-decoding and similar scenarios, but it might inadvertently modify inputs that are allowed to contain properly-encoded dangerous content.
  6. Hiện thực hóaWhen exchanging data between components, ensure that both components are using the same character encoding. Ensure that the proper encoding is applied at each interface. Explicitly set the encoding you are using whenever the protocol allows you to do so.
  7. Hiện thực hóaWhen your application combines data from multiple sources, perform the validation after the sources have been combined. The individual data elements may pass the validation step but violate the intended restrictions after they have been combined.
  8. 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.

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

Phân tích tĩnh tự động, còn gọi là SAST, có thể phát hiện một số trường hợp bằng cách lập mô hình luồng dữ liệu và luồng điều khiển trong mã nguồn hoặc mã đã biên dịch, rồi tìm đường đi từ nguồn dữ liệu đầu vào đến các điểm gọi thành phần bên ngoài hoặc lớp thấp hơn như hệ điều hành. Phương pháp này có hiệu quả cao nhưng không bảo đảm phát hiện mọi trường hợp, vì chỉ nhận diện được các mẫu và đường đi mà công cụ lập mô hình được.

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

Các ví dụ sau đây là một số ví dụ đại diện, không phải danh sách đầy đủ:

  • CVE-2022-36069: công cụ quản lý phụ thuộc viết bằng Python tránh chèn lệnh hệ điều hành khi tạo lệnh Git nhưng vẫn cho phép chèn các đối số tùy chọn bắt đầu bằng dấu gạch ngang, có khả năng dẫn đến thực thi mã.
  • CVE-1999-0113: đối số -froot được chuyển cho chương trình khác, trong đó -f khiến chương trình chạy với người dùng root.
  • CVE-2001-0150, CVE-2001-0667, CVE-2004-0121, CVE-2004-0473, CVE-2004-0489 và CVE-2006-6597: trình duyệt hoặc ứng dụng xử lý URI truyền các tùy chọn dòng lệnh ngoài ý muốn cho Telnet, mail client hoặc chương trình khác, có thể dẫn đến thực thi lệnh, chương trình hoặc mã.
  • CVE-2002-0985, CVE-2005-4699 và CVE-2016-10033: các đối số được chèn vào chức năng mail hoặc chương trình Whois, cho phép thay đổi tùy chọn, vượt qua hạn chế, đọc thông tin nhạy cảm, ghi tệp hoặc thực thi chương trình.
  • CVE-2006-2312, CVE-2006-3015 và CVE-2004-0480: các URI hoặc tên đường dẫn được chế tạo làm thay đổi tùy chọn của chương trình, cho phép tải lên, tải xuống tệp hoặc dùng tệp cấu hình thay thế.
  • CVE-2007-0882: máy chủ Telnet diễn giải một chuỗi -f như yêu cầu hợp lệ để bỏ qua xác thực cho chương trình đăng nhập.
  • CVE-2019-13475: chèn tùy chọn -exec khiến lệnh được thực thi.
  • CVE-2006-1865, CVE-2006-2056, CVE-2006-2057, CVE-2006-2058 và CVE-2006-4692 được bản ghi liên hệ với việc tạo dòng lệnh không an toàn hoặc sửa đối số, nhưng một số trường hợp không xác định rõ liệu nguyên nhân cụ thể là chèn đối số, ký tự đặc biệt của shell, vấn đề triển khai hay API.
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-88, dựa theo mức độ ưu tiên

Nguồn (6)

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