官术网_书友最值得收藏!

2.3.2 IsPasswordOK()的安全缺陷

在IsPasswordOK()程序中,允許攻擊者獲得未授權訪問的安全缺陷是由于對gets()的調用所引起的。上面已經提到過,gets()函數從標準輸入復制字符串到Password中,直至遇到EOF標志或者換行符。然而,Password數組只能容納11個字符的密碼加上一個結尾的空字符。這個情況就導致如果輸入多于11個字符,那么程序就會對Password數組進行越界寫,圖2.4展示了一個程序試圖復制16字節的數據到12字節的數組所發生的情況。

這種允許越界寫的情況在安全領域中稱為緩沖區溢出(buffer overflow)。緩沖區溢出實際上是一個運行時事件。然而,在這個例子中,造成緩沖區溢出發生的原因是一個無界字符串讀取,而這一點可以在程序編譯時識別。在進一步了解緩沖區溢出究竟如何造成安全風險之前,我們首先需要對緩沖區溢出和進程內存組織有個大概的了解。

圖2.4 復制16字節的數據到12字節的數組

IsPasswordOK()程序有另一個問題:它沒有檢查gets()的返回狀態。這違反了“FIO04-C.檢測和處理輸入和輸出錯誤”。當gets()失敗時,Password緩沖區的內容是不確定的,所以后續的strcmp()調用的行為是未定義的。在實際的程序中,緩沖區甚至可能包含先前其他用戶輸入的密碼。

主站蜘蛛池模板: 肃宁县| 新干县| 桐梓县| 迭部县| 安康市| 菏泽市| 德安县| 长乐市| 永靖县| 五指山市| 桂平市| 奉新县| 民丰县| 长岛县| 丰宁| 鱼台县| 桐庐县| 梁河县| 库车县| 海城市| 榆中县| 太仓市| 临湘市| 陆河县| 河北省| 芮城县| 高密市| 昭觉县| 忻州市| 宝清县| 三明市| 水富县| 朝阳区| 辽阳县| 彰武县| 营口市| 顺义区| 大姚县| 河津市| 平遥县| 合阳县|