
上QQ阅读APP看书,第一时间看更新
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()调用的行为是未定义的。在实际的程序中,缓冲区甚至可能包含先前其他用户输入的密码。