缓冲区溢出攻击的分析及防范策略

合集下载

浅析缓冲区溢出攻击技术以及防范策略

浅析缓冲区溢出攻击技术以及防范策略

下 面我 们 就列 举 一个 简 单 的缓 冲 区溢 出的例 子 :
sa kl C tc , #n ld <sdi. > icu e t o h
it an it g ,hr rv( nm i ( a cc a* ag ) nr c abf1 ] hru[O ; s c yb f rv 1) t p (u, g【 ]; r a
p it ” h sr gs k ,u ) r f T et n i%s n( i n”b r;
r t mO; eu
e ix O 8 d 3 51 6 6 d0 8 4 3 O1 4 3 1
ep x 41 41 x 41 41 iO 41 41 O 41 41
当 覆 盖 3 B 'S 的 “ 时 , 仅 覆 盖 了 程 序 的 其 他 数 据 , 且 覆 2 YI K A” 不 而 盖 了 程 序 的 EP 地 址 , 时 程 序 无 法 正 常 返 回 。 们 就 可 以 改 变 程 序 I 此 我 的 执 行 流 程 , 果 攻 击 者 利 用 了 程 序 的 这 个 缺 陷 。 覆 盖 E P地 址 的 如 将 I
这 是 一 个 存 在 缓 冲 区 溢 出 漏 洞 的 程 序 。 构 造 一 个 1 B T S的 被攻 击 者 控制 的 危 险 。 先 0Y E 二 缓 冲 区 溢 出 的 预 防 与 检 测 技 术
2 1缓 冲 区 溢 出 攻 击 的 防 护 ,
1B T S时 , 会 造 成缓 冲 区溢 出 , 体 操作 : 0YK 就 具
技 术 中 , 冲 区溢 出对 计 算 机 系 统 造 成 的 危 害 最 大 。 史 上 最 著 名 寄 存 器 中 的 值 变 化 如 下 : 缓 历
a00 的 缓 冲 区溢 出攻 击 可 能 要 算 是 18 9 8年 1 1月 2 日的 Mor Wom ( rs r 莫 ex x 0 i c O 42 2e2 8 3 8 4 1 尔 斯 蠕 虫 ) 。 它 可 以 使 攻 击 者 有 机 会 获 得 一 台 主 机 的 部 分 获 全 部 ex x 1 e 01 O 5 6 6 了

缓冲区溢出攻击的基本原理

缓冲区溢出攻击的基本原理

缓冲区溢出攻击的基本原理
缓冲区溢出攻击(Buffer Overflow Attack)是一种常见的安全漏洞,指的是攻击者利用输入数据的长度或格式错误,超出程序设计者预留的存储空间范围,从而写入到相邻内存空间中,进而控制程序的执行或修改程序的行为。

缓冲区溢出攻击的基本原理如下:
1.内存分配:程序在运行时会根据变量类型和长度来分配内存空间。

2.缓冲区溢出:攻击者通过向程序输入异常数据,超出了程序预留的内存空
间。

3.覆盖关键数据:溢出的数据覆盖了原本存储的数据,可能是程序的返回地
址、函数指针等关键信息。

4.控制程序行为:攻击者利用溢出的数据修改程序的执行路径,跳转到自己
准备好的恶意代码。

5.执行恶意代码:程序执行了攻击者注入的恶意代码,可能导致系统崩溃、
拒绝服务或远程执行任意命令。

为了避免缓冲区溢出攻击,开发人员可以采取以下措施:
•使用安全的编程语言和工具,如内存安全的语言(如Rust)或经过良好测试的C/C++库。

•限制输入数据的长度,确保不会超过缓冲区可容纳的大小。

•进行输入验证和过滤,确保输入数据符合预期的格式和范围。

•定期更新软件和操作系统,及时修补已知的漏洞。

•实施数据执行保护(DEP)和地址空间布局随机化(ASLR)等安全机制。

综上所述,缓冲区溢出攻击是一种常见的安全漏洞,它利用错误处理输入数据的程序中的缺陷,从而控制程序行为。

开发人员和系统管理员应该密切关注安全问题,采取相应的防护措施,以保护系统和用户的信息安全。

用堆栈卫士检测和阻止缓冲区溢出攻击的策略分析

用堆栈卫士检测和阻止缓冲区溢出攻击的策略分析

第 7卷
第 3期
集 美大学 学报 ( 自然科 学版 )
Ju a o me U i r t( a rl cec ) orl f i i nv sy N t a Sine n J ei u
V0. No 3 17 . Sp 0 2 e .2 0
20 0 2年 9月
[ 文章编 号]10 7 o 【0 2 0 0 2 o 07— 4 5 20 )3— 22一 4
C语 言编 译 系统在 编译 源程 序 时不 对 数组 的越 界进 行 检测 ,一 些 常用
堆 栈 栈 底
攻 击 代 码
的c 数也不 库函 对数组越界进 行检测, 例如: e ) sc ) 基I函数 调 用 传 递 的参 数 gs( 、 tp , t ry( 这 数被 些函 称为不安 全函数[. 2 假设一个粗心的 】 程序员设计用一个 喾 函 数 的 返 回地 址 l 字 组接 户输入, 符数 收用 而在程序中 未对数组越界作任何限制, l 函数 内部 局部 变 量 数 当 组 增 用户输入一个超长的字符串时,缓冲区溢出就发生了.如果被一个 简l 冲 区 ( : 符 数 组 )长 缓 如 字
恶意的攻击者利用 ,则看似安全 的系统就可能被非法人员控制.

方 向
2 堆 栈 卫 士基 本 策 略 分 析
堆栈卫士的功能是通过扩展程序设计语言的编译器来实现保护堆栈、防止修改堆栈中的函数返 回
地址 的 ・堆栈 卫 士策 略 中 ,堆 栈 的结 构 如 图 2所 示 ,其保 护 堆栈 的功 能对 程序员 是透 明的
用 堆 栈 卫 士检 测 和 阻止 缓 冲 区溢 出攻 击 的 策 略分 析
丽 莉
( 集美大 学信 息工程学 院,福建 厦 门 3 12 ) 6 0 1

C语言中常见的安全漏洞及防范方法

C语言中常见的安全漏洞及防范方法

C语言中常见的安全漏洞及防范方法C语言作为一种广泛应用于系统开发和嵌入式设备的编程语言,虽然具有高效性和灵活性,但在安全性方面却存在一些常见的漏洞。

本文将介绍C语言中常见的安全漏洞,并提供相应的防范方法。

一、缓冲区溢出漏洞缓冲区溢出是C语言中最常见的安全漏洞之一。

当程序试图向一个已经装满数据的缓冲区写入更多的数据时,就会导致缓冲区溢出。

攻击者可以利用这个漏洞来修改程序的执行流,执行恶意代码或者获取敏感信息。

防范方法:1. 使用安全的函数:应该使用安全的函数,如`strncpy`、`snprintf`等,而不是不安全的函数`strcpy`、`sprintf`等。

安全的函数会检查数据长度,避免发生缓冲区溢出。

2. 输入验证:对于用户输入的数据,应该进行输入验证,确保输入的数据不会超出缓冲区的长度。

3. 使用堆栈保护技术:可以使用堆栈保护技术,如栈溢出检测、堆栈随机化等,在一定程度上提高程序对缓冲区溢出漏洞的防护能力。

二、格式化字符串漏洞格式化字符串漏洞是由于未正确使用格式化字符串函数(如`printf`、`sprintf`等)导致的安全问题。

当攻击者能够控制格式化字符串的参数时,就可能导致信息泄露或者任意代码执行。

防范方法:1. 限制格式化字符串的输入:应该限制用户输入的格式化字符串,确保输入的格式化字符串参数是合法且不含恶意代码。

2. 使用安全的格式化函数:使用安全的格式化函数,如`snprintf`等,这些函数会检查参数的有效性,避免格式化字符串漏洞的发生。

3. 程序审计:对于已经存在的代码,应进行定期的程序审计,识别和修复潜在的格式化字符串漏洞。

三、整数溢出漏洞整数溢出漏洞是由于未对输入数据进行正确的检查和验证,导致整数值超出其数据类型范围,从而引发安全问题。

攻击者可以利用这个漏洞来改变程序的行为,执行未经授权的操作。

防范方法:1. 输入验证:对于用户输入的数据,应该进行输入验证,确保输入的数据范围在合理的范围内。

缓冲区溢出攻击的工作原理及防范策略

缓冲区溢出攻击的工作原理及防范策略

服 务病毒黑客图1 计算机程序内存存放示意图为了搞清楚“黑客”基于缓冲区溢出漏洞攻击的工作原理,我们先来分析一下计算机程序在内存中的存储和运行方式,计算机程序在内存中通常分为[1]程序段、数据段和堆栈部分,其具体存放策略如图示,程序段存放的是可执行的二进制机器代码或者只读数据,这个段的内容只允许读或者执行操作,不允许写服 务病毒黑客操作如下:首先把参数‘c’,’b’,’a’压入堆栈;然后保存指令寄存器(I P)中的内容,作为返回地址(R E T);第三个放入堆栈的是基址寄存器(F P);接着把当前的栈指针(S P)拷贝到F P,作为新的基地址;最后为函数变量留出一定空间,把S P减去适当的数值,使其指向局部变量的位置;执行完上述函数调用操作后,程序转到函数中继续执行,此时堆栈中的数据如图2所示。

图2 堆栈工作原理示意图函数执行完毕后,执行出栈操作,其中最主要的是将r e t送到I P中[3],正常执行此操作会使程序返回到函数调用指令的下一条指令,继续程序的正常执行,不会产生缓冲区的溢出,那么什么情况下会产生缓冲区的溢出呢?让我们来分析一下面的程序。

Buffer_overflow.c void function(char *str){ char buffer[16]; strcpy(buffer,str);}void main(){ char large_str [512];int i; for( i = 0; i < 512; i++) large_str [i] = \'A\'; function(large_str); }在程序Buffer_overflow.c执行过程中,当调用函数function时,函数将字符串*str不经过边界检查,直接拷贝到内存区域buffer[16]。

此时堆栈结果如图3所示:首先将参数*str压入堆栈,占用512字节的内存,接着将返回地址将指令寄存器IP中的返回地址ret入栈,然后将基址指针FP入栈,最后分配16字节的函数局部变量存储空间,随后程序转入function执行,当执行完strcpy(buffer,str)指令后,溢出产生了,程序执行的结果是从buffer开始的512个字节都将被*str的内容\'A\'覆盖,包括基址指针SFP和程序返回地址ret,甚至部分*str的内容。

缓冲区溢出黑客攻击及防范技术的研究

缓冲区溢出黑客攻击及防范技术的研究
摘 要: 从缓 冲区溢 出的原理 出发 , 细的阐述 了缓冲 区溢出的黑客攻击方法及如何防范黑客 攻击的技术 , 详 确保 网络运行 的安全和可靠 , 在计 算机 网络安全 管理 中具有较好的 实用价值。
关键词: 黑客 ; 网络 攻 击 ; 冲 区 溢 出 ; 范 缓 防
1 概 述
试 探 性 攻 击 , 后 执 行 类 似 “xes ) 执行 代 码 来 获得 具 有 r t 限 的 然 ee(h 的 o 权 o
的就是使不进行边界检查或者有其他弱点的缓 冲区溢 出, 这样就扰乱了 程序正常的执行顺序 。通过使一个缓 冲区镒 出, 攻击者可以用暴力的方 法改写相邻的程序空间而直接跳过 了系统的检查 。 总之 , 冲区溢 出是一种在各种操作 系统 、 用软件 中广泛存在危 缓 应 险的漏洞 , 冲区溢出攻 击可以导致程序运行失败 、 缓 系统崩溃等后果 。 更 31 缓 冲 区溢 出 . 为 严 重 的是 , 以利 用 它执 行 非 授 权指 令 , 至 可 以 取 得 系统 特 权 , 而 可 甚 进 堆 栈 溢 出 ( 称 缓 冲 区溢 出 )攻击 是 最 常 用 的 黑 客攻 击技 术 之 一 。 进 行 各 种 非 法 操作 。第 一 个 缓 冲 区攻 击 — — Mo s 虫 , 生 在 十 多 年 又 m 蠕 发 它 0 0多 台 网络 服 务 器 瘫 痪 。 U I 自身 以及 其 上 层 的许 多应 用 程 序都 是用 C语 言编 写 的 , NX C语 言 不 前 , 曾造 成 了全 世 界 6 0 检查 缓 冲 区 的边 界 。 在某 些 情 况 下 , 如果 用 户 输 入 的 数据 长度 超 过 应 用 4 缓 冲 区 溢 出攻 击 的 防 范 程 序 给定 的 缓 冲 区 , 会 覆 盖 其 他 数 据 区 , 称 作 “ 栈 溢 出或 缓 冲 溢 就 这 堆 传统安全工具如防火墙对缓冲区溢出攻击无 能为力 , 因为攻击者传 出” 。 输 的数 据 分 组 并 无异 常 特 征 , 有 任 何 欺 骗 。 另外 可 以用 来 实施 缓 冲 区 没 般情 况 下 , 盖 其 他 数 据 区 的数 据 是 没 有 意 义 的 , 多 造 成应 用 溢出攻击的字符串非常多样化 , 覆 最 无法与正常数据有效地进行区分。缓 冲 程序错误 。 但是 , 如果输入的数据是经过黑客精心设计的 , 覆盖堆栈的数 区溢 出攻击不是一种窃密和欺骗的手段 , 而是从计算机系统的最低层发 据恰恰是黑客的入侵程序代码, 黑客就获取了程序的控制权。如果该程 起攻击 , 因此身份验证和访 问权限等安全策略对于缓冲区溢出攻击形 同 序恰好是以 ro运行 的, ot 黑客就 获得 了 ro 权 限, ot 然后就 可以编译黑 客 虚设 。通常采用 以下防范措施 。 程序 、 留下入侵后 门, 实施进一步攻击。 按照这种原理实现的黑客入侵就 1 编写攻击防范的代码。缓冲区溢 出根源在于程序, 由编程错误 ) 是 叫做“ 堆栈溢出攻击” 。 引 起 的 。 防止 利 用缓 冲 区溢 出 发 起地 攻 击 , 键 在 于 程序 开发 者 在 开 发 关 3 缓 冲 区溢 出攻 击 的原 理 . 2 程序时仔细检查溢出情况 , 不允许数据溢出缓冲区。 ) 2 非执行的缓冲区。 当正 常 的使 用 者操 作 程 序 的 时候 , 进 行 的操 作 一 般 不 会 超 出程 序 使被攻击程序的数据段地址空间不可执行 , 所 从而使 得攻击者不可能执行 的运行范围, 而黑客却利用缓冲长度界限 向程序输入超过其常规长度的 被植入 的攻击程序输入缓冲区的代码 , 这种技术被称为非执行的缓冲区 内容 , 造成缓 冲区的溢 出从 析破坏程序 的堆栈 , 使程序运行 出现特殊 的 技 术 。 ) 组 边 界 检查 。数组 边 界 检 查 完 全 不会 有 缓 冲 区溢 出 的产 生和 3数 问题转 而执行其他指令 , 以达到攻击的 目的。造成缓冲区溢出的原因是 攻击。 只要数组不能被溢出 , 溢出攻击也就无从谈起 。 为了实现数组边界 程序没有仔细检查用户输入的参数 , 属于程序开发过程考虑不周 到的结 检查 , 应检查所有数组操作范围 , 还可 以用一些优化技术来减少检查的 果。 次数。4 程序指针完整性检查。程序指针完整性检查指 的是在程序指针 ) 通 过 制造 缓 冲区 溢 出使 程 序 运 行 一 个用 户 sel hl ,再 通 过 sel 行 被 引 用之 前 检 测 到 它 的变 化 。 因 此 , h l执 即使 一 个 攻 击 者 成 功地 改变 了程 序 其他 命 令 。如果 该 程 序属 于 ro 且有 si 限 的话 。 击 者 就 获得 了一 的 指 针 , 于 系统 事 先 检 测 到 了 指 针 的 变 化 , 此 这 个 指 针 将 不 会 被 使 ot ud权 攻 由 因 个 有 ro权 限 的 sel可以 对 系统 进 行 任 意操 作 了 。 ot hl , 用 。这 种 方 法 不 能解 决 所 有 的缓 冲 区溢 出 问题 , 是 在 性 能 上 有 很 大 的 但 缓冲区溢出攻击之所以成为一种常见网络安全攻击手段 , 其原因在 优 势 , 且 兼 容性 也 很 好 。 而 于缓冲区溢 出漏洞普遍并且易于实现。 而缓冲区溢 出成为远程攻击的主 此外 , 用户需要经常登录操作系统和应用程序提供商 的网站 , 跟踪 要手段原 因在于缓 冲区溢出漏洞给予了攻击者想要的一切 , 如植入并且 公 布 的 系 统 漏洞 , 时 下 载补 丁程 序 , 补 系统 漏 洞 。 及 弥 执 行攻 击 代 码 。 植 入 的 攻 击代 码 以一定 的权 限 运 行有 缓 冲区 溢 出 漏洞 被 总 结 的程序从而得 到被攻击主机的控制权 。 冲区溢 出是一种常见 的网络攻击方法 ,它易于攻击 而且危害性大 , 在 19 年 Ln o 98 icl 验 室 用来 评 估 入 侵 检 测 的 五 种远 程 攻 击 中 , n实 有 给系统的安全带来了巨大的危险。因此 , 如何及时有效地检测出计算机 两种是缓冲区溢 出。而在 19 98年 C R E T的 l 3份建议 中, 9份是与缓 网络系统入侵行为 , 有 已成为网络安全信息管理的一项重要量工作。 冲 区溢 出 有关 的 。 19 , 少 有半 数 的建 议 是 和缓 冲 区有 关 的 。在 在 99年 至 参 考 文 献 B grq的调 查 中 ,有 分 之 二 的 被 调 查 者 认 为缓 冲 区溢 出漏 洞 是 一 个 []赵 有 恩 , 守 军. 冲 区 溢 出攻 击 的 分析 及 防 范 『BOL.t :w . ut a 1 周 缓 E / J t / ww hp/

缓冲溢出

缓冲溢出

溢出目录[隐藏]【简介】【内存溢出】为什么会出现内存溢出问题如何解决溢出内存问题【缓冲区溢出】缓冲区溢出分类为什么缓冲区溢出如此常见防止缓冲区溢出的新技术[编辑本段]【简介】1.溢出是黑客利用操作系统的漏洞,专门开发了一种程序,加相应的参数运行后,就可以得到你电脑具有管理员资格的控制权,你在你自己电脑上能够运行的东西他可以全部做到,等于你的电脑就是他的了。

在黑客频频攻击、在系统漏洞层出不穷的今天,作为网络管理员、系统管理员的我们虽然在服务器的安全上都下了不少功夫:诸如,及时的打上系统安全补丁、进行一些常规的安全配置,但是仍然不太可能每台服务器都会在第一时间内给系统打上全新补丁。

因此我们必需要在还未被入侵之前,通过一些系列安全设置,来将入侵者们挡在“安全门”之外。

2.溢出是程序设计者设计时的不足所带来的错误.[编辑本段]【内存溢出】内存溢出已经是软件开发历史上存在了近40年的“老大难”问题,象在“红色代码”病毒事件中表现的那样,它已经成为黑客攻击企业网络的“罪魁祸首”。

如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行。

据有关安全小组称,操作系统中超过50%的安全漏洞都是由内存溢出引起的,其中大多数与微软的技术有关。

微软的软件是针对台式机开发的,内存溢出不会带来严重的问题。

但现在台式机一般都连上了互联网,内存溢出就为黑客的入侵提供了便利条件。

【数据溢出】在计算机中,当要表示的数据超出计算机所使用的数据的表示范围时,则产生数据的溢出。

[编辑本段]为什么会出现内存溢出问题导致内存溢出问题的原因有很多,比如:(1) 使用非类型安全(non-type-safe)的语言如C/C++ 等。

(2) 以不可靠的方式存取或者复制内存缓冲区。

(3) 编译器设置的内存缓冲区太靠近关键数据结构。

下面来分析这些因素:1. 内存溢出问题是 C 语言或者C++ 语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。

缓冲区溢出原理

缓冲区溢出原理

缓冲区溢出原理缓冲区溢出是一种常见的安全漏洞,它利用了程序在处理数据时没有正确限制输入长度的特点。

当程序接收用户输入数据并存储在缓冲区中时,如果输入的数据超过了缓冲区所能容纳的大小,就会导致溢出。

这种溢出可能导致程序崩溃、系统崩溃,甚至是远程攻击者能够利用溢出来执行恶意代码。

缓冲区溢出的原理是利用了程序在内存中分配缓冲区时的特性。

通常,程序在内存中为缓冲区分配一块连续的内存空间,并将用户输入的数据存储在这个缓冲区中。

然而,程序并没有对用户输入的数据长度进行有效的检查和限制,导致用户可以输入超出缓冲区大小的数据。

当用户输入的数据超过缓冲区大小时,多余的数据会被存储在相邻的内存区域中。

攻击者可以利用这个特性,通过输入特定的数据,覆盖控制程序的返回地址或其他关键数据,从而控制程序的行为。

一旦攻击者成功利用缓冲区溢出漏洞,可能会导致以下问题:1. 执行任意代码:攻击者可以注入恶意代码,并使程序执行该代码,这可能导致系统被完全控制。

2. 提升权限:攻击者可以修改关键数据,包括用户权限、系统配置等,从而获得更高的权限。

3. 拒绝服务:攻击者可以通过溢出来破坏程序的正常运行,导致程序崩溃或系统崩溃,从而拒绝正常用户的服务。

为了防止缓冲区溢出,开发者应该采取以下措施:1. 输入验证:对用户输入进行有效验证和过滤,确保输入的数据长度不会超过缓冲区的大小。

2. 使用安全的库函数:使用具有长度检查的安全库函数替代容易造成溢出的不安全函数,例如使用strncpy替代strcpy。

3. 栈保护机制:启用操作系统提供的栈保护机制,如栈保护、地址空间布局随机化(ASLR)等,以减少攻击的可能性。

4. 定期修补和更新:及时安装系统和应用程序的安全补丁,以修复已知的缓冲区溢出漏洞。

通过采取上述措施,可以有效减少缓冲区溢出漏洞的风险,提高系统的安全性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

缓冲区溢出攻击的分析 及防范策略

系别:计算机科学系 班级:网络工程 姓名:姚康平 学号:3111101157 指导教师:乐丁惕 时间:2014-11-29 目录 1、缓冲区溢出攻击简介……………………………….

2、缓冲区溢出攻击原理………………………………. 3、缓冲区溢出攻击问题………………………………. 4、缓冲区溢出攻击危害……………………………….. 5、缓冲区溢出攻击防范方法…………………………… 6、缓冲区溢出攻击相关对策………………………….. 7、参考文献……………………………………………... 一、缓冲区溢出攻击简介 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。

二、 缓冲区溢出攻击原理 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序: void function(char *str) { char buffer[16]; strcpy(buffer,str); } 上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat()、sprintf()、vsprintf()、gets()、scanf()等。 当然,随便往缓冲区中填东西造成它溢出一般只会出现分段错误(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。 缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。 在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。在ugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。 缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。

三、 缓冲区溢出攻击问题 缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标: 3.1 在程序的地址空间里安排适当的代码。 3.2 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。 根据这两个目标来对缓冲区溢出攻击进行分类。 3.3 在程序的地址空间里安排适当的代码的方法 有两种在被攻击程序地址空间里安排攻击代码的方法: 1)、植入法 攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的资料是可以在这个被攻击的硬件平台上运行的指令序列。在这里,攻击者用被攻击程序的缓冲区来存放攻击代码。缓冲区可以设在任何地方:堆栈(stack,自动变量)、堆(heap,动态分配的内存区)和静态资料区。 2)、利用已经存在的代码 有时,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数。比如,攻击代码要求执行“exec (bin/sh)”,而在libc库中的代码执行“exec (arg)”,其中arg是一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改向指向“/bin/sh”。 3.4 控制程序转移到攻击代码的方法 所有的这些方法都是在寻求改变程序的执行流程,使之跳转到攻击代码。最基本的就是溢出一个没有边界检查或者其它弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用暴力的方法改写相邻的程序空间而直接跳过了系统的检查。 分类的基准是攻击者所寻求的缓冲区溢出的程序空间类型。原则上是可以任意的空间。实际上,许多的缓冲区溢出是用暴力的方法来寻求改变程序指针的。这类程序的不同之处就是程序空间的突破和内存空间的定位不同。主要有以下三种: 1)、活动纪录(Activation Records) 每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击(Stack Smashing Attack),是目前最常用的缓冲区溢出攻击方式。 2)、函数指针(Function Pointers) 函数指针可以用来定位任何地址空间。例如:“void (* foo)()”声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下的superprobe程序。 3)、长跳转缓冲区(Longjmp buffers) 在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓 冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Perl 5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。 3.5 代码植入和流程控制技术的综合分析 最简单和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码植入和活动纪录技术。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出,改变活动纪录的同时植入了代码。这个是由Levy指出的攻击的模板。因为C在习惯上只为用户和参数开辟很小的缓冲区,因此这种漏洞攻击的实例十分常见。 代码植入和缓冲区溢出不一定要在在一次动作内完成。攻击者可以在一个缓冲区内放置代码,这是不能溢出的缓冲区。然后,攻击者通过溢出另外一个缓冲区来转移程序的指针。这种方法一般用来解决可供溢出的缓冲区不够大(不能放下全部的代码)的情况。 如果攻击者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数调用。举例来说,在libc(几乎所有的C程序都要它来连接)中的部分代码段会执行“exec(something)”,其中somthing就是参数。攻击者然后使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。

四、 缓冲区溢出攻击危害 可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。缓冲区溢出攻击有多种英文名称:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它们指的都是同一种攻击手段。第一个缓冲区溢出攻击--Morris蠕虫,发生在二十年前,它曾造成了全世界6000多台网络服务器瘫痪。 在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。

五、 缓冲区溢出攻击防范方法 缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。 目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响。通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。强制写正确的代码的方法。利用编译器的边界检查来实现缓冲区的保护。这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲

相关文档
最新文档