编写安全的驱动程序之输入输出检查
输入输出检查是指对不可信的输入输出地址及数据长度进行合法性检查的过程。这种方法在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指定的Mthod为METHOD_NEITHER时,也应当对输入和输出地址使用ProbeForRead和ProbeForWrite函数进行检验。
本文节选自《0day安全:软件漏洞分析技术(第2版)》一书。
图书详细信息:http://www.cnblogs.com/broadview/archive/2011/07/11/2103329.html