驱动的可靠性和安全性是相互关联的。也就是说,创建可靠的驱动就意味着创建安全的驱动。安全的驱动可以是系统避免恶意的攻击。
当你编写即在用户态又在内核态可以执行的代码时,需要注重以下的原则:
不要相信运行时环境
也就是说,不要臆想你总是知道系统的那些部件会调用你的驱动。假设你初始设计了一个在数量有限的明确定义的环境中操作的软件,可信任的组件会调用你写的组件。在未来情况中,可能新的和未知的组件会在你不知情的情况下被添加到系统环境中。
基于上述运行时环境不值得信任的原则,你应该按照下列指导来编写你的设备驱动的代码:
●验证输入的参数
通常情况下,应当验证来自其他驱动、操作系统组件、用户态程序的参数的合法性。特别要注意来产生自用户态程序的参数。测试参数值,并确保它们在合法的范围内。测试输入缓冲,确保接受的参数不会超过缓冲区的大小。测试输出缓冲,确保输出缓冲的大小足够写出数据。
●给驱动支持的函数添加注释(注解?)以便于代码的分析
注解(例如__in, __out, __opt, 或者 __drv_requiresIRQL)给代码分析工具提供一些包括函数及其参数和它们潜在功能的附加信息。这些注解能帮助代码开发者提高效率,并且提高代码分析结果的精确性。例如,当你添加了一个指明缓冲区大小的注解时,代码分析工具会使用这个信息去检测会引起缓冲区溢出错误的条件。
●验证注册内容
在使用前先要验证注册的内容。注册内容应该被认为是不可靠的,用户可修改的数据。
●用户安全的字符串函数
当编写代码需要操作字符串时,使用用户安全的字符串函数来替代由C运行时库提供的字符串函数。安全字符串函数对用户态和内核态都可用,而且他们接受参数时可以有效避免缓冲区溢出错误。
更多的关于内核态驱动安全性和可靠性的讨论请见Creating Reliable
Kernel-Mode Drivers一节
PS:近期生活空虚无聊至极,又怕自己堕落,加上近期需要学习WDD的相关内容,所以就干脆仿照以前初中高中学习时的方法,做笔记吧,自然看E文材料就是翻译了,也算是给自己找点事情做,不让自己闲着吧。当然,我这个水货六级的水平自然不能精确表达原作者的意思,只好凑活发表了,希望没恶心到大家就好。
FROM firefox 3.6
阅读(1071) | 评论(0) | 转发(0) |