软件开发者开发软件时的疏忽,或者是编程语言的局限性,比如c语言家族比
java效率高但漏洞也多,电脑系统几乎就是用c语言编的,所以常常要打补丁。 软件漏洞有时是作者日后检查的时候发现的,然后修正;还有一些人专门找别人的漏洞以从中做些非法的事,当作者知道自己的漏洞被他人利用的时候就会想办法补救。
缓冲区溢出是一种常见的编程错误,也是一种牵扯到复杂因素的错误。开发人员经常预先分配一定量的临时内存
空间,称为一个
缓冲区,用以保存特殊信息。如果代码没有仔细地把要存放的
数据大小同应该保存它的
空间大小进行对照检查,那么靠近该分配空间的内存就有被覆盖的风险。熟练的
黑客输入仔细组织过的
数据就能导致程序崩溃,更糟糕的话能执行代码。
缓冲区溢出是称为输入有效性漏洞的更大一类软件安全缺陷下的一个子类。几乎所有的程序都接受某种类型的用户输入(例如,
命令行参数或者
HTML表格)。如果代码没有严格检查输入的格式和内容是否合适,就开始处理
数据,那么就会发生问题。考虑下面这个简单的例子:
这段代码的意图可能是打印/var/www/
html下某个
HTML文件的内容,/var/www/html是Red Hat
服务器上Apache的httpd服务程序默认的文档根目录。这段代码接受用户输入的一个文件名,把它作为参数传给open
函数。不过,如果一个恶意的用户把../../../etc/shadow当作参数输入的话,就会显示出/etc/shadow的内容,并可能根据这些内容破译出root密码!
作为一名
系统管理员,您该如何防止这种情况发生呢?几乎无可奈何,至少在确定出缺陷(bug),并发布解决它的补丁之前是这样。紧盯补丁和安全性公告的发布,这是大多数
系统管理员工作的一个重要部分。大多数Linux发行版本都带自动打补丁的工具,如
Fedora上的yum、
Debian和
Ubuntu上的apt-get。利用这些工具能让您的站点避免出现软件的
安全漏洞问题。
大多数IT安全事件(如
补丁程序或
网络攻击等)都与软件编程错误有关,在过去的三年中,非盈利调研机构MITRE和美国系统网络安全协会( SANS Institute)发现了700多处常见的软件编程错误,经过安全专家的筛选,最终公布了以下25大软件编程错误:
2. 不正确的编码或转义输出
3. 维持SQL查询结构(SQL注入)错误
6. 明文传送敏感信息
7. 跨站点请求伪造
8. 资源竞争(Race condition)
12. 外部控制文件名或路径
13. 不可信搜索路径
15. 下载未经完整性检查的代码
16. 错误的资源关闭或发布
18. 错误计算
21. 硬编码密码
22. 对核心资源的错误权限分配
23. 随机值的错误利用
24. 滥用特权操作