概念
C/C++语言空指针的值为NULL,一般NULL指针指向进程的最小地址,通常这个值为0.
当程序试图解引用一个期望非空,但是实际为空的指针时,会发生空指针解引用错误。可以导致程序异常终止或拒绝服务。
空指针解引用时C/C++程序中较为普遍存在的内存缺陷类型,当指针指向无效的内存地址并对其解引用时,产生不可预见错误,导致软件崩溃或者拒绝服务。
漏洞编号 | 漏洞概述 |
CVE-2018-16517 | Netwide Assmbler的asm/labels.c文件存在空指针解引用,攻击者可以进行拒绝服务攻击 |
CVE-2018-16428 | GNOME Glib 2.56.1的gmarkup.c中的g_markup_parse_context_end_parse()函数存在空指针解引用 |
CVE-2018-16329 | ImageMagick7.0.8-8之前的版本的MagickCore/property.c文件中的GetMagickProperty()函数存在空指针解引用 |
CVE-2018-16328 | ImageMagick 7.0.8-8之前的版本的MagickCore/property.c文件中的CheckEventLogging()函数存在空指针解引用 |
CVE-2019-9635 | TensorFlow1.12.2之前的版本存在空指针解引用 |
CVE-2020-9385 | Zint2.7.1中的libzint存在空指针解引用 |
CVE-2021-27186 | Fluent Bit 1.6.10,当没有对flb_avro.c或http_server/api/v1/metrics.c中的flb_malloc的返回值进行验证时,存在空指针解引用 |
代码
void NULL_Pointer_Dereference()
{
char *data;
/*指针置为空*/
data=NULL;
/*空指针解引用*/
printHexCharLine(data[0]);
}
避免空指针解引用
1. 使用指针前进行健壮性检查
2. 调用函数返回值为空时,需对函数返回值进行非空验证
3. 在释放指针指向的空间后,需将指针赋值为空
4. 确保异常被正确处理