随着数据泄露的增加,创建和维护安全软件对于每个组织都至关重要。尽管并非所有攻击都可以预期或预防,但可以通过消除软件漏洞来避免许多攻击。在本文中,您将了解一些最常见的软件漏洞以及如何避免这些问题。您还将学习一些通用的优秀实践,以确保您的软件和数据保持安全。
解决常见软件漏洞
以下漏洞只是MITRE的 2019年CWE最危险的25个最严重软件错误列表中列出的几个漏洞。尽管攻击者已广为人知并使用了许多此类问题,但它们仍继续包含在软件中。
缓冲区溢出
当您的程序试图读取或写入超出范围的缓冲区时,就会发生缓冲区溢出。它可能导致覆盖或在现有代码中附加数据。缓冲区溢出可使攻击者执行代码,更改程序流,读取敏感数据或使系统崩溃。
缓冲区溢出漏洞的示例包括:
- 接受长度不受限制的输入
- 允许从无效索引对数组进行读取操作
缓冲区溢出漏洞的包含通常发生在体系结构和设计,实施或操作阶段。这些漏洞最常见于C,C ++和Assembly程序,但可以以任何缺少内存管理支持的语言出现。
缓冲区溢出的漏洞预防措施
尽可能选择一种防止或降低此漏洞风险的语言,例如Java或Perl。如果这是一个选项,请不要禁用溢出保护,例如在C#中。此外,请记住,与环境中的易受攻击的本机代码交互时,即使是“免疫”语言也可能会产生错误。
为了防止利用缓冲区溢出漏洞,可以使用包含功能或扩展名以限制输入的编译器。例如,Visual Studio或StackGuard。您还可以使用工具在内存中随机排列程序组件。这使得地址更难以识别或预测,从而使攻击者难以利用特定组件。
创建代码时,请确保正确分配了缓冲区空间。另外,请使用允许您限制输入大小的方法和功能。
输入验证不正确
当用户输入在接受时未得到验证或验证不足时,就会发生输入验证不当。不正确的验证可以使攻击者执行恶意代码,更改程序流,访问敏感数据或滥用资源分配。
验证不当的示例包括:
- 假设攻击者无法访问隐藏的表单字段
- 仅验证输入的长度而不是内容
包含不正确的验证通常发生在架构,设计和实施阶段。它可以在任何接受外部数据的语言或系统中发生。
输入验证不当的漏洞预防措施
您应该对任何用户应用“零信任”原则,并假设所有输入都是有害的,直到证明安全为止。使用白名单以确保输入内容仅包含可接受的格式和内容。
在验证输入时,请评估长度,类型,语法和对逻辑的符合性(即输入具有语义意义)。您可以使用多种工具来确保进行充分的验证,例如OWASP ESAPI验证API和RegEx。使用这些工具来验证所有输入源,包括环境变量,查询,文件,数据库和API调用。
确保在客户端和服务器端都执行检查。可以绕过客户端验证,因此您需要仔细检查。如果绕过客户端验证,则在服务器端捕获输入可以帮助您识别攻击者的操纵。在进行任何必要的组合或转换后,请验证输入。
信息公开
当有意或无意将数据提供给潜在攻击者时,就会发生信息泄露。数据可以包含敏感信息,也可以向攻击者提供有关可以在攻击中利用的软件或环境的信息。
信息公开的示例包括:
- 显示文件或程序完整路径的错误
- 错误消息暴露了数据库中用户的存在
包含信息公开漏洞通常发生在开发的体系结构和设计或实施阶段。任何语言都可能发生这些漏洞。
信息暴露的漏洞预防措施
为防止信息泄露,您应设计程序体系结构以将敏感信息包含在具有明确信任边界的区域中。确保使用访问控制来保护和限制“安全”区域与端点之间的连接。
为了很大程度地利用漏洞,请验证错误消息和用户警告中是否包含不必要的信息。您还应该限制来自URL和通信标头的敏感信息。例如,模糊完整的路径名或API密钥。
特权或认证不当
如果未正确分配,跟踪,修改或验证用户权限和凭据,则会发生不正确的权限或身份验证。这些漏洞可使攻击者滥用特权,执行受限任务或访问受限数据。
不当特权或身份验证的示例包括:
- 不可逆转的临时特权升级。
- 通过黑名单而不是白名单来限制特权。
- 允许较低的特权级别影响较高的特权帐户,例如重置管理员密码。
- 无限制的登录尝试或会话限制。
特权或身份验证漏洞通常在开发的体系结构和设计,实施或操作阶段引入。任何语言都可能发生这些漏洞。
特权或身份验证的漏洞预防措施
您应将最小特权原则应用于与您的软件和系统交互的所有用户和服务。通过在整个程序和环境中应用访问控制来限制用户和实体的功能。您应该将权限限制为仅用户或服务所需的那些资源。
如果可能,将高级特权分成多个角色。分离有助于限制“高级用户”,并降低攻击者滥用访问权限的能力。您还可以应用多因素身份验证方法来防止攻击者绕过系统或获得轻松的访问权限。
减少一般漏洞的优秀实践
除了采取针对特定漏洞的措施外,您还应该采取一些措施来总体上减少漏洞。您可以从以下做法开始。
向威胁情报来源学习
监视和应用来自漏洞数据库和独立监督组(例如OWASP或NIST)的信息。这些资源可以在发现漏洞后为您提供有关漏洞的信息。这些资源通常包括有关如何解决或缓解当前存在的问题的信息。您可以应用此信息来确保正确修补了系统和组件。
仔细包括依赖性
确保仅在需要时才使用经过审查和信任的库和框架。这些工具中的漏洞会传输到您的软件,并且可以为攻击者提供后门访问。使用库和框架时,请确保您了解可用的功能,并且知道任何已知的利用或漏洞。
进行漏洞评估
即使您遵循任何已知的优秀做法,也不要假定您的程序是安全的。您需要在运行时静态测试代码,以确保不会遗漏漏洞。将自动测试工具集成到您的开发环境中可以帮助您尽早发现漏洞。这些工具可以帮助您确保不会因时间限制而跳过测试,也不会因人为错误而忽略测试。
结论
软件漏洞似乎是不可避免的,但大多数漏洞可以消除或至少减少。通过了解如何引入漏洞,您可以调整自己的做法和测试以在产品发布之前发现问题。
希望本文能帮助您了解一些最常见的漏洞。通过应用此处介绍的实践和方法,可以减少攻击者利用软件中这些问题的机会。