安全研究

安全漏洞
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(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障