GNU GCC盲目结构拷贝操作导致内存破坏漏洞
发布日期:2003-05-29
更新日期:2003-06-04
受影响系统:GNU gcc 3.2.2
GNU gcc 3.2.1
GNU gcc 3.2
GNU gcc 3.2-7
- RedHat Linux 8.0
GNU gcc 3.2.2-5
- RedHat Linux 9.0
不受影响系统:GNU gcc 3.2.3-4
GNU gcc 3.2.3-3
GNU gcc 3.2.3
描述:
BUGTRAQ ID:
7743
GNU gcc是一款开放源代码流行的编译器。
GNU gcc在执行多个结构拷贝(struct-copy)操作时存在问题,可导致获取系统内存中的敏感信息,或者以高权限执行任意代码。
问题可能是在编译程序过程中当部分优化选项使用的情况下,由于盲目的结构拷贝,完成多次结构拷贝过程中,会导致之前声明的结构中的值被破坏。虽然此问题不常见,但利用此漏洞可能获取系统内存中的敏感信息,或者以高权限执行任意代码。
<*来源:Luke Hutchison (
lukehlistemail@byu.edu)
链接:
http://marc.theaimsgroup.com/?l=bugtraq&m=105427659226417&w=2
*>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
Luke Hutchison <
lukehlistemail@byu.edu>提供一个演示程序如下:
/*
Compile with: gcc -Wall prog.c -o prog && ./prog
I'm using gcc version 3.2 20020903 (Red Hat Linux 8.0 3.2-7)
Also tested on gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) [RH9]
This problem is solved in gcc version 3.2.3 [RawHide]
Actual output:
0 1 0
1 0 0
1 2 1
2 3 4
Expected output:
2 2 3
1 3 3
1 2 4
2 3 4
*/
#include <stdio.h>
typedef struct {
int _0, _1, _2;
} POINT;
POINT xform(POINT p) {
return (POINT) { p._0 + 1, p._1 + 2, p._2 + 3 };
}
int main(void) {
int i;
POINT p[4] =
{ xform((POINT) { 1, 0, 0 }),
xform((POINT) { 0, 1, 0 }),
xform((POINT) { 0, 0, 1 }),
xform((POINT) { 1, 1, 1 }) };
for (i = 0; i < 4; i++)
printf(" %d %d %d\n", p[i]._0, p[i]._1, p[i]._2);
return 0;
}
建议:
厂商补丁:
GNU
---
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
GNU Upgrade gcc 3.2.3
http://gcc.gnu.org/releases.html浏览次数:3043
严重程度:0(网友投票)