中国领先的IT技术网站
|
|

2.12.2 软件安全中的诸宗罪

《信息安全原理:第5版》第2章安全需求,本章介绍商界对信息安全越来越感兴趣的原因。本章介绍了现代企业在信息安全领域的需求,强调并构建了第1章介绍的概念。一个原理性概念是:信息安全主要是一个管理问题,而不是技术问题。换言之,信息安全领域中的最佳实践过程是在考虑了商务需求后,才应用具体的技术。本节为大家介绍软件安全中的诸宗罪。

作者:王晓海 译来源:清华大学出版社|2015-12-10 11:17

Tech Neo技术沙龙 | 11月25号,九州云/ZStack与您一起探讨云时代网络边界管理实践


2.12.2  软件安全中的诸宗罪

一些软件开发故障或者错误导致很难或无法以安全的方式部署软件。其中最常见的一些称为"软件开发中的诸宗罪"。55软件开发中的这20个问题区域最初由John Viega分类,时任美国国土安全部国家网络安全办公室主管的Amit Youran请求他完成了这项任务。接下来就描述这些问题区域。

缓冲区溢出  在通信过程中,两个实体的处理速度出现不协调时,就要使用缓冲区。当缓冲区溢出时,攻击者能够使目标系统执行指令,或者利用该故障造成的其他后果。有时,只能进行DoS攻击。无论怎样,被攻击系统中的数据都丧失了完整性。561998年,微软就遇到了一个缓冲区溢出问题:

"微软承认:如果在IE 4.0中输入超过256个字符的res://URL(微软设计的一种URL),浏览器就会崩溃。这似乎不是什么大问题,但是第256个字节之后的字节能在计算机上执行。这个花招称为缓存区溢出,正是本书中提到的最老式的黑客诡计。将一些恶意代码(例如,使奔腾计算机崩溃的FooF代码的可执行版本)添加到URL的末端,就会制造一场灾难。"57

命令注入  产生命令注入问题的原因在于,在程序中使用命令输入之前,开发人员没有确保验证这些命令输入。使用Windows命令shell可以演示一个非常简单的例子:

  1. @echo off  
  2. set /p myVar="Enter the string>" 
  3. set someVar=%myVar%  
  4. echo %somevar%  

这些命令要求用户提供一个字符串,然后将另一个变量设为该值并显示。但是,攻击者可以使用命令连接字符(&)在用户提供的字符串后面附加其他命令(Hello&del*.*)。

跨站脚本攻击(XSS)  跨站脚本攻击使攻击者能够获得有价值的信息,如账户凭据、账户号码和其他重要数据。通常,攻击者将恶意链接编码并放到目标服务器上,使其看起来不那么可疑。当恶意应用程序收集了数据后,就会从目标服务器发送看上去有效的响应。59

未能处理错误  当系统或应用程序遇到无法处理的场景时会发生什么?会尝试完成操作(读写数据或执行计算)吗?会发出只有程序员能理解的晦涩消息吗?还是干脆停止运行?未能处理错误会导致各种意外的系统行为。程序员应该预见到问题,并为处理这些问题准备好应用程序代码。

未能保护网络流量  随着无线网络越来越流行,无线传输的数据被拦截的风险也在增加。大多数无线网络在安装和运行时,对客户端和无线网络接入点之间广播的信息提供很少(甚至没有提供)保护。咖啡店、书店和宾馆的公共网络尤其如此。没有合适的加密(如WPA提供的那些),攻击者就可以拦截并查看发送的数据。

在一些场景中,有线网络中的流量也容易被拦截。在使用集线器而不是交换机的网络上,任何用户都可以安装数据包嗅探器,收集该网络上的用户发出和收到的数据。定期扫描未授权的数据包嗅探器和未授权的网络连接,以及提高对这种威胁的认识,可以减少这个问题。

未能安全地存储和保护数据  安全地存储和保护数据是一个非常大的主题,可以成为一本书的核心内容。程序员负责在程序中集成访问控制,并将机密信息放到程序外部。访问控制是后续章节的主题,它们控制着哪些用户和系统在什么时候、什么地方、以何种方式与数据交互。不能恰当实现足够强的访问控制使数据易受攻击。过于严格的访问控制会妨碍用户执行职责,导致以行政方式移除控制或绕过控制。

集成机密信息(如"硬编码"密码、加密密钥或其他敏感信息)会使该信息存在被暴露的风险。

未能使用安全等级强的随机数  大多数现代加密系统(例如其他许多计算机系统)都使用随机数生成器。但是,对于严格程度和真正随机性的要求,为使用蒙特卡罗方法进行预测而使用随机数和伪随机数的决策支持系统与想要实现加密过程的系统是不同的。这些"随机"数生成器使用数学算法,根据种子值和另一系统组件(如计算机时钟)来模拟随机数。理解这种"随机"数生成器的工作原理的人们可以预测特定时间的特定值。

格式字符串问题  计算机语言通常内置了在输出数据时将其重新格式化的能力。格式化指令通常被写作"格式字符串"。但是,有些程序员可能使用来自非信任源的数据作为格式字符串。60攻击者可能在恶意输入中嵌入作为格式指令(例如%x、%d、%p等)有意义的字符。如果这个输入被程序解释为格式化指令(如C语言的printf函数的参数),攻击者可能就能够访问程序栈的信息,或者使用自己选择的数据重写程序堆栈中的目标部分。61

忽略变更控制  开发人员使用一个称为"变更控制"的过程,以确保交给用户的工作系统代表了开发人员的意图。在开发过程的早期,变更控制确保了开发人员的工作不会同时修改相同的程序或者程序部分,导致工作冲突。一旦系统进入生产阶段,变更控制过程确保了只有经过授权的变更能够引入系统,并且所有变更在发布前都经过了足够的测试。

不正当的文件访问  如果攻击者通过拦截并修改程序代码调用,修改了文件的预期位置,就可以强制程序使用其他文件,而不是本应该使用的文件。这类攻击可用来将合法文件(如密码文件)替换为假文件,或者诱导系统运行恶意可执行文件。这类攻击很可能导致破坏或信息泄露,所以不只应该保护文件的位置,保护访问这些文件的方法和通信渠道也至关重要。

不恰当地使用SSL  程序员使用安全套接字层(SSL)在客户端和服务器之间传输敏感数据,如信用卡号码和其他私人信息。虽然大多数程序员认为使用SSL就保证了安全,但是他们常常不恰当地使用这种技术。SSL及其后继协议传输层安全(TLS)都需要证书验证才能真正实现安全。未能使用HTTPS来验证证书授权和证书本身,或者未能针对证书吊销列表(CRL)验证信息,会损害SSL流量的安全性。第8章将更详细地介绍加密控制。

信息泄露  获取内部和机密信息最常用的方法之一是直接或间接地从某个人(通常是一名员工)那里获得。"二战"期间有一个著名的海报警告说"口风不严战舰沉",这句话强调了如果海员、水兵和他们的家人泄露了美国军舰的行动,海军部署就存在遭受敌人攻击的风险。当时很多人担心的一个问题是敌人安排了一些平民特工,让他们等候在海军停靠港口的酒吧和商店,等待军人们无意间透露出关于他们什么时候要去什么地方的信息。通过警告员工不要泄露信息,机构可以保护运营的机密性。

整数错误(上溢和下溢)  虽然理论上,数学计算可以处理包含任意个数字的数,但是计算机使用的二进制表示具有固定长度。程序员必须预见到在程序的任何部分要计算的数的大小。当程序员没有验证要计算的输入,没有确认整数大小符合预期时,就可能发生整数错误。例如,把1加到32 767上应该得到32 768,但是在使用16位有符号整数的计算机计算中,会产生错误的结果-32 468。而把-32 767减去5后,会发生下溢,得到不正确的结果+32 764,因为使用16个位能够表示的最大负整数是-32 768。

整数错误分为四大类:上溢、下溢、截断和符号类型错误。整数错误通常被间接利用-- 也就是说,触发整数错误使攻击者能够破坏内存的其他区域,获得对应用程序的控制。如果某个值大于预期,就可能超出为该值分配的内存,多出的位会写入其他位置。然后,系统会出现不可预知的后果,包括计算错误、错误、崩溃或其他问题。虽然整数错误常被用来创建缓冲区溢出或其他内容破坏攻击,但是整数错误并不只是内存破坏错误的特例。62

争用条件  当程序执行中事件的意外顺序导致对相同系统资源的访问发生冲突时,就会发生争用条件,这是程序的一种故障。这种冲突不需要涉及程序中的代码流,因为当前的操作系统和处理器技术会自动把程序分解为多个可同步执行的线程。如果这个过程得到的线程共享任何资源,就可能彼此干扰。63

例如,当程序创建了一个临时文件,并且攻击者能够在文件创建后、被使用以前替换掉该文件时,就会发生争用条件。当信息存储在多个内存线程中时,如果一个线程故意或无意间将信息存储到错误的内存位置,也可能发生争用条件。

SQL注入  开发人员在使用用户输入查询关系数据库之前,如果没有恰当地对用户输入进行验证,就可能发生SQL注入。例如,一个无害的程序片段可能期望用户输入用户ID,然后对USERS表执行SQL查询以检索相关的姓名:

  1. Accept USER-ID from console;  
  2. SELECT USERID, NAME FROM USERS WHERE USERUSERID = USER-ID;  

这是直观的SQL语法;正确使用时,它会显示用户ID和姓名。问题在于,从用户那里接受的字符串作为SQL命令的一部分直接传递给SQL数据库服务器。如果攻击者输入了字符串"JOE OR 1=1",会发生什么?这个字符串包含有效的SQL语法,当用户ID为"JOE"或"1=1"时返回表中的所有行。因为1总是等于1,所以系统将返回所有用户ID和姓名。黑客在程序中注入SQL代码可能产生的影响不限于以不正当方式访问信息,例如攻击者可能包含SQL命令来删除USERS表,甚至关闭数据库。64

信任网络地址解析  DNS是万维网的一个功能,将类似于www.course.com的URL转换为Web服务器主机的IP地址。这个分布式模型容易受到攻击或被"投毒"。DNS缓存投毒是指破坏DNS服务器,然后把与某个域名称关联的有效IP地址修改为攻击者选择的IP地址,通常是一个虚假网站,专门被设计用来获得私人信息或者给攻击者带来收益--例如将购物者从竞争对手的网站重定向到自己的网站。不过,这种攻击一般更加危险;例如,用于进行钓鱼攻击的虚假银行网站可能收集网上银行的信息。

攻击者如何使这种虚假信息进入DNS服务器的呢?除了直接攻击根DNS服务器,多数时候是攻击主DNS服务器和辅助DNS服务器,它们属于机构所有,是分布式DNS系统的一部分。其他攻击尝试破坏DNS分布模式更上层的DNS服务器--ISP或者支柱连接提供商的DNS服务器。DNS依赖于一个可被攻击的自动更新过程。攻击者最常见的做法是破坏DNS的段,方法通常是攻击名称服务器的名称并替换为他们自己的DNS主名称服务器,错误地更新单独记录,或者在实际DNS之前响应。在最后一类攻击中,攻击者尝试发现名称服务器的延迟,或者引入一个延迟,如进行DoS攻击。当延迟就绪后,攻击者可以设置另一个服务器在真正的DNS服务器之前进行响应,好像这个服务器是真正的DNS服务器一样。客户端会接受它收到的第一组信息,并被定向到该IP地址。

未认证的密钥交换  私钥系统(其中的两个用户共享相同密钥)面对的最大挑战之一是安全地让密钥到达对方。在交换密钥时,有时候会使用一个"带外"信使,其他时候则使用一个公钥系统。在公钥系统中会同时使用一个公钥和一个私钥。但是,某个未经认证的人可能收到被复制到USB设备上寄送的密钥。这个人可能不是公司员工,而只是预知有这次寄送,并进行了拦截。在互联网上可能发生类似的情景,即攻击者编写了公钥系统的一个变体,使其作为一个免费软件,或者攻击者破坏并拦截了其他人的公钥加密系统的功能(方法可能是假装成一个公钥存储库)。

使用神奇URL和隐藏表单  HTTP是一个无状态协议,通信通道两端的计算机程序不能依赖于任何消息被保证递送。这使软件开发人员很难跟踪用户在与网站的多次交互中交换的内容。很多时候,敏感状态信息被包含在HTML页面上的隐藏表单字段中,或者干脆包含在一个"神奇的"URL中(例如,身份验证ID作为URL的参数传递,用于接下来要进行的交换)。如果这些信息被存储为明文,那么当神奇URL在网络中传递时,攻击者可以收集这些信息。或者,攻击者可以在客户端使用脚本来修改隐藏表单字段中的信息。根据应用程序的结构,收集或者修改的信息可用于欺骗或者劫持攻击,或者修改应用程序的运行方式。例如,如果某个商品的价格存储在隐藏的表单字段中,攻击者就可以进行修改,用1美分买下该商品。65

使用基于弱密码的系统  未能要求足够的密码强度,未能控制错误的密码输入,这是严重的安全问题。密码策略可以指定可接受的字符数和字符类型,必须改变密码的频率,甚至是否可以重用原来的密码。类似地,系统管理员可以管理允许提交错误密码的次数,从而进一步提高保护等级。不验证密码或者在易于访问的位置存储密码的系统很容易遭受攻击。

不易使用  员工更喜欢选择容易的方式。当面临执行任务的"正式方式"和"非正式方式"(更简单的方式)时,他们会选择后者。解决这个问题最好的方法是只提供一种方式:安全的方式。集成安全性和易用性,增加培训并提高认知,并确保可靠的控制,这都有助于保护信息的安全。允许用户在默认情况下选择更简单的方法不可避免地会导致损失。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢
24H热文
一周话题
本月最赞

读 书 +更多

非常网管——网络应用

在网络应用越来越复杂的今天,传统的网络应用已经不能满足企业和用户的需要,这就对网络管理员、信息管理部门提出了更高的要求。本书介绍了...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× CTO训练营(深圳站)