Crowdstrike 分析归纳总结
问题概述:
- 问题类型:由于 C++ 语言的不安全内存导致的空指针问题。
- 具体表现:计算机尝试读取无效的内存地址(0x9c,即156),导致程序崩溃。
技术细节:
- 内存组织:内存被组织成一个巨大的数字数组,通常用十六进制表示。
- 无效内存访问:0x9c 是无效的内存区域,任何对其数据的读取会导致 Windows 立即终止程序。
- 空指针使用:C++ 使用地址 0x0 表示“空值”,即不应访问的区域。
- 错误原因:程序员未进行必要的空值检查,直接访问了空指针的成员变量,导致崩溃。
示例代码解析:
- 空值检查示例:
string* p = get_name(); if (p == NULL) { print("无法获取名称"); }
- 结构体示例:
struct Obj { int a; int b; }; Obj* obj = new Obj(); // 地址示例:假设起始地址为 0x9030 // obj 是 0x9030,obj->a 是 0x9030 + 0x4,obj->b 是 0x9030 + 0x8
关键点:
- 程序崩溃原因:未检查对象是否为空,试图访问对象的成员变量导致崩溃。
- 特权访问:该问题发生在系统驱动程序中,这类程序拥有对计算机的特权访问,操作系统出于谨慎考虑会立即崩溃。
改进建议:
- 代码审查和工具:增加代码安全官员,安装代码清理工具以自动捕获类似问题。
- 语言转换:将系统驱动程序从 C++ 重写为更现代的语言如 Rust,后者没有这个问题。
- 微软策略改进:建议 Microsoft 制定更好的策略来回滚有缺陷的驱动程序,而不是直接推送风险更新给客户。
背景评论:
- 阴谋论:存在一些关于转向 Rust 的阴谋论,但主要关注点仍在于提高代码安全性。
Source:https://baoyu.io/translations/security/crowdstrike-analysis