CVE-2025-68156:CWE-770:expr-lang expr中无限制或节流的资源分配
严重性:高 类型:漏洞 CVE:CVE-2025-68156
Expr 是一个用于 Go 的表达式语言和表达式求值工具。在 1.17.7 版本之前,Expr 中的几个内置函数,包括 flatten、min、max、mean 和 median,在对用户提供的数据结构执行递归遍历时,没有强制执行最大递归深度。如果求值环境中包含深度嵌套或循环的数据结构,这些函数可能会无限递归,直到超过 Go 运行时的栈限制。这会导致栈溢出恐慌(panic),进而使宿主应用程序崩溃。
虽然可利用性取决于攻击者是否能够影响或向求值环境中注入循环或病态深度的数据,但这种行为构成了拒绝服务(DoS)风险,并影响了库的整体健壮性。进程可能会意外终止,而不是返回一个可恢复的求值错误。
在受影响的版本中,对不受信任或未经充分验证的数据结构调用某些内置函数的表达式求值,可能会因栈耗尽而导致进程级崩溃。此问题在以下场景中最为相关:Expr 被用于针对外部提供或动态构建的环境进行表达式求值;循环引用(直接或间接)可能被引入到数组、映射或结构体中;并且没有应用级别的防护措施来防止深度嵌套的输入数据。在具有受控、非循环数据的典型用例中,此问题可能不会显现。然而,一旦出现,由此产生的恐慌可用于可靠地使应用程序崩溃,构成拒绝服务。
此问题已在 Expr 的 v1.17.7 版本中得到修复。该补丁为受影响的的内置函数引入了最大递归深度限制。当超过此限制时,求值会优雅地中止,并返回描述性错误,而不是引发恐慌。此外,用户可以通过 builtin.MaxDepth 自定义最大深度,允许具有合法深层结构的应用程序以受控的方式提高限制。
强烈建议用户升级到已打补丁的版本,该版本包含递归防护和全面的测试覆盖,以防止回归。对于无法立即升级的用户,推荐了一些缓解措施。确保求值环境不包含循环引用,在将外部提供的数据结构传递给 Expr 之前验证或清理它们,和/或用恐慌恢复机制包装表达式求值,以防止完整的进程崩溃(作为最后一道防御措施)。这些变通方法可以降低风险,但在没有补丁的情况下无法完全消除问题。
技术总结
CVE-2025-68156 是 expr-lang 库中的一个漏洞,expr-lang 是一个基于 Go 的表达式语言和求值工具。在 1.17.7 版本之前,几个内置函数(flatten、min、max、mean、median)对用户提供的数据结构执行递归遍历,但没有强制执行最大递归深度。这种缺乏节流的情况使得攻击者可以提供深度嵌套或循环的数据结构,导致递归无限进行,直到超过 Go 运行时栈限制,从而导致栈溢出恐慌。这种恐慌会导致宿主应用程序突然崩溃,从而导致拒绝服务(DoS)状态。
当 expr-lang 用于针对外部提供或动态构建的环境(其中可能在数组、映射或结构体中引入循环引用)进行表达式求值时,此漏洞尤其相关。具有受控、非循环数据的典型用例不会显现此问题。
版本 1.17.7 中的补丁为受影响的的内置函数引入了可配置的最大递归深度,从而能够优雅地中止并返回描述性错误,而不是恐慌。对于无法立即升级的用户,建议的缓解措施包括确保求值环境中不存在循环引用、验证或清理输入数据以及用恐慌恢复机制包装表达式求值以防止完整的进程崩溃。CVSS v3.1 评分为 7.5(高),反映了该漏洞的网络攻击媒介、低攻击复杂性、无需权限或用户交互以及影响仅限于可用性(拒绝服务)。目前没有在野利用的报告。
潜在影响
对于欧洲组织,CVE-2025-68156 的主要影响是,当基于 expr-lang 的系统处理恶意构造或格式错误的输入数据时,会导致应用程序崩溃,从而造成拒绝服务。这可能会破坏依赖 expr 进行表达式求值的后端服务、API 或微服务,可能影响业务连续性和服务可用性。高度依赖 Go 语言基础设施的行业,如金融科技、电信、云服务提供商和软件开发公司,可能会遇到运营中断。该漏洞不会直接损害机密性或完整性,但攻击者可以利用它来造成持续的服务中断。在多租户或云环境中,这可能导致级联故障或影响多个客户。无需身份验证即可轻松利用的特点增加了风险,尤其是在接受由 expr 求值的用户输入的面向公众的服务中。未对输入数据进行清理或验证或缺乏恐慌恢复机制的组织尤其脆弱。可用性影响还可能影响符合要求服务连续性和事件管理的欧洲法规,如 GDPR 和 NIS 指令。
缓解建议
最有效的缓解措施是将 expr-lang 升级到 1.17.7 或更高版本,该版本包含最大递归深度限制和优雅的错误处理,可防止栈溢出恐慌。对于无法立即升级的组织,应对传递给 expr 的所有外部提供或动态构建的数据结构实施严格的验证和清理,以确保它们不包含循环引用或过度嵌套。引入应用级防护措施,在求值前检测并拒绝或扁平化深度嵌套的数据。在 Go 中用恐慌恢复机制包装表达式求值调用,以防止进程崩溃传播并导致服务中断。此外,在打补丁的版本中配置最大递归深度参数(builtin.MaxDepth),以在合法的深层数据结构和安全性之间取得平衡。在各种输入场景下对表达式求值组件进行彻底测试,以识别潜在的递归风险。监控应用程序日志中是否存在栈溢出恐慌或崩溃的迹象,这些迹象可能表明存在利用尝试。最后,审查并更新事件响应计划,以包含检测和缓解 expr-lang 相关 DoS 攻击的内容。
受影响国家
德国、法国、英国、荷兰、瑞典、芬兰、爱尔兰、波兰、意大利、西班牙