ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows Driver Samples 之 SDV-FailDriver-WDM:用 Static Driver Verifier 在 WDM 驱动中发现 5 类缺陷

Windows Driver Samples 之 SDV-FailDriver-WDM:用 Static Driver Verifier 在 WDM 驱动中发现 5 类缺陷 示例工程【免费下载链接】Windows-driver-samplesThis repo contains driver samples prepared for use with Microsoft Visual Studio and the Windows Driver Kit (WDK). It contains both Universal Windows Driver and desktop-only driver samples.项目地址https://gitcode.com/gh_mirrors/wi/Windows-driver-samples点击查看免费下载本篇技术指南以 Windows-driver-samples 仓库中 SDV-FailDriver-WDM 示例为核心讲解如何使用随 WDK 附带的静态验证工具 Static Driver VerifierSDV对 WDM 内核驱动进行 DDI 使用规则验证。该示例驱动被刻意注入了 5 处代码缺陷通过本文你将掌握如何在 Visual Studio 中启动并配置 SDV、如何选择与驱动类型匹配的规则集、如何解读缺陷报告与 Trace Viewer 的代码路径以及这 5 类典型 WDM 缺陷各自对应的 DDI 规则与源码位置。⚠️ 注意SDV-FailDriver-WDM 系列示例驱动中故意包含代码错误其唯一目的是演示 SDV 的检测能力不具备任何实际功能也不应作为真实驱动开发项目的参考实现。请勿将其中任何写法复制进生产代码。示例概览一个注定失败的 WDM 驱动SDV-FailDriver-WDM 由解决方案文件 SDV-FailDriver-WDM.sln 与单个驱动项目组成项目位于 driver/ 目录文件作用fail_driver1.c驱动主实现内含 5 处故意缺陷每处均有英文注释标明注入目标规则fail_driver1.h头文件声明DRIVER_DEVICE_EXTENSION结构及各 Dispatch 例程fail_driver1.vcxprojMSBuild 工程文件DriverType为 WDM支持 Debug/Release × x64/ARM64sdv-user.sdvSDV 规则清单逐行列出本示例建议验证的 5 条规则名SDV-FailDriver-WDM.sln解决方案Visual Studio 17 可直接打开从工程配置看fail_driver1.vcxproj该项目面向 Windows 10 通用驱动目标平台工具集为WindowsKernelModeDriver10.0四个配置均开启/W4且将警告视为错误TreatWarningAsErrortrue。即便如此SDV 仍然能发现普通编译与静态分析如 PREfast难以捕捉的运行时 DDI 违规——这正是该示例的教学价值所在。驱动主体是一个典型的 WDM 结构DriverEntry注册 5 个 MajorFunctionCREATE/READ/POWER/SYSTEM_CONTROL/PNP、DriverAddDevice创建设备对象并挂接到设备栈还实现了中断服务例程InterruptServiceRoutine与 DPC 例程DpcForIsrRoutine。所有缺陷都伪装在看似正常的逻辑里只有 SDV 才能把它们逐一揪出。运行 SDV从 Visual Studio 启动静态分析前提安装 Windows Driver KitWDK并使用支持它的 Microsoft Visual Studio。打开解决方案后按以下步骤运行 SDV在Solution Explorer中选中驱动项目fail_driver1。从Driver菜单点击Launch Static Driver Verifier...打开 SDV 应用窗口在这里可以控制、配置和调度分析任务。若驱动依赖库如 KMDF 示例中的库项目需先在Libraries标签页添加库再开始分析本例 WDM 驱动无此步骤。SDV 会自动识别待分析驱动的类型WDF、WDM、NDIS 或 Storport并据此选中对应的默认规则集。首次运行建议直接使用默认规则集。缩短分析时间自定义规则选择为了尽快看到结果也可以改用Custom rule selection点击Clear All清空默认选择然后只勾选本示例对应的 5 条 WDM 规则。这 5 条规则同时被记录在 sdv-user.sdv 中CancelSpinLock IrqlIoApcLte IrqlKeSetEvent LowerDriverReturn SpinLock规则与驱动类型存在对应关系均属于 WDM 驱动的 DDI Compliance RulesDDI 合规规则。以sdv-user.sdv形式存在时SDV 可以直接按清单执行便于命令行或 CI 场景复用同一组规则。启动分析点击Main标签页中的Start。此时 SDV 会弹窗提示静态分析已加入调度队列且分析可能持续较长时间点击OK继续。等待期间 SDV 会持续汇报分析进度与统计信息。5 个刻意注入的缺陷与对应规则对 fail_driver1.c 逐函数核对可确认每一处注入缺陷与规则的一一对应关系。SDV 完成分析后将报出5 个缺陷正好对应以下 5 条规则。1. CancelSpinLock取消自旋锁未释放缺陷位于DispatchSystemControlfail_driver1.cIoAcquireCancelSpinLock(oldIrql); return STATUS_SUCCESS;CancelSpinLock规则要求驱动在调用IoAcquireCancelSpinLock后必须成对调用IoReleaseCancelSpinLock释放。该例程将 IRQL 提升到 DISPATCH_LEVEL 并持有全局取消自旋锁直接返回将导致锁泄漏、IRQL 错误恢复属严重缺陷。2. IrqlIoApcLte在错误的 IRQL 调用 IoGetInitialStack缺陷位于 DPC 例程DpcForIsrRoutinefail_driver1.c/* This defect is injected for IrqlIoApcLte rule */ IoGetInitialStack();IrqlIoApcLte规则约束驱动只能在IRQL APC_LEVEL时调用IoGetInitialStack。DPC 例程运行在 DISPATCH_LEVEL此处调用即违反该规则。3. IrqlKeSetEventDPC 路径中错误的 IRQL 下 KeSetEvent缺陷位于CompletionRoutinefail_driver1.cKeRaiseIrql(DISPATCH_LEVEL, oldIrql); /* This defect is injected for IrqlKeSetEvent rule */ KeSetEvent(Event, extension-Increment, TRUE);IrqlKeSetEvent规则要求KeSetEvent在调用时 IRQL 必须小于等于 DISPATCH_LEVEL且不得在 DISPATCH_LEVEL 使用非紧急等待语义。该例程先KeRaiseIrql(DISPATCH_LEVEL, ...)再调用KeSetEvent正落在规则的红线上。这条缺陷的完整路径还跨越了DispatchPower中的IoSetCompletionRoutinefail_driver1.c与IoCallDriver的调用关系SDV 的 Trace Viewer 会完整展示这条跨例程调用链。4. LowerDriverReturn覆盖下层驱动返回状态缺陷位于DispatchPnpfail_driver1.c/* This defect is injected for LowerDriverReturn rule. */ NTSTATUS status IoCallDriver(DeviceObject, Irp); PAGED_CODE(); status STATUS_SUCCESS; return status;LowerDriverReturn规则规定驱动不得用STATUS_SUCCESS覆盖下层驱动设备栈更底层驱动通过IoCallDriver返回的状态。此处无论下层返回什么status都被强制改写为STATUS_SUCCESS会破坏即插即用PnP错误传播链。5. SpinLockWDM获取自旋锁后未释放缺陷位于DispatchReadfail_driver1.cKSPIN_LOCK queueLock; KIRQL oldIrql; KeInitializeSpinLock(queueLock); KeAcquireSpinLock(queueLock, oldIrql); return STATUS_SUCCESS;SpinLockWDM规则要求KeAcquireSpinLock之后必须通过KeReleaseSpinLock释放并恢复保存的 IRQL。此处获取后直接返回自旋锁将永远无法释放后续任何对该锁的获取都会死锁。值得注意的一点普通编译器即使开启/W4也无法报出这些缺陷——它们是合法的 C 代码却违反 WDM 的运行时契约。这正是 SDV 这类静态验证工具的核心价值不运行驱动仅通过符号执行与规则引擎即可对 DDI 调用序列建模并发现违规。查看与分析结果分析完成后SDV 在Main标签页的Results区域汇总结果与统计信息。凡是未满足 DDI 使用规则的路径都会报告为Defect缺陷本例总计 5 个缺陷。在 Results 下点击Rules标签页可查看最近一次运行中每条规则的验证结果Pass未发现违反该规则的代码路径Defect发现违规且该行呈现为可点击链接。点击Defect链接会打开Static Driver Verifier Report PageSDV 报告页与Trace Viewer缺陷查看器。Trace Viewer 以图形化方式展示从入口到违规点的完整代码路径——例如上述DispatchPower → IoCallDriver → CompletionRoutine → KeSetEvent的调用链——逐条高亮每一步的 IRQL 状态与锁状态帮助开发者理解为什么这条路径违规。同系列示例KMDF / NDIS / Storport本仓库 tools/sdv/samples/ 下还提供同系列的另外 3 个失败驱动示例各自演示 SDV 在不同驱动模型下的规则检测可作为扩展学习材料SDV-FailDriver-KMDFKMDF 驱动含 8 个缺陷与一个库项目演示Libraries标签页的库处理流程如 DriverCreate、DeviceInitAPI 等 KMDF 规则SDV-FailDriver-NDISNDIS 驱动示例SDV-FailDriver-STORPORTStorport 存储驱动示例。三者的 README 结构与本例一致均围绕运行 SDV → 选择规则 → 启动分析 → 查看缺陷的同一流程方便对照不同驱动模型的规则差异。小结通过 SDV-FailDriver-WDM 示例可以确认以下几点SDV 是 WDK 附带的静态验证工具可在 Visual Studio 中直接启动并自动按驱动类型WDM/WDF/NDIS/Storport匹配默认规则集规则清单可沉淀为sdv-user.sdv文件复用本例即为 driver/sdv-user.sdv编译告警无法发现此类 DDI 契约违规SDV 的规则引擎与 Trace Viewer 才是定位这类问题的有效手段本示例的 5 个缺陷覆盖了自旋锁泄漏、IRQL 违规、状态覆盖三类最典型的 WDM 运行时错误是从零学习 WDM 驱动静态验证的绝佳教学素材。需要再次强调该驱动是失败驱动教学样例其代码刻意包含错误仅供学习 SDV 用法切勿作为真实驱动开发的蓝本。赞分享示例工程【免费下载链接】Windows-driver-samplesThis repo contains driver samples prepared for use with Microsoft Visual Studio and the Windows Driver Kit (WDK). It contains both Universal Windows Driver and desktop-only driver samples.项目地址https://gitcode.com/gh_mirrors/wi/Windows-driver-samples点击查看免费下载相关推荐Windows-driver-samples 实战用 DV-FailDriver-WDM 验证 Driver Verifier 与 Device Fundamentals 测试如何捕获注入缺陷Windows driver samples 实战用 DV FailDriver WDM 验证 Driver Verifier 与 Device Fundam示例工程终极指南如何使用SDV对Windows-driver-samples进行静态分析检测驱动缺陷终极指南如何使用SDV对Windows driver samples进行静态分析检测驱动缺陷 Windows驱动程序开发是系统编程中的关键技术领域而 Win示例工程SysVAD 虚拟音频设备驱动示例详解基于 WaveRT 与音频卸载的 WDM 音频驱动框架Windows-driver-samplesSysVAD 虚拟音频设备驱动示例详解基于 WaveRT 与音频卸载的 WDM 音频驱动框架Windows driver samples 本指南以 Mic示例工程上一篇LocalSend完整指南5分钟跑通无需互联网的跨平台文件传输下一篇Gatus插件系统功能扩展的架构设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表