Hyperresearch抓取安全加固清单:响应大小上限、TLS证书验证与私有主机白名单
【免费下载链接】hyperresearchAgent-driven research knowledge base. Agents collect, search, and synthesize web research into a persistent, searchable wiki.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperresearch
Hyperresearch 是一个 Agent 驱动的研究知识库工具,它让 AI 自动抓取、搜索并合成网络资料,构建可长期检索的 Wiki。由于抓取目标不受你控制,Hyperresearch 内置了一套 SSRF 防护网关,通过响应大小上限、TLS 证书验证与私有主机白名单三道防线,防止恶意页面把抓取器引向云元数据接口(如 169.254.169.254)或耗尽内存。本文带你逐项看懂这套加固机制,以及如何在配置中调整它们。
为什么抓取器需要安全网关?
当 AI Agent 自动抓取网页时,攻击者可以用三种方式下手:
| 攻击手法 | 风险 | Hyperresearch 的防线 |
|---|---|---|
| SSRF(服务端请求伪造) | 让抓取器访问内网、127.0.0.1、云元数据接口 | 出站前逐跳校验目标 IP |
| 超大/无限响应体 | 内存耗尽(zip bomb 式攻击) | 流式读取 + 大小上限,超量即中断 |
| TLS 证书攻击 | 中间人篡改传输内容 | 默认验证证书,且不自动降级重试 |
所有出站请求都集中在一个模块 safe_http.py 中处理,Web 抓取提供商(builtin、crawl4ai 等)全部经由它访问网络,不存在"后门"通道。
响应大小上限:流式拦截,超量即拒 🛡️
大小上限不是"下载完再检查",而是边下载边计数——服务端即使谎报 Content-Length 或用分块传输,也会在传输过程中被掐断:
- 先查声明值:如果响应头
Content-Length已声明超过上限,直接拒绝,一字节都不下载; - 再查实际流:逐块累加,一旦累计字节数超过上限立即抛出错误终止连接。
三类内容各自有默认上限,定义在 config.py 的[fetch]配置段中:
| 配置项 | 默认值 | 适用场景 |
|---|---|---|
max_html_bytes | 10 MiB | 网页正文 |
max_pdf_bytes | 25 MiB | PDF 论文下载 |
max_image_bytes | 2 MiB | 图片资源 |
这些值均可在.hyperresearch/config.toml中覆盖。PDF 下载入口 safe_get_pdf 会把配置里的上限原样传给网关,保证"你配的数就是生效的数"。
TLS 证书验证:默认开启,且绝不自动降级 🔐
这是 2.0 版本一个重要的行为变化:PDF 下载路径过去静默关闭了证书验证(verify=False),现在pdf_verify_tls默认值为true(见 config.py)。
更关键的设计是**"拒绝但不自动重试"**:
- 证书验证失败会抛出专用异常 CertVerificationError,并明确告诉你:如果这是一个你信任的证书损坏镜像,请在
[fetch]中显式设置pdf_verify_tls = false; - 被证书拒绝的 URL永远不会落入"忽略 TLS 错误"的浏览器回退通道——因为那等同于一次由攻击者触发的自动降级重试,中间人只要递来一张坏证书就能强制你关闭验证;
- 批量抓取时,这类 URL 会被大声跳过,而不是静默吞掉。
💡 建议:除非你明确信任某个自签名证书的私有镜像,否则保持默认值即可,无需任何配置。
私有主机白名单:内网源的合法通道 🎯
SSRF 网关默认拒绝一切解析到私有地址(RFC1918、回环、链路本地、CGNAT、6to4 包裹地址等)的主机。但如果你有自托管镜像或内网 Wiki,可以通过白名单放行:
[fetch] allow_private_hosts = ["10.8.0.0/16", "mirror.internal"]配置在 FetchSettings 中定义,白名单支持两种条目(解析逻辑见 _parse_allowlist):
- 主机名:精确匹配(大小写不敏感),
mirror.internal不会顺带放行evilmirror.internal; - CIDR 网段:按解析后的 IP 地址匹配,如
10.8.0.0/16。
两条值得注意的安全细节:
- 白名单不能绕过协议校验——
file://之类非法协议依然被拒,白名单主机仍需通过 DNS 解析; - 写错一个 CIDR(比如拼写错误的网段)会大声报错,而不是被静默忽略——否则一个手误看起来就像一次 SSRF 拦截,让你误以为网关在"乱抓"。
别漏掉的:重定向逐跳复检 + 最终 URL 复查 🔄
攻击最常见的绕过方式是"跳转钓鱼":入口 URL 是公网的,但 302 重定向指向内网地址。Hyperresearch 的对策是:
- 手动跟随重定向:每一跳都重新走一遍完整的 URL 校验(默认最多 5 跳),白名单同样对跳转落点生效;
- 事后复查:浏览器渲染完成后,还会对最终落点 URL 再做一次校验(_check_final_url),防止页面内的二次跳转把入口检查变成"睁眼瞎"。
完整的攻防对抗用例可以在测试套件中找到,例如 test_safe_http.py 覆盖了 CGNAT 拒绝、6to4 包裹私有 IPv4 拒绝、跳转落白名单放行等场景,test_final_url_recheck.py 验证了最终 URL 复查逻辑。
快速上手:三步完成加固配置 ✅
- 保持默认:大小上限与 TLS 验证开箱即安全,什么都不改就是一套合理基线;
- 有内网源时:在
[fetch]中添加allow_private_hosts,只放行你控制的网段或主机名; - 有证书损坏的受信镜像时:显式设置
pdf_verify_tls = false,并在团队内记录原因。
最后一点诚实说明(源码注释中已如实标注):地址校验对DNS rebinding是尽力而为的——校验时解析的 IP 与连接时解析的 IP 理论上可能被低 TTL 记录调包,这部分残余风险已被接受并记录在 safe_http.py 模块文档中。对绝大多数使用场景,这套网关已经把"恶意网页操纵抓取器"的可行路径堵得相当彻底。
【免费下载链接】hyperresearchAgent-driven research knowledge base. Agents collect, search, and synthesize web research into a persistent, searchable wiki.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperresearch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考