CWE-690: Unchecked Return Value to NULL Pointer Dereference(没有针对空指针间接引用而检查返回值)

 ID: 690

类型: 复合
结构:链接

状态:草稿

描述

如果函数失败,则产品不会在调用可以返回空指针的函数后检查是否有错误,这将导致产生空指针取消引用。

链接组件

关系

类型

ID

名称

始于

252

未检查返回值

接着

476

空指针间接引用

扩展描述

函数经常返回NULL表明出现了错误,但未检查返回值弱点不局限于返回空指针的情形(参见CWE-252中的例子)。当这个错误条件没有被检查时,空指针间接引用可能会发生。

相关视图

与“研究层面”视图(CWE-1000)相关

引入模式

阶段

说明

实现

当应用程序包含对malloc()调用的用户控制输入时,通常会出现这种弱点。相关代码在防止缓冲区溢出方面可能是正确的,但是如果提供了一个大的值,malloc()将由于内存不足而失败。当解析例程期望某些元素总是存在时,也经常发生此问题。如果提供了格式错误的输入,分析器可能会返回空值。例如,strtok()可以返回空值。

应用平台

语言

C (出现的可能性不确定)

C++ (出现的可能性不确定)

后果

范围

冲击

可能性

可利用性

技术冲击: DoS: 崩溃、退出或重启

 

示例

例1

下面的代码调用getUsername()函数,但在取消引用之前不检查返回值(这可能导致NullPointerException)。

(问题代码)

Example Language: Java 

String username = getUserName();
if (username.equals(ADMIN_USER)) {

...

}

例2

此示例从用户获取IP地址,验证其格式是否正确,然后查找主机名并将其复制到缓冲区中。

(问题代码)

Example Language:

void host_lookup(char *user_supplied_addr){

struct hostent *hp;
in_addr_t *addr;
char hostname[64];
in_addr_t inet_addr(const char *cp);

/*routine that ensures user_supplied_addr is in the right format for conversion */

validate_addr_form(user_supplied_addr);
addr = inet_addr(user_supplied_addr);
hp = gethostbyaddr( addr, sizeof(struct in_addr), AF_INET);
strcpy(hostname, hp->h_name);

}

如果攻击者提供的地址格式似乎正确,但该地址无法解析为主机名,则对gethostbyaddr()的调用将返回空值。由于代码没有检查gethostbyddr(cwe-252)的返回值,因此对strcpy()的调用中将发生空指针取消引用(cwe-476)。

请注意,此示例还容易受到缓冲区溢出的攻击 (参见CWE-119).

种属

关系

类型

ID

名称

属于

851

The CERT Oracle Secure Coding Standard for Java (2011) Chapter 8 - Exceptional Behavior (ERR)

属于

876

CERT C++ Secure Coding Section 08 - Memory Management (MEM)

属于

1157

SEI CERT C Coding Standard - Guidelines 03. Expressions (EXP)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值