乐于分享
好东西不私藏

你本地那个 AI 工具,后台其实一直没关门

你本地那个 AI 工具,后台其实一直没关门
你有没有想过一件事。
你每天在本地跑的那个 AI 编程工具,除了你看得见的那块聊天界面,背后还悄悄开着一个网页后台。
这个后台,默认是没锁的。
我不是在吓你。这是有人认真测过、还在 GitHub 上公开报出来的事(编号 Discussion#853)。结论很直白:只要你机器上跑着 deepseek-harness 的 web 控制面,任何能碰到那个本地端口的程序,不用密码,就能替你干几乎任何事。
我换个说法。
想象你电脑里有个房间。门没锁。你以为"反正只有我能进自家屋",所以没当回事。可问题是,你电脑上同时跑着几十个程序——浏览器插件、下载器、一个你都忘了从哪装的小工具。它们都在这同一个屋檐下。门没锁,谁都能推门进去,坐到你的椅子上,用你的身份敲键盘。
那个后台,就是这么个"没锁的房间"。

这个房间,比你以为的敞亮得多

那个后台监听在一个本地地址上(127.0.0.1:3080)。听起来挺安全,对吧?"只在我自己机器上嘛。"
但"只在本地"从来不是安全边界。这是整件事里最容易被误解的一点。
你的电脑不是一台机器,而是一座住着很多程序的小区。任何一个程序,只要和你跑在同一台机器上,就能访问那个端口。恶意软件、你随手跑的一个脚本、甚至某个你信任但其实被污染的依赖——它们不需要破解任何东西。门就是开的。
更麻烦的是,那个后台提供的能力很"重"。它能创建会话、执行命令、改设置、读写你的凭据。报告里举了一条真实的攻击路径:先建个会话,再把权限悄悄切到"完全放开",然后让一个叫 bash 的工具去执行任意命令。一路下来,不需要你点任何确认。
你说,我人在旁边,我能看见吧?不一定。那个后台还有个广播所有会话事件的流。你的工具调用、参数、甚至待你审批的请求,全在那条流里飘着。本地另一个程序看一眼,就知道你正在干什么、该怎么顺着你的手继续往下走。
还有一个细节很讽刺。后台本来有一道"围栏"——校验请求到底从哪来。但这道围栏看的是请求自己报上来的"我来自哪"。这就好比门卫问"你是这栋楼的人吗",陌生人随口说"是",门卫就信了。本地程序编一个地址,围栏就放行。
所以问题不只是"门没锁"。是"门卫认错人,还只信对方自己说的话"。

所以我给它装了把锁

那怎么办?我写了个叫 dsh-web-auth 的小插件。它干的事特别简单:给那扇门,装把锁。
具体说,就是给所有 /api 接口加一层校验。每个请求都得带上正确的"钥匙"(一把共享密钥),验不过就直接挡回去。没钥匙?门都不让你推。
这把锁有两种用法,看你喜好。
第一种叫 auto,自动模式。插件一启动,自己随机生成一把钥匙,再悄悄塞进网页里。你什么都不用配,开箱即用。钥匙每次启动都不一样,像是每天自动换一次门锁。启动时它会把这把钥匙打到日志里,万一你要手动调试也找得着。
第二种叫 manual,手动模式。你自己定一把固定钥匙,插件问你要。网页端会提示你输入一次,存在浏览器本地,之后自动帮你把钥匙附加到每个请求上。重点是:这把钥匙不会写进网页源码里。外人翻源码也抄不走。
你肯定担心一件事:比对钥匙的时候,会不会被人靠"响应快慢"猜出来?比如猜对了前几位,回得就快一点?这点我处理过了——插件先把钥匙两边做哈希归一,再用"时序安全"的方式比对,从根上堵掉这种靠时间差猜密码的伎俩。
你可能还想问:为啥不直接上 HTTPS 那种正经认证?原因很现实——那个工具的第一版,压根把"认证"和"加密"都排在了范围之外,只防恶意网页,没防本地程序。我这个插件做的是在它现有架构上,先把"谁都能进"这扇门堵上。正经的传输加密,得等宿主程序那一层的版本慢慢补。

但它真不是万能的

我得跟你说实话:这把锁修好了最大的那个洞——"谁都能进"。但有几个缝,是单个插件补不完的,得靠你自己和宿主程序一起补。
第一,那个广播所有会话事件的流,暂时没完全拦进清单里。如果你特别在意事件泄露,得自己把它也加进配置,或者等宿主侧修。
第二,插件默认拒绝把后台直接暴露到公网(那个 0.0.0.0 的监听)。这是守着"远程未认证、能被外人直接控制"那道最危险的门。但如果你硬要放开,插件不会偷偷放你过去——它会让你明确表态,亲口说"我清楚风险"。这不是挡你,是逼你想清楚。
第三,钥匙策略的另一半(比如"能不能让一个被认证的请求,去乱连调用方指定的网址"),要宿主侧的程序配合修。插件能拦住没钥匙的请求,但拦不住一个已经进门的人干傻事。门里的事,门管不了。
所以正确的姿势是:装了这个插件,再把它放在一个"带认证的代理"后面跑,别把端口直接亮给公网。插件是那道门,代理是门外的围墙。两样都得有。

一句安利,给那个你从没锁过的房间

说到底,我想安利的就这么个东西:一个开源的小插件,给那个你一直没注意的"没锁房间",加道门。
它不复杂。你在 cordis.yml 里加几行,把插件挂上去就行:
- insert:    - id: web-auth      name: '/path/to/dsh-web-auth/src/index.ts'      config:        tokenMode: auto        rejectStatus: 401        allowNetworkExposure: false
auto 连钥匙都不用你想。比起你机器上那些默认敞着的后台,这把锁几乎零成本。
我也没把它吹成银弹。安全从来不是"装一个东西就万事大吉"。但很多时候,一句"我装了那把锁",就能把最蠢也最致命的那种入侵,从"随便进"变成"进不来"。
如果你本地跑着 deepseek-harness 的 web 控制面,又从没想过这扇门的事——去看看 dsh-web-auth 吧。它就在那,等你在门口,挂上第一把锁。
项目地址:https://github.com/vicoproplus/deepseek-harness-web-auth.git