1300万 Tokens 被刷光:一次 OpenAI API Key 泄露事故复盘

昨天打开 OpenAI API 后台的时候,我差点以为系统出 Bug 了。

账户余额显示:

-$125.66

第一反应是:

"我最近根本没怎么调用 API,怎么会欠费一百多美元?"

结果一查 Usage,发现事情远比想象中严重。

异常从 5 月 29 日开始

查看消费曲线后,我发现:

  • 5 月 29 日出现第一波异常请求

  • 6 月 5 日开始明显增长

  • 6 月 6 日彻底爆发

短短几天时间:

  • Total Spend:$167.34

  • Total Tokens:13,048,668

  • Total Requests:2,563

对于我这种个人开发者来说,这个数字完全不正常。

谁在疯狂调用我的 API?

进一步查看请求日志。

我发现大量请求都长这样:

"你是一位世界一流的图像描述大师......"

后面跟着数千字 Prompt。

任务内容几乎全部都是:

  • OCR识别

  • 图片分析

  • 图像描述

  • JSON结构化输出

更夸张的是,同一分钟内出现大量完全相同的请求。

正常用户不可能这样操作。

这明显是自动化脚本在批量执行任务。

API Key 是怎么泄露的?

目前我还无法100%确定泄露源头。

但根据我的排查结果,存在两个比较大的可能性。

可能一:AI 编程工具qoder中输入过 API Key

我曾经在 AI 编程工具qoder中输入过 OpenAI API Key。

可能二:App 被反编译获取 Key

这是我目前认为更值得警惕的风险。

很多独立开发者为了图方便,会把 OpenAI Key 直接写进 App:

ini 复制代码
OPENAI_API_KEY=sk-xxxx

或者:

makefile 复制代码
Authorization: Bearer sk-xxxx

如果这样做:

  • Android APK 可以被反编译

  • iOS IPA 也可以被提取资源和字符串

攻击者完全有机会拿到真实 Key。

如果 Key 一旦暴露,无论应用本身是否加密、是否混淆,都无法阻止别人直接调用 OpenAI API。

因此我也不排除是 App 包中的 Key 被提取后遭到滥用。

为什么预算限制没有拦住?

很多开发者都有一个误区:

设置:

ini 复制代码
Monthly Budget = $20

就认为最多只会消费 20 美元。

实际上并不是这样。

预算更多是告警机制。

当大量请求同时进入系统时:

  • 请求先执行

  • 费用后统计

因此即使预算设置为 20 美元,也可能最终产生远超预算的费用。

我的账户就是这样一路从正常余额变成:

-$125.66

我做了什么?

发现问题后,我第一时间:

  1. 撤销所有 API Key

  2. 停止相关服务

  3. 检查项目代码

  4. 排查 App 包

  5. 检查 AI 工具配置记录

  6. 导出 Usage 与 Billing 数据

  7. 向 OpenAI 提交账单申诉

目前正在等待官方审核结果。

给所有开发者的建议

不要把 OpenAI Key 放在前端。

不要把 OpenAI Key 打包进 App。

不要把 OpenAI Key 提交到 GitHub。

不要多个项目共用同一个 Key。

每个项目单独创建 Key。

定期轮换 Key。

开启 Usage 告警。

发现异常立即撤销所有 Key。

正确的做法永远是:

复制代码
App
 ↓
你的后端
 ↓
OpenAI API

而不是:

复制代码
App
 ↓
OpenAI API

因为只要 Key 出现在客户端,理论上就存在被提取的风险。

结语

这次事故总共消耗了超过 1300 万 Tokens。

损失虽然不算特别大,但足以给我上一课。

截至目前,我仍在继续调查 Key 的真实泄露源头。

无论最终结果是 AI 工具配置问题、客户端反编译问题,还是其他我尚未发现的环节,有一点已经非常明确:

在 AI 时代,API Key 的重要程度已经和银行卡密码没有本质区别。

一旦泄露,损失发生的速度可能远超你的想象。

希望这次经历能给所有独立开发者提个醒。

相关推荐
szephyr10 小时前
消息队列入门:RabbitMQ 和 Kafka 到底怎么选,什么时候不该用
后端·架构·kafka·消息队列·rabbitmq
上进小菜猪18 小时前
把 KES 集群交给 Kubernetes 的九十天:一个 DBA 的试用实录
后端
两点王爷18 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
考虑考虑19 小时前
Springboot环境变量占位符语法
spring boot·后端·spring
步行cgn21 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
RISCV_Explorer1 天前
RISC-V启动与运行时规范机制解析——BRS约定、HSM多核启动与设备树要求
后端·risc-v
星栈独行1 天前
ADK-Rust 是什么?Rust 生态新一代 AI Agent 开发套件
人工智能·后端·rust
JavaGuide1 天前
对标 MinIO!全新一代分布式文件系统正式发布
前端·后端
用户8356290780511 天前
使用 Python 将 DOCX 转换为 Markdown
后端·python
IT_陈寒1 天前
Vue computed属性这个坑,我居然踩了三次才爬出来
前端·人工智能·后端