. = 0;
while () {
chomp;
s/^\s+//;
s/\s+$//;
if (/\*\w+\+\+\s{0,}=\s{0,}\*\w+\+\+) {
print $filename . " " .
一种被忽视的构造和整数溢出重现_网学
浏览:
. "\n";
}
}
注这段脚本只查找 *p++ 构造,而不查找 *++p 构造。
假定您发现了一个缺陷,使代码更安全的一种方法是限制被复制的数据不大于目标缓冲区:
HRESULT GetMachineName(WCHAR *pwszPath) {
WCHAR wszMachineName[N + 1])
LPWSTR pwszServerName = wszMachineName;
size_t cbMachineName = N;
while (*pwszPath != L''\\'' && --cbMachineName)
*pwszServerName++ = *pwszPath++;
}
最后,对不为目标缓冲区的大小所限制的任何内存复制函数或构造都应该进行严格检查。
返回页首
关于整数溢出的更多介绍
在前面的文章 Reviewing Code for Integer Manipulation Vulnerabilities 中,我讨论了与所谓整数溢出 的简单数学运算相关的安全性缺陷。
最近,作为正在进行的可信赖计算工程系列 (Trustworthy Computing Engineering Series) 的一部分,我给 Microsoft 的工程师做了一次关于整数溢出的讲座。在讲座中,我概述了如何发现整数溢出以及如何修复整数溢出。让我感到吃惊的是,我接收到的许多电子邮件都说我的补救方法很好,但是充满危险。请允许我做一些解释。
在该专栏中,我提到过的代码如下所示:
if (A + B > MAX) return -1;
应该改成这样:
if (A + B >= A && A + B < MAX) {
// cool!
}
三年前就有人指出,一些人会看到这段代码,但是不知道它有什么用,从而可能删除 A+B >= A 部分,因为它看起来纯属多余,而现在,整数溢出又重新出现在您面前。不会吧!
作为回应,我写了下面的头文件,它的意图再明白不过了。是的,它看起来像乱码,但这段乱码却是 x86 汇编语言。我之所以使用汇编语言,是因为它可以使我直接访问 jc 操作数,即按进位转移 (jump-on-carry)。换句话说,它检测数学运算是否会导致溢出。
#ifndef _INC_INTOVERFLOW_
#define _INC_INTOVERFLOW_
#ifdef _X86_
inline bool UAdd(size_t a, size_t b, size_t *r) {
__asm {
mov eax,dword ptr [a]
add eax,dword ptr [b]
mov ecx,dword ptr [r]
mov dword ptr [ecx],eax
jc short j1
mov al,1
jmp short j2
j1:
#ifdef _DEBUG
int 3
#endif
xor al,al
j2:
&nbs