如何在软件开发中避免出现漏洞

译文
开发 前端 应用安全
在本文中,您将了解一些最为常见的软件漏洞,以及如何避免它们的方法。此外,您还会学习到如何采用一些通用的优秀实践,来确保软件和数据的安全。

【51CTO.com快译】随着数据泄露事件的频繁发生,创建和维护安全的软件产品对于每一个组织来说,都变得越来越重要了。尽管并非所有的攻击都可以被预期或防范,但是我们至少可以通过消减软件的漏洞,来避免攻击的暴露面。

[[315437]]

在本文中,您将了解一些最为常见的软件漏洞,以及如何避免它们的方法。此外,您还会学习到如何采用一些通用的优秀实践,来确保软件和数据的安全。

常见的软件漏洞

2019年,MITRE.org的CWE(Common Weakness Enumeration,通用缺陷列表)推出了25项最危险的软件错误列表,请参见:https://cwe.mitre.org/top25/archive/2019/2019_cwe_top25.html。尽管攻击者的手法五花八门,但实际上却是万变不离其宗地组合了各种常见的攻击方式。在此我们将重点讨论其中的几个常见软件漏洞。

缓冲区溢出(Buffer Overflow)

当您的程序试图读取或写入超出范围的缓冲区时,就会发生缓冲区溢出的错误。其直接的危害是:可能导致数据覆盖,或是在现有的代码中附加不该出现的数据。因此,缓冲区溢出可以使得攻击者通过执行代码,来更改程序流,进而读取某种敏感数据,或造成系统的崩溃。

缓冲区溢出漏洞的典型示例包括:

  • 接受各种长度不受限制的输入
  • 允许从无效的索引处对数组进行读取操作

缓冲区溢出漏洞通常潜藏在软、硬件体系架构的设计、实施、以及操作阶段。这些漏洞最常见于C、C ++和Assembly程序中。当然,它也可能出现在缺乏对内存管理提供支持的任何一种编程语言里。

针对缓冲区溢出漏洞的预防措施

如上文所述,我们应当尽量选择诸如:Java或Perl等具有防范,或降低此类漏洞风险机制的语言。而在C#之类的编程语言中,我们千万不要禁用溢出保护的选项。即便如此,那些具有“免疫”功能的编程语言,也可能会在运行环境中的易受攻击的、原生代码交互时,产生不可预期的错误。

为了防止缓冲区溢出漏洞被利用,您可以使用诸如Visual Studio或StackGuard之类的编译器,来针对函数或扩展名进行输入的限制。同时,您还可以使用各种工具,在内存中随机地排列程序的不同组件,以使得地址更难以被识别与预测,进而使攻击者难以利用到这些特定的组件。

另外,请创建代码时确保正确地分配缓冲区空间,并使用各种方法和功能来限制输入的大小。

不当的输入验证(Improper Input Validation)

如果我们不能够在接收端对用户的输入采取验证,或验证不足,那么就会产生所谓的“输入验证不当”。而不当的验证则会使得攻击者通过执行恶意代码,来更改程序流,访问敏感数据,以及滥用现有的资源分配。

不当验证的典型示例包括:

  • 自认为攻击者无法访问到隐藏的表单字段
  • 仅验证输入的字段的长度,而不是具体内容

不当的验证同样会潜藏在软、硬件体系架构的设计和实施阶段。它可以发生在任何接受外部数据的编程语言或系统中。

不当验证漏洞的预防措施

我们应该对任何用户采取“零信任(zero trust)”的原则,并假设所有的输入都是可疑的,直到它们被证明是安全的为止。同时,我们可以使用白名单机制,来确保输入的内容仅包含了可接受的格式与信息。

因此,在验证输入时,请评估其长度、类型、语法、以及逻辑上的符合性(即:输入是否具有语义)。您可以使用多种工具来确保完成了充分的验证,例如:OWASP ESAPI Validation API(https://owasp.org/www-project-enterprise-security-api/)和RegEx(RegularExpression,正则表达式)。这些工具可以帮助我们验证所有的输入源,包括:环境变量、查询、文件、数据库、以及API调用。

此外,我们应当确保在客户端和服务器端都执行相应的检查。为了避免出现客户端验证被绕过的情况,我们需要重点在服务器端捕获各项输入,以识别攻击者的潜在操纵。同时,在程序代码进行任何必要的组合或转换后,也请您再次验证其输入。

信息泄露(Information Exposure)

数据被有意或无意地提供给潜在攻击者,被称为信息泄露。除了泄露敏感的数据信息,向攻击者提供可能被利用的软、硬件环境信息也是一种泄露。

信息泄露的典型示例包括:

  • 错误地暴露文件或程序的完整路径
  • 程序的错误、异常消息中暴露了数据库中用户的相关信息

信息泄露漏洞依然会潜藏在软、硬件体系架构的设计和实施阶段。它跟编程语言无关,更大程度上取决于编程的习惯。

信息泄露漏洞的预防措施

为防止信息的泄露,您应当在设计程序架构时,针对明确的信任边界区域(请参见:https://www.microsoft.com/en-us/itshowcase/implementing-a-zero-trust-security-model-at-microsoft),来保护敏感的信息;通过使用访问控制,来保护和限制“安全”区域与各个端点之间的连接。

为了最大程度地避免该漏洞,请在程序中验证各类错误的提示消息,以及用户警告信息中是否包含有不必要暴露的内容。同时,您还应该限制在URL和通信包的头部(header)出现的敏感信息。例如:您可以隐藏完整的路径名称,以及API密钥。

特权或认证不当(Improper Privileges or Authentication)

如果未能正确地分配,跟踪,修改或验证用户的相关权限和凭据,那么就可能发生特权或身份验证不当的情况。此类漏洞可以让攻击者滥用特权,执行受限的任务,以及访问受限的数据。

特权或身份验证不当的典型示例包括:

  • 未及时回收临时的提权
  • 仅通过黑名单、而不是白名单来限制特权
  • 允许较低的特权级别去影响较高的特权帐户,例如:重置管理员的密码
  • 限制登录尝试的次数或会话空闲时间

特权或身份验证漏洞仍然可能发生在软、硬件体系架构的设计、实施、以及操作阶段。它同样不限于某一种编程语言。

特权或身份验证漏洞的预防措施

您应当将“最小特权原则”,应用于与目标软件和系统交互的所有用户和服务之中。只给真正需要某些资源和操作的用户或服务,完成所需任务的最少权限。我们需要通过在整个程序和环境中使用访问控制,来限制用户和实体的权限。

如有可能,我们也可以将高级特权分给多个角色。通过分离,我们可以有效地削弱“高级用户”,并降低攻击者滥用其访问权限的能力。此外,您还可以运用多因素身份验证的方法,来防止攻击者绕过系统的检查机制,轻松地获得访问权限。

减少一般性漏洞的优秀实践

除了采取针对特定漏洞的措施之外,我们还应该利用一些通用的措施,在总体上减少漏洞的暴露面。您可以从如下方面入手:

从威胁情报中学习

持续监控和使用来自漏洞数据库(vulnerability databases,请参见:https://vuln.whitesourcesoftware.com/)和独立监督组(如:OWASP或NIST)的消息。这些资源可以在出现漏洞后,及时地为您提供该漏洞的相关信息,并能够指导您如何解决或缓解当前存在的问题。据此,您可以根据实际情况,准确地修补目标系统及其组件。

谨慎地包含依赖性

请确保仅在需要时才去使用那些已经过审核、且值得信任的库和框架。某些不知名的工具会将其自身的漏洞传递到您的软件中,并且会给攻击者提供潜在的访问后门。而且,在使用选定的库和框架时,请确保您已经充分了解了可用的功能,以及那些已知的漏洞与缺陷。

执行漏洞评估

永远不要盲目地认为自己的程序已经“固若金汤”,请不断通过静态代码和动态运行时(runtime)的测试,以确保各种遗留的漏洞能够得到及时的评估。只有将自动测试工具集成到现有开发环境中,您才能尽早地发现漏洞。据此,您可以确保自己不会因为时间的限制而跳过某些重要的测试,也不会因为人为的错误而忽略掉应有的测试。

总结

综上所述,软件漏洞可谓层出不穷,显然无法赶尽杀绝。我们能做的只有通过了解漏洞的原理和防范的措施,来及时地调整自己的实现方式,并开展全面的测试,尽量在产品发布之前,尽可能多地发现并解决潜在的漏洞与问题。希望本文在上面所介绍到的各种最常见漏洞,以及在软件开发中推荐采用的实践和方法,能够帮助您减少攻击者乘虚而入的机会。

原文标题:Avoiding Vulnerabilities in Software Development,作者:Eddie Segal

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

责任编辑:张燕妮 来源: 51CTO
相关推荐

2021-09-16 09:05:45

SQL注入漏洞网络攻击

2023-05-30 18:26:49

ZOMBIES软件开发

2020-12-03 15:54:15

软件开发工具

2020-03-03 09:43:21

软件数据库Java

2017-09-19 09:14:40

2012-12-10 09:49:28

2016-10-09 23:47:04

2023-02-09 16:48:12

软件开发测试结对测试

2009-12-29 14:25:14

phpXSS漏洞

2016-04-25 11:37:10

开发团队问题

2021-08-31 08:00:00

开发软件框架

2011-07-04 17:09:54

2009-03-04 17:48:05

虚拟化VMware微软

2011-08-11 09:56:50

模式

2011-12-26 11:22:48

2012-12-21 09:48:36

2024-01-30 08:56:55

性能监控性能管理工具内存存储

2009-06-03 15:23:18

Struts教程乱码

2022-03-09 10:18:48

UnixC语言软件

2022-08-30 18:46:24

安全软件开发测试软件
点赞
收藏

51CTO技术栈公众号