一个编码代理在测试环境做例行任务,撞上了凭证不匹配。它决定"修复"这个问题——方式是删掉托管服务商Railway上的一个数据库卷。PocketOS创始人Jer Crane在X上说,整个过程"只用了9秒"。那个卷是生产环境的,卷级备份跟着一起没了。
![]()
Crane称,执行操作的是运行Anthropic Claude Opus 4.6的Cursor。这个细节上了头条,却也是整件事里最没用的部分。一次API调用能造成这么大的破坏,需要三样东西同时失效,模型只是其中之一。
第一道:一把为小任务配的钥匙,能开账户里所有的门
PocketOS给汽车租赁运营商卖软件,覆盖预订、支付和车辆追踪。代理在一个无关文件里发现了一个Railway API令牌。这个令牌原本是为了通过Railway CLI增删自定义域名而创建的,但它能执行任何操作,包括破坏性操作。代理用它发了一次调用,删掉了卷,中间没有任何确认步骤。
Railway的复盘文章点名了这次调用:一个GraphQL的volumeDelete变更。Railway写道:"直到本周,在API上调用volumeDelete会立即执行删除,无法撤销。"而同样的操作在控制面板上一直有48小时的撤销窗口。
Railway有四类API凭证,从权限最宽到最窄。PocketOS这个令牌"被配置为账户级访问,即可能的最大权限"。Railway也认了一部分责任:正确的权限范围是存在的,但"流程没有让人一眼看出该选哪个"。Crane的说法更直接——PocketOS的责任在于"对生产API密钥的未知暴露",他还说Railway"目前不允许对密钥施加限制",如果早知道令牌的权限广度,它"根本不会被存下来"。
两种说法落到同一个地方:有人需要一个管域名的令牌,拿到的令牌却能删生产库。真正起作用的边界是令牌自带的边界,而它覆盖了整个账户。
第二道:备份和数据死在同一个地方
Crane的抱怨是,Railway"把卷级备份存在同一个卷里"。Railway的备份文档对一个场景写得很直白:"擦除一个卷会删除所有备份。"
Railway的复盘补充了救回PocketOS的那部分。它保留两类备份:用户在面板里排期的备份,以及无论用户怎么设置都会异地保留的灾难备份。旧版API路径执行了一次级联删除,让用户备份"在界面上看起来不可用",Railway称现在已经延迟删除备份本身。CEO Jake Cooper告诉媒体,Railway同时保留用户备份和灾难备份。数据是通过Railway回来的,不是通过PocketOS自己控制的任何东西。
5月1日,Railway上线了承诺的修复:"通过API删除卷现在会软删除48小时。"这关掉了Railway上那条9秒的路径。但它不给你一个备份。软删除是服务商的撤销键,在服务商的账户里,48小时后失效。如果你数据的唯一副本躺在代理够得着的凭证下面,一个令牌仍然决定你周一还有没有生意。留一份部署令牌碰不到的副本:换个账户,换个服务商,或者两者都换。
第三道:代理自己猜了"测试环境"是什么意思
Crane问代理为什么这么做,它写了一段被他称为 confession 的东西。被多家媒体引用的原话是:"我猜测通过API删除一个测试卷,范围只会限于测试环境。我没有验证。""我没有检查卷ID是否跨环境共享。"
这段自白是模型事后生成的文本,不是它检查过什么的日志。但它描述的失败模式是真实的:代理把任务的标签("测试")当成了权限。API看到的是一个已认证的账户令牌和一个卷ID,它不知道代理在说什么。
Crane贴出的自白里,代理说它忽略了Cursor的系统提示规则和PocketOS的项目规则。Cooper的立场是:如果代理通过了认证并调用删除,"我们会执行这个请求"。
这句话就是全部问题:提示词里的规则是对模型的建议,令牌才是服务器检查的东西。令牌说可以,猜测就放行。
今天就去翻一遍代理够得着的令牌。你没法给一个不知道存在的令牌划定范围。在交给代理的仓库根目录跑几条命令,只打印名称和文件位置,不打印密钥值:全树搜索令牌名(grep不读.gitignore,而代理按路径打开被忽略的文件和打开被追踪的文件一样容易);列出git status默认不显示的忽略文件,.env就住在那里;查所有曾经被提交过的内容,哪怕现在已经删除;再看代理继承的shell环境——Railway CLI在设置了RAILWAY_TOKEN或RAILWAY_API_TOKEN时会跳过登录直接认证,代理在那个shell里敲的railway命令,就带着那个令牌能触及的一切。
然后问一个令牌它是什么。Railway的认证指南说,me查询"只对账户令牌解析",而授权失败会以HTTP 200加一个errors数组返回,所以要读响应体。如果返回了你的名字,这个令牌能触及你所属的每一个工作区。把它换成只覆盖任务所需那一个环境的项目令牌。
如果你用git worktree跑代理,一个任务一个,上面的扫描只覆盖了其中一个文件夹。Git能列出全部,同一段grep在每个里面跑一遍。每个worktree都是另一份.env。
PocketOS这件事是一个穿着AI外衣的系统设计问题:爆炸半径、故障域,以及你数据的第二份副本放在哪里。这些是给代理发令牌之前值得先问的问题。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.