編寫安全的驅動程式之輸入輸出檢查

broadviewbj發表於2011-07-11

輸入輸出檢查

輸入輸出檢查是指對不可信的輸入輸出地址及資料長度進行合法性檢查的過程。這種方法在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://space.itpub.net/?uid-13164110-action-viewspace-itemid-701890

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-701894/,如需轉載,請註明出處,否則將追究法律責任。

相關文章