《测试之美_从内核到用户-全方位驱动程序安全性测试.pdf》由会员分享,可在线阅读,更多相关《测试之美_从内核到用户-全方位驱动程序安全性测试.pdf(33页珍藏版)》请在三个皮匠报告上搜索。
1、从内核到用户:全方位驱动程序安全性测试分享人:杨霄个人简介姓名:杨霄所在组织:技术中台-质量工程部专业领域:windows客户端安全测试目录010203驱动程序简介常见安全漏洞和案例分析驱动安全测试引言-驱动初印象驱动是一个用于让操作系统和硬件设备通信的软件组件引言-驱动初印象应用程序操作系统驱动硬件设备假设一个应用程序需要从硬件设备读取一些数据引言-驱动的扩展 并不是所有的驱动都必须由生产真实设备的厂商所写一般情况下设备都会按照已发布的硬件标准生产,所以按照标准的协议来开发即可。并不是所有的驱动程序都会直接与真实的设备进行通信在和真实硬件设备通信的过程中是一系列驱动配合完成的,中间层的一些驱
2、动并不会直接和硬件通信,只是做了一些数据的处理和传递。驱动程序是观察或参与操作系统和设备之间通信的任何软件组件引言-驱动的扩展应用程序软件驱动程序Kernel modeUser mode受保护的数据软件驱动程序始终在内核模式下运行。编写软件驱动程序的主要原因是要获取对仅在内核模式下可用的受保护数据的访问权限。但是,设备驱动程序并不总是需要访问内核模式数据和资源。因此某些设备驱动程序在用户模式下运行。驱动程序简介驱动程序简介-用户模式VS内核模式权限受限的执行环境,通常用于运行应用程序,不能直接访问操作系统内核和硬件。用户模式具有高权限和直接硬件访问能力的执行环境,通常用于运行操作系统内核和驱动
3、程序。内核模式驱动程序简介 驱动分类上层驱动中间层驱动底层驱动文件系统驱动网络协议驱动过滤驱动WFP设备驱动总线驱动驱动程序简介 驱动安全驱动在安全领域的应用 弹窗和拦截 HOOK 绑定与过滤 注册回调来监控驱动的安全隐患 权限滥用 内存安全 任意读,利用信息泄漏 任意写,污染关键数据结构驱动程序简介 驱动安全示例CVE-2021-3437|HP OMEN Gaming Hub 权限升级漏洞影响数百万台游戏设备漏洞本身源于名为“OMEN命令中心”中的一个组件,该组件预装载惠普 OMEN 品牌的笔记本电脑和台式电脑中,用于控制和优化设备 GPU、风扇速度、CPU 超频、内存等设置。惠普的OMEN
4、命令中心包含一个驱动存在漏洞,可以被攻击者利用,在不需要管理员权限的情况下实现权限升级到内核模式。HpPortIox64.sysWinRing0.sys驱动程序简介 驱动安全大事件01030402勒索软件利用Windows驱动程序漏洞关闭杀软Meltdown&Spectre,CPU暴露内存泄漏风险NVIDIA Windows GPU显示驱动中漏洞,导致信息泄露或权限提升HP OMEN驱动程序软件存在漏洞,可以进行提权利用不安全的驱动程序,可能会被利用作为攻击整个系统的跳板。常见安全漏洞和案例分析用户层R3与内核层R0通信通过DeviceIoControl函数来使应用程序与驱动程序通信:驱动程序
5、和应用程序自定义一种IO控制码,然后应用程序调用DeviceIoControl函数,DeviceIoControl函数会产生此控制码的IRP请求,系统就调用相应的处理该IRP请求的分发函数,在分发函数中判断,如果是自定义的控制码就进行相应的处理。传入控制码打开符号链接创建符号链接创建驱动对象创建驱动设备执行分发函数R0R3IRP请求内核漏洞案例分析缓冲区溢出-漏洞说明程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。示例:RtlCopyMemory函数没有对KernelBuffer大小进行验证,直接将size大小的userbuffer传入
6、缓冲区,没有进行大小的限制缓冲区溢出-利用方式利用驱动与R3通信,能够直接读取R3地址,改写缓冲区地址,直接将程序跳转到预先设定的目标程序代码上来执行。内核漏洞案例分析空指针漏洞-漏洞说明空指针Null Pointer指向0地址空间,如果不加判断就对其进行引用,会造成不可预知的后果。攻击者可以在0地址写入shellcode,调用空指针来执行。示例:清空指针(NullPointerDereference=NULL;)之后,未对NullPointerDereference进行检查判断,直接调用callback。内核漏洞案例分析空指针漏洞-利用方式利用NtAllocateVirtualMemory函
7、数,在0页申请内存,申请成功后,将攻击代码地址放入内核漏洞案例分析常见内核驱动漏洞不正确的函数调用函数调用最为常见的是不正确的 ZwXXX 函数调用:不能将任何用户态内存通过调用 ZwXXX 函数传递给内核。用户态内存未经过校验,传递给 ZwXXX 会让系统忽略内存检查,即使进行了校验,传递这样的内存给系统也容易引发崩溃。即便在外部有异常捕获,也可能造成内核内存泄露、对象泄露、甚至权限提升等严重问题。常见内核驱动漏洞不正确的内存操作譬如:没有在 try_except 内完成对于用户态内存的任何操作ProbeForRead 只检查在 probe 的那一刻,buff 地址是在用户态地址范围内。在t
8、ry,except块之外进行读写,这个时候并不能保证buff还是用户态的地址。常见内核驱动漏洞随意对外暴露接口小心对注册表、文件、内存、进程线程等操作的功能性接口暴露,如果不能完全杜绝存在被恶意利用的可能,尽量限制对驱动的调用。打开设备时检查是否保护进程(DisptchCreate)尽量禁止非 Admin 用户打开设备 如果是服务进程或常驻进程使用的驱动设备,可以在 IoCreateDevice 时对 Exclusive(排他性,只允许一个进程打开)参数传 TRUE,来杜绝其他进程打开设备 在打开的分发函数中获取调用者的pid,校验签名,禁止一切非受信进程的调用驱动安全测试方法分享驱动安全测试
9、方法分享使用安全清单(Security Checklist)是一种高效的方式,以确保驱动程序开发过程中注意到所有重要的安全方面设计阶段开发阶段测试阶段发布阶段01020304理解测试的功能和设计制定测试计划分析风险和攻击面设计测试用例静态测试动态测试测试用例覆盖WHQL签名测试金丝雀发布安全漏洞响应计划权限设计最小化安全更新限制暴露的攻击面 使用安全的函数 防止缓冲区溢出 防止未初始化内存访问 安全的I/O操作 代码审计 模糊测试 权限测试 接口安全测试签名检查响应策略监控机制测试左移测试右移驱动安全测试方法分享驱动安全测试用例设计驱动安全测试方法分享驱动安全静态测试静态分析指的是在源代码的编
10、译期间进行分析,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。WDK中提供的两种常用技术 PREfast for Drivers:在每个进程中深度分析可能的违例 Static Driver Verifier:延执行路径,跨进程间的边界warning 8103:Leaking the resource stored in warning 8103:Leaking the resource stored in SpinLock:MyLockSpinLock:MyLock.驱动安全测试方法分享驱动安全静态
11、测试PREfast 无法发现所有的错误:Null指针,未初始化的变量(延非常规路径)本地的泄漏(内存,资源)不匹配的参数 未检查返回值 格式/列表不匹配 一些IRQL的误用 容易忽略的各种特殊情况(例如,取消IRQL)回调/函数指针的恰当使用PREFASTPREFAST检测的缺项不仅仅是安全缺陷,但是安全缺陷类型是其检测的最为重要的部分驱动安全测试方法分享驱动安全动态测试-verifier驱动安全测试方法分享驱动安全动态测试-verifier驱动校验器可以帮助驱动程序员更容易的发现和定位到错误,建议在所有驱动测试中使用。但是校验器使用不当、测试人员对校验器功能不了解,当做黑盒工具来使用,可能导
12、致拖延项目进度,给定位问题带来困难。校验器使用规范常用的校验项1,校验器只能在干净的测试环境中使用,不要和任何带非正规驱动的软件共存使用,例如网络游戏、杀毒软件、安全软件(冰刃等)2,如果要进行兼容性测试,必须删除原有的Driver VERIFER设置。删 除 方 法 是 打 开 校 验 工 具,选 择“Delete existing settings”(vista下是“删除现有设置”),点击完成后重新启动系统 特殊池 死锁检测 强制IRQL检查 I/O验证 池跟踪 DMA检查 安全性检查 杂项检查驱动安全测试方法分享驱动安全动态测试-fuzzHOOK FUZZNtFuzz 是一个专门用于对
13、Windows NT 内核API进行模糊测试的工具。通过生成随机或半随机的输入数据来调用内核API。在驱动程序和操作系统内核层面,这种测试方法对于提高代码的稳健性和安全性非常有效。驱动安全测试方法分享驱动安全动态测试-fuzzIOCTL FUZZ通过hook ntdeviceiocontrolfile,捕获系统中所有的ioctl请求,当用户层与内核层发生通信的时候,就可以监控到这个操作并且可以对其中的输入输出数据进行修改,再将修改以后的数据传递给原始的NtDeviceIoControlFile 函数。如果将修改以后的数据发送给 NtDeviceIoControlFile 函数以后,发生了内核崩溃或蓝屏,往往预示着该驱动程序可能存在内核漏洞。驱动安全测试方法分享驱动安全WHQL签名测试微软签名系统正常加载WHQL测试70%15%15%WHQL驱动测试错误原因所占比例测试环境布置问题微软测试工具问题驱动自身问题WHQL驱动测试错误排查步骤 检查测试环境是否符合要求 分析测试日志 跟踪解析测试工具的执行结果WHQL驱动测试错误解决 对稳定的测试环境备份系统镜像 对需要填写测试配置的测试项分类保存 对重复操作用脚本替代THANK YOU