Skip to content

Security: Xplore-LAB/postbird

Security

SECURITY.md

安全政策(Security Policy)

Postbird for DeepSeek Harness(产品名「信鸽」,包名 dsh-plugin-office)是一个会执行真实外部动作的 Agent 工具套件:发送邮件、读写本机文件。本文档说明它的威胁模型、已内置的防护机制、可配置的护栏,以及漏洞上报方式。目标读者:使用者、审查者、贡献者。

支持版本

版本 状态
v1.1.1 及以上 支持
v1.1.0 及以下 存在已修复漏洞,请升级(见下文「已修复漏洞」)

威胁模型

工具运行在「LLM Agent + 不可信数据」的环境中,防护围绕三个攻击面设计:

攻击面一:不可信表格数据

收件人表、批量数据行(CSV/JSON)通常来自外部(学生名单、客户名单、他人提供的表格)。恶意或被污染的单元格是本插件最主要的攻击向量:

攻击 后果 防护
附件列填 ~/.ssh/id_rsa../../.env 任意本机文件作为附件外发(数据外泄) 附件路径解析后强制限制在 workDir 内,逃逸即整行拦截(v1.1.1 起)
pptx 的 imagePath 从数据行渲染出逃逸路径 任意本机文件被嵌入外发文档 同上,imagePath 强制限制在 workDir 内(v1.1.1 起)
单元格值含 \r\n 注入邮件头(如伪造 Bcc) 邮件头注入 所有进入邮件头的渲染值(主题、显示名)剥除 CR/LF/Tab(v1.1.1 起)
表格数据本身就是钓鱼内容(诱导收件人) 依赖发件人审核 两阶段设计强制 preview 样本展示给用户确认

攻击面二:Agent 误操作

LLM 可能理解错意图、被提示注入诱导,或拿到过时数据。防护原则是外部不可逆动作必须有摩擦力

  1. 两阶段发送office_mail_send 只接受 office_mail_preview 生成的 previewId,且必须显式 confirm: true
  2. 预览有效期:preview 超过 TTL(默认 60 分钟)自动作废,防止 Agent 拿陈旧预览直接发送。
  3. 默认草稿模式:不配 SMTP 凭据时,工具只能产出 .eml 草稿文件,物理上无法发送。
  4. 缺字段硬失败:任何一行缺模板字段,整批拦截,杜绝半成品或错发。

攻击面三:滥用与账号安全

批量发送可能触发邮箱服务商风控,也可能被用于垃圾邮件:

  1. 单批上限maxRecipients,默认 50):一批最多多少收件人。
  2. 24 小时滚动发送上限dailySendCap,默认 200):基于审计日志统计,超出即拒绝发送(v1.1.1 起)。
  3. 发送节流sendIntervalMs,默认 1500ms):两封邮件之间的最小间隔。
  4. 域名白名单allowDomains,默认空):配置后只允许向指定域名(如 qq.comedu.cn)发送,适合「只发本校/本组织」场景(v1.1.1 起)。
  5. 收件人去重:同批重复地址自动拦截,防误发与刷量(v1.1.1 起)。

凭据管理

  • SMTP 密码/授权码推荐通过环境变量注入(默认读 DSH_SMTP_PASS,可用 smtpPassEnv 改名),避免明文写进 cordis.patch.yml。
  • 凭据从不写入审计日志、预览文件、草稿文件。
  • 审计日志(~/.dsh/office/mail/sent-log.jsonl)只记录时间戳、收件地址、主题、投递结果与 .eml 路径。

文件系统边界

路径类型 边界
附件路径、pptx 图片路径(数据驱动) 必须位于 workDir 内,逃逸即拦截
输出文件(docx/pptx/csv/xlsx) 默认拒绝覆盖已存在文件,须显式 overwrite: true
输入文件(模板、数据表) 由 Agent/使用者显式指定,视为可信指令通道
审计与预览数据 固定存放于 ~/.dsh/office/mail/,不散落

已修复漏洞

版本 漏洞 严重度
v1.1.1 邮件附件路径逃逸:不可信 CSV 单元格可将任意本机文件(如 SSH 私钥、.env)作为附件外发
v1.1.1 pptx imagePath 路径逃逸:同上,嵌入文档外发
v1.1.1 邮件头 CRLF 注入:表格单元格可注入伪造邮件头(Bcc 等)
v1.1.1 无发送总量护栏:缺少 24h 滚动上限与域名白名单,存在滥用与风控封号风险

上报漏洞

请通过 GitHub 私密漏洞报告(Private Vulnerability Reporting)上报:

  1. 打开 github.com/Xplore-LAB/postbird/security/advisories
  2. 选择「Report a vulnerability」

请勿在公开 Issue 中披露未修复漏洞。期望响应时间:72 小时内确认,7 天内给出修复计划。

office_inbox 的安全原则(v1.2 起生效)

收件侧工具维持与发送侧同级的默认安全姿态:

  1. IMAP 严格只读:正文以 BODY.PEEK 拉取,绝不置 \Seen;不写旗标、不移动、不删除任何邮件。
  2. 凭据仅走环境变量:IMAP 授权码通过 DSH_IMAP_PASS(可配置 imapPassEnv)注入,不落配置文件、不写日志。
  3. 最小化落盘:本地索引 ~/.dsh/office/mail/index.jsonl 只存元数据(时间/发件人/主题/附件清单)与短摘要(默认 300 字符),不存正文全文,不存附件内容。
  4. 收件内容视为不可信文本:邮件正文与主题是潜在注入载体,分诊只输出结构化分类与证据;正文中的链接与指令不得被自动执行。
  5. 确定性规则可解释:每条分诊结果附判定证据(命中了哪条规则),语义修正由 Agent 完成并需要可追溯的理由。

office_archive / office_stats / office_inbox_clean 的安全原则(v1.3 起生效)

归档、统计与清理建议工具共享收件侧数据层(本地 JSONL 索引),安全姿态延续只读原则:

  1. 写入边界.eml 导出与附件下载只能写入 workDir 内的目录,路径逃逸即拦截;文件名统一清洗去重,不覆盖既有文件。
  2. 显式上限maxArchiveMessages(默认 200)限制单次操作触碰的邮件数;maxAttachmentMb(默认 25)限制单附件大小,超限跳过并逐条报告,绝不静默丢弃。
  3. 全文落盘须显式请求:索引只存元数据与摘要;.eml 导出是唯一把正文全文写到磁盘的路径,且只在用户明确要求导出时发生。
  4. 统计纯本地office_stats_* 只读本地索引与审计日志,零网络请求;求职台账的自动归并只前进(已投 → 笔试 → 面试 → offer),降级与拒绝状态必须手动修正,防止误判污染台账。
  5. 清理建议只输出office_inbox_clean 只生成建议清单与 List-Unsubscribe 链接,绝不代为退订、删除、移动或发送;任何处置动作由用户在邮箱客户端自行完成。退订链接本身视为不可信输入,不由插件请求。

每日简报、行动雷达与上下文回复的安全原则(v1.4 起生效)

  1. 继续使用最小化索引:三项工具只处理本地索引中的元数据与短摘要,不新增邮件全文落盘。
  2. 每项行动提供依据:行动类型、截止状态和优先级同时返回规则证据,方便使用者回到原邮件复核。
  3. 模糊时间明确保留:无法从摘要识别具体日期时标记为 unscheduled,不虚构截止时间。
  4. 回复草稿保留人工判断office_context_reply 聚合同主题的已索引摘要并生成三种草稿,输出始终标记 requiresUserReview: true
  5. 发送边界保持独立:回复工具不发送邮件。真实发送仍要调用 office_mail_preview 生成预览,再由用户确认后调用 office_mail_send

线程、材料与附件理解的安全原则(v1.5 起生效)

  1. 完整线程按需读取office_thread_summaryoffice_reply_draft 默认使用本地短摘要。只有调用者明确选择 contextMode: full 时才通过只读 IMAP 与 BODY.PEEK 重新获取选定邮件。
  2. 完整正文不扩充索引:full 模式下的正文只存在于当前进程内存,每封邮件受 maxThreadCharsPerMessage 限制,处理完成后不会写回 index.jsonl
  3. 线程数量有硬上限maxThreadMessages 限制一次完整上下文操作触碰的邮件数,避免异常线程造成资源耗尽。
  4. 附件路径严格限制office_attachment_ask 只读取 workDir 内的文件,并受 maxAttachmentReadMb 限制。工具不会修改或上传附件。
  5. 证据粒度明确:PDF、DOCX、PPTX、XLSX 与文本附件分别返回页、段落、幻灯片、工作表行和文本行范围。回答应引用这些位置,并由使用者复核关键结论。
  6. 图片需要视觉复核:位图附件仅返回受限的本地文件路径和基本元数据,交给具备视觉能力的本地读取器处理。工具不会静默调用第三方 OCR 服务。
  7. 材料状态允许人工覆盖office_collection_track 保留 manualStatus 与备注。重新扫描会继续保留人工确认,避免自动识别覆盖辅导员或行政人员的判断。
  8. 催办始终经过发送护栏:材料追踪只生成缺失清单和提醒所需数据,不会自动发送催办。邮件仍需预览、检查收件人并明确确认。

Postbird 负责插件自身的本地文件与索引边界。工具返回给 DeepSeek Harness 的文本会进入当前 Agent 上下文,其后续存储与模型处理路径取决于使用者选择的 DeepSeek Harness 部署和模型配置。处理敏感邮件前,应确认运行时符合所在组织的数据要求。

已知依赖告警

2026-09-07 的 npm audit 会报告 pptxgenjs 间接依赖 image-size 的两项高危拒绝服务告警,涉及恶意 ICNS、JXL 与 HEIF 文件。上游当前没有修复版本。Postbird 的 office_pptx 在读取文件前只允许 PNG、JPEG、GIF 与 SVG,明确拒绝 .icns.jxl.heif.heic,并有端到端用例验证该边界。维护者会在上游发布修复后及时升级并重新审计。

There aren't any published security advisories