CVE-2026-95664
Apache Camel:Camel-AWS2-S3 Producer 将来自 CamelAwsS3Key 头的不可信 S3 对象键作为简单表达式求值
- 已发布
- 2026年10月26日
- 已更新
- 2026年10月26日
- 分配 CNA
- apache
- 观察到的证据
- 2026年10月30日
初级CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N低 · 未来 30 天
- 百分位
- 57.6%
- 型号日期
- 2026年10月29日
EPSS 是统计估计,而不是确定性或影响衡量标准。将其与 CVSS、KEV 状态、暴露程度和您的环境相结合。
总结
Apache Camel AWS2-s3 组件中存在“表达式语言语句中特殊元素的不当中和”(“表达式语言注入”)漏洞。此问题影响 Apache Camel:从 4.8.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.2 之前。对于其上传、读取或删除的对象,camel-aws2-s3 生产者从 CamelAwsS3Key 消息头中获取键,仅当该消息头不存在时,才回退到端点上配置的 keyName 选项。自 4.8.0 起,AWS2S3Utils.determineKey() 在结果值包含 ${ 或 $simple{ 时,还会将该值传递给 Simple 语言,以便路由可以使用动态键,并且该求值既应用于从消息头获取的值,也应用于配置的选项。然而,消息头并非路由配置:aws2-s3 消费者在其创建的交换上设置 CamelAwsS3Key,其值为所读取对象的键,即桶中对象的名称。在仅从一个 aws2-s3 端点消费并向另一个 aws2-s3 端点生产的路由中,每个被消费对象的名称因此会到达生产者,而包含任一标记的名称会被当作表达式求值,尽管路由作者从未要求任何求值,并且在生产者上配置 keyName 也无法阻止这一点,因为消息头优先。路由从其他消息内容复制到消息头中的键也会以相同方式被求值。因此,任何能够选择此类路由所消费桶中对象名称的人(通常是获准向该桶上传的主体),都可能使自选的 Simple 表达式在 Camel 进程中求值。Simple 语言可以读取 JVM 系统属性、环境变量和配置属性,这些通常携带凭据;并且在类路径中存在 camel-bean 时,还可以调用注册表中 bean 的方法。求值结果会成为生产者使用的键,因此要读回某个值,还需要能够查看目标桶中的对象名称,而方法调用则无需此条件即可生效;再加上需要命名被消费桶中的对象,这就是严重性被评定为中危的原因。桶名称也经过相同的求值,但消费者只会将其自身端点上配置的桶放入桶消息头,绝不会放入源自远程对象的值,因此桶名称无法通过这种方式触达。4.8.0 之前的版本按原样使用消息头中的键,不受影响。建议用户升级到 4.23.0 版本,该版本修复了此问题。如果用户处于 4.22.x 发布流,建议升级到 4.22.2。如果用户处于 4.18.x 发布流,建议升级到 4.18.5。4.8.x 至 4.17.x 以及 4.19.x 至 4.21.x 发布线在此问题解决之前已停止维护,将不会获得修复,因此部署在这些版本上的用户必须迁移到受支持的版本。升级后,通过消息头提供的键或桶名称将按字面使用,因此,如果路由在 CamelAwsS3Key 或 CamelAwsS3OverrideBucketName 消息头中放置了未求值的 Simple 表达式,则必须在路由中对其进行求值,例如使用 setHeader 和 simple(),或者将其配置为端点的 keyName 或 bucketName 选项。对于无法立即升级的部署,不要让源自对象名称或其他不可信消息内容的键未经检查地到达 aws2-s3 生产者:在将交换从 aws2-s3 消费者传递到 aws2-s3 生产者的路由中,要么在生产之前使用 removeHeader(“CamelAwsS3Key”) 移除 CamelAwsS3Key 消息头,以便使用端点上配置的 keyName,要么拒绝 CamelAwsS3Key 消息头包含 ${ 或 $simple{ 的交换。仅配置 keyName 并非变通方法,因为消息头优先于它。作为纵深防御,仅允许受信任的主体写入 Camel 路由所消费的桶。
来源
针对 CVE-2026-95664 的可运行 Spring Boot 和 Quarkus 复现程序,演示通过 camel-aws2-s3 中的 CamelAwsS3Key 请求头进行 Simple 表达式注入,并验证修复效果。
负责任的使用
仅在您拥有或有权测试的系统上使用漏洞信息。 Kitploit 链接到公共研究元数据,并且不存储漏洞代码或恶意负载。