一个内核资源泄漏样本(待更新文中链接)


2012-04-05

开发过程中,我习惯会一直开着verifier进行测试,绝大部分非逻辑错误都能被揪出来。
这两天测试部的同事反馈说貌似驱动有资源泄漏,我第一反应是“不会吧,有资源泄漏verifer早崩了”。
测试了一下,发现还真是驱动嫌疑最大,于是开启verifer和压力测试工具,跑了一会,停掉驱动。发现没有bsod,一脑子不理解。
看了下驱动停止后,内核内存情况:

0: kd> !poolused 7
   Sorting by  NonPaged Pool Consumed

  Pool Used:
            NonPaged                    Paged
 Tag    Allocs    Frees     Diff     Used *  Allocs    Frees     Diff     Used
 Proc    12980        1    12979  8618056 *       0        0        0        0  Process objects , Binary: nt!ps
 LSwi        1        0        1  2576384 *       0        0        0        0  initial work context 
 SePa   955604   942626    12978  2247904 *      17       16        1       16  Process audit image names and captured polity structures , Binary: nt!se
 TCPt    47617    47580       37  1423848 *       1        1        0        0  TCP/IP network protocol , Binary: TCP
 SeTd   372125   359104    13021   833344 *  372125   359104    13021  1145088  Security Token dynamic part , Binary: nt!se
 .... 省略若干不相干信息
 SEY6        0        0        0        0 *       1        1        0        0  UNKNOWN pooltag 'SEY6', please update pooltag.txt
 SEYC  1448369  1448369        0        0 *       0        0        0        0  UNKNOWN pooltag 'SEYC', please update pooltag.txt
 SEYB        0        0        0        0 *   47738    47738        0        0  UNKNOWN pooltag 'SEYB', please update pooltag.txt
 SEY5        0        0        0        0 *       1        1        0        0  UNKNOWN pooltag 'SEY5', please update pooltag.txt
 SEYA    46294    46294        0        0 *       0        0        0        0  UNKNOWN pooltag 'SEYA', please update pooltag.txt
 SEY4  1186033  1186033        0        0 *       0        0        0        0  UNKNOWN pooltag 'SEY4', please update pooltag.txt
 SEY3        1        1        0        0 *       1        1        0        0  UNKNOWN pooltag 'SEY3', please update pooltag.txt
 SEY9        0        0        0        0 *   47008    47008        0        0  UNKNOWN pooltag 'SEY9', please update pooltag.txt
 SEY2        0        0        0        0 *       1        1        0        0  UNKNOWN pooltag 'SEY2', please update pooltag.txt
 SEY1        0        0        0        0 *   54507    54507        0        0  UNKNOWN pooltag 'SEY1', please update pooltag.txt
 SEYD  1419958  1419958        0        0 *       0        0        0        0  UNKNOWN pooltag 'SEYD', please update pooltag.txt
 .... 省略若干不相干信息
 TOTAL    79306657 79234060    72597 22806272 38472704 38412253    60451 29841272

其中SEY?就是我的驱动使用的tag,发现没有泄漏,更一头雾水了。最后瞅到第一行,nnd,’Proc’这个tag明显有问题,基本没释放。
检查了一下代码,发现之前从网上摘的一段获取进程路径的函数,里面的错误结束分支没有释放EPREOCESS和句柄……
赶紧改掉了,这个bug存在了好多年啊,横跨我的几个驱动,之前从osr上摘下来的时候只是稍微调整了一下功能,没有再仔细审查……
警钟警钟~
有从我那篇《驱动中获取进程完整路径名》(@TODO)里拷代码的朋友也赶紧更新吧,对不住大伙~

几点体会:

  1. 别偷懒。不是自己写的代码更要仔细检查,哪怕出自osr这种权威级论坛。
  2. verifer不是万能的(至少在win2k3之前的版本),别偷懒。
  3. 别偷懒。