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

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()調用的行為是未定義的。在實際的程序中,緩沖區甚至可能包含先前其他用戶輸入的密碼。

主站蜘蛛池模板: 黔西县| 惠来县| 雅江县| 大新县| 礼泉县| 庄河市| 车致| 阿合奇县| 景谷| 叶城县| 南华县| 玛纳斯县| 政和县| 涡阳县| 青岛市| 邵阳市| 怀宁县| 枣强县| 两当县| 鹤峰县| 石泉县| 胶州市| 会泽县| 河东区| 新安县| 尼玛县| 伊宁市| 象州县| 北辰区| 永泰县| 乐山市| 南宫市| 调兵山市| 玛纳斯县| 绵竹市| 昌江| 辽阳市| 东辽县| 沅陵县| 南皮县| 桃江县|