标题：漏洞
释义
词目：漏洞
拼音：lòu dòng
基本解释
1. [hole；leak； leakage]∶小孔或缝隙堵塞漏洞。
2. [flaw；weak points；hole； loophole]∶法律、法令、条约或协议中制订得不周密的地方,破绽要堵住立法中的明显漏洞。
详细解释
1. 缝隙；小孔。 明 陆深《停骖录摘抄》：“左手关脉滑而缓，肝第四叶有漏洞，下相通。” 赵自《第二双眼睛》：“可以根据水流的方向，摸到进水的漏洞。”
2. 破绽，不周密之处。 茅盾《霜叶红似二月花》五：“想来 王伯申 也很精明，这件事他一定另有布置，漏洞是早已补好了的。” 周而复《上海的早晨》第四部十三：“总经理想的实在周密极了，一点漏洞也没有。”
概况
一、 漏洞与具体系统环境之间的关系及其时间相关特性
漏洞会影响到很大范围的软硬件设备，包括作系统本身及其支撑软件，网络客户和服务器软件，网络路由器和安全防火墙等。换而言之，在这些不同的软硬件设备中都可能存在不同的安全漏洞问题。在不同种类的软、硬件设备，同种设备的不同版本之间，由不同设备构成的不同系统之间，以及同种系统在不同的设置条件下，都会存在各自不同的安全漏洞问题。 
漏洞问题是与时间紧密相关的。一个系统从发布的那一天起，随着用户的深入使用，系统中存在的漏洞会被不断暴露出来，这些早先被发现的漏洞也会不断被系统供应商发布的补丁软件修补，或在以后发布的新版系统中得以纠正。而在新版系统纠正了旧版本中具有漏洞的同时，也会引入一些新的漏洞和错误。因而随着时间的推移，旧的漏洞会不断消失，新的漏洞会不断出现。漏洞问题也会长期存在。
因而脱离具体的时间和具体的系统环境来讨论漏洞问题是毫无意义的。只能针对目标系统的作系统版本、其上运行的软件版本以及服务运行设置等实际环境来具体谈论其中可能存在的漏洞及其可行的解决办法。 
同时应该看到，对漏洞问题的研究必须要跟踪当前最新的计算机系统及其安全问题的最新发展动态。这一点如同对计算机病毒发展问题的研究相似。如果在工作中不能保持对新技术的跟踪，就没有谈论系统安全漏洞问题的发言权，即使是以前所作的工作也会逐渐失去价值。 
二、漏洞的危害及防范
漏洞的存在，很容易导致黑客的侵入及病毒的驻留，会导致数据丢失和篡改、隐私泄露乃至金钱上的损失，如：网站因漏洞被入侵，网站用户数据将会泄露、网站功能可能遭到破坏而中止乃至服务器本身被入侵者控制。目前数码产品发展，漏洞从过去以电脑为载体延伸至数码平台，如手机二维码漏洞，安卓应用程序漏洞等等...
随着漏洞危害的逐步扩大，人们应该提高安全意识，留意最新漏洞信息，漏洞信息可从网上各大漏洞发布平台获取（如：漏洞吧 bug8），并参考相关信息对其进行防范，避免因漏洞造成自身利益的损害。 
三、新装WINDOWS系统必补十大高危漏洞
我们常说，系统漏洞是病毒木马传播最重要的通道，不及时安装系统补丁的电脑，将无法阻止被入侵。一个新装的Windows系统，需要安装的补丁可能多达上百个，还有盗版用户会担心安装补丁影响Windows激活。目前，可以帮助用户安装补丁的工具也比较多，不同的软件，推荐安装的补丁列表也会略有差异，到底该怎样安装补丁才科学呢？
金山安全专家推荐用户新装系统，必须修补的十大安全高危漏洞：
1、紧急安全更新Server 服务中的漏洞(补丁名称KB958644)
2、IE0day漏洞，病毒木马通过此漏洞传播，感染量超过1000万（补丁名称KB960714）
3、Internet Explorer 7 for Windows XP 安全更新程序(补丁名称KB961260) 
4、Internet Explorer for Windows XP 安全更新程序(补丁名称KB963027）
5、Internet Explorer for Windows XP 安全更新程序（补丁名称KB969897）
6、Windows XP 的 ActiveX Killbit 安全更新程序（补丁名称KB973346）
7、Internet Explorer for Windows XP 安全更新程序（补丁名称KB972260）
8、Windows XP 安全更新程序 (补丁名称KB971633)
9、IE极光漏洞（补丁名称KB979352）
10、Internet Explorer for Windows XP 安全更新程序 (补丁名称KB978207) 
四、安全漏洞与系统攻击之间的关系
系统安全漏洞是在系统具体实现和具体使用中产生的错误，但并不是系统中存在的错误都是安全漏洞。只有能威胁到系统安全的错误才是漏洞。许多错误在通常情况下并不会对系统安全造成危害，只有被人在某些条件下故意使用时才会影响系统安全。
漏洞虽然可能最初就存在于系统当中，但一个漏洞并不是自己出现的，必须要有人发现。在实际使用中，用户会发现系统中存在错误，而入侵者会有意利用其中的某些错误并使其成为威胁系统安全的工具，这时人们会认识到这个错误是一个系统安全漏洞。系统供应商会尽快发布针对这个漏洞的补丁程序，纠正这个错误。这就是系统安全漏洞从被发现到被纠正的一般过程。
系统攻击者往往是安全漏洞的发现者和使用者，要对于一个系统进行攻击，如果不能发现和使用系统中存在的安全漏洞是不可能成功的。对于安全级别较高的系统尤其如此。 
系统安全漏洞与系统攻击活动之间有紧密的关系。因而不该脱离系统攻击活动来谈论安全漏洞问题。了解常见的系统攻击方法，对于有针对性的理解系统漏洞问题，以及找到相应的补救方法是十分必要的。 
五、常见攻击方法描述
系统攻击是指某人非法使用或破坏某一信息系统中的资源，以及非授权使系统丧失部分或全部服务功能的行为。
通常可以把攻击活动大致分为远程攻击和内部攻击两种。现在随着互联网络的进步，其中的远程攻击技术得到很大发展，威胁也越来越大，而其中涉及的系统漏洞以及相关的知识也较多，因此有重要的研究价值。
漏洞的分类
苍蝇不盯无缝的蛋，入侵者只要找到复杂的计算机网络中的一个缝，就能轻而易举地闯入系统。所以了解这些缝都有可能在哪里，对于修补它们至关重要。通常裂缝主要表现在软件编写存在bug、系统配置不当、口令失窃、明文通讯信息被监听以及初始设计存在缺陷等方面。1、软件编写存在bug无论是服务器程序、客户端软件还是操作系统，只要是用代码编写的东西，都会存在不同程度的bug。Bug主要分为以下几类：
(1) 、缓冲区溢出：指入侵者在程序的有关输入项目中了输入了超过规定长度的字符串，超过的部分通常就是入侵者想要执行的攻击代码，而程序编写者又没有进行输入长度的检查，最终导致多出的攻击代码占据了输入缓冲区后的内存而执行。别以为为登录用户名留出了200个字符就够了而不再做长度检查，所谓防小人不防君子，入侵者会想尽一切办法尝试攻击的途径的。
(2)、意料外的联合使用问题：一个程序经常由功能不同的多层代码组成，甚至会涉及到最底层的操作系统级别。入侵者通常会利用这个特点为不同的层输入不同的内容，以达到窃取信息的目的。例如：对于由Perl编写的程序，入侵者可以在程序的输入项目中输入类似“mail</etc/passwd”的字符串，从而使perl让操作系统调用邮件程序，并发送出重要的密码文件给入侵者。借刀杀人、借Mail送“信”，实在是高!
(3) 、不对输入内容进行预期检查：有些编程人员怕麻烦，对输入内容不进行预期的匹配检查，使入侵者输送炸弹的工作轻松简单。
(4)Raceconditions：多任务多线程的程序越来越多，在提高运行效率的同时，也要注意Raceconditions的问题。比如说：程序A和程序B都按照“读/改/写”的顺序操作一个文件，当A进行完读和改的工作时，B启动立即执行完“读/改/写”的全部工作，这时A继续执行写工作，结果是A的操作没有了表现!入侵者就可能利用这个处理顺序上的漏洞改写某些重要文件从而达到闯入系统的目的，所以，编程人员要注意文件操作的顺序以及锁定等问题。2、系统配置不当(1) 、默认配置的不足：许多系统安装后都有默认的安全配置信息，通常被称为easy to use。但遗憾的是，easy to use还意味着easy to break in。所以，一定对默认配置进行扬弃的工作。
(2)、 管理员懒散：懒散的表现之一就是系统安装后保持管理员口令的空值，而且随后不进行修改。要知道，入侵者首先要做的事情就是搜索网络上是否有这样的管理员为空口令的机器。
(3) 、临时端口：有时候为了测试之用，管理员会在机器上打开一个临时端口，但测试完后却忘记了禁止它，这样就会给入侵者有洞可寻、有漏可钻。通常的解决策略是：除非一个端口是必须使用的，否则禁止它!一般情况下，安全审计数据包可用于发现这样的端口并通知管理者。
(4) 、信任关系：网络间的系统经常建立信任关系以方便资源共享，但这也给入侵者带来借牛打力、间接攻击的可能，例如，只要攻破信任群中的一个机器，就有可能进一步攻击其他的机器。所以，要对信任关系严格审核、确保真正的安全联盟。3、口令失窃(1) 、弱不禁破的口令：就是说虽然设置了口令，但却简单得再简单不过，狡猾的入侵者只需吹灰之力就可破解。
(2) 、字典攻击：就是指入侵者使用一个程序，该程序借助一个包含用户名和口令的字典数据库，不断地尝试登录系统，直到成功进入。毋庸置疑，这种方式的关键在于有一个好的字典。
(3) 、暴力攻击：与字典攻击类似，但这个字典却是动态的，就是说，字典包含了所有可能的字符组合。例如，一个包含大小写的4字符口令大约有50万个组合，1个包含大小写且标点符号的7字符口令大约有10万亿组合。对于后者，一般的计算机要花费大约几个月的时间才能试验一遍。看到了长口令的好处了吧，真正是一两拨千斤啊!4、嗅探未加密通讯数据(1)、共享介质：传统的以太网结构很便于入侵者在网络上放置一个嗅探器就可以查看该网段上的通讯数据，但是如果采用交换型以太网结构，嗅探行为将变得非常困难。
(2)、服务器嗅探：交换型网络也有一个明显的不足，入侵者可以在服务器上特别是充当路由功能的服务器上安装一个嗅探器软件，然后就可以通过它收集到的信息闯进客户端机器以及信任的机器。例如，虽然不知道用户的口令，但当用户使用Telnet软件登录时就可以嗅探到他输入的口令了。
(3)、 远程嗅探：许多设备都具有RMON(Remotemonitor，远程监控)功能以便管理者使用公共体字符串(publiccommunitystrings)进行远程调试。随着宽带的不断普及，入侵者对这个后门越来越感兴趣了。5、设计存在缺陷(1) 、 TCP/IP协议的缺陷:TCP/IP协议现在已经广为应用、但是它设计时却是在入侵者猖狂肆虐的今天之很早以前设计出来的。因此，存在许多不足造成安全漏洞在所难免，例如smurf攻击、ICMPUnreachable数据包断开、IP地址欺骗以及SYNflood。然而，最大的问题在于IP协议是非常容易“轻信”的，就是说入侵者可以随意地伪造及修改IP数据包而不被发现。现在Ipsec协议已经开发出来以克服这个不足,但还没有得到广泛的应用。6、系统攻击系统攻击是指某人非法使用或破坏某一信息系统中的资源，以及非授权使系统丧失部分或全部服务功能的行为。
通常可以把攻击活动大致分为远程攻击和内部攻击两种。现在随着互联网络的进步，其中的远程攻击技术得到很大发展，威胁也越来越大，而其中涉及的系统漏洞以及相关的知识也较多，因此有重要的研究价值。
最新释义
漏洞是指一个系统存在的弱点或缺陷，系统对特定威胁攻击或危险事件的敏感性，或进行攻击的威胁作用的可能性。漏洞可能来自应用软件或操作系统设计时的缺陷或编码时产生的错误，也可能来自业务在交互处理过程中的设计缺陷或逻辑流程上的不合理之处。这些缺陷、错误或不合理之处可能被有意或无意地利用，从而对一个组织的资产或运行造成不利影响，如信息系统被攻击或控制，重要资料被窃取，用户数据被篡改，系统被作为入侵其他主机系统的跳板。从目前发现的漏洞来看，应用软件中的漏洞远远多于操作系统中的漏洞，特别是WEB应用系统中的漏洞更是占信息系统漏洞中的绝大多数。
漏洞发现是攻击者与防护者双方对抗的关键，防护者如果不能早于攻击者发现可被利用的漏洞，攻击者就有可能利用漏洞发起攻击。越早发现并修复漏洞，信息安全事件发生的可能性就越小。专业漏洞扫描系统是一种发现漏洞的重要手段，它能自动发现远程服务器端口分配，判断所提供服务，并检测远程或本地主机安全弱点的系统。发现漏洞后，还要进一步通过自动或手动的漏洞验证来检验漏洞扫描结果的准确性。信息系统的运行维护人员应定期进行漏洞扫描，及时发现并快速修复漏洞。
漏洞危害详谈
如今，在病毒肆虐、黑客无处不在的网络环境里，软件的安全性已成为一个备受关注的话题。传统的软件安全性关注的主要在于权限与角色的管理，如访问控制，或是数据的机密性与完整性，如加密解密。但是一个软件系统在应用了这些安全措施之后就能确保其万无一失了吗?答案似乎并不那么简单，其中一个重要(甚至可以说致命)的问题在于软件系统中的漏洞。常常在一个看似牢不可破的系统中，仅仅是因为存在一个小小的漏洞，导致整个安全体系被黑客轻易地攻破，整个系统的控制权彻底丧失。
所谓漏洞，通常是指软件中存在的一些bug，但这种bug又不同于普通软件测试中的bug。普通软件测试中的bug指的是功能性或逻辑性的错误，如对话框弹出出错、系统执行某功能失败等。这些bug影响的只是用户的使用体验，并不对系统的安全构成威胁。而软件的安全漏洞指的是某些别有用心的用户非正常的使用软件，让软件执行一些自己精心设计的恶意代码，或解析畸形文件，当软件中存在安全漏洞的时候，程序的正常执行流程被改变，从而达到获取系统的控制权或窃取机密数据的目的。
下面仅以数据库为例，作为说明。
数据库系统是在操作系统平台之上的最重要的系统软件，数据库系统的安全可以说是十分重要的。曾经有句话这样说：如果网络遍地是金钱，那么金钱就在数据库服务器中。随着无纸化业务环境的不断扩大，人们在数据库中存储着越来越多的敏感信息：银行账户、医疗记录、政府文件、军事机密等等，数据库系统就成为越来越有价值的攻击目标，因此确保数据库系统的安全也越来越重要。
作为一种大型的系统软件，数据库系统中也存在着各种各样的安全漏洞，其中危害性较大的有缓冲区溢出、堆溢出和SQL注入等。
而网络数据库系统尤甚，尤其是一些网络游戏的数据库，下面就以网络游戏天龙八部点卡充值数据库漏洞TL010511为例，说明系统漏洞的可怕性。
1.缓冲区溢出
缓冲区溢出是一种很常见也很古老的安全漏洞。早在上个世纪80年代，缓冲区溢出就已经为人所知，但时至今日，大量的缓冲区溢出漏洞仍被发现。最著名的Morris蠕虫就是利用Unix系统上fingerd程序的缓冲区溢出漏洞。在Oracle 9i发布之初，Oarcle公司曾宣称他的数据库是“ unbreakable ”的，但不到几个月的时间，就暴出Oracle 9i中oracle.exe、XDB等程序存在多个缓冲区溢出漏洞。
在C语言中最常见的缓冲区就是字符数组，而操纵字符数组的函数有gets、strcpy、sprintf等。这些函数在执行字符串拷贝的过程中没有对字符串进行长度检查，这样就很容易发生超长的字符串溢出缓冲区的情况。当初这样设计是出于效率的考虑，但现在看来，这些函数的使用已成为C语言软件脆弱的一个重要因素。如果程序员没有良好的编程习惯，时刻注意函数调用过程中是否拷贝了超过缓冲区长度的字符串，那么缓冲区溢出就不可避免。对于一个有缓冲区溢出漏洞的程序，当普通用户输入超长字符串时，通常只会使该程序崩溃。例如对于下面一小段代码：
/* vulprog */
#include
int main(int argc , char * argv[])
{
char buff[8];
strcpy(buff, argv[1]);
}
如果用户执行 ./vulprog AAAAAAAAAAAAAAAA，在Linux上会出现段错误，因为用户输入了超长的字符串，除了填满了缓冲区，还覆盖了其他一些程序正常退出所需要的数据。为了研究这个问题，就需要了解Linux系统中进程的内存空间。
在Linux系统中，2G～3G的内存地址是普通用户进程的加载空间，其内存布局如下图所示：
  图例从图中可以看出栈结构是从高地址增长到低地址，而进行函数调用时系统所作的“序幕”工作就是将函数的返回地址和EBP压栈，再将ESP赋给EBP使其成为局部基指针，最后ESP减去一定的值为局部变量留出空间。这样当程序将过长的字符串拷贝到缓冲区时就会依次覆盖EBP和返回地址。当用AAAA覆盖返回地址，函数退栈时系统就将0x41414141(A的16进制ASCII码)赋给EIP去执行，由于是一个非法的内存地址，故程序崩溃。但如果用一个实际存在的地址覆盖返回地址，那么程序就转而去执行该地址处的指令，通常黑客会在这个地址植入所谓的shellcode，由shellcode产生一个shell，如果被攻击程序设置了suid位，那么产生的shell就是root shell，黑客也就获得了系统的最高控制权，这一过程就是基本的缓冲区溢出攻击。
覆盖函数的返回地址是比较常见的攻击方式，但缓冲区溢出攻击的手法是灵活多样的，往往在编程中的一个小小纰漏就可能导致被攻击，下面简单介绍一下几种较为高级的攻击方式。
(1)通过覆盖函数指针进行攻击：
/* vulprog */
int main(int argc , char * argv[])
{
void (* fp)(char *) = (void (*)(char *))&puts;
char buff[256];
strcpy(buff,argc[1]);
fp(argc[2]);
exit(1);
}
上面这个程序在执行拷贝时没有检查边界，这样用户数据就有可能覆盖函数指针fp，如果用shllcode的地址去覆盖fp，那么函数指针调用时就会去执行shellcode。
这种覆盖函数指针的方式是一种较直接的覆盖方式(因为函数指针就在缓冲区上面)，还有一种间接的覆盖方式，就是当函数指针不直接在缓冲区上面时，通过覆盖另外一个指针来覆盖函数指针，再将shellcode的地址填充函数指针。
(2)通过覆盖 .dtors区地址进行攻击：
/* vulprog */
int main(int argc ,char * argv[])
{
char * pbuf = malloc(strlen(argv[2])+1);
char buff[256];
strcpy(buff,argv[1]);
strcpy(pbuf,argv[2]);
exit(1);
}
虽然这个程序没有函数指针，但在执行第二个拷贝时，可以将任意的数据拷贝到任意的地址中(这个地址由第一个拷贝指定)，这时就可以选择用 .dtors区的地址覆盖指针pbuf，在执行第二个拷贝时将shellcode的地址拷贝至.dtors区，那么在函数退出时shellcode就会被执行。 
由此可见，漏洞的危害可大可小！