编写安全的驱动程序之输入输出检查

输入输出检查

输入输出检查是指对不可信的输入输出地址及数据长度进行合法性检查的过程。这种方法在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函数进行检验。

 bb

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

图书详细信息:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-701890

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13164110/viewspace-701894/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13164110/viewspace-701894/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值