当前位置: 首页 > 科技观察

如何避免软件开发中的漏洞_0

时间:2023-03-22 14:30:35 科技观察

【.com快译】随着数据泄露的频繁发生,创建和维护安全的软件产品对每个组织来说都变得越来越重要。虽然不是所有的攻击都可以预见或预防,但至少我们可以通过减少软件的漏洞来避免攻击的暴露。在本文中,您将了解一些最常见的软件漏洞以及如何避免它们。此外,您还将学习如何采用一些常见的最佳实践来确保软件和数据的安全。常见软件漏洞2019年,MITER.org的CWE(CommonWeaknessEnumeration,常见缺陷列表)推出了25个最危险的软件错误列表,参见:https://cwe.mitre.org/top25/archive/2019/2019_cwe_top25。HTML。虽然攻击者的手法多种多样,但实际上是各种常见攻击手段的组合。在这里,我们将重点关注其中的一些常见软件漏洞。缓冲区溢出(BufferOverflow)当您的程序试图读取或写入超出范围的缓冲区时,就会发生缓冲区溢出错误。它的直接危害是:可能会导致数据被覆盖,或者增加现有代码中不应出现的数据。因此,缓冲区溢出可以让攻击者通过执行代码改变程序流程,进而读取一些敏感数据,或者导致系统崩溃。缓冲区溢出漏洞的典型示例包括:接受各种长度的输入无限制允许从无效索引对数组进行读取操作缓冲区溢出漏洞通常潜伏在软硬件架构的设计、实现和运行阶段。这些漏洞最常见于C、C++和汇编程序中。当然,它也可以出现在任何缺乏内存管理支持的编程语言中。缓冲区溢出漏洞的预防措施如上所述,我们应该尽量选择Java或Perl等具有防止或降低此类漏洞风险机制的语言。而在像C#这样的编程语言中,我们绝不能禁用溢出保护选项。即便如此,“免疫”的编程语言在运行时环境中与易受攻击的本地代码交互时,可能会产生不可预测的错误。为防止缓冲区溢出攻击,您可以使用VisualStudio或StackGuard等编译器对函数或扩展设置输入限制。同时,还可以利用各种工具在内存中随机排列程序的不同组件,使地址更难识别和预测,使攻击者难以利用这些特定组件。此外,请确保在创建代码时正确分配缓冲区空间,并使用各种方法和函数来限制输入的大小。不正确的输入验证(ImproperInputValidation)如果我们不能在接收端验证用户的输入,或者验证不充分,那么就会出现所谓的“不正确的输入验证”。不正确的身份验证可能允许攻击者通过执行恶意代码来改变程序流、访问敏感数据和滥用现有资源分配。不正确验证的典型示例包括:被认为攻击者无法访问的隐藏表单字段仅验证输入字段的长度,而不是其内容验证不当也可能潜伏在软件和硬件架构的设计和实现中。它可以发生在任何接受外部数据的编程语言或系统中。不当验证漏洞的预防措施我们应该对任何用户采用“零信任”原则,并假设所有输入都是可疑的,直到它们被证明是安全的。同时,我们可以使用白名单机制来保证输入的内容只包含可接受的格式和信息。因此,在验证输入时,评估其长度、类型、语法和逻辑合规性(即:输入是否具有语义)。您可以使用各种工具来确保完成充分的验证,例如:OWASPESAPIValidationAPI(https://owasp.org/www-project-enterprise-security-api/)和RegEx(RegularExpression,正则表达式)。这些工具帮助我们验证所有输入源,包括:环境变量、查询、文件、数据库和API调用。此外,我们应该确保在客户端和服务器端都执行了适当的检查。为了避免绕过客户端验证的情况,我们需要专注于捕获服务器端的输入以识别攻击者的潜在操纵。另外,在任何必要的组合或转换后,请重新验证程序代码的输入。信息暴露(InformationExposure)数据有意或无意地提供给潜在的攻击者,称为信息暴露。除了泄露敏感数据信息外,为攻击者提供可能被利用的软硬件环境信息也是一种泄露。信息泄露的典型例子包括:错误地暴露文件或程序的完整路径。程序错误和异常消息揭示了数据库中用户的相关信息。信息泄露漏洞仍然隐藏在软硬件架构的设计和实现阶段。它与编程语言无关,更大程度上取决于编程习惯。信息泄露漏洞的预防措施为防止信息泄露,您应该设计具有明确信任边界的程序架构(参见:https://www.microsoft.com/en-us/itshowcase/implementing-a-zero-trust-security-model-at-microsoft)来保护敏感信息;通过使用访问控制来保护和限制“安全”区域和各个端点之间的连接。为最大程度避免该漏洞,请在程序中验证各种错误的提示信息和用户警告信息是否包含不必要的暴露。同时,还应限制URL和通信包头中出现的敏感信息。例如:您可以隐藏完整路径名,以及API密钥。不当的权限或身份验证如果用户的关联权限和凭证未正确分配、跟踪、修改或验证,则可能会发生不当的权限或身份验证。此类漏洞可能允许攻击者滥用特权、执行受限任务和访问受限数据。不当权限或身份验证的典型示例包括:未及时撤销的临时权限提升仅通过黑名单而不是白名单来限制权限允许较低的权限级别影响较高权限的帐户密码限制登录尝试次数或会话空闲时间权限或在软件和硬件架构的设计、实现和运行阶段,身份验证漏洞仍然可能发生。也不局限于某种编程语言。权限或身份验证漏洞的预防措施您应该将“最小权限原则”应用于与目标软件和系统交互的所有用户和服务。只给真正需要某些资源和操作的用户或服务最少的权限来完成所需的任务。我们需要通过在整个程序和环境中使用访问控制来限制用户和实体的权限。如果可能,我们还可以将高级权限分配给多个角色。通过分离,我们可以有效地削弱“高级用户”,降低攻击者滥用其访问权限的能力。此外,您可以使用多因素身份验证来防止攻击者绕过系统检查并轻松获得访问权限。减少通用漏洞的最佳实践除了针对特定漏洞采取措施外,我们还应该使用一些通用措施来减少通用漏洞的暴露。您可以通过持续监控和使用来自漏洞数据库(请参阅:https://vuln.whitesourcesoftware.com/)和独立监督组(例如:OWASP或NIST)的信息来从威胁情报中学习。这些资源可以在漏洞发生后及时为您提供漏洞的相关信息,指导您如何解决或缓解当前的问题。由此,您可以完全按原样修补目标系统及其组件。小心地包含依赖项确保只在需要时使用经过审查和值得信赖的库和框架。未知工具可以将自身的漏洞传递到您的软件中,并为攻击者提供潜在的后门访问权限。此外,在使用您选择的库和框架时,请确保您对可用的功能以及那些已知的错误和缺陷有很好的了解。进行漏洞评估千万不要盲目地认为你的程序已经“加固”了,请继续通过静态代码和动态运行时(runtime)测试,以确保能够及时评估各种遗留漏洞。只有将自动化测试工具集成到您现有的开发环境中,您才能及早发现漏洞。相应地,您可以确保您不会因时间限制而跳过一些重要的测试,也不会因人为错误而忽略应有的测试。小结综上所述,软件漏洞可谓层出不穷,而且显然无法根除。我们能做的就是通过了解漏洞的原理和防范措施,及时调整我们的实现,并进行全面的测试,在产品发布前尽可能多地发现并解决潜在的漏洞和问题。希望本文对最常见漏洞的描述以及推荐的软件开发实践和方法将帮助您减少攻击者利用它们的机会。原标题:避免软件开发中的漏洞,作者:EddieSegal