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: C
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)