如何评价 7 月 19 日发生的全球范围内的 Windows 大面积蓝屏事件?具体原因是什么?
原因就是CrowdStrike这个垃圾软件导致的。
我是我们公司第一个蓝屏的!
大概在下午1点左右,在全球可能都算比较早的一批,我本地有保存minidump,所以第一时间就定位了是它,当时公司IT还以为是硬盘的问题。
我的运气比较好,只蓝屏了一次,后来很多人干脆无法启动了。
这个CrowdStrike号称是一个安全防护软件,据说能防勒索病毒之类的,但是它非常不好用,Windows系统上不做任何操作的情况下,CPU占用率都在20%左右,比当年的卡巴斯基还烂,它对你的系统有很多限制,对软件开发相当不友好。比如用VS随便写一个Windows程序,编译完了直接就被杀掉,甚至某些Python脚本里如果带了下载的功能,那么也被认为是病毒,属于宁可错杀一万也不放过一个的那种。论功能,它比MSE差的多。
这种东西在软件开发公司里使用就是一场灾难。
再配合企业的域管理和域策略,这玩意就是关也关不掉,还强制更新,甚至强制给你重启更新。
而且不知道这个公司怎么做的公关,现在欧美企业,尤其是美国企业,安装它成了标配,这家公司的市值也非常高(800亿美元),我严重怀疑这家公司的市值是否匹配它的技术能力,我甚至怀疑它是不是通过商业贿赂才做到这么大的市场的。
这件事情的恶劣影响在于,有相当一部分设备是无法启动的,这就需要人工去现场解决,任何情况下人力成本都是非常高的,尤其是在欧美,让IT人员一个一个电脑修复,那么工作量是非常恐怖的,因为电脑已经变砖了,远程修复不可能。如果设备在偏远山区,那么维护成本就是天价了。
要修复受影响的设备,需要IT人员去现场,切换到安全模式,把这个东西卸载或者人工打补丁,但是很多移动设备上的Windows都是默认打开bitlocker的,但是bitlocker的秘钥也是放在Windows机器上,存放bitlocker秘钥的机器也蓝屏了,然后就死锁了。
bitlocker + CrowdStrike才是最大的难题。
我不知道会不会有人起诉这家公司,我相信一定会的,而且我相信这家公司的股价肯定会大幅跳水,甚至不排除被人告到破产。
当然,我也不希望它破产,因为万一换上另一个更烂的供应商……那……。
这对于软件开发来说,最大的教训就是:测试的时候一般都只测试正常工作的代码路径,一般很少关注错误处理,而引发软件灾难的很多时候都是错误处理不到位。
安全软件如果做不好,就变成了不安全软件,并且安全软件一般都难以停止、卸载,就更不安全了。
这一波,对国外影响非常大,大部分外企都遭殃了。(估计国产软件又能吹一波?)
官方的回应(我感觉是废话):
根据评论,这家公司有一定美国政府背景,所以在安全领域,或者有安全需求的领域,欧美企业对这个软件几乎是要求强制安装的。
网络上转发的修复方式不一定都奏效的:要删除或者重命名出问题的文件,需要进入安全模式,但是如果开启了bitlocker,那么安全模式需要秘钥,企业里的秘钥很多都是集中管理的,集中管理秘钥的电脑也是Windows,也蓝屏了。
大部分公司的安全策略是:移动设备(比如笔记本)都要强制开启bitlocker,所以对于移动设备来说,恢复难度很大。
而且删除那个C-000029*.SYS文件不一定管用,下午时我尝试在一台没有bitlocker的设备上删除过,然后过一会又自动更新,恢复回来了。
补充一点乐子时间,内容摘自外网(乐子,不代表认可其说法正确):
I heard North Korea computer systems are doing very well.
Meanwhile in China: What outage???
Microsoft needs Testers
Hong Kong airport says flight operations not affected but some airlines hit
This is what happens when ONE COMPANY has tentacles attached to EVERYTHING! Did not the first Terminator movie warn us about Skynet?
Unplug it and plug it back in.
It's the Chinese! It's always been the Chinese! Oh wait, we OWN Microsoft
So this is why Mcdonalds got my order wrong this morning
Sooo no work today??
当时蓝屏的dump分析:(注:原始dump/SYS我目前拿不到了,电脑没有拿回来,放公司关机了,IT说没什么事尽量不要开机)
For analysis of this file, run !analyze -v
nt!KeBugCheckEx:
fffff805`77017f80 48894c2408 mov qword ptr [rsp+8],rcx ss:0018:fffffd89`395719c0=0000000000000050
3: kd> !analyze -v
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced. This cannot be protected by try-except.
Typically the address is just plain bad or it is pointing at freed memory.
Arguments:
Arg1: ffffe400000000a8, memory referenced.
Arg2: 0000000000000000, X64: bit 0 set if the fault was due to a not-present PTE.
bit 1 is set if the fault was due to a write, clear if a read.
bit 3 is set if the processor decided the fault was due to a corrupted PTE.
bit 4 is set if the fault was due to attempted execute of a no-execute PTE.
- ARM64: bit 1 is set if the fault was due to a write, clear if a read.
bit 3 is set if the fault was due to attempted execute of a no-execute PTE.
Arg3: fffff805893414ed, If non-zero, the instruction address which referenced the bad memory
address.
Arg4: 0000000000000002, (reserved)
Debugging Details:
------------------
KEY_VALUES_STRING: 1
Key : AV.Type
Value: Read
Key : Analysis.CPU.mSec
Value: 1468
Key : Analysis.Elapsed.mSec
Value: 1506
Key : Analysis.IO.Other.Mb
Value: 12
Key : Analysis.IO.Read.Mb
Value: 0
Key : Analysis.IO.Write.Mb
Value: 30
Key : Analysis.Init.CPU.mSec
Value: 483
Key : Analysis.Init.Elapsed.mSec
Value: 27920
Key : Analysis.Memory.CommitPeak.Mb
Value: 96
Key : Bugcheck.Code.LegacyAPI
Value: 0x50
Key : Bugcheck.Code.TargetModel
Value: 0x50
Key : Dump.Attributes.AsUlong
Value: 100c
Key : Dump.Attributes.DiagDataWrittenToHeader
Value: 1
Key : Dump.Attributes.ErrorCode
Value: 0
Key : Dump.Attributes.InsufficientDumpfileSize
Value: 1
Key : Dump.Attributes.KernelGeneratedTriageDump
Value: 1
Key : Dump.Attributes.LastLine
Value: Dump completed successfully.
Key : Dump.Attributes.ProgressPercentage
Value: 0
Key : Dump.Attributes.RequiredDumpfileSize
Value: 0x180243647
Key : Failure.Bucket
Value: AV_R_(null)_csagent!unknown_function
Key : Failure.Hash
Value: {0a7d0180-2167-fed0-1865-46fb6bb26816}
BUGCHECK_CODE: 50
BUGCHECK_P1: ffffe400000000a8
BUGCHECK_P2: 0
BUGCHECK_P3: fffff805893414ed
BUGCHECK_P4: 2
FILE_IN_CAB: 071924-35578-01.dmp
DUMP_FILE_ATTRIBUTES: 0x100c
Insufficient Dumpfile Size
Kernel Generated Triage Dump
READ_ADDRESS: fffff8057791c4a8: Unable to get MiVisibleState
Unable to get NonPagedPoolStart
Unable to get NonPagedPoolEnd
Unable to get PagedPoolStart
Unable to get PagedPoolEnd
unable to get nt!MmSpecialPagesInUse
ffffe400000000a8
MM_INTERNAL_CODE: 2
BLACKBOXBSD: 1 (!blackboxbsd)
BLACKBOXNTFS: 1 (!blackboxntfs)
BLACKBOXPNP: 1 (!blackboxpnp)
BLACKBOXWINLOGON: 1
CUSTOMER_CRASH_COUNT: 1
PROCESS_NAME: System
TRAP_FRAME: fffffd8939571be0 -- (.trap 0xfffffd8939571be0)
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=fffffd89395721c0 rbx=0000000000000000 rcx=0000000000000003
rdx=fffffd8939572190 rsi=0000000000000000 rdi=0000000000000000
rip=fffff805893414ed rsp=fffffd8939571d70 rbp=fffffd8939571e70
r8=ffffe400000000a8 r9=0000000000000000 r10=0000000000000000
r11=0000000000000014 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0 nv up ei ng nz na pe nc
csagent+0xe14ed:
fffff805`893414ed 458b08 mov r9d,dword ptr [r8] ds:ffffe400`000000a8=????????
Resetting default scope
STACK_TEXT:
fffffd89`395719b8 fffff805`770b1fb0 : 00000000`00000050 ffffe400`000000a8 00000000`00000000 fffffd89`39571be0 : nt!KeBugCheckEx
fffffd89`395719c0 fffff805`76e3014c : ffffe400`ebeecac8 00000000`00000000 00000000`00000000 ffffe400`000000a8 : nt!MiSystemFault+0x1b9d60
fffffd89`39571ac0 fffff805`7702917e : ffffc084`d2694868 00000000`00000001 fffffd89`39571fe0 fffffd89`39571fe0 : nt!MmAccessFault+0x29c
fffffd89`39571be0 fffff805`893414ed : 00000000`00000000 fffffd89`39571e70 ffffe401`0a0d600c ffffe401`0a0ce05c : nt!KiPageFault+0x37e
fffffd89`39571d70 00000000`00000000 : fffffd89`39571e70 ffffe401`0a0d600c ffffe401`0a0ce05c ffffe400`e7000140 : csagent+0xe14ed
SYMBOL_NAME: csagent+e14ed
MODULE_NAME: csagent
IMAGE_NAME: csagent.sys
STACK_COMMAND: .cxr; .ecxr ; kb
BUCKET_ID_FUNC_OFFSET: e14ed
FAILURE_BUCKET_ID: AV_R_(null)_csagent!unknown_function
OSPLATFORM_TYPE: x64
OSNAME: Windows 10
FAILURE_ID_HASH: {0a7d0180-2167-fed0-1865-46fb6bb26816}
Followup: MachineOwner