歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言中數據類型不一致導致安全性漏洞-memcpy()的參數 int 與 unsigned

//庫函數memcpy()的聲明
void *memcpy(void *dest, void *src, size_t n);

//核心內存區域,擁有用戶可訪問的數據
#define KSIZE 1024
char kbuf[KSIZE];

//最多可以從核心內存中向用戶內存區復制maxlen字節的數據
int copy_from_kernel(void *user_dest, int maxlen){
    //所復制的字節數是緩沖區大小與maxlen中的較小者。
    int len = KSIZE < maxlen ? KSIZE : maxlen;
    memcpy(user_dest, kbuf, len);
    return len;
}

copy_from_kernel() 與 memcpy()的長度參數類型不一致,一個int 型,另一個是size_t(實際上是unsigned int)。如果有惡意程序員在調用copy_from_kernel()時將長度參數設置為負數,那麼memcpy()會把它當成一個很大的正數。雖然等復制這麼多(至少231個) 實際上不會完成,因為程序會遇到進程中非法地址的錯誤,但是程序還是能讀到沒有被授權的內核存儲器區域。

Copyright © Linux教程網 All Rights Reserved