首页 > AI教程资讯 >54亿美金蒸发,83岁老人失踪!30天崩一个系统,微软急发事故报告

54亿美金蒸发,83岁老人失踪!30天崩一个系统,微软急发事故报告

2025-08-2002ai门户网

编辑:Aeneas好困

【本站导读】史上最大规模TI故障,已经为财富500强带来了54亿美元损失,甚至导致一位83岁老人失踪至今未归。如今,微软终于给出了一份详尽的分析报告。

7月19日那场震惊全球的「史上最大规模IT故障」,影响还在继续……

25日,情况最为严重、持续时间也最长的航司——达美航空,终于完成了系统修复,恢复正常运营。期间,共有2500多个航班被迫取消。

27日,美国奥兰多**局发布寻人启事称,一名83岁男子在因CrowdStrike宕机导致回家航班被取消后,已经失踪一周了。

根据分析和保险服务商Parametrix的计算,这次宕机事件给财富500强企业带来了高达54亿美元的损失。

而这种搞崩全球设备的操作,可以算是CrowdStrike家的传统艺能了。

首席执行官GeorgeKurtz早在2010年的WindowsXP时代,就曾在McAfee用一个更新搞崩了全球设备;跟CEO的作风类似的,CrowdStrike在过去的四个月里,差不多每30天就要搞垮一个操作系统!

终于,在7月27日,微软针对这次CrowdStrike导致的全球蓝屏事件,给出了一份官方的分析。

「Windows安全工具的集成与管理最佳实践」

而看完报告之后,网友纷纷开启了嘲讽模式:

「难道CrowdStrike的高层领导都睡着了?为什么连续几个月来每30天都会发生这么多事件?」

「微软已经在言辞上尽可能地保持委婉了,但这绝对是对CrowdStrike的一记耳光!」

CrowdStrike不知道如何展开工作,并且需要基本的质量保证(QA)实践指导,我们很乐意教他们……

接着,便列出了一堆在用户模式下运行的功能,告诉他们如何避免需要在内核模式下运行太多东西。

有人表示,自己在微软工作的朋友对此深表不满,每次有类似的宕机事件,微软都得背黑锅。

「接口之所以这样设计,是因为不在内核模式下进行,就很难在实时文件系统过滤中获得足够的性能。这是困扰很多操作系统的难题。」

实际上,微软允许第三方代码加载到自己的内核,跟其他的主要操作系统内核(Linux或AppleXNU之类)并没什么不同。

这次的问题主要是,CrowdStrike在内核模式下做了很多本可以在用户模式下完成的事情。

接下来,就让我们看看,微软官方对于宕机事件的详细分析。

CrowdStrike事件分析

在博客中,微软解释了为什么现在的安全产品,必须使用内核模式驱动程序。

为此,Windows也为第三方解决方案提供了安全措施。

报告中,CrowdStrike将原因归根为内存安全问题,特别是CSagent驱动程序中的越界读取访问违规

对于CrowdStrike给出的解释,微软利用MicrosoftWinDBG内核调试器和任何人都可免费谁用的几个扩展,来执行了如下分析。

基于Microsoft对与该事件相关的Windows错误报告(WER)内核崩溃转储的分析,可以观察到反映这一点的全球崩溃模式:

FAULTING_THREAD:ffffe402fe868040READ_ADDRESS:ffff840500000074PagedpoolMM_INTERNAL_CODE:2IMAGE_NAME:csagent.sysMODULE_NAME:csagentFAULTING_MODULE:fffff80671430000csagentPROCESS_NAME:SystemTRAP_FRAME:ffff94058305ec20--(.trap0xffff94058305ec20).trap0xffff94058305ec20NOTE:Thetrapframedoesnotcontainallregisters.Someregistervaluesmaybezeroedorincorrect.rax=ffff94058305f200rbx=0000000000000000rcx=0000000000000003rdx=ffff94058305f1d0rsi=0000000000000000rdi=0000000000000000rip=fffff806715114edrsp=ffff94058305edb0rbp=ffff94058305eeb0r8=ffff840500000074r9=0000000000000000r10=0000000000000000r11=0000000000000014r12=0000000000000000r13=0000000000000000r14=0000000000000000r15=0000000000000000iopl=0nvupeingnznaponccsagent+0xe14ed:fffff806`715114ed458b08movr9d,dwordptr[r8]ds:ffff8405`00000074=????????.trapResettingdefaultscopeSTACK_TEXT:ffff9405`8305e9f8fffff806`5388c1e4:00000000`00000050ffff8405`0000007400000000`00000000ffff9405`8305ec20:nt!KeBugCheckExffff9405`8305ea00fffff806`53662d8c:00000000`0000000000000000`0000000000000000`00000000ffff8405`00000074:nt!MiSystemFault+0x1fcf94ffff9405`8305eb00fffff806`53827529:ffffffff`00000030ffff8405`af8351a2ffff9405`8305f020ffff9405`8305f020:nt!MmAccessFault+0x29cffff9405`8305ec20fffff806`715114ed:00000000`00000000ffff9405`8305eeb0ffff8405`b0bcd00cffff8405`b0bc505c:nt!KiPageFault+0x369ffff9405`8305edb0fffff806`714e709e:00000000`0000000000000000`e01f008dffff9405`8305f102fffff806`716baaf8:csagent+0xe14edffff9405`8305ef50fffff806`714e8335:00000000`0000000000000000`0000001000000000`00000002ffff8405`b0bc501c:csagent+0xb709effff9405`8305f080fffff806`717220c7:00000000`0000000000000000`00000000ffff9405`8305f38200000000`00000000:csagent+0xb8335ffff9405`8305f1b0fffff806`7171ec44:ffff9405`8305f668fffff806`53eac2b0ffff8405`afad4ac000000000`00000003:csagent+0x2f20c7ffff9405`8305f430fffff806`71497a31:00000000`0000303bffff9405`8305f6f0ffff8405`afb1d140ffffe402`ff251098:csagent+0x2eec44ffff9405`8305f5f0fffff806`71496aee:ffff8405`afb1d140fffff806`71541e7e00000000`000067a0fffff806`7168f8f0:csagent+0x67a31ffff9405`8305f760fffff806`7149685b:ffff9405`8305f9d8ffff8405`afb1d230ffff8405`afb1d140ffffe402`fe8644f8:csagent+0x66aeeffff9405`8305f7d0fffff806`715399ea:00000000`4a8415aaffff8eee`1c68ca4f00000000`00000000ffff8405`9e95fc30:csagent+0x6685bffff9405`8305f850fffff806`7148efbb:00000000`00000000ffff9405`8305fa59ffffe402`fe864050ffffe402`fede62c0:csagent+0x1099eaffff9405`8305f980fffff806`7148edd7:ffffffff`ffffffa1fffff806`7152e5c1ffffe402`fe86405000000000`00000001:csagent+0x5efbbffff9405`8305fac0fffff806`7152e681:00000000`00000000fffff806`5378927200000000`00000002ffffe402`fede62c0:csagent+0x5edd7ffff9405`8305faf0fffff806`53707287:ffffe402`fe86804000000000`00000080fffff806`7152e510006fe47f`b19bbdff:csagent+0xfe681ffff9405`8305fb30fffff806`5381b8e4:ffff9680`37651180ffffe402`fe868040fffff806`5370723000000000`00000000:nt!PspSystemThreadStartup+0x57ffff9405`8305fb8000000000`00000000:ffff9405`83060000ffff9405`8305900000000000`0000000000000000`00000000:nt!KiStartSystemThread+0x34

如果深入分析这个崩溃转储,就可以恢复访问违规时的堆栈帧,从而了解更多起因了。

然而不幸的是,由于使用WER数据时,微软只能接收到压缩状态,因此就无法反向反汇编,查看崩溃前的更多指令了。

不过,在反汇编中可以看到,在读取R8寄存器中指定的地址之前,有一个NULL检查:

6:kd>.trap0xffff94058305ec20.trap0xffff94058305ec20NOTE:Thetrapframedoesnotcontainallregisters.Someregistervaluesmaybezeroedorincorrect.rax=ffff94058305f200rbx=0000000000000000rcx=0000000000000003rdx=ffff94058305f1d0rsi=0000000000000000rdi=0000000000000000rip=fffff806715114edrsp=ffff94058305edb0rbp=ffff94058305eeb0r8=ffff840500000074r9=0000000000000000r10=0000000000000000r11=0000000000000014r12=0000000000000000r13=0000000000000000r14=0000000000000000r15=000000000000000iopl=0nvupeingnznaponccsagent+0xe14ed:fffff806`715114ed458b08movr9d,dwordptr[r8]ds:ffff8405`00000074=????????6:kd>!pteffff840500000074!pteffff840500000074VAffff840500000074PXEatFFFFABD5EAF57840PPEatFFFFABD5EAF080A0PDEatFFFFABD5E1014000PTEatFFFFABC202800000contains0A00000277200863contains0000000000000000pfn277200---DA--KWEVcontains0000000000000000notvalid6:kd>ubfffff806`715114edubfffff806`715114edcsagent+0xe14d9:fffff806`715114d904d8addal,0D8hfffff806`715114db750bjnecsagent+0xe14e8(fffff806`715114e8)fffff806`715114dd4d85c0testr8,r8fffff806`715114e07412jecsagent+0xe14f4(fffff806`715114f4)fffff806`715114e2450fb708movzxr9d,wordptr[r8]fffff806`715114e6eb08jmpcsagent+0xe14f0(fffff806`715114f0)fffff806`715114e84d85c0testr8,r8fffff806`715114eb7407jecsagent+0xe14f4(fffff806`715114f4)6:kd>ubfffff806`715114d9ubfffff806`715114d9^Unabletofindvalidpreviousinstructionfor"ubfffff806`715114d9"6:kd>ufffff806`715114ebufffff806`715114ebcsagent+0xe14eb:fffff806`715114eb7407jecsagent+0xe14f4(fffff806`715114f4)fffff806`715114ed458b08movr9d,dwordptr[r8]fffff806`715114f04d8b5008movr10,qwordptr[r8+8]fffff806`715114f44d8bc2movr8,r10fffff806`715114f7488d4d90learcx,[rbp-70h]fffff806`715114fb488bd6movrdx,rsifffff806`715114fee8212c0000callcsagent+0xe4124(fffff806`71514124)fffff806`715115034533d2xorr10d,r10d6:kd>dbffff840500000074dbffff840500000074ffff8405`00000074????????????????-????????????????????????????????ffff8405`00000084????????????????-????????????????????????????????ffff8405`00000094????????????????-????????????????????????????????ffff8405`000000a4????????????????-????????????????????????????????ffff8405`000000b4????????????????-????????????????????????????????ffff8405`000000c4????????????????-????????????????????????????????ffff8405`000000d4????????????????-????????????????????????????????ffff8405`000000e4????????????????-????????????????????????????????

观察以上结果,就可以证实CrowdStrike的分析是正确的——

在CrowdStrike开发的CSagent.sys驱动程序中,存在越界读取内存安全错误。

另外,微软还发现,csagent.sys模块被注册为文件系统过滤驱动程序——通常被反恶意软件用来接收与文件操作有关的通知。

安全软件会用它来扫描保存到磁盘的任何新文件,比如通过浏览器下载的文件。

typedefunion_FLT_PARAMETERS{...;struct{PIO_SECURITY_CONTEXTSecurityContext;ULONGOptions;USHORTPOINTER_ALIGNMENTReserved;USHORTShareAccess;PVOIDParameters;}CreatePipe;...;}FLT_PARAMETERS,*PFLT_PARAMETERS;

而且,文件系统过滤器还可以作为监控系统行为的安全解决方案的信号。

正如CrowdStrike在博客中指出,他们内容更新的一部分,就是更改传感器逻辑,以处理与命名管道创建相关的数据。

而文件系统过滤驱动程序API,允许驱动程序在系统上发生命名管道活动时接收调用,从而能够检测恶意行为。

这种驱动程序的一般功能,是与CrowdStrike分享的信息相关联的。

6:kd>!regquerykeyREGISTRYMACHINEsystemControlSet001servicescsagentHiveffff84059ca7b000KeyNodeffff8405a6f67f9c[SubKeyAddr][SubKeyName]ffff8405a6f683acInstancesffff8405a6f6854cSimUse"!regkeyinfoffff84059ca7b000"todumpthesubkeydetails[ValueType][ValueName][ValueData]REG_DWORDType2REG_DWORDStart1REG_DWORDErrorControl1REG_EXPAND_SZImagePath??C:Windowssystem32driversCrowdStrikecsagent.sysREG_SZDisplayNameCrowdStrikeFalconREG_SZGroupFSFilterActivityMonitorREG_MULTI_SZDependOnServiceFltMgrREG_SZCNFGConfig.sysREG_DWORDSupportedFeaturesf

可以看到,在CrowdStrike分析中指定的控制通道文件版本291也出现在了崩溃中,这表明文件已被读取。

如何确定文件本身与崩溃转储中观察到的访问违规相关联呢?这就需要使用这些工具对驱动程序进行额外的调试了。(这次咱不讨论)

!caffffde8a870a8290ControlArea@ffffde8a870a8290Segmentffff880ce0689c10Flinkffffde8a87267718Blinkffffde8a870a7d98SectionRef0PfnRefbMappedViews0UserRef0WaitForDel0FlushCount0FileObjectffffde8a879b29a0ModWriteCount0SystemViews0WritableRefs0PartitionId0Flags(8008080)FileWasPurgedOnUnusedListWindowsSystem32driversCrowdStrikeC-00000291-00000000-00000032.sys1:kd>!ntfskd.ccbffff880ce06f6970!ntfskd.ccbffff880ce06f6970Ccb:ffff880c`e06f6970Flags:00008003CleanupOpenAsFileIgnoreCaseFlags2:00000841OpenCompleteAccessAffectsOplocksSegmentObjectReferencedType:UserFileOpenFileObj:ffffde8a879b29a0(018)ffff880c`db937370FullFileName[WindowsSystem32driversCrowdStrikeC-00000291-00000000-00000032.sys](020)000000000000004CLastFileNameOffset(022)0000000000000000EaModificationCount(024)0000000000000000NextEaOffset(048)FFFF880CE06F69F8Lcb(058)0000000000000002TypeOfOpen

我们可以做的,是通过崩溃转储,来确定在崩溃发生时,运行的系统上是否存在其他由CrowdStrike提供的驱动程序。

6:kd>lmDvmCSFirmwareAnalysislmDvmCSFirmwareAnalysisBrowsefullmoduleliststartendmodulenamefffff806`58920000fffff806`5893c000CSFirmwareAnalysis(deferred)Imagepath:SystemRootsystem32DRIVERSCSFirmwareAnalysis.sysImagename:CSFirmwareAnalysis.sysBrowseallglobalsymbolsfunctionsdataSymbolReloadTimestamp:MonMar1811:32:142024(65F888AE)CheckSum:0002020EImageSize:0001C000Translations:0000.04b00000.04e40409.04b00409.04e4Informationfromresourcetables:6:kd>lmDvmcspcm4lmDvmcspcm4Browsefullmoduleliststartendmodulenamefffff806`71870000fffff806`7187d000cspcm4(deferred)Imagepath:??C:Windowssystem32driversCrowdStrikecspcm4.sysImagename:cspcm4.sysBrowseallglobalsymbolsfunctionsdataSymbolReloadTimestamp:MonJul818:33:222024(668C9362)CheckSum:00012F69ImageSize:0000D000Translations:0000.04b00000.04e40409.04b00409.04e4Informationfromresourcetables:6:kd>lmDvmcsboot.syslmDvmcsboot.sysBrowsefullmoduleliststartendmodulenameUnloadedmodules:fffff806`587d0000fffff806`587dc000CSBoot.sysTimestamp:unavailable(00000000)Checksum:00000000ImageSize:0000C0006:kd>!regquerykeyREGISTRYMACHINEsystemControlSet001servicescsboot!regquerykeyREGISTRYMACHINEsystemControlSet001servicescsbootHiveffff84059ca7b000KeyNodeffff8405a6f68924[ValueType][ValueName][ValueData]REG_DWORDType1REG_DWORDStart0REG_DWORDErrorControl1REG_EXPAND_SZImagePathsystem32driversCrowdStrikeCSBoot.sysREG_SZDisplayNameCrowdStrikeFalconSensorBootDriverREG_SZGroupEarly-Launch6:kd>!regquerykeyREGISTRYMACHINEsystemControlSet001servicescsdevicecontrol!regquerykeyREGISTRYMACHINEsystemControlSet001servicescsdevicecontrolHiveffff84059ca7b000KeyNodeffff8405a6f694ac[SubKeyAddr][VolatileSubKeyName]ffff84059ce196c4EnumUse"!regkeyinfoffff84059ca7b000"todumpthesubkeydetails[ValueType][ValueName][ValueData]REG_DWORDType1REG_DWORDStart3REG_DWORDErrorControl1REG_DWORDTag1fREG_EXPAND_SZImagePathSystemRootSystem32driversCSDeviceControl.sysREG_SZDisplayName@oem40.inf,%DeviceControl.SVCDESC%;CrowdStrikeDeviceControlServiceREG_SZGroupBaseREG_MULTI_SZOwnersoem40.inf!csdevicecontrol.inf_amd64_b6725a84d4688d5a!csdevicecontrol.inf_amd64_016e965488e83578REG_DWORDBootFlags146:kd>!regquerykeyREGISTRYMACHINEsystemControlSet001servicescsagent!regquerykeyREGISTRYMACHINEsystemControlSet001servicescsagentHiveffff84059ca7b000KeyNodeffff8405a6f67f9c[SubKeyAddr][SubKeyName]ffff8405a6f683acInstancesffff8405a6f6854cSimUse"!regkeyinfoffff84059ca7b000"todumpthesubkeydetails[ValueType][ValueName][ValueData]REG_DWORDType2REG_DWORDStart1REG_DWORDErrorControl1REG_EXPAND_SZImagePath??C:Windowssystem32driversCrowdStrikecsagent.sysREG_SZDisplayNameCrowdStrikeFalconREG_SZGroupFSFilterActivityMonitorREG_MULTI_SZDependOnServiceFltMgrREG_SZCNFGConfig.sysREG_DWORDSupportedFeaturesf6:kd>lmDvmCSFirmwareAnalysislmDvmCSFirmwareAnalysisBrowsefullmoduleliststartendmodulenamefffff806`58920000fffff806`5893c000CSFirmwareAnalysis(deferred)Imagepath:SystemRootsystem32DRIVERSCSFirmwareAnalysis.sysImagename:CSFirmwareAnalysis.sysBrowseallglobalsymbolsfunctionsdataSymbolReloadTimestamp:MonMar1811:32:142024(65F888AE)CheckSum:0002020EImageSize:0001C000Translations:0000.04b00000.04e40409.04b00409.04e4Informationfromresourcetables:6:kd>!regquerykeyREGISTRYMACHINEsystemControlSet001servicescsfirmwareanalysis!regquerykeyREGISTRYMACHINEsystemControlSet001servicescsfirmwareanalysisHiveffff84059ca7b000KeyNodeffff8405a6f69d9c[SubKeyAddr][VolatileSubKeyName]ffff84059ce197ccEnumUse"!regkeyinfoffff84059ca7b000"todumpthesubkeydetails[ValueType][ValueName][ValueData]REG_DWORDType1REG_DWORDStart0REG_DWORDErrorControl1REG_DWORDTag6REG_EXPAND_SZImagePathsystem32DRIVERSCSFirmwareAnalysis.sysREG_SZDisplayName@oem43.inf,%FirmwareAnalysis.SVCDESC%;CrowdStrikeFirmwareAnalysisServiceREG_SZGroupBootBusExtenderREG_MULTI_SZOwnersoem43.inf!csfirmwareanalysis.inf_amd64_12861fc608fb14406:kd>!regquerykeyREGISTRYMACHINEsystemControlset001controlearlylaunch!regquerykeyREGISTRYMACHINEsystemControlset001controlearlylaunch

从上述分析中可见,CrowdStrike加载了四个驱动程序模块。

其中一个模块根据CrowdStrike的初步事件后审查时间线,会频繁接收动态控制和内容更新。

利用此次崩溃的独特堆栈和属性,便可以识别出由CrowdStrike特定编程错误导致的Windows崩溃报告。

图1CrowdStrike驱动程序相关的崩溃转储报告随时间的变化(仅包括选择上传的用户)

总之,这次全球宕机事件告诉我们:任何无效内存访问之类的可靠性问题,如果没有结合安全部署实践,都会导致严重的后果。

所以,为什么安全解决方案必须在Windows上使用内核驱动程序呢?

对此,微软给出了以下解释。

为什么安全解决方案,必须依赖内核驱动程序

首先最重要的一点原因,就是内核驱动程序允许系统范围的可见性。

而且,它能在早起启动时运行,这样就能检测出像启动工具包和根工具包这样的威胁(要知道,后者可是在用户模式应用程序加载前,就可以运行的)。

微软为内核驱动程序提供了一套丰富的功能,包括用于进程和线程创建的系统事件回调,以及可以监控文件创建、删除或修改的过滤驱动程序。

而且,内核活动还可以触发回调,让驱动程序决定何时阻止文件或创建进程。

因此,许多供应商都是用NDIS驱动,在内核中使用驱动程序来收集各种网络信息。

性能

内核驱动程序,还会带来潜在的性能优势。

比如,它可以帮助进行高吞吐量的网络活动分析或数据收集。

当然,有许多场景可以在非内核模式下优化数据收集和分析操作,微软也会继续与生态系统合作。

防篡改能力

加载到内核模式的另一个好处,就是防篡改能力。

即使攻击者具有管理员权限,安全产品也不希望软件被恶意软件、针对性攻击或恶意的内部人员击溃。

另一个要求,就是让驱动程序尽早加载,以便尽早观察到系统事件。

为此,微软提供了一种机制,可以在启动过程的早期,启动标记为早期启动反恶意软件(ELAM)的驱动程序。

内核驱动程序提供了以上好处,但是是以弹性为代价的。

因此,安全供应商在使用内核驱动程序时,就必须仔细权衡利弊,平衡可见性和防篡改需求,与在内核模式下操作的风险。

微软表示,如今安全工具已经可以在安全性和可靠性之间实现平衡。

例如,安全供应商可以使用在内核模式下运行的最小传感器进行数据收集和执行,以限制暴露于可用性问题的风险。

其余的关键产品功能则在用户模式下隔离进行,然后再恢复。

图2平衡安全性和可靠性的示例安全产品架构

而对于用户模型保护方法,Windows也同样提供了几种防篡改的方法,比如基于虚拟化的安全(VBS)隔离区和受保护进程,以及ETW事件和用户模式接口,如反恶意软件扫描接口。

如何在更高安全模式下进行部署

微软表示,Windows本质上是一个开放、多功能的操作系统,可以通过集成工具轻松锁定,以提高安全性。

此外,Windows也在不断增加安全默认值,包括在Windows11中默认启用的数十个新的安全功能。

在Windows的自我防御方面,默认启用的关键反恶意软件功能包括:

安全启动(SecureBoot):通过在系统启动过程中强制执行签名一致性,防止早期启动恶意软件和rootkit

测量启动(MeasuredBoot):通过集成的证明服务(如设备健康证明)提供基于TPM的硬件加密测量,以检测启动时的属性。

内存完整性(Memoryintegrity,也称HVCI):防止在内核中运行时生成动态代码,确保控制流完整性

易受攻击驱动程序阻止列表:集成在操作系统中并由微软管理,与恶意驱动程序黑名单相辅相成

受保护的本地安全机构(ProtectedLocalSecurityAuthority):负责保护一系列凭据,企业版默认开启基于硬件的凭据保护

MicrosoftDefenderAntivirus:在整个操作系统中提供反恶意软件保护

利用Windows集成的安全功能来防止攻击,可以提高安全性,同时减少成本和复杂性。可参考的最佳实践如下:

通过AppControlforBusiness来编写一个安全策略,只允许受信任和/或业务关键的应用程序

结合内存完整性(Memoryintegrity)与特定的允许列表策略,利用基于虚拟化的安全性(VBS)进一步保护Windows内核

以标准用户身份运行,并仅在必要时提升权限

使用设备健康证明(DeviceHealthAttestation,DHA)监控设备的正确安全策略,包括硬件基础的机器安全姿态测量

为反恶意软件生态提供最佳实践

最后,微软计划利用新推出的数十种安全功能和架构改进,来帮助反恶意软件完成方法的现代化,从而提升安全性和可靠性:

提供安全部署指南、最佳实践和技术,使执行安全产品更新更安全

减少内核驱动程序访问重要安全数据的需求

提供增强的隔离和防篡改能力,如VBSenclaves技术

启用零信任方法,如高完整性证明

微软表示,Windows今后将继续创新并提供新的方法,使安全工具能够安全地检测和响应新兴威胁。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表本站立场。文章及其配图仅供学习分享之

2552
434