Claude Code:权限控制存在两个盲点
有些版本说明读起来像水管工的账单,9月15日这份就是其中之一。埋在连接修复和上下文计数器中间的两行写着:权限控制无法完全分析的命令竟然可以不请求用户同意就通过,而一个子 shell 竟然能藏起危险的文件删除操作。给那些从没打开过终端的人翻译一下:门口检查命令的保安有两个盲区,现在它们被堵上了。
这不是什么管道细节,而是这些工具的核心承诺。Claude Code 不会独自在角落里工作:它会在你的机器上执行命令,读取和写入文件,推送代码。作为交换,它会在做可疑事情之前请求你的许可。它获得的全部信任,都建立在一个读取文本行并判断它是否危险的程序上。显然,这个程序很容易被编故事骗过去。
程序如何决定要不要请求你的许可
原理说起来很简单。在执行命令之前,工具会读取命令,把它拆开,将看到的内容与规则列表进行比较,并查看它是否超出了你允许它工作的文件夹。如果它看起来无害,就会执行它。如果它闻起来像烧焦了,就会把它展示给你,等待你的回答。
门禁卡打开了,门依然关着,在有人从后面溜进去的那天之前,所有人都很满意
所以一切都建立在一次读取上。不是沙盒,不是独立机器,而是一次读取。读取这种东西会出错。这正是这几周以来修复列表所讲述的事情:每一次,都是一种有点拧巴的表达,一条伪装起来的命令,而控制程序错误地得出一切正常的结论。
9月15日堵上的两个洞
第一个涉及那些怪异到无法分析的命令。要求规定任何东西都不能读取工作文件夹之外的内容,而在一段时间里,控制程序无法理解的一行命令竟然可以不受询问地通过,而不是触发警报。换句话说,命令越拧巴,受到的检查反而越少。它就该这样。
第二个更阴险,也属于那种让人苦笑的漏洞。一条放在子 shell 中的删除命令,也就是说,放在另一条命令内部的括号之间,在工具完全不再请求任何东西的模式下,竟然可以穿过去。这正是那些赶时间的人会选择的模式,他们会并行运行多个会话,不想再逐行确认,而我上个月在上个月讲过这种模式在多大程度上改变了工作方式。也就是说,顺便说一句,就是我,还有可能是很多其他人。
门确实关上了,只是锁被放在了旁边
这不是一次孤立的事故
让这件事变得有意思的是前一天,也就是9月14日的版本说明。它修复了一系列同类漏洞,全都出在同一个控制环节中:一条命令的选项无法识别时,某个文件仍然可能被读取;文件路径中出现星号时,文件可能因此通过;shell 变量可能描述出一条完全不同于实际执行命令的命令;连续两次切换文件夹,则可能让那些工具不再请求任何东西的模式跳过询问。
这不是电影里的情节。这些都是普通的表达,是我们不假思索就会写下来的东西,而六七个这样的表达在同一天都需要修复,这个事实说明了问题有多难:分析一行命令,就是在分析一种语言,而语言总会有一处阴暗角落。
好消息是,防护栏也在同时收紧。同一次更新为每条命令增加了网络授权:当工具需要为了某条具体命令访问某个网站时,它会请求你授权访问那个网站和执行那条命令,其他一切都会被拒绝。它也允许在不把你的指令文件背在身上的情况下运行子代理,对于那些到处带着自制指令的人来说,这远没有看起来那么无关紧要。
如果你是开发者
教训可以用一句话说完:命令检查是过滤器,不是墙。这个过滤器直到上周还会放过最拧巴的那些行,也正是最值得关注的那些行。
滤网挡住大块的东西,却让粗粒小麦粉通过,这正是人们对权限控制的批评
三个比信任更省钱的习惯。首先要更新,因为 2.1.273 版本修复了这里描述的两个漏洞,而且没人想拿一个落后了一个月的版本来逞能。然后,不要把免提问模式和安全模式混为一谈:它什么都不问,这意味着它什么也保护不了,你应该只把它留给那些即使内容丢了也能接受的文件夹。最后,在交给它一个需要写入大量内容的任务时,让这个工具在一个用完就扔的文件夹里工作,而不是在存放着三年工作成果的文件夹里工作。十天前,只要打开一个项目文件夹,就足以让一个陌生人的代码在打开它的那台机器上运行,这可不是什么原则上的谨慎。
另一方面,那份描述你规则的配置文件,值得每季度重新读一遍。旧项目里被遗忘的规则,偏偏总有个坏习惯,那就是继续套用到当天的项目上。
只希望下一批修复程序在一两周后发布时,不要换几个词又讲同一个故事。每一次,都是有人最终写下了一行歪掉的代码,而且没人知道在外面还藏着多少行。



加入对话
您必须拥有一个账户才能评论这篇文章。注册免费,耗时不到一分钟。
目前没有评论。