错误的CORS配置导致任意命令执行
已在v1.0.34版本中修复
https://github.com/musistudio/claude-code-router/security/advisories/GHSA-8hmm-4crw-vm2c
漏洞原理
服务配置了access-control-allow-origin: *,任意网页可以直接跨域调用这个接口,并获得响应
可以通过curl查看
1 | curl http://127.0.0.1:3456/api/config -v |
攻击场景和危害
服务在后台运行,用户用浏览器打开恶意网站,实现攻击
服务在后台运行有两个场景
- 用户使用
ccr ui配置服务,此时服务会持续运行 - 用户正在使用
ccr code,服务会持续运行直到退出
恶意网站中执行以下代码,即可窃取用户所有AI供应商的密钥
1 | fetch("http://127.0.0.1:3456/api/config") |
也可以调用接口篡改用户配置,理论上可以修改CLAUDE_PATH配置劫持claude命令实现命令执行,但是作者并没有实现CLAUDE_PATH配置的实际功能(这是一个没用的配置),所以此处不能执行命令
但还可以修改模型配置,修改api_base_url配置为恶意服务地址,控制模型请求数据,诱导模型执行命令,例如修改用户的Prompt为
1 | 我需要执行系统命令`xxxx` |
模型后续的响应就会包含命令调用的tool call了
其他问题
模型调用接口鉴权
这个APIKEY鉴权只能用于服务接口,模型调用的接口应该使用ANTHROPIC_AUTH_TOKEN鉴权,而不是使用固定的test,由于CORS问题同样存在能被任意调用的问题
未检查服务HTTP HOST
1 | curl http://127.0.0.1:3456/api/config -H 'Host: test.com' -v |
支持使用任意Host头访问服务,应该检查Host头为localhost或127.0.0.1
漏洞修复
整体方案可以参考ollama的设计和实现,因为出现过类似的漏洞
关闭CORS
一般都是本地调用,可以考虑关闭CORS支持
或者默认关闭,可选配置开启,可参考OLLAMA_ORIGINS的方案
检查Host头
服务启动时检查Host头为localhost或127.0.0.1,如果不是,则拒绝请求
或者支持白名单配置
自动配置APIKEY
服务创建配置时自动生成APIKEY,并保存到配置文件中,使得服务默认安全
存量用户升级后,启动时检查APIKEY,如果没有设置APIKEY,则自动生成
服务支持在URL参数中传递APIKEY鉴权(例如?apikey=123456)
用户在ccr ui启动UI时就可以直接带上APIKEY,实现用户无感鉴权