当前位置:主页 > 建站知识 > 软件开发 >

漏洞数据库(vulnerabilitydatabases)

发布时间:2020-12-27 20:49   浏览次数:次   作者:admin
由于数据泄露事件的频繁发生,对每个组织而言,创建和维护安全的软件产品变得越来越重要。虽然并不是所有的攻击都能被预料到或者预防,但我们至少可以通过消除软件的漏洞来避免这种暴露面。
这篇文章中,您将学习一些常见的软件漏洞,以及如何避免它们。另外,您将学会如何采用一些通用的优秀实践,以确保安全地使用软件和数据。
普通软件漏洞。
2018年,CWE在http://MITRE.org(CommonWeaknessEnumeration,GenerationBigList)发布了25个最危险的软件错误列表,请参阅:https://cwe.mitre.org/top25/archive/2019/2019_cwe_top25.html。虽然攻击者的手段多种多样,但他们实际上是各种常见的攻击方式的完美结合。这里,我们将着重于一些常见的软件漏洞。
缓冲溢出(BufferOverflow)
如果程序尝试读写超出范围的缓冲区,就会出现一个错误,即缓冲区溢出。它的直接危害是:可能导致数据重写,或将不应该出现的数据添加到现有代码中。所以缓冲区溢出可以让攻击者通过执行代码,改变程序流,然后读取一些敏感数据,或者导致系统崩溃。
缓冲溢出漏洞的典型例子如下:
接收不同长度的无限制输入。
在有效索引上允许对数组执行读取操作。
缓冲溢出漏洞通常隐藏在软件和硬件体系结构的设计、实施和运行阶段。在C、C++和Assembly程序中,这些漏洞最为常见。当然,它也可能出现在任何缺少内存管理支持的编程语言中。
防止缓冲区溢出漏洞的措施。
如前所述,我们应该尽可能地选择诸如:Java或Perl之类具有预防机制或减少此类漏洞风险机制的语言。对于C#这样的编程语言,我们不能禁用“溢出保护”选项。即使是这样,那些具有“免疫”能力的编程语言,在运行环境中的本地代码容易受到攻击时,也可能产生无法预料的错误。
要避免利用缓冲区溢出漏洞,可以使用诸如VisualStudio或StackGuard这样的编译器,对函数或扩展设置输入限制。与此同时,你也可以使用各种各样的工具,在内存中随意安排程序的不同组件,使它们的地址难以被识别和预测,从而使攻击者很难利用这些特定组件。
同样,在创建代码时,要确保适当地分配缓冲区空间,并使用各种方法和函数限制输入的大小。
输入验证错误(ImproperInputValidation)
当我们无法在接收端对用户输入进行验证,或者验证不足时,就会产生“输入验证错误”。不适当的验证使攻击者可以通过执行恶意代码、改变程序流程、访问敏感数据以及滥用已有资源分配。
一个典型的错误验证示例包括:
自欺欺人地攻击不能访问隐藏的表单字段。
只检查输入的字段长度,而不检查具体内容。
不适当的验证同样隐藏在软硬件体系结构的设计和执行阶段。任何接受外部数据的编程语言或系统都可以使用这种方法。
对错误验证漏洞的预防措施
对于任何用户,我们都应该遵循“零信任”原则,并假定在所有输入都不可靠之前,它们都是安全的。在此过程中,我们可以使用白名单机制,以确保输入的内容只包含可接受的信息格式。
所以,在验证输入时,要评估它的长度、类型、语法和逻辑一致性(即:输入是否有语义)。你可以使用很多工具来确保完全有效,比如OWASPESAPIValidationAPI(https://owasp.org/www-project-enterprise-security-api/)和RegularExpression(regularExpression)。这两个工具可以帮助我们确认所有的输入来源,包括:环境变量,查询,文件,数据库,和API调用。
另外,我们应该确保相应的检查在客户端和服务器端都执行。为避免忽略客户机验证,我们需要集中注意捕获所有输入,以便识别服务器端攻击者的潜在操作。与此同时,在对程序代码进行必要的组合或转换之后,还要再次验证它的输入。
资料泄漏(InformationExposure)
有意识或无意识地向潜在攻击者提供数据的行为称为信息泄漏。除泄漏敏感数据信息外,为攻击者提供可能被利用的软、硬件环境信息也属于泄漏。
资料泄漏的典型例子有:
显示文件或程序的完整路径错误。
在程序错误、异常信息等方面暴露出用户的相关信息。
在软件和硬件体系结构的设计和实施阶段,仍然存在着信息泄露的漏洞。这与编程语言无关,而且更多地依赖于编程习惯。
防止信息泄漏漏洞的措施。
为了防止信息泄露,在设计程序架构时,应该针对明确的信任边界区域(请参阅:https://www.microsoft.com/en-us/itshowcase/implementing-a-zero-trust-security-model-at-microsoft),以保护敏感信息;通过访问控制,可以保护和限制“安全”区域与各个端点之间的连接。
要最大程度地避免漏洞,请检查程序中各种错误的提示消息,以及用户警告信息中是否包含不必要暴露的内容。与此同时,还应该限制URL和通信包头(header)中的敏感信息。比如,你可以隐藏路径名,和API键一起。
不适当的特权或认证(ImproperPrivilegesorAuthentication)
如果没有正确地分配、跟踪、修改或验证用户的相关权限和凭据,则可能会出现错误的特权或身份验证。这种攻击允许攻击者滥用权限,执行受限制的任务,以及访问受限制的数据。
不正确的权限或身份验证的典型例子包括:
临时提权没有及时回收。
限制特权只能使用黑名单,而不能使用白名单。
让更低的权限级别影响更高的权限帐户,例如:为管理员重新设置密码。
减少您的登录尝试或会话空闲时间。
在软、硬件体系架构的设计、执行和运行阶段,仍然可能出现特权或身份验证漏洞。也不局限于某种特定的编程语言。
防止权限或身份验证漏洞的措施。
你应该对与目标软件和系统进行交互的所有用户和服务都采用“最小特权原则”。只有真正需要特定资源和操作的用户或服务才有权完成所需任务。通过对整个程序和环境使用访问控制,我们需要限制用户和实体的权限。
如果可能的话,我们还可以为多个角色分配高级特权。使用隔离机制,可以有效地削弱“高级用户”,降低攻击者对其访问权限的滥用。另外,您可以使用多元身份验证方法,以阻止攻击者绕过系统的检查机制,从而方便地访问。
消除一般漏洞的良好做法
除针对具体漏洞采取措施外,我们还应利用一些一般性措施,从整体上减少漏洞的暴露性。你可以从以下几点开始:
学习有关威胁情报的知识。
从漏洞数据库(vulnerabilitydatabases)(见:https://vuln.whitesourcesoftware.com/)和独立的监督小组(例如:OWASP或NIST)获得的消息,进行持续监控和使用。当一个漏洞发生时,这些资源可以及时地向您提供有关这个漏洞的信息,并能够指导您如何解决或减轻当前存在的问题。通过这样的方法,你可以根据实际情况,精确的修补目标系统及其组件。
小心包含依赖项。
一定要确保你只在需要的时候才使用那些经过审查并且值得信任的库和框架。一些不知名的工具会自己制造出漏洞。