CWE-476: Dereference con trỏ NULL

CWE-476 là gì?

CWE-476 là Dereference con trỏ NULL. Lỗi phát sinh khi Sản phẩm giải tham chiếu một con trỏ mà nó cho là hợp lệ, nhưng con trỏ đó có giá trị NULL. Hiện có 529 lỗ hổng trong kho dữ liệu liên quan đến CWE-476 và 1 trong số đó nằm trong danh mục khai thác thực tế của CISA.

THỨ HẠNG OWASP TOP 10:202510 — A10:2025 — Mishandling of Exceptional Conditions
Tổng số CVE liên quan (365 ngày)529
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-476

529 lỗ hổngTăng 213% so với cùng kỳ

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

1 lỗ hổng

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

TheoMitre CWE

Chi tiết kỹ thuật

Lỗi xảy ra tại thời điểm chương trình truy cập vùng nhớ hoặc đối tượng thông qua một con trỏ NULL thay vì kiểm tra và xử lý trạng thái không hợp lệ. Nguyên nhân có thể là không kiểm tra giá trị trả về của hàm, khởi tạo không đầy đủ, dữ liệu đầu vào làm phát sinh trạng thái thiếu đối tượng, hoặc việc sử dụng đồng thời khiến con trỏ không còn hợp lệ sau khi kiểm tra. Trong phần lớn môi trường, thao tác này làm tiến trình phát sinh lỗi và dừng; trong điều kiện đặc biệt, nếu NULL tương ứng với địa chỉ 0x0 và mã đặc quyền có thể truy cập địa chỉ đó, việc đọc hoặc ghi có thể dẫn đến tác động nghiêm trọng hơn.

Đặc điểm

Điểm yếu xuất hiện khi một con trỏ được giả định là hợp lệ nhưng thực tế có giá trị NULL, thường trong giai đoạn triển khai. Nó có thể xảy ra sau khi hàm trả về NULL, khi biến hoặc cấu trúc chưa được khởi tạo, khi dữ liệu trạng thái không đồng bộ, hoặc khi điều kiện tranh chấp làm tài nguyên thay đổi giữa lúc kiểm tra và sử dụng. CWE này có thể gặp trong C, C++, Java, C#, Go và Python; tên gọi liên quan gồm NPD, null deref, NPE và nil pointer dereference.

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

Hậu quả thường gặp là ảnh hưởng tính sẵn sàng: tiến trình có thể crash, thoát hoặc khởi động lại. Trên một số nền tảng, xử lý ngoại lệ có thể ngăn việc kết thúc ngay lập tức, nhưng vẫn khó đưa phần mềm trở lại trạng thái an toàn. Trong trường hợp hiếm, nếu mã đặc quyền có thể đọc hoặc ghi vùng nhớ tương ứng với NULL, lỗi có thể ảnh hưởng tính bí mật và tính toàn vẹn, bao gồm đọc hoặc sửa đổi bộ nhớ hay thực thi mã hoặc lệnh trái phép.

Dữ liệu MITRE CWE chính thức
Tác độngPhạm viDiễn giải
Từ chối dịch vụ: sập, thoát hoặc khởi động lạiTính sẵn sàngNULL pointer dereferences usually result in the failure of the process unless exception handling (on some platforms) is available and implemented. Even when exception handling is being used, it can still be very difficult to return the software to a safe state of operation.
Thực thi mã hoặc lệnh trái phép, Đọc bộ nhớ, Thay đổi bộ nhớTính toàn vẹn, Tính bí mậtIn rare circumstances, when NULL is equivalent to the 0x0 memory address and privileged code can access it, then writing or reading memory is possible, which may lead to code execution.

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

Yêu cầu: Chọn ngôn ngữ lập trình không dễ phát sinh lỗi giải tham chiếu con trỏ NULL.

Kiến trúc và thiết kế: Xác định mọi biến và kho dữ liệu nhận thông tin từ nguồn bên ngoài, sau đó kiểm tra đầu vào để bảo đảm chúng chỉ được khởi tạo bằng các giá trị mong đợi.

Triển khai: Khởi tạo tường minh mọi biến và kho dữ liệu khi khai báo hoặc ngay trước lần sử dụng đầu tiên. Kiểm tra kết quả của mọi hàm và xác minh giá trị khác NULL trước khi sử dụng. Với các con trỏ có thể bị thay đổi hoặc được trả về từ hàm có khả năng trả về NULL, hãy kiểm tra trước khi giải tham chiếu. Trong môi trường đa luồng hoặc bất đồng bộ, dùng API khóa thích hợp, giữ khóa từ lúc kiểm tra cho đến khi thao tác hoàn tất rồi mới mở khóa. Kiểm tra giá trị trả về thường hữu ích, nhưng không tự xử lý được điều kiện tranh chấp hoặc biến khởi tạo sai.

Dữ liệu MITRE CWE chính thức
  1. Hiện thực hóaFor any pointers that could have been modified or provided from a function that can return NULL, check the pointer for NULL before use. When working with a multithreaded or otherwise asynchronous environment, ensure that proper locking APIs are used to lock before the check, and unlock when it has finished [REF-1484].
  2. Yêu cầuSelect a programming language that is not susceptible to these issues.
  3. Hiện thực hóa · Hiệu quả: KháCheck the results of all functions that return a value and verify that the value is non-null before acting upon it.Checking the return value of the function will typically be sufficient, however beware of race conditions (CWE-362) in a concurrent environment. This solution does not handle the use of improperly initialized variables (CWE-665).
  4. Kiến trúc và thiết kếIdentify all variables and data stores that receive information from external sources, and apply input validation to make sure that they are only initialized to expected values.
  5. Hiện thực hóaExplicitly initialize all variables and other data stores, either during declaration or just before the first usage.

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

Phân tích động tự động: fuzzing, kiểm thử độ bền và fault injection với nhiều đầu vào có thể phát hiện lỗi nếu chương trình trở nên không ổn định, bị crash hoặc tạo kết quả sai; phương pháp này có hiệu quả vừa phải và có thể làm chậm chương trình. Có thể tích hợp cơ chế kiểm tra lỗi an toàn bộ nhớ trong lúc biên dịch, chẳng hạn AddressSanitizer cho C/C++; phương pháp này có hiệu quả vừa phải, cần đầu vào được tạo để đi tới đoạn mã lỗi, làm giảm hiệu năng và chỉ báo cáo điều kiện lỗi chứ không nhất thiết chỉ ra nguyên nhân ban đầu.

Phân tích động thủ công: chủ động tạo các điều kiện lỗi ít xảy ra trong sử dụng bình thường, như thiếu bộ nhớ, thiếu quyền, giao dịch bị ngắt hoặc mất các dịch vụ mạng cơ bản, rồi theo dõi hành vi bất thường. Ngoại lệ được môi trường ứng dụng bắt lại vẫn có thể cho thấy ứng dụng chưa xử lý đúng điều kiện bất ngờ.

Phân tích tĩnh tự động: SAST có thể tìm 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, sau đó tìm các mẫu nguy hiểm nối từ nguồn đầu vào tới nơi dữ liệu được sử dụng; 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.

Dữ liệu MITRE CWE chính thức
Phương phápCách làmHiệu quả
Phân tích động tự độngThis weakness can be detected using dynamic tools and techniques that interact with the software using large test suites with many diverse inputs, such as fuzz testing (fuzzing), robustness testing, and fault injection. The software's operation may slow down, but it should not become unstable, crash, or generate incorrect results.Khá
Phân tích động thủ côngIdentify error conditions that are not likely to occur during normal usage and trigger them. For example, run the program under low memory conditions, run with insufficient privileges or permissions, interrupt a transaction before it is completed, or disable connectivity to basic network services such as DNS. Monitor the software for any unexpected behavior. If you trigger an unhandled exception or similar error that was discovered and handled by the application's environment, it may still indicate unexpected conditions that were not handled by the application itself.-
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
Phân tích động tự độngUse tools that are integrated during compilation to insert runtime error-checking mechanisms related to memory safety errors, such as AddressSanitizer (ASan) for C/C++ [REF-1518].Crafted inputs are necessary to reach the code containing the error, such as generated by fuzzers. Also, these tools may reduce performance, and they only report the error condition - not the original mistake that led to the error.Khá

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

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

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-476, dựa theo mức độ ưu tiên

Nguồn (2)

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.