希赛网 · 知识导航  
 
    软考英语    通信工程英语    软件工程    项目管理    操作系统    数据库系统    计算机网络    IT新技术    硬件数码    应用系统    计算机基础    IT职场  
希赛网 > IT英语 > 操作系统 > 缓冲益出与不好的编程习惯

缓冲益出与不好的编程习惯

www.educity.cn   发布者:andytlq   来源:网络转载   发布日期:2013年08月27日   

Buffer Overflow

  Do an Internet search on the term buffer overflow, and you'll come up with hundreds of thousands of links, most related to security. In the National Institute of Standards and Technology's ICAT index of computer vulnerabilities, six of the top 10 involve buffer overflows. In 1999, buffer overflow was named the No. 1 computer vulnerability. Five years later, it's still a major problem.

  If you've ever poured a gallon of water into a pint-size pot, you know what overflow means ——water spills all around.

  Inside a computer, something similar happens if you try to store too much data in a space designed for less. Input normally goes into a temporary storage area, called a buffer, whose length is defined in the program or the operating system.

  Ideally, programs check data length and won't let you input an overlong data string. But most programs assume that data will always fit into the space assigned to it. Operating systems use buffers called stacks, where data is stored temporarily between operations. These, too, can overflow.

  When a too-long data string goes into the buffer, any excess is written into the area of memory immediately following that reserved for the buffer -- which might be another data storage buffer, a pointer to the next instruction or another program's output area. Whatever is there is overwritten and destroyed.

  That in itself is a problem. Just trashing a piece of data or set of instructions might cause a program or the operating system to crash. But much worse could happen. The extra bits might be interpreted as instructions and executed; they could do almost anything and would execute at the level of privilege (which could be root, the highest level).

Bad Programming

  Buffer overflow results from a well-known, easily understood programming error. If a program doesn't check for overflow on each character and stop accepting data when its buffer is filled, a potential buffer overflow is waiting to happen. However, such checking has been regarded as unproductive overhead - when computers were less powerful and had less memory, there was some justification for not making such checks. Moore's Law has removed that excuse, but we're still running a lot of code written 10 or 20 years ago, even inside current releases of major applications.

  Some programming languages are immune to buffer overflow: Perl automatically resizes arrays, and Ada95 detects and prevents buffer overflows. However, C —— the most widely used programming language today -- has no built-in bounds checking, and C programs often write past the end of a character array.

  Also, the standard C library has many functions for copying or appending strings that do no boundary checking. C++ is slightly better but can still create buffer overflows.

  Buffer overflow has become one of the preferred attack methods for writers of viruses and Trojan horse programs. Crackers are adept at finding programs where they can overfill buffers and trigger specific actions running under root privilege -- say, telling the computer to damage files, change data, disclose sensitive information or create a trapdoor access point.

缓冲溢出

  对缓冲溢出这个术语做一次因特网搜索,你将看到成千上万的链接,其中大多数与安全有关。按(美国)国家标准与技术协会公布的 ICAT计算机安全隐患指数,在最主要的十项安全隐患中有六项涉及缓冲溢出。1999年,缓冲溢出被定为头号计算机安全隐患。五年之后,它仍是一个重大问题。

  如果你将一加仑水倒入一品脱的壶里,就知道溢出是什么意思了 ——水洒了一地。

  在计算机中,如果你试图在设计存放较少数据的空间储存太多的数据,也会发生类似的事情。正常情况下,输入放入临时存储区域,称作缓冲区,其长度由程序或操作系统定义。

  理想的情况是,程序检查你的数据长度,不让你输入过长的数据串。但多数程序假设数据总是适合分配给它的空间。操作系统使用称作堆栈的缓冲区,在两次运算之间数据暂时存放在那里。这也能产生溢出。

  当太长的数据串进入缓冲区时,超过部分马上被写入紧跟在为缓冲区保留的存储区域后面的区域,它可能是另一个数据存储缓冲区、下一个指令的指针或者另一个程序的输出区域。不管是哪一种情况,(数据)都会因重写而被破坏。

  这本身就是个问题。弄坏一个数据或一组指令会造成程序或操作系统的崩溃。还会发生更坏的事情,额外的位有可能被解释成指令而加以执行,这些位几乎可能做任何事情,在特权级上执行(它可能是根,即最高级)。

坏的编程

  缓冲溢出源于一个众所周知、容易理解的编程错误。如果程序不检查每个字符是否溢出,以及在缓冲区已满时不停止接收数据,那么潜在的缓冲溢出就可能发生。但是,这样的检查被当作无收益的开销 ——当计算机能力不强、内存不大时,不做这样的检查还算有些道理。摩尔定律使这个借口不复存在,但是我们仍在运行一、二十年前写的程序,甚至有些主要应用软件的最新版本还是如此。

  有些编程语言对缓冲溢出具有免疫力: Perl能自动给阵列重新定长度,Ada95能检测和避免缓冲溢出。然而,今天用得最广的编程语言——C语言没有内在的超限检查,而C语言的程序常常写得超出字符阵列的末端。

  同样,标准的 C语言程序库拥有很多拷贝或添加不检查边缘的字符串的功能。C++稍好一些,但仍会产生缓冲溢出。

  缓冲溢出已经成为病毒和特洛伊木马程序编写者喜爱用的攻击方法。黑客们擅长于发现他们能使缓冲区溢出并在根特权下触发特定动作的程序,比方说,告诉计算机破坏文件、修改数据、暴露敏感信息或生成陷阱门接入点等。

标签: 操作系统
1 2
   主编推荐
全局导航
IT认证学院
Adobe认证Cisco认证H3C认证IBM认证IT认证资讯Java认证Linux认证Microsoft认证Oracle认证华为认证
IT英语
IT新技术操作系统基础英语计算机网络软件工程软考英语数据库系统通信专业英语项目管理英语应用系统硬件数码职场英语
程序开发学院
.NETC语言_C++语言DelphiPowerBuilderWeb开发嵌入式开发移动开发游戏开发PHPPythonPerlRuby
等考学院
考试大纲二级考试经验二级模拟试题一级考试资料二级考试资料一级模拟试题三级模拟试题四级模拟试题一级考试经验三级考试经验四级考试经验四级考试资料三级考试资料等级考试动态
软件工程学院
CASE工具构件与中间件软件测试软件过程改进软件设计软件外包需求分析软件质量保证系统分析与建模系统规划业界观点敏捷开发
软考学院
程序员电子商务设计师法律法规考试大纲考试政策历年试题软件评测师软件设计师软考英语数据库系统工程师网络工程师网络管理员网络规划设计师系统分析师系统架构设计师信息技术处理员信息系统管理工程师信息系统监理师
通信学院
初级通信工程师传输与接入高级通信工程师互联网技术交换技术考试大纲考试动态考试题库设备环境通信法规终端与业务综合能力
网络工程学院
交换技术接入技术路由技术实施案例网络布线网络存储网络服务器网络管理无线网络系统应用网络协议网络设备
项目管理学院
系统集成项目管理工程师信息系统项目管理师CPMP考试IPMPPMP考试prince2认证项目采购管理项目成本管理项目范围管理项目风险管理项目沟通管理项目配置管理项目人力资源管理项目时间管理项目管理案例项目管理动态项目管理工具项目经理项目整合管理项目质量管理项目干系人管理
职称考试学院
职称考试题目职称考试指南职称考试资料
研究生院
考研英语考研题库招生信息就业指导考研经验考研政治考研数学
信息安全实验室
网络安全黑客教程杀毒防毒安全设置脚本攻防黑客入侵工具使用漏洞分析加密解密手机安全安全技术
物联网学院
生物识别二维码射频技术传感器物联网感知层物联网网络层物联网传输层物联网应用层物联网标准物联网前沿技术智能生活智慧城市物联网案例分析云计算虚拟化技术
Java学院
Javascript教程Java教程Java核心技术Java高级技术J2EE教程J2ME教程XML教程Java开源技术
Linux学院
Linux系统管理Unix教程Linux教程Linux编程Linux集群Linux内核技术Linux安全Linux服务器Solaris教程AIX教程
Windows学院
Windows系统管理Windows教程Windows安全Windows服务器Windows网络管理Windows故障Windows优化Windows动态
数据库学院
数据库开发Oracle数据库MySQL数据库Sybase数据库DB2数据库SQL Server数据库数据仓库Informix数据库