免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1040 | 回复: 0
打印 上一主题 下一主题

编写安全的驱动程序之输入输出检查 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:53 |只看该作者 |倒序浏览
编写安全的驱动程序之输入输出检查

输入输出检查是指对不可信的输入输出地址及数据长度进行合法性检查的过程。这种方法在Windows内核API中应用的十分广泛。

例如,在NtReadFile函数中,如果PreviousMode不是KernelMode,即NtReadFile函数是从用户态被调用的,可以使用ProbeForWrite函数检测输入输出缓冲区是否可写,参见ReactOS中的代码如下:

NTSTATUS NTAPI NtReadFile(IN HANDLE FileHandle,

           IN HANDLE Event OPTIONAL,

           IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,

           IN PVOID ApcContext OPTIONAL,

           OUT PIO_STATUS_BLOCK IoStatusBlock,

           OUT PVOID Buffer,

           IN ULONG Length,

           IN PLARGE_INTEGER ByteOffset OPTIONAL,

           IN PULONG Key OPTIONAL)

{

    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();

    //省略部分代码......

    /* Validate User-Mode Buffers */

    if (PreviousMode != KernelMode)

    {

        _SEH2_TRY

        {

            /* Probe the status block */

            ProbeForWriteIoStatusBlock(IoStatusBlock);

            /* Probe the read buffer */

            ProbeForWrite(Buffer, Length, 1);

    //省略部分代码......

类似地,在NtWriteFile函数中当发现PreviousMode不是KernelMode时,即从用户态调用过来的,可以使用ProbeForRead函数进行检测。

此外,在IoControl中如果IoControlCode指定的MthodMETHOD_NEITHER时,也应当对输入和输出地址使用ProbeForReadProbeForWrite函数进行检验。

 

本文节选自《0day安全:软件漏洞分析技术(第2版)》一书。

图书详细信息:http://blog.chinaunix.net/space.php?uid=13164110&do=blog&id=1645730

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP