|
看看360的关于卡巴bug的技术分析,果然360的工程师很牛x啊,太强悍了!~~~~~~~~~~
卡巴斯基2010安装后,其驱动Kilf.sys和Klbg.sys,会分别注册两个MiniFilter,一个用于实时病毒监控,一个用于它的SANDBOX虚拟化, 在系统开机之后,若有非系统卷加载,并有两个以上线程打开卷上的文件,将导致这两个驱动程序发生互锁。
一个典型的例子是,A软件的驱动程序去打开一个非系统卷的文件,例如f:\1.txt. 此时若这是开机以来第一次有人打开这个卷上的文件,那么这个卷会被挂载到文件系统上,并被FilterManager所得知, 此时kilf.sys会通过FilterManager调用FltpDoInstanceSetupNotification 函数来捕捉到这个操作,此时已经进入FilterManager对于FltpDoFilterNotificationForNewVolume 的一个锁(下面称LockA)中,接着,kilf.sys会调用API:FtlQueryVolumeInformation,来获取这个卷的信息,这个API函数会通过IoCreateFileEx来打开这个卷。
此时,卡巴斯基的另一个驱动Klbg.sys会拦截Kilf.sys的这个动作,在拦截处理中,会需要申请一个Klbg.sys自身使用的锁(下面称LockB),这个锁此时正是被锁定状态,因此这个线程会处于等待状态.
回到卷挂载的时候,这个卷的挂载后,若是NTFS文件系统,会触发NTFS驱动的EFS部分的一个线程:Ntfs!EfspCheckVolumeForRecoveryLog ,这个线程会试图打开卷及卷下的System Volume Information的相关文件,此时又被Klbg.sys拦截,此时Klbg.sys会进入锁定LockB,并去打开这个卷, 此时又触及了FilterManager的FltpDoFilterNotificationForNewVolume调用,由于这个函数在执行过程中需要等待LockA的解锁, 这样,两个线程就会发生互锁的状况,此时系统会被卡巴这两个系统锁住而无法继续启动,导致用户无法进入操作系统。
一个常见的互锁堆栈如下: !thread 860cc020
80785ca8 83c7bb15 860cc020 00000000 83d36d20 nt!KiSwapContext+0x26 (FPO: [Uses EBP] [0,0,4]) 80785ce0 83c7a403 860cc0e0 860cc020 86ff3f18 nt!KiSwapThread+0x266 80785d08 83c742cf 860cc020 860cc0e0 00000029 nt!KiCommitThreadWait+0x1df 80785d84 83cac193 86ff3f18 0000001b 00000000 nt!KeWaitForSingleObject+0x393 80785ddc 83c776ae 86ff3f18 86f24ec0 8a9dfce8 nt!ExpWaitForResource+0x16f 80785e28 843e13f9 843e3180 00000001 840207a0 nt!ExAcquireResourceExclusiveLite+0x1cf < -- Thread is locked by resource 843e3180 WARNING: Stack unwind information not available. Following frames may be wrong. 80785e44 8402092d 80000160 00220020 8cecd128 klbg+0x53f9 80785e88 843dfcb5 86ee0008 86ee0068 86f24ec0 hal!KeReleaseQueuedSpinLock+0x2d 80785f08 843ad9f0 80785f4c 86f244e8 00000000 klbg+0x3cb5 80785f20 843c11fe 80785f4c 843c4f3c 00000000 fltmgr!FltpPassThroughInternal+0x40 (FPO: [2,0,4]) 80785f34 843c18b7 80785f4c 86f244e8 86f24460 fltmgr!FltpCreateInternal+0x24 (FPO: [1,0,4]) 80785f78 83c494bc 870a4a10 870b3008 86f244bc fltmgr!FltpCreate+0x2c9 (FPO: [2,11,4]) 80785f90 83e4d62d 1ceaea86 80786138 00000000 nt!IofCallDriver+0x63 80786068 83e2e1d7 86e620e8 860ed938 87078d20 nt!IopParseDevice+0xed7 807860e4 83e5424d 00000000 80786138 00000240 nt!ObpLookupObjectName+0x4fa 80786144 83e4c5ab 807862f0 860ed938 9021a500 nt!ObOpenObjectByName+0x159 807861c0 83e83d99 80786330 00100180 807862f0 nt!IopCreateFile+0x673 8078621c 843c3b62 80786330 00100180 807862f0 nt!IoCreateFileEx+0x9e 807862a8 843cc866 86fc08b8 86f24a40 80786330 fltmgr!FltCreateFileEx2+0xba (FPO: [SEH]) 80786310 843cce92 86f24a40 80786330 00000000 fltmgr!FltOpenVolume+0x66 (FPO: [3,8,0]) 80786328 90241a45 86f24a40 80786380 80786394 fltmgr!FltQueryVolumeInformation+0x14 (FPO: [5,0,4]) 807863d8 843c2bf5 807863f4 00000005 00000008 klif+0x36a45 8078640c 843c3417 86f24a40 00000005 0443fdfb fltmgr!FltpDoInstanceSetupNotification+0x69 (FPO: [2,6,4]) 80786458 843c37d1 86fc08b8 870b3008 00000005 fltmgr!FltpInitInstance+0x25d (FPO: [SEH]) 807864c8 843c38d7 86fc08b8 870b3008 00000005 fltmgr!FltpCreateInstanceFromName+0x285 (FPO: [7,17,0]) 80786534 843cccde 86fc08b8 870b3008 00000005 fltmgr!FltpEnumerateRegistryInstances+0xf9 (FPO: [SEH]) 80786584 843c17f4 870b3008 870bd8c0 870af6f0 fltmgr!FltpDoFilterNotificationForNewVolume+0xe0 < - Enter NewVolume Lock 807865c8 83c494bc 870a4a10 870b3008 870af74c fltmgr!FltpCreate+0x206 (FPO: [2,11,4]) 807865e0 83e4d62d 1ceaec56 80786788 00000000 nt!IofCallDriver+0x63 807866b8 83e2e1d7 86e620e8 840ed938 86fc5938 nt!IopParseDevice+0xed7 80786734 83e5424d 00000000 80786788 00000240 nt!ObpLookupObjectName+0x4fa 80786790 83e4c5ab 807868b8 860ed938 80786800 nt!ObOpenObjectByName+0x159 8078680c 83e9707d 807868f8 80100000 807868b8 nt!IopCreateFile+0x673 80786854 9026e07e 807868f8 80100000 807868b8 nt!IoCreateFile+0x38 80786b9c 83fbe853 00000001 00000000 80786bd4 nt!IopLoadDriver+0x7ed 80786be8 83fba87b 80813360 8080b4b0 00000000 nt!IopInitializeSystemDrivers+0x163 80786c6c 83fbfe6f 0080b4b0 8602b500 860cc020 nt!IoInitSystem+0x6de
Thread 860cc020 is locked by resource 843e3180
0: kd> !locks 843e3180 Resource @ klbg (0x843e3180) Shared 1 owning threads Contention Count = 351 NumberOfExclusiveWaiters = 1 Threads: 86ee8d28-01< *> Threads Waiting On Exclusive Access: 860cc020
Lock 843e3180 is locked by Thread 86ee8d28
!thread 86ee8d28 Win32 Start Address Ntfs!EfspCheckVolumeForRecoveryLog (0x84a8d6dd) Stack Init 8ed96fd0 Current 8ed962b0 Base 8ed97000 Limit 8ed94000 Call 0 Priority 14 BasePriority 8 UnusualBoost 6 ForegroundBoost 0 IoPriority 2 PagePriority 5 ChildEBP RetAddr Args to Child 8ed962c8 83c7bb15 86ee8d28 00000000 83d36d20 nt!KiSwapContext+0x26 (FPO: [Uses EBP] [0,0,4]) 8ed96300 83c7a403 86ee8de8 86ee8d28 86f02308 nt!KiSwapThread+0x266 8ed96328 83c742cf 86ee8d28 86ee8de8 00000029 nt!KiCommitThreadWait+0x1df 8ed963a4 83cac193 86f02308 0000001b 00000000 nt!KeWaitForSingleObject+0x393 8ed963fc 83c776ae 86f02308 00000000 83c495bd nt!ExpWaitForResource+0x16f 8ed96448 843ccc3b 870b3420 00000001 0ae2fd37 nt!ExAcquireResourceExclusiveLite+0x1cf < - Thread 86ee8d28 is locked by 870b3420 8ed96494 843c17f4 870b3008 8718cd38 871894b8 fltmgr!FltpDoFilterNotificationForNewVolume+0x3d (FPO: [SEH]) 8ed964d8 83c494bc 870a4a10 870b3008 87189514 fltmgr!FltpCreate+0x206 (FPO: [2,11,4]) 8ed964f0 83e4d62d 124bef26 8ed96698 00000000 nt!IofCallDriver+0x63 8ed965c8 83e2e1d7 86e620e8 840ed938 86f1ad20 nt!IopParseDevice+0xed7 8ed96644 83e5424d 00000000 8ed96698 00000240 nt!ObpLookupObjectName+0x4fa 8ed966a4 83e4c5ab 8ed96870 860ed938 00000700 nt!ObOpenObjectByName+0x159 8ed96720 83e57eb6 8ed9685c 00100000 8ed96870 nt!IopCreateFile+0x673 8ed9676c 83c5042a 8ed9685c 00100000 8ed96870 nt!NtCreateFile+0x34 8ed9676c 83c4decd 8ed9685c 00100000 8ed96870 nt!KiFastCallEntry+0x12a (FPO: [0,3] TrapFrame @ 8ed967a0) 8ed96810 843df846 8ed9685c 00100000 8ed96870 nt!ZwCreateFile+0x11 (FPO: [11,0,0]) WARNING: Stack unwind information not available. Following frames may be wrong. 00000000 00000000 00000000 00000000 00000000 klbg+0x3846
0: kd> !locks 870b3420 Resource @ 0x870b3420 Exclusively owned Contention Count = 2 NumberOfExclusiveWaiters = 2 Threads: 860cc020-01< *> Threads Waiting On Exclusive Access: 86ee8d28 870af790 1 total locks, 1 locks currently held
Thread 86ee8d28 is locked by 870b3420 Lock 870b3420 is locked By Thread 860cc020
因此,线程860cc020 被线程86ee8d28持有的锁 锁定,而线程86ee8d28 被线程860cc020 持有的锁锁定,最后互锁了。 由于线程860cc020是操作系统初始化过程Phase1Initialization-> IoInitSystem的线程,因此系统在此会卡住,无法进入。
|