搜索
缓存时间04 现在时间04 缓存数据 “白茶清欢无别事,我在等风也等你。”
查看: 523|回复: 4

知道为啥装有crowdstrike的电脑都蓝屏了

[复制链接]
发表于 2024-7-21 11:59:52 | 显示全部楼层 |阅读模式

厌倦了滚动浏览相同的帖子?当您创建帐户后,您将始终回到您离开的地方。使用帐户,不仅可以享受无广告的清爽界面!

您需要 登录 才可以下载或查看,没有账号?注册

×
它是来自内存不安全的 C++ 语言的空指针解引用导致。
这个sys文件在0x9c 属于无效地址。而计算机中的内存被设计成一个巨大的数字数组。
我们在这里将这些数字表示为十六进制,即以 16 为基数(十六进制),计算机尝试读取内存地址 0x9c(又名 156),对于任何程序来说,这都是无效的内存区域。任何试图读取此区域的程序都会立即被 Windows 杀死。
事实证明,crowdstrike 使用的语言 C++ 喜欢使用地址 0x0 作为特殊值,表示“这里什么都没有”,不要尝试访问它,否则你会模块将会死去。






C++ 程序员在传递对象时应该通过“检查完全空值”来检查这一点。
通常你会看到类似这样的内容:
  1. string* p = get_name();
  2. if (p == NULL) { print("Could not get name"); }
复制代码


  1. struct Obj {
  2.   int a;
  3.   int b;
  4. };
复制代码
如果我们创建一个指向它的指针:Obj* obj = new Obj();我们可以得到它的起始地址,假设它是一个随机数,如 0x9030=36912 (I我使用较小的数字)然后是地址:
  1. obj is 0x9030
  2.   obj->a is 0x9030 + 0x4
  3.   obj->b is 0x9030 + 0x8
复制代码
每个成员都是距离起始地址的偏移量。

现在我们假设以下情况:Obj* obj = NULL;然后是地址:
  1. obj is 0
  2.   obj->a is 0 + 4
  3.   obj->b is 0 + 8
复制代码
所以如果我对 NULL 指针执行此操作:print(obj->a);程序堆栈转储如上所示。它无法读取值 0x000000004



在此堆栈转储中,您可以看到它正在尝试读取内存值 0x9c。用人类数字来说,这是值 156。所以发生的事情是程序员忘记检查它正在处​​理的对象是否无效,它试图访问其中一个对象的成员变量

NULL + 0x9C = 0x9C = 156 ,因此0x9c的内存区域是无效区域。最致命的是,这是一个称为系统驱动程序的特殊程序,它对计算机具有特权访问权限。


因此,出于谨慎考虑,操作系统被迫立即崩溃。这就是导致蓝屏死机的原因。计算机可以通过简单地终止程序来从非特权代码崩溃中恢复,但不能终止系统驱动程序。当您的计算机崩溃时,95% 的时间是因为系统驱动程序崩溃。如果程序员检查了 NULL,或者使用了检查这类东西的现代工具,它本可以被发现。但不知何故它进入了生产环境,然后被 Crowdstrike 强制更新。


未来的解决办法是,微软需要有更好的政策来回滚有缺陷的驱动程序,而不仅仅是向客户提供原始的、危险的更新。Crowdstrike 可能会促使其代码安全官安装能够自动捕获此类问题的代码清理工具。而 Crowdstrike 可能会认真考虑将其系统驱动程序从当前的 C++ 重写为更现代的语言,如 Rust,而 Rust 不存在此问题。毕竟C++还是太古老了
爱生活,爱奶昔~
发表于 2024-7-21 14:35:27 | 显示全部楼层
学到了,学到了
爱生活,爱奶昔~
回复 支持 反对

使用道具 举报

发表于 2024-7-21 15:28:16 | 显示全部楼层
本帖最后由 yaoyao 于 2024-7-21 16:00 编辑

这里不是MS发布了更新,而是Crowdstrike发布了更新。所以MS其实应该是在这个事件中无责的,提供了安全模式且未被这种问题影响相当于给予了恢复可能。对于微软来说,操作系统的提供是AS-IS的,因此用户使用这种软件不应该在操作系统可控制范围内。如果可控制的话那win和ios没有多大区别了()
并且这不是第一次Crowdstrike坑操作系统了…… 大概三个月以前 RedHat内核害怕 也是因为 Crowdstrike
参考:https://access.redhat.com/solutions/7068083 https://news.ycombinator.com/item?id=41005936
也可以看出就算是rust之类所谓“内存安全”的东西 到最后也不好说会不会被写出的bug玩出花。

Crowdstrike 在这个事情中感觉可以说是主要责任了,QA没有发现这个问题,codereview也没有发现问题。还有一点是在用cpp写(和内核有关的)代码的时候没有抛异常(SIGSEGV)。


另外补充一下
https://x.com/vinceflibustier/status/1814334836892672420/photo/1 来看,可能是因为这里
size_t size = static_cast<size_t>(-1); 返回了一个巨大值(18446744073709551615)
之后 malloc(size) 不成功 因此 ptr 成了 NULL
后面就是分析的那样 0x9c未映射 出现了  0xc0000005 (Access Violation) 之后 BSOD


(另:楼主的这个内容的来源是 https://x.com/Perpetualmaniac/status/1814376668095754753

点评

专业啊!  发表于 2024-7-21 17:06
爱生活,爱奶昔~
回复 支持 反对

使用道具 举报

楼主| 发表于 2024-7-29 12:48:56 | 显示全部楼层
yaoyao 发表于 2024-7-21 15:28
这里不是MS发布了更新,而是Crowdstrike发布了更新。所以MS其实应该是在这个事件中无责的,提供了安全模式 ...

不过这套安全软件是真贵啊
爱生活,爱奶昔~
回复 支持 反对

使用道具 举报

Powered by Nyarime. Licensed

GMT+8, 2024-12-7 04:23 , Processed in 0.025218 second(s), 12 queries , Gzip On, Redis On
发帖际遇 ·手机版 ·小黑屋 ·RSS ·奶昔网

登录切换风格
快速回复 返回顶部 返回列表