AI API Key 安全 2026:9 家平台集体泄露
2026 年 10 月,9 家 AI 开发平台集体曝出安全事件。被盗 Key 引发约 250 万次 AWS Bedrock 调用。本文给出真正能拦住它的 IAM 改法。
2026 年 10 月到底发生了什么
2026 年 10 月 30 日,Wiz 发布了一份名为「黑色十月」(Black October for AI Developer Platforms)的合并分析:在同一个月里,至少 9 家 AI 开发平台公开披露了安全事件。研究人员发现,虽然这些事件之间没有任何一个共同漏洞把它们串起来,但它们共享同一种形态。
Wiz 列出的平台与日期如下:
| 平台 | 披露日期 | 官方给出的根因 |
|---|---|---|
| Fireworks AI | 10 月 6 日 | 凭据访问 |
| Andromeda | 10 月 9 日 | 称为「行业范围的攻击」 |
| Zeabur | 10 月 14 日 | 长期管理员凭据明文存储 |
| Lightning AI | 10 月 15 日 | 凭据访问;此前刚受 Mini-Shai Hulud 供应链活动影响 |
| OpenCode | 10 月 16 至 17 日 | 一个「遗留系统」;报告了 agent swarm 攻击 |
| Railway | 10 月 20 日 | 「构建基础设施中的权限提升」 |
| Warp | 10 月 23 日 | 第三方厂商依赖 |
| CommandCode | 10 月 28 日 | 归因于一次蒸馏尝试 |
| Northflank | 10 月 30 日 | 尚未发布 |
其中 Fireworks、OpenCode、Warp 三家报告了 agent swarm(智能体蜂群)攻击迹象,OpenCode 和 CommandCode 明确把事件归因于一次模型蒸馏尝试。所有公开报告的共同模式,用 Wiz 的原话是:有针对性的定向利用,明确在搜寻存储的环境变量,重点是那些授予 AI 访问权限的变量。如果你把 LLM 服务商的 Key 放在托管平台的环境变量里,这就是在找你的那波攻击。
没有单一漏洞,这恰恰是最难受的地方
多数泄露复盘都会以一个补丁和一个版本号收尾。这次没有。Fireworks、Zeabur、Lightning AI 都指向凭据访问;Railway 指向构建基础设施里的权限提升;Warp 指向第三方依赖;OpenCode 指向遗留系统;Lightning AI 在此之前刚被 Mini-Shai Hulud 供应链活动打过一次。
真正统一的不是 AI 平台上的某个漏洞,而是两件事的组合:长期有效的凭据存在一个可触达的位置,加上一台每分钟能试上千个 Key 的机器。Wiz 指出两个在推动这一切的力量:一是 agentic 攻击让攻击者能更快拿下目标;二是 LLMJacking 的兴起,以及配套的「LLM 经纪人」基础设施——被偷的 API 访问权可以直接转卖,这给了盗窃行为一条变现路径,这在几年前并不存在。对模型输出做蒸馏的需求也在往同一个方向推。
攻击者在拿到凭据之后做了什么
这部分对 API 开发者最重要,因为被黑只是无聊的一半。Wiz 观察到两起企业 AWS 案例:平台厂商处泄露的凭据,随后被用来打客户自己的 AWS 账号,而使用模式高度一致。
两起案例中,第一次未授权活动都发生在凭据暴露报告后的 30 分钟内。那是一次来自住宅 IP 的 InvokeModel 调用,用一分钟时间扫过多个组织来测试这把 Key。调用先请求一个 Claude 模型失败,然后回退到另一个成功的模型。之后几天里两把 Key 都只有零星流量,每天 14 到 120 次调用,来自同一个小型客户端,且两把 Key 的调用时间前后只差约一分钟、像被同一条任务驱动。那是一次验活:攻击者在确认 Key 还能用。
然后是洪水。在案例 A 里,验活后第四天,一个轮换代理池跑了一次目录探测,对十余家厂商的每个模型各发一次调用,包括 Amazon Nova、DeepSeek、GLM、Kimi、Grok 和 GPT-6 Astra。几小时后,一个 boto3 脚本开始枚举 Bedrock 与 EC2 配额;又过了半小时,第二个主机用不到一分钟做了上千次调用,把各 Region 的配额与模型可用性摸了一遍。在大约三十小时内,攻击者发出了约 80 万次 Bedrock 调用,其中约 90% 成功。
案例 B 走向相反。那把 Key 原本就被限制在特定地理区域,前两天调用全部失败;直到一个共享 VPN 出口上的探针找到真正可用的模型 ID,闸门才打开。那个地址在十三小时内发起约 170 万次 Bedrock 调用,其中超过一百万次成功。Wiz 的估算:按官方价,仅这两起就很可能产生超过 10 万美元的用量费用。
决定你会被打多狠的那个跨区细节
这是整件事的技术核心,也是大多数开发者不知道它的原因。Amazon Bedrock 提供两类跨区推理配置:地理型配置带地理前缀,比如 us.、eu.、apac.、in.,处理始终留在该地理范围内;全球型配置前缀是 global.,可以把请求路由到全球任意受支持的商用 Region。AWS 文档写明,Global 配置在输入输出 token 价格上可省约 10%,且价格永远按调用来源 Region 计算,与请求实际在哪儿跑无关。
在案例 A 中,被盗 Key 的策略允许 global.* 配置,于是攻击者把所有调用都走全球路由。因为全球路由把负载摊到了多个 Region,那 80 万次调用中只有约 6% 被限流。案例 B 的 Key 只允许 us.*:攻击者对 global 的调用全部失败,找到真正可用的区域模型 ID 之后,洪峰仍然大多被限流,因为流量撞上了账号的区域配额,超出部分几乎全被挡下。
由此有两个直接结论。第一,global 配置会放大被盗 Key 的破坏半径,因为它把一个区域配额变成了一个全球配额池。第二,你监控的配额数字不是攻击者消耗的那个配额。如果你盯的是区域级的每分钟 token 上限,一把走 global 配置的 Key 对这个监控是隐形的。
AWS 还有一个让修复方案不直观的细节:启用全球跨区推理需要同时放行 三个资源 ARN,而不是一个——区域推理配置 ARN、区域 foundation model ARN,以及不含 Region 也不含账号的全局 foundation model ARN。全局 ARN 的「空」是刻意设计的。只放前两个的策略会静默地无法启用全球路由,而三个全放、没有 deny 的策略则等于把它打开。
平台泄露到底意味着什么:Zeabur 的数字
Zeabur 写出了这个月最完整的一份事故说明,并因此决定关停:共享集群服务自 2026 年 12 月 1 日起暂停,所有专属服务器与共享集群在 12 月 31 日前全部停止。它 10 月 19 日发布的初步报告,最清楚地说明了托管平台被黑对里面的 API Key 意味着什么。
10 月 14 日至 15 日,攻击者使用泄露的内部凭据进入共享集群、部分专属服务器与 Zeabur 内部系统,最终读到平台数据库。共享集群的管理接口当时暴露在公网,管理员 token 永不过期。攻击者在 865 个数据库服务里执行命令,规模化读取 n8n 实例,并逐表翻阅 PostgreSQL 数据库,随后又从密钥管理服务读走了约 53 个生产密钥。
| 被读取的数据 | 规模 | Zeabur 自述的确定性 |
|---|---|---|
| 服务环境变量(名称与值) | 3,218,965 条 | 已确认 |
| 账号记录(邮箱、用户名、手机号) | 321,810 个账号 | 已确认 |
| 明文存储的 zSend API Key | 566 个,已吊销 | 已确认 |
| 平台访问令牌 | 11,536 个,仅存哈希不可逆,已全部吊销 | 已确认 |
| 共享集群全部服务的环境变量与密钥 | 9 个 Region | 部分确认,其余按泄露处理 |
| 用户数据库内容 | 865 个数据库服务 | 评估判定 |
| GCP 专属服务器上的全部数据 | 101 台服务器,92 个用户 | 登录已确认 |
表里有两处值得强调:访问令牌只存哈希、无法还原,而 zSend 的 API Key 是明文存储——同一个设计错误在两个不同层面重复出现;以及官方建议比日常轮换更强——由于 8 月那次凭据轮换没有覆盖本次用到的凭据,Zeabur 要求用户替换平台上存储的每一个密码和 Key,哪怕 8 月之后已经换过一轮,因为泄露数据仍可能被滥用。同样有效的一条缓解措施也值得照抄:8 月之后已经把环境变量迁到自己专属服务器的项目,完全不在平台数据库泄露范围内。
转售市场才是这件事反复发生的原因
Wiz 识别出两个正在公开交易被盗 Key 的团伙。其中一个以单个 IP 为中心,Zeabur 的自查报告也点名了这个 IP;该站点公开宣传以折扣价提供前沿模型访问,并接受 USDT 支付。其基础设施可追溯到 2025 年,陆续承载过多个 LLM 转卖页面,包括 2026 年 3 月的 ChatGPT 账号池管理站,以及在 Zeabur 时间线点名该 IP 之前四天上线的一个自主渗透测试控制台。另一个转卖枢纽在另一个地址上,对多起事件中的被盗 Key 做权限检查。
第二个团伙有一处细节值得读两遍,因为它解释了经济逻辑:它的域名曾被快照到一个标题为「蒸馏检测监控」的页面,按高风险、观察、正常三类给用户打分。研究人员认为,这是运营方在尽量让自己的账号远离看起来像蒸馏的流量,因为蒸馏正是账号被封的原因。这是有合规职能的转售生意,不是一个拿着泄露 Key 乱跑的脚本小子。
Wiz 对证据边界很明确:它没有证据把这些转卖基础设施与「黑色十月」的攻击直接关联起来。它能证明的是,这些运营者确实持有被盗 Key 并对其做过测试,这证明凭据存在活跃交易市场。
真正能改变结果的五项措施
防御建议并不复杂,五条都是你这周就能做完、不需要买新的安全产品的事。
一、把每把 Key 限定到单一模型和单一 Region。一个策略里 bedrock:InvokeModel 只允许命中某个具体推理配置 ARN 和某个具体 foundation model ARN 的 IAM 角色,对攻击者毫无价值,因为那次横跨十余家厂商的目录探测会立刻失败。AWS 自己就写明,可以把 InvokeModel 语句的 Resource 换成具体的模型与推理配置 ARN,机制就是这一句。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowOneScopedProfile",
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": [
"arn:aws:bedrock:us-east-1:123456789012:inference-profile/us.anthropic.claude-sonnet-4-5-20250929-v1:0",
"arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-5-20250929-v1:0"
]
},
{
"Sid": "DenyGlobalCrossRegionRouting",
"Effect": "Deny",
"Action": [
"bedrock:InvokeModel*",
"bedrock:Converse*",
"bedrock:ConverseStream*"
],
"Resource": "*",
"Condition": {
"StringEquals": { "aws:RequestedRegion": "unspecified" }
}
}
]
}
上面这段里最容易写错的是 deny 那一块。AWS 文档明确指出,全球跨区推理在评估那个不含 Region 的全局 foundation model 资源时,会把 aws:RequestedRegion 置为 unspecified,而不是实际的目标 Region,所以传统的、针对具体 Region 名(例如 us-west-2)的 deny 根本匹配不到它。如果你的组织用服务控制策略屏蔽未启用的 Region,全球路由还要求你在那里放行 unspecified,否则请求会在到达模型之前就被策略拒绝。
二、给每把 Key 加硬性支出上限。Wiz 的案例给出了理由:一例中约 80 万次调用成功,另一例超过一百万次成功,而使用特征是一个把众多终端用户藏在同一把凭据后面的转售商。每个 Key 的预算加自动熔断,能把无上限的损失变成有上限的损失。网关能提供这个能力加上真正可审计的请求日志。如果你还没有网关,Portkey 是放逐 Key 虚拟 Key 与支出上限的合理落点,比你为每一家服务商各配一套省钱机制省事。
三、盯目录探测,而不是只盯流量尖峰。两起 Wiz 案例中的第一个恶意动作,都是一次扫过十多个模型的探测调用。正常业务不会长这样。下面的脚本查 CloudTrail 的 Bedrock 事件,把 Wiz 公布的做凭据检测的 IP 标出来,同时标出那些在大量不同模型之间发起大量调用的来源地址——那就是目录探测的特征。
import boto3
from collections import defaultdict
from datetime import datetime, timedelta, timezone
# Wiz 公布的用于检测被盗 Key 的 IP。请对照自己的日志确认这些地址。
WIZ_IOC = {
"23.106.46.239", # 转卖枢纽,Zeabur 也点名过
"38.246.114.118", # 对多把被盗 Key 做权限检查
"104.243.32.50", # 对多把被盗 Key 做权限检查
"31.57.201.201", # 被发现使用多把被盗 Key
}
client = boto3.client("cloudtrail")
def bedrock_events(days=14):
start = datetime.now(timezone.utc) - timedelta(days=days)
token = None
while True:
kwargs = dict(
LookupAttributes=[{
"AttributeKey": "EventSource",
"AttributeValue": "bedrock.amazonaws.com",
}],
StartTime=start,
EndTime=datetime.now(timezone.utc),
MaxResults=50,
)
if token:
kwargs["NextToken"] = token
response = client.lookup_events(**kwargs)
for event in response.get("Events", []):
yield event
token = response.get("NextToken")
if not token:
break
by_ip = defaultdict(lambda: {"calls": 0, "models": set()})
for event in bedrock_events():
ip = event.get("sourceIPAddress")
if not ip:
continue
by_ip[ip]["calls"] += 1
for resource in event.get("resources") or []:
by_ip[ip]["models"].add(resource.get("ARN", "").split("/")[-1])
for ip, agg in sorted(by_ip.items(), key=lambda kv: -kv[1]["calls"]):
if ip in WIZ_IOC:
print(f"[IOC] {ip} 发起了 {agg['calls']} 次 Bedrock 调用")
elif agg["calls"] > 200 and len(agg["models"]) > 5:
print(f"[目录探测] {ip}:{agg['calls']} 次调用,横跨 {len(agg['models'])} 个模型")
四、按周期轮换 Key,出事故时也要轮换,不能只轮换一次。Zeabur 自己的案例暴露了陷阱:一次轮换如果漏掉某一类凭据,或漏掉轮换之后新建的凭据,门就还开着。唯一能扛住你事先不知道的平台泄露的版本,是自动化。
五、把最值钱的 Key 整个搬离共享托管。Zeabur 唯一被证实有效的缓解措施,就是把环境变量搬出平台、搬进客户自己控制的专属服务器。如果一把 Key 能触达输出价每百万 5 到 25 美元的前沿模型,它就该待在你自己的密钥管理服务里,而不是共享集群上的一个环境变量。
本文不覆盖的部分
有几点限制需要说清楚。多数平台的根因分析仍是初步阶段,Northflank 在写作时尚未发布,因此这份名单可能还会变长。Wiz 无法把转卖站点与整场攻击行动关联起来。那两起 AWS 企业案例只是样本而非完整统计,受影响客户总数未知,总成本也就高于已披露的 10 万美元。最后,本文没有、也不可能说明哪家 AI 模型服务商被攻破:漏洞出在托管与部署平台,API Key 是被搬运的货物,不是漏洞本身。
结论
对「黑色十月」最诚实的解读是:这不是一场 AI 特有的危机。它就是那个普通的凭据盗窃问题,只不过被一个新激励加速了——模型访问权现在有一个干净的转售市场,于是被盗 Key 有了一个明确的价格,而这个价格又供养了让这类攻击能规模化、低成本运行的自动化。
对 API 开发者来说,动作都不炫酷,而且大多早就知道:把 Key 限定到单一模型与单一 Region;显式 deny 掉全球跨区路由,因为这条 deny 必须匹配 unspecified 这个字符串;给每把 Key 设支出上限;盯住那些在大量不同模型之间来回调用的来源地址;按周期轮换;再把那些真的能伤到你的 Key 搬离共享基础设施。
唯一真正新的信息就是跨区那个细节。一把 Key 有多受限,取决于它策略里允许哪些推理配置;而一个 global 配置能把一个区域配额变成一个九成可用的全球配额。如果你只从这篇文章带走一件事,就带走这一件。
常见问题
2026 年 10 月有哪些 AI 开发平台被曝泄露?至少 9 家:Fireworks AI、Andromeda、Zeabur、Lightning AI、OpenCode、Railway、Warp、CommandCode、Northflank。Wiz 于 2026 年 10 月 30 日发布合并分析。
攻击者拿走了什么?是授予 AI 访问权的环境变量,不是模型权重。所有公开报告都描述了对存储环境变量的定向搜寻,Zeabur 确认平台数据库中 3,218,965 条环境变量记录被读取。
被盗 Key 造成多少损失?按官方价折算,Wiz 记录的两起 AWS 案例合计超过 10 万美元,总计约 250 万次 Bedrock 调用。另有社区报告称,Railway 上存储的 Key 被用于盗取加密货币,金额约 37.1 万美元。
如何阻断全球跨区路由?加一条显式 deny,作用于 bedrock:InvokeModel* 与 converse 系列操作,条件用 StringEquals 匹配 aws:RequestedRegion 为 unspecified。针对具体 Region 名的 deny 匹配不到全局资源评估。
有证据证明转卖站点是这轮攻击的幕后黑手吗?没有。Wiz 明确表示没有。它记录到的是这些站点运营者持有被盗 Key 并对其做过检查,这说明凭据存在活跃市场。
参考来源
- Wiz —「Black October」for AI Developer Platforms — 合并事件分析,2026 年 10 月 30 日
- Zeabur — 2026 年 10 月安全事件初步报告 — 2026 年 10 月 19 日
- Zeabur 即将关停:接下来会怎样 — 2026 年 10 月 17 日
- Amazon Bedrock — 跨区推理 — 地理型与全球型对比
- Amazon Bedrock — 全球跨区推理 — 三段式 IAM 策略与 unspecified deny 模式
- Amazon Bedrock — 地理跨区推理 — 地理前缀与 IAM 示例
- Amazon Bedrock — 支持推理配置的 Region 与模型
- Amazon Bedrock — IAM 策略示例 — 把 InvokeModel 限制到具体模型与推理配置
相关文章
- Claude API 滥用报告 2026:对开发者的影响 — 同一个市场的需求侧,来自 Anthropic 自己的报告
- AI API 成本控制工具 2026 — 网关支出上限与逐 Key 预算横评
- GPT-5.6 Sol 袭击 Hugging Face:API 启示 — 能扛住模型层攻击的护栏模式
- Amazon Bedrock API 评测 — 平台层的定价与模型总览