ID: 476

类型:基础
结构:简单

状态:草稿

描述

空指针间接引用发生在应用程序间接引用其预期有效但实际为空的指针时,通常会导致崩溃或退出。

扩展描述

空指针间接引用可能在多个弱点发生后发生,如竞争条件和简单程序省略等。

相关视图

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

与“开发层面”视图(CWE-699)相关

引入模式

阶段

说明

实现

 

应用平台

语言

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

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

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

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

后果

范围

冲击

可能性

可用性

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

除非异常处理(在某些平台上)可用并实现,否则空指针间接引用通常会导致流程失败。即使在使用异常处理时,仍然很难将软件恢复到安全操作状态。

 

完整性
机密性
可用性

技术冲击: 执行未获授权的代码或命令

在非常罕见的情况和环境中,代码执行是可能的。

 

被利用的可能性:

中等

示例

例1

虽然除了认真的编程之外没有完整的修复,但以下步骤将很长一段时间确保不会发生空指针取消引用。

(正确代码)

if (pointer1 != NULL) {

/* make use of pointer1 */

/* ... */

}

如果您使用的是多线程或异步环境,请确保在if语句之前使用适当的锁定API进行锁定,并在完成后解锁。

例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-119).

例3

在下面的代码中,程序员假定系统总是定义了一个名为“cmd”的属性。如果攻击者可以控制程序的环境,从而不定义“cmd”,则程序在尝试调用trim()方法时会抛出空指针异常。

(问题代码)

Example Language: Java

String cmd = System.getProperty("cmd");
cmd = cmd.trim();

例4

此应用程序已注册以在发送意图时处理URL:

(问题代码)

Example Language: Java

...
IntentFilter filter = new IntentFilter("com.example.URLHandler.openURL");
MyReceiver receiver = new MyReceiver();
registerReceiver(receiver, filter);
...

public class UrlHandlerReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

if("com.example.URLHandler.openURL".equals(intent.getAction())) {

String URL = intent.getStringExtra("URLToOpen");
int length = URL.length();

...
}

}

}

应用程序假定URL将始终包含在意图中。当URL不存在时,对getStringExtra()的调用将返回空值,因此在调用length()时会导致空指针异常。

应对措施

阶段: 实现

如果可以修改的所有指针在使用前都进行了健全性检查,那么几乎可以防止所有空指针取消引用。

阶段: 需求

可以选择使用不易受这些问题影响的语言。

阶段: 实现

检查返回值的所有函数的结果,并在对其执行操作之前验证该值是否为非空。

有效性: 中等

说明: 检查函数的返回值通常是足够的,但是要注意并发环境中的竞争条件(CWE-362)。此解决方案不处理不正确初始化变量(CWE-665)的使用。

阶段: 架构与设计

标识从外部源接收信息的所有变量和数据存储,并应用输入验证以确保它们仅初始化为预期值。

阶段: 实现

在声明期间或第一次使用之前,显式初始化所有变量和其他数据存储。

阶段: 测试

使用针对这类弱点的自动化静态分析工具。许多现代技术使用数据流分析来最小化误报的数量。这不是一个完美的解决方案,因为100%的准确度和覆盖范围是不可行的。

种属

关系

类型

ID

名称

属于

398

7PK - Code Quality

属于

398

7PK - Code Quality

属于

730

OWASP Top Ten 2004 Category A9 - Denial of Service

属于

737

CERT C Secure Coding Standard (2008) Chapter 4 - Expressions (EXP)

属于

742

CERT C Secure Coding Standard (2008) Chapter 9 - Memory Management (MEM)

属于

808

2010 Top 25 - Weaknesses On the Cusp

属于

867

2011 Top 25 - Weaknesses On the Cusp

属于

871

CERT C++ Secure Coding Section 03 - Expressions (EXP)

属于

876

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

属于

884

CWE Cross-section

属于

971

SFP Secondary Cluster: Faulty Pointer Use

属于

1136

SEI CERT Oracle Secure Coding Standard for Java - Guidelines 02. Expressions (EXP)

属于

1157

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

CWE-476: NULL Pointer Dereference(空指针间接引用)相关推荐

  1. 华为运行APK时的ART空指针间接引用报错问题

    文章目录 1. 问题情况 1. 问题情况 在此前已经正常运行过的项目,重新修改了配置信息(gradle和一些业务环境信息如域名等)后重新运行时,运行后若干秒后会发生闪退并输出了以下的错误信息.并且该错 ...

  2. Unable to handle kernel NULL pointer dereference at virtual address 分析

    Unable to handle kernel NULL pointer dereference at virtual address 分析 现象 [ 136.847780] br-lan: rece ...

  3. 新手玩转Linux Kernel漏洞之Null Pointer Dereference

    新手玩转Linux Kernel漏洞之Null Pointer Dereference 前言 这是我内核漏洞的入门篇, 不是很复杂, 希望能给徘徊在门外的小伙伴一点启发. 漏洞描述 A NULL po ...

  4. Unable to handle kernel NULL pointer dereference at virtual address 0000000d[ 435.859000] pgd = c9

    由于本人刚学驱动新手,不会太多反向操作.看了很多博主也没有解决. 经过我一个下午尝试,把代码缩减缩减在缩减之后,我发现了 先看下面的代码,有问题的代码(扫一眼就行了,估计没人看的出来) #includ ...

  5. ncnn报null pointer dereference异常

    错误描述 基于c++使用ncnn封装了深度学习模型,并将c++项目打包成为了一个so库给Android调用,在打包成为so库之前,在Windows系统以及Ubuntu系统利用电脑的camera测试过都 ...

  6. Unable to handle kernel NULL pointer dereference at virtual address

    1:从sd卡出错log里可以看出来pc指针以及出错位置 PC is at dw_mci_pre_dma_transfer.isra.19+0x7c/0x158 pc : [<8032e130&g ...

  7. Unable to handle kernel NULL pointer dereference at virtual address 00000000问题的解决

    Unable to handle kernel NULL pointer dereference at virtual address 00000000问题的解决 参考文章: (1)Unable to ...

  8. Android UVCCamera问题——Cause: null pointer dereference

    记录遇到的问题. 采用的开源库链接:https://github.com/saki4510t/UVCCamera 使用该库预览的时候,如果拔掉uvc设备,会造成异常闪退. signal 11 (SIG ...

  9. NULL Pointer Dereference(转)

    0x00 漏洞代码 null_dereference.c: #include <linux/init.h> #include <linux/module.h> #include ...

  10. c语言 空指针解引用,【缺陷周话】第一期:空指针解引用

    代码审计是使用静态分析发现源代码中安全缺陷的方法,能够辅助开发或测试人员在软件上线前较为全面地了解其安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并且已经成为安全开发生命周期 SDL ...

最新文章

  1. Opengl-基本概念-纹理(单纯的颜色太单调弄张图显示不是更好)
  2. hosts和resolv.conf区别
  3. 威胁情报大会直击 | 企业IT部王森:腾讯企业终端安全管理最佳实践
  4. xlwings删除数据_xlwings如何删除行和列?
  5. 手机锁屏js倒计时停止问题解决办法探索
  6. ubuntu 以太网已连接但是无法联网_连接wifi时,出现“已连接但无法访问互联网”,这样做就可以了...
  7. 人类和编译器谁编写的代码更快?你们的答案也许都是错的
  8. [linux]解决DNS配置重启丢失
  9. [PYTHON]python 基础笔记(1)
  10. VC知识库五周年精华珍藏版(2CD)
  11. 将酷狗krc歌词转换为lrc格式
  12. 苹果电脑系统如何读取移动硬盘数据?
  13. 计算机考研哪个专业好就业,计算机专业考研选择哪个方向比较好就业?
  14. vs2013 打开失败 未能完成操作,不支持此接口
  15. 蓝桥杯省赛真题2016题解
  16. 微信小程登录功能和获取手机号
  17. 用html5制作闹钟,HTM5制作的闹钟
  18. 如何用 canvas 画出分形图
  19. 【对称加密与非对称加密】-- 概念、图示、优缺点
  20. 《Python数据分析与挖掘实战》示例源码免费下载

热门文章

  1. 发票查验、发票识别API
  2. reset()方法 submit()方法
  3. js监听中文拼音输入开始输入和输入完成的事件,用input事件用拼音输入法的大坑,由这两个事件来解决
  4. 氨基酸在php的溶液中,氨基酸等电点的计算和应用.ppt
  5. 家用计算机的ram怎么清理,电脑内存满了怎么清理【解决流程】
  6. 个人带领团队做过的事
  7. matlab 稀疏矩阵求 特征值
  8. OpenCV MPR.DLL WNetRestoreConnectionA相关问题
  9. 【lol版】2022年最新Java学习路线图(来自动力节点)
  10. Rayman的绝顶之路——Leetcode每日一题打卡13