【免费下载链接】open-gleanAn open-source AI platform for knowledge work. Connect your apps, find answers, and get work done.项目地址https://gitcode.com/gh_mirrors/op/open-glean点击查看免费下载Open Glean 是一个开源的 AI 知识工作平台其核心职责包括代用户持有 API 密钥、发起对外请求并渲染 LLM 生成的答案因此 SECURITY.md 定义的是一套面向真实攻击面的安全模型而非通用模板。本文以该安全策略为骨架结合仓库源码lib/session.ts、lib/safeUrl.ts、lib/safeFetch.ts、lib/subject.ts、lib/citationMarkup.ts与对应测试逐层讲解 Open Glean 如何加密托管凭证、防御 SSRF、隔离匿名会话、净化渲染输出并明确哪些边界问题不属于漏洞。读完本文你将掌握该项目的威胁模型、各安全模块的实现原理以及自托管部署时应当遵守的边界约定。漏洞报告流程渠道、时效与红线Open Glean 的安全策略对漏洞上报有明确的流程要求任何安全研究人员或自托管用户都应先遵守这些约定上报渠道通过邮件securityhydradb.com联系维护团队不得为漏洞创建公开 issue。上报内容尽可能包含三要素——发现了什么what you found、如何复现how to reproduce it、攻击者能获得什么what an attacker gets提供 PoCproof of concept会更有帮助。响应时效三个工作日内会收到确认回执。测试红线不要对你不拥有的部署进行测试应在本地运行 Open Glean 进行验证。这既避免对线上服务造成影响也保证测试环境可控。这一本地运行而非攻击他人部署的要求与该项目的自托管定位一致仓库提供next.config.ts、Dockerfile与package.json本地起服务即可复现大部分攻击面无需触碰生产环境。Open Glean 处理的核心资产四个关键攻击面安全策略明确列出了系统真正要紧matter的部分它们也是漏洞报告应当聚焦的四个领域凭证CredentialsHydra 与 LLM 的 API 密钥。出站请求Outbound requests服务端抓取调用方可控的 URLLLM 端点、Hydra 基础 URL、网页抓取端点。聊天隔离Chat isolation每个会话归属一个匿名的、按浏览器维度的 subject。渲染答案Rendered answersLLM 输出被渲染为 HTML且可能引用他人撰写的文档内容。下面逐一结合源码深入剖析这四块防线。凭证安全AES-256-GCM 加密的 httpOnly Cookie安全策略的核心声明是Hydra 与 LLM 密钥存放于 AES-256-GCM 加密的 httpOnly Cookie 中仅在服务端使用绝不发送到浏览器。这一承诺在 lib/session.ts 中有完整实现加密算法CIPHER aes-256-gcm第 23 行加密时生成 12 字节随机 IV并使用 GCM 认证标签cipher.getAuthTag()保证密文完整性第 49-55 行解密时校验认证标签任何篡改都会导致解密返回null第 57-75 行。密钥派生加密密钥并非直接使用OPEN_GLEAN_SESSION_SECRET而是通过createHash(sha256).update(raw).digest()派生为稳定的 32 字节密钥第 33-47 行。生产环境要求该 secret 至少 16 字符否则直接抛错。Cookie 属性写入时显式设置httpOnly: true、sameSite: lax、生产环境secure: true路径/有效期 90 天第 107-113 行。httpOnly意味着浏览器 JS 无法读取密钥XSS 也无法直接窃取 cookie。服务端解析代理路由 app/api/hydra/[...path]/route.ts 的buildClient按优先级解析密钥Authorization: Bearer请求头显式逐请求覆盖→ 加密会话 Cookie →HYDRA_API_KEY环境变量部署级共享密钥缺省时返回 401第 58-80 行。值得注意的细节是密钥与端点同源绑定解析 base URL 时只有调用方自带 header key 才能同时提供 base URL否则沿用会话或环境变量中的端点第 87-90 行。README.md 将这一条总结为存储的密钥被固定pinned到存储它的端点防止攻击者用自己控制的 URL 搭配服务端密钥把密钥以Authorization头发送到攻击者指定的主机。出站请求从 URL 字符串检查到 DNS 解析后的双重 SSRF 防护出站请求是 Open Glean 最复杂的一条攻击面因为它包含三类调用方可控的目标LLM 端点、Hydra 基础 URL、网页抓取端点。防护由两层组成分别位于 lib/safeUrl.ts 与 lib/safeFetch.ts。第一层assertSafeLlmUrl——URL 字符串检查传输层 主机名规则lib/safeUrl.ts 的assertSafeLlmUrl使用两条相互独立的规则因为它们防御的是不同问题传输规则公网主机必须使用https:。密钥走Authorization头传输明文http:会把密钥暴露给网络路径上的任何人file:、gopher:、ftp:等非 http(s) 协议一律拒绝第 45-47、75-79 行。主机规则主机不得是 loopback、私网、link-local 或内部域名localhost、ip6-localhost、ip6-loopback以及.localhost、.local、.internal后缀否则服务端会成为向自身网络发起 SSRF 的中继第 56-72 行。IP 分类函数isPrivateAddress第 89-100 行覆盖了相当完整的地址形态IPv4 方面包括10/8、127/8、0/8本机、169.254/16link-local含云元数据地址169.254.169.254、172.16/12、192.168/16、CGNAT100.64/10第 111-118 行IPv6 方面通过自定义解析器展开::压缩、尾嵌 IPv4 等文本形态统一分类::、::1、ULAfc00::/7、link-localfe80::/10并正确处理::ffff:127.0.0.1等嵌入 IPv4 前缀第 173-198 行。另外代码会剥离域名尾部的点号第 52-55 行因为vault.internal.这类 FQDN 能正常解析却不匹配任何名称规则是历史绕过点lib/safeUrl.test.ts 的 trailing dot 测试组专门回归了这一场景第 98-110 行。第二层assertPublicHostfetchPinned——DNS 解析后的地址级校验与连接固定安全策略明确指出字符串检查不足以防御DNS rebinding一个公网主机名解析到私网地址时仍能通过所有字符串规则。因此 lib/safeFetch.ts 提供了解析后校验assertPublicHost第 41-88 行先做名称与 IP 字面量检查然后通过node:dns/promises的lookup(host, { all: true, verbatim: true })解析出全部地址只要任意一条记录是私网地址就整体拒绝——rebinding 主机常同时返回一条公网与一条私网地址交由客户端挑选逐一拒绝正是为此设计。fetchPinned第 111-175 行解决校验与抓取之间的二次解析问题Node 全局fetch会再次解析主机名短 TTL 的 rebinding 记录能在校验后、抓取前把解析结果翻转为私网 IP。它改用node:http(s)的lookup回调把 socket固定pin到已校验的 IP同时保留原始主机名作为Host头与 TLS SNI保证虚拟主机与证书校验正确。此外不跟随重定向3xx 状态只回传状态码因为跳转目标未经校验响应体读取上限MAX_BYTES 2_000_000第 20 行readCapped第 184-201 行流式截断而非res.text()整体缓冲。网页抓取端点的实际运用app/api/fetch-url/route.ts 是Webpage导入功能的抓取入口它完整串联了上述两层防线解析 URL → 只接受 http(s) →assertPublicHost校验主机 →fetchPinned固定连接并拒绝重定向 → 10 秒超时、文本提取上限 200KB。该路由还处理了另一个隐患标签剥离正则的二次回溯问题。注释说明[\s\S]*?惰性匹配在闭合标签缺失时会二次方回溯攻击者构造的重复script开启标签可冻结单线程服务超过一分钟现在的线性扫描stripTagPair第 62-85 行与MAX_PARSE_CHARS 400_000输入上限把成本约束在可控范围内stripTagPair.test.ts中亦有对应测试。聊天隔离HMAC-SHA256 签名的匿名 SubjectOpen Glean没有登录系统。安全策略定义每个会话归属于一个匿名的、按浏览器维度的 subject并明确要求如果你能读取、修改或删除另一个 subject的聊天记录应立即上报。实现位于 lib/subject.ts身份机制subject 是一次性铸造mint的不透明随机 IDrandomUUID()盖上每个聊天行第 50-54 行每次读取、更新、删除都必须匹配。签名而非加密Cookie 值格式为id.signature签名是HMAC-SHA256密钥来自OPEN_GLEAN_SESSION_SECRET与凭证会话共用验证时使用timingSafeEqual防时序攻击第 62-74 行。subject 本身不含秘密加密没有意义但伪造的 subject 会冒用另一浏览器的聊天记录所以签名是必需的。独立 Cookiesubject 使用单独的open-glean.subCookie与凭证会话open-glean.session分离第 31 行。注释解释了原因断开密钥连接会清除凭证会话若两者共用一个 Cookie每次断开都会让浏览器的聊天历史永久失联。渲染答案引用链接化环节的 XSS 防线LLM 输出被渲染为 HTML且其中可能引用他人撰写的文档因此答案渲染是一条 XSS 攻击面。Open Glean 的做法是在escapeHtml处理之后、dangerouslySetInnerHTML投喂之前插入引用链接化环节 lib/citationMarkup.ts 的linkCitations其安全性依赖两条承重性质load-bearing唯一的插值数据是本函数自己解析的数字[n]标记中的引用号被解析为整数并校验1 ≤ ref ≤ maxRef第 51-57 行攻击者文本不可能进入任何 HTML 属性超界的标记保持纯文本而不是指向空卡的链接。拒绝在既有标签内匹配通过按标签切分 HTML 并跟踪code、pre、a、button的嵌套深度第 32-50 行[1]不会在array[1]这类下标语境中被误转换也不会把按钮嵌套进链接。lib/xss-pipeline.test.ts 针对完整管线真实inlineMarkdown渲染 真实linkCitations做了 XSS 回归覆盖 14 种攻击向量script标签、javascript:URL、属性逃逸[1 onerroralert(1)]、伪造data-cite、code 内标记、链接文本内标记、超大引用号、负号引用、替换模式$、嵌套括号、img onerror、SVGonload、实体双重编码以及 Unicode 数字[١]全部断言输出不含非法标签、非法href、事件处理器或非数字data-cite第 24-44 行。边界声明什么不是漏洞安全策略对三类边界场景给出明确澄清自托管用户尤其需要理解这些设计如此的行为匿名 subject 不是认证。它标识的是浏览器而非人任何使用同一浏览器配置文件的用户都拥有相同访问权。这是已知限制。从 lib/subject.ts 的注释看这一限制是刻意设计清除 Cookie 即丢失历史且设计上无法恢复因为没有任何其他信息能把行记录绑定回浏览器两个浏览器或两台设备就是两个不同的 subject。部署级HYDRA_API_KEY与所有访客共享。这正是该设置的功能部署设置此变量后每个访客的请求都会解析到该密钥见代理路由的密钥解析优先级。因此文档明确建议把部署放到你自己的访问控制之后put the deployment behind your own access control。OPEN_GLEAN_ALLOW_PRIVATE_LLM_URLtrue允许向私网地址发送明文请求。该设置专为本地模型如 Ollama、LM Studio存在——本地模型在 loopback 上以无证书的明文 HTTP 提供服务流量不出本机强制 TLS 只会逼人关闭整个防护。但实现上做了精确收窄lib/safeUrl.ts 第 64-79 行先解析 URL 再做 opt-in 判断开关只放宽私网地址 http这一组合公网主机的明文http:即使在开关开启时依然被拒绝file:等非 http 协议同样如此。lib/safeUrl.test.ts 的 opt-in 测试组第 67-87 行与 lib/env.test.ts 的环境告警第 72-75 行均验证了这一点。环境变量与部署边界的配套约束安全策略虽未逐一列出环境变量但凭证加密、SSRF 防护、subject 签名都依赖正确配置因此 README.md 的配置表与 lib/env.ts 的启动期校验构成安全边界的配套部分变量作用与安全含义OPEN_GLEAN_SESSION_SECRET生产环境必需任意 16 字符随机串用于加密密钥会话 Cookie 与签名 subjectHYDRA_API_KEY可选部署级共享密钥设置后无需用户自带密钥注意与访客共享的边界HYDRA_BASE_URL可选默认后端地址默认https://api.hydradb.comOPENROUTER_API_KEY可选服务端 LLM 密钥OPEN_GLEAN_ALLOW_PRIVATE_LLM_URL允许 LLM 基础地址指向私网/loopback本地模型默认关闭仅放宽私网明文 httplib/env.ts 的checkEnv在启动时执行校验生产环境缺少或过短的 session secret 记为错误HYDRA_BASE_URL非 https 或格式非法记为错误因为密钥经Authorization头传输开启OPEN_GLEAN_ALLOW_PRIVATE_LLM_URL、设置了 LLM 密钥却未设模型等情况记为告警第 30-74 行。这些检查通过 lib/env.test.ts 逐一回归保证配置错误在启动时暴露而不是深埋在某个请求内部。版本支持策略安全策略的版本政策只有一条修复落在main分支不存在向后移植backported的发布版本。这意味着使用 Open Glean 的自托管用户应当跟进main分支的更新安全修复不会以补丁形式回填到旧版本这也是官方建议本地运行、及时同步的原因之一。小结一份可以直接指导安全评审的威胁模型Open Glean 的 SECURITY.md 是一份与实现严格对齐的安全策略四个核心攻击面凭证、出站请求、聊天隔离、渲染答案分别对应lib/session.ts、lib/safeUrl.tslib/safeFetch.ts、lib/subject.ts、lib/citationMarkup.ts四个模块每个模块都有配套测试safeUrl.test.ts、xss-pipeline.test.ts、env.test.ts等锁定回归。对安全研究者而言这是一套结构清晰的靶点清单对自托管运维者而言则是一份明确的边界手册——尤其是匿名 subject 不等于认证部署级密钥与访客共享私网 LLM 开关仅用于本地模型三条边界直接决定了你的部署需要什么样的外部访问控制。赞分享【免费下载链接】open-gleanAn open-source AI platform for knowledge work. Connect your apps, find answers, and get work done.项目地址https://gitcode.com/gh_mirrors/op/open-glean点击查看免费下载相关推荐NOFX 安全策略与纵深防御实践密钥保护、漏洞披露与部署加固完全指南NOFX 安全策略与纵深防御实践密钥保护、漏洞披露与部署加固完全指南 NOFX 是一套同时管理美股、大宗商品、外汇与加密货币交易的 AI 交易终端直接持有真AI Agent金融科技后端前端24GB以下显存用户的终极AI解决方案Flux1-dev完整部署指南24GB以下显存用户的终极AI解决方案Flux1 dev完整部署指南 还在为AI模型对显存要求过高而烦恼吗Flux1 dev专为24GB以下VRAM环境深度基础模型计算机视觉OmniRoute 安全架构深度指南从漏洞报告到多层纵深防御OmniRoute 安全架构深度指南从漏洞报告到多层纵深防御 OmniRoute 是一个单端点接入 350 提供商的 MIT 许可证 AI 网关而安全是其后端API网关LLM 网关人工智能大模型MCP 服务桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考