AI-NEWS · 2024年 7月 22日

Crowdstrike 分析 [译]

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
    

关键点:

  • 程序崩溃原因:未检查对象是否为空,试图访问对象的成员变量导致崩溃。
  • 特权访问:该问题发生在系统驱动程序中,这类程序拥有对计算机的特权访问,操作系统出于谨慎考虑会立即崩溃。

改进建议:

  1. 代码审查和工具:增加代码安全官员,安装代码清理工具以自动捕获类似问题。
  2. 语言转换:将系统驱动程序从 C++ 重写为更现代的语言如 Rust,后者没有这个问题。
  3. 微软策略改进:建议 Microsoft 制定更好的策略来回滚有缺陷的驱动程序,而不是直接推送风险更新给客户。

背景评论:

  • 阴谋论:存在一些关于转向 Rust 的阴谋论,但主要关注点仍在于提高代码安全性。

Source:https://baoyu.io/translations/security/crowdstrike-analysis