不安全的软件正在破坏我们的金融、医疗、国防、能源等关键基础设施。随着我们的软件变得更加关键、复杂和相互关联,实现应用程序安全性变得更加困难。现代软件开发过程的快速发展,使得快速准确地识别软件安全风险变得越来越重要。1.注入当不受信任的数据作为命令或查询的一部分发送到解析器时,就会出现SQL注入、NoSQL注入、操作系统注入和LDAP注入等注入缺陷。攻击者的恶意数据可以诱使解析器执行意外命令或在未经适当授权的情况下访问数据。如何预防:预防注入漏洞需要将数据与命令和查询分开。最好的办法是使用安全的API,完全避免解释器,或者为参数化接口提供接口,或者迁移到ORM或实体框架。使用具有适当规范化的正确或“列入白名单”的输入验证方法也将有助于防止注入攻击,但这并不是完全的防御,因为许多应用程序需要在输入中使用特殊字符,例如文本字段或移动应用程序API。对于任何剩余的动态查询,可以使用该解释器的特定转义语法转义特殊字符。OWASP的JavaEncoder和类似的库提供了这样的转义例程。在查询中使用LIMIT和其他SQL控件,以防止SQL注入时记录的大量泄漏。2.失效的身份验证通常,通过不正确地使用应用程序的身份验证和会话管理功能,攻击者可以破译密码、密钥或会话令牌,或利用其他开发缺陷暂时或永久地冒充其他用户。如何预防:在可能的情况下,实施多因素身份验证以防止自动、凭据填充、暴力和被盗凭据重用攻击。不要使用发送或部署默认凭据,尤其是对于管理员用户。执行弱密码检查,例如测试新密码或更改的密码,以更正“前10,000个弱密码”列表。修改密码复杂度策略。密码由大小写字母+特殊字符+数字组成,长度大于8个字符。在90天内定期更改密码。通过对所有输出使用相同的消息,确认注册、凭据恢复和API路径以防御帐户枚举攻击。限制或逐渐延迟失败的登录尝试。记录所有故障并在检测到凭据填充、暴力破解或其他攻击时向管理员发出警报。使用服务器端安全的内置会话管理器在登录后生成高度复杂的新随机会话ID。会话ID不能在URL中,它可以安全地存储并在注销、不活动、绝对超时时过期。3.敏感数据泄露许多网络应用程序和API未能妥善保护敏感数据,例如财务数据、医疗数据和PII数据。攻击者可以窃取或修改未加密的数据以实施信用卡欺诈、身份盗窃或其他犯罪。未加密的敏感数据容易受到损坏。因此,我们需要对敏感数据进行加密,包括:传输中的数据、存储的数据、浏览器交互数据。如何防范:对系统处理、存储或传输的数据进行分类,并根据分类控制访问。熟悉与敏感数据保护相关的法律法规,根据各监管要求保护敏感数据。对于不必要的、重要的敏感数据,应尽快清除,或通过PCIDSS标记或拦截。未存储的数据无法被窃取。确保存储的所有敏感数据均已加密。确保使用最新的、强大的标准算法或密码、参数、协议和密钥,并确保密钥管理到位。确保传输中的数据已加密,例如使用TLS。确保强制执行数据加密,例如使用HTTP严格传输安全(HSTS)。禁止缓存包含敏感数据的响应。确保使用特定于密码的算法存储密码,例如:Argon2、scrypt、bcrypt或PBKDF2。将工作因子(延迟因子)设置在可接受的范围内。分别验证每个安全配置项的有效性。4.XMLExternalEntity(XXE)当开发人员公开对内部实现对象的引用时,例如文件、目录或数据库键,会产生不安全的直接对象引用。在没有访问控制检查或其他保护措施的情况下,攻击者可以操纵这些引用来访问未经授权的数据。许多旧的或配置错误的XML处理器评估XML文件中的外部实体引用。攻击者可以利用外部实体使用URI文件处理程序窃取内部和共享文件、侦听内部扫描端口、执行远程代码以及进行拒绝服务攻击。如何预防:尽可能使用简单的数据格式(例如JSON)并避免序列化敏感数据。及时修复或更新应用程序或底层操作系统使用的所有XML处理器和库。同时通过依赖检测将SOAP更新到1.2或更高版本。在应用程序的所有XML解析器中禁用XML外部实体和DTD处理。在服务器端实施积极的(“白名单”)输入验证、过滤和清理,以防止XML文档、标头或节点中的恶意数据。验证XML或XSL文件上传功能是否使用XSD验证或其他类似的验证方法来验证上传的XML文件。虽然手动代码审查是许多集成环境中大型复杂应用程序的最佳选择,但SAST工具可以检测源代码中的XXE漏洞。5.无效的访问控制没有为经过身份验证的用户实施适当的访问控制。攻击者可以利用这些漏洞获取未经授权的功能或数据的访问权限,例如:访问其他用户的帐户、查看敏感文件、修改其他用户的数据、更改访问权限等。如何防止:默认情况下拒绝访问,除了公共资源。使用一次性访问控制机制并在整个应用程序中不断重复使用它们,包括最大限度地减少CORS的使用。对访问控制进行建模以强制执行记录的所有权,而不是接受用户创建、读取、更新或删除的任何记录。域访问控制对于每个应用程序都是唯一的,但是业务约束要求应该由域模型强制执行。禁用Web服务器目录列表并确保文件元数据(例如:git)不存在于Web的根目录中。访问控制失败会被记录下来,并在适当的时候提醒管理员(例如重复失败)。限制对API和控制器的访问,以最大限度地减少自动攻击工具的危害。当用户注销时,服务器上的JWT令牌应该失效。6.安全错误配置安全错误配置是最常见的安全问题,通常是由不安全的默认配置、不完整的临时配置、开源云存储、不正确的HTTP标头配置以及包含敏感信息的详细错误消息引起的。造成的。因此,我们不仅需要对所??有操作系统、框架、库和应用程序进行安全配置,还需要及时打补丁和升级。如何预防:可重复的强化过程,可以快速轻松地部署在另一个锁定的环境中。开发、QA和生产环境都应该配置相同,并在每个环境中使用不同的密码。这个过程应该是自动化的,以最小化安装新安全环境的成本。构建一个不包含任何不必要的功能、组件、文档和示例的最小平台。删除或不安装不适用的功能和框架。作为更新管理流程的一部分,审查和修复安全配置项以适应最新的安全说明、更新和补丁。分段式应用程序架构,在组件和用户之间提供有效的分离和安全性,包括:分段、容器化和云安全组。向客户端发送安全指令,如:securityheader。在所有环境中启用适当的安全配置和设置的自动化过程。7.跨站点脚本(XSS)当应用程序的新网页包含不受信任的、未正确验证或转义的数据时,或者当使用可以创建HTML或JavaScript的浏览器API更新现有网页时,就会存在XSS缺陷.XSS允许攻击者在受害者的浏览器中执行脚本并劫持用户会话、破坏网站或将用户重定向到恶意站点。如何预防:使用设计为自动编码解决XSS问题的框架,例如:Ruby3.0或ReactJS。了解每个框架的XSS保护的局限性,并适当处理未发现的用例。为了避免反射型或存储型XSS漏洞,最好的办法是根据HTML输出的上下文(包括:body、attribute、JavaScript、CSS或URL)对所有不可信的HTTP请求数据进行适当的转义。在客户端修改浏览器文档时,避免DOMXSS攻击的最佳选择是实施上下文相关的数据编码。使用内容安全策略(CSP)是针对XSS的纵深防御策略。如果没有其他漏洞可以通过本地文件放置恶意代码(例如:路径遍历覆盖和允许跨网络传输的易受攻击的库),则此策略是有效的。8.不安全的反序列化不安全的反序列化会导致远程代码执行。即使反序列化漏洞不会导致远程代码执行,攻击者也可以利用它们进行攻击,包括:重放攻击、注入攻击和提权攻击。如何预防:对任何序列化对象执行完整性检查,例如数字签名,以防止恶意对象创建或数据篡改。在创建对象之前强制执行严格的类型约束,因为通常期望代码是一组可定义的类。有经过验证的方法可以绕过此技术,因此完全依赖它是不可取的。如果可能,在隔离的低特权环境中运行反序列化的代码。记录反序列化异常和失败信息,比如:传入的类型不是预期的类型,或者反序列化处理导致的异常。限制或监视来自容器或服务器的传入和传出反序列化网络连接。监视反序列化并在用户继续反序列化时警告用户。9.使用已知漏洞的组件组件(如库、框架和其他软件模块)与应用程序具有相同的权限。如果具有已知漏洞的应用程序组件被攻击者利用,可能会导致严重的数据丢失或服务器接管。同时,使用存在已知漏洞的组件的应用程序和API会破坏应用程序防御,引发各种攻击,并产生严重影响。如何预防:删除未使用的依赖项、不需要的功能、组件、文件和文档。使用versions、DependencyCheck、retire.js等工具,持续记录客户端和服务端及其依赖库的版本信息。持续监控所用组件的CVE、NVD等漏洞信息是否发布。软件分析工具可用于自动执行此功能。订阅有关使用组件的安全漏洞的电子邮件警报。仅从官方渠道安全获取组件,并使用签名机制降低组件被篡改或添加恶意漏洞的风险。监控不再维护或已发布安全补丁的库和组件。如果打补丁不是一种选择,请考虑部署虚拟补丁来监控、检测或保护。10.日志记录和监控不足日志记录和监控不足,以及事件响应的缺失或无效集成,使攻击者可以进一步攻击系统,保持持久性或转向更多系统,并篡改、提取或破坏数据。大多数缺陷研究表明,缺陷的检测时间超过200天,并且通常由外部检查员而不是内部流程或监控检测到。如何预防:确保记录所有登录、访问控制失败、输入验证失败,并保留足够的用户上下文信息以识别可疑或恶意帐户,并为以后的取证留出足够的时间。确保以集中式日志管理解决方案可以使用的形式生成日志。确保高价值交易具有受完整性控制的审计信息,以防止被篡改或删除。例如,审计信息存储在只能添加到记录的数据库表中。建立有效的监控和警报机制,以便在可接受的时间内发现和处理可疑活动。
