修复缓冲区溢出问题
2009-03-07 20:02:33 来源:WEB开发网使用 /GS 进行编译
Visual C++ .Net 中的这个新的编译时选项会在某些函数的堆栈框架中插入值,有助于减少基于堆栈的缓冲区溢出的潜在弱点。请记住,此选项不会修复您的代码,也不能删除任何错误。它只是象一个棒球运动的捕手,帮助您减少某些类的缓冲区溢出变为可被人利用的缓冲区溢出的潜在可能性,以免攻击者向过程中写入代码并执行。可以把它视为一个很小的保险措施。请注意,对于使用 Win32 应用程序向导创建的新的本机 Win32 C++ 项目,将默认启用此选项。此外,Windows .NET Server 编译时也使用了此选项。有关详细信息,请参阅 Brandon Bray 的 Compiler Security Checks In Depth(英文)。
排除隐患
下面我给出了一些代码,其中至少包含一处安全隐患。您能找出来吗?我将在下一篇文章中公布答案!
WCHAR g_wszComputerName[INTERNET_MAX_HOST_NAME_LENGTH + 1];
// 获取服务器名称并将其转换为 Unicode 字符串。
BOOL GetServerName (EXTENSION_CONTROL_BLOCK *pECB) {
DWORD dwSize = sizeof(g_wszComputerName);
char szComputerName[INTERNET_MAX_HOST_NAME_LENGTH + 1];
if (pECB->GetServerVariable (pECB->ConnID,
"SERVER_NAME",
szComputerName,
&dwSize)) {
// 其余代码被略去
Michael Howard 是 Microsoft Secure Windows Initiative 小组的安全程序经理,也是《Writing Secure Code》的作者之一。他的主要工作就是确保人们设计、构建、测试和记录无缺陷的安全系统。他最喜欢的话是“尺有所短,寸有所长”。
更多精彩
赞助商链接