C++ 中的情况
Visual C++ 小组并未停止使用 C 运行库。对于标准模板库 (STL),有许多众所周知的事实。您知道使用迭代程序能够使缓冲区溢出吗?许多安全性方面的风险都与不恰当地使用了迭代程序有关,使用当迭代超出有效范围时中止运行(或出现异常)的迭代程序可以消除这一风险。下面是一个示例:
#include <vector>
vector<int> v(10);// 向量大小为 10
v[20] = 10; // 出现缓冲区溢出
vector<int>::iterator it = v.end();
// 超出界限后导致缓冲区溢出
++it;
#define _SECURE_SCL (1) 编译这段代码后,可以使所有的迭代程序进行检查范围的操作。
也可以不使用新添加的 #define,而使用新功能来达到相同的目的。例如,以下代码将不会导致溢出:
vector<int> v(10);// 向量大小为 10
stdext::checked_iterator<vector<int> > ck_it(v, v.end());
// 超出界限后将中止程序
++ck_it;
其他升级的类和方法有 operator[](vector、string、deque、bitset classes 等), front 和 back(vector、queue、list 类等)。此外还更新了各种算法,包括 copy、copy_backward、*_copy、transform、fill、set_* 等等。
标准的变化
看到这里,您可能会想,标准有什么变化吗?C 和 C++ 不符合标准吗?不,它们已经标准化,并且 Microsoft 已将最新的草案提交给标准化委员会。可以转到 http://std.dkuug.dk/jtc1/sc22/wg14/www/docs/n1031.pdf 查看此草案。
小结
我确实很高兴使用新的运行库。虽然它不能显著提高代码的安全性,但它却是防止缓冲区溢出的又一个工具。在即将结束之际,我要感谢 Visual C++ 库开发小组出色地完成了这一任务,尤其要感谢 Martyn Lovell 对写作本文档提供的帮助。
“以往的 CRT 大势已去,愿新的 CRT 焕发生机!”
发现安全漏洞
许多人帮助我最后改正了错误。早在这篇文章之前,答案就已明确。所谓“安全的” strncpy 并不检查参数是否为 NULL,它能够导致您的应用程序死机或非法访问。
好,看一下本月的问题。这段代码有什么问题?
void ReadDataFromFile(char *szFilename,
LPOVERLAPPED_COMPLETION_ROUTINE func) {
HANDLE hFile = CreateFile(szFilename,
FILE_ALL_ACCESS,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_OVERLAPPED,
NULL);
OVERLAPPED io;
memset(&io,0,sizeof OVERLAPPED);
DWORD dwWritten=0, dwRes=0;
// 执行读取操作
const size_t cBuff = 1024;
char buff[cBuff];
if (!ReadFileEx(hFile,buff,cBuff,&io,func)){
// 哦!保证!
}
// 其他代码
}
Michael Howard 是 Microsoft Secure Engineering 小组的高级安全程序经理,是 Writing Secure Code 的作者之一,现在正在进行该书新版本的写作,他还是《Designing Secure Web-based Applications for Windows 2000》的主要作者。他的主要工作就是确保人们设计、构建、测试和介绍无缺陷的安全系统。他最喜欢的话是“尺有所短,寸有所长”。 上一页 [1] [2] |