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 样本展示给用户确认 |
LLM 可能理解错意图、被提示注入诱导,或拿到过时数据。防护原则是外部不可逆动作必须有摩擦力:
- 两阶段发送:
office_mail_send只接受office_mail_preview生成的 previewId,且必须显式confirm: true。 - 预览有效期:preview 超过 TTL(默认 60 分钟)自动作废,防止 Agent 拿陈旧预览直接发送。
- 默认草稿模式:不配 SMTP 凭据时,工具只能产出 .eml 草稿文件,物理上无法发送。
- 缺字段硬失败:任何一行缺模板字段,整批拦截,杜绝半成品或错发。
批量发送可能触发邮箱服务商风控,也可能被用于垃圾邮件:
- 单批上限(
maxRecipients,默认 50):一批最多多少收件人。 - 24 小时滚动发送上限(
dailySendCap,默认 200):基于审计日志统计,超出即拒绝发送(v1.1.1 起)。 - 发送节流(
sendIntervalMs,默认 1500ms):两封邮件之间的最小间隔。 - 域名白名单(
allowDomains,默认空):配置后只允许向指定域名(如qq.com、edu.cn)发送,适合「只发本校/本组织」场景(v1.1.1 起)。 - 收件人去重:同批重复地址自动拦截,防误发与刷量(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)上报:
- 打开 github.com/Xplore-LAB/postbird/security/advisories
- 选择「Report a vulnerability」
请勿在公开 Issue 中披露未修复漏洞。期望响应时间:72 小时内确认,7 天内给出修复计划。
收件侧工具维持与发送侧同级的默认安全姿态:
- IMAP 严格只读:正文以
BODY.PEEK拉取,绝不置\Seen;不写旗标、不移动、不删除任何邮件。 - 凭据仅走环境变量:IMAP 授权码通过
DSH_IMAP_PASS(可配置imapPassEnv)注入,不落配置文件、不写日志。 - 最小化落盘:本地索引
~/.dsh/office/mail/index.jsonl只存元数据(时间/发件人/主题/附件清单)与短摘要(默认 300 字符),不存正文全文,不存附件内容。 - 收件内容视为不可信文本:邮件正文与主题是潜在注入载体,分诊只输出结构化分类与证据;正文中的链接与指令不得被自动执行。
- 确定性规则可解释:每条分诊结果附判定证据(命中了哪条规则),语义修正由 Agent 完成并需要可追溯的理由。
归档、统计与清理建议工具共享收件侧数据层(本地 JSONL 索引),安全姿态延续只读原则:
- 写入边界:
.eml导出与附件下载只能写入 workDir 内的目录,路径逃逸即拦截;文件名统一清洗去重,不覆盖既有文件。 - 显式上限:
maxArchiveMessages(默认 200)限制单次操作触碰的邮件数;maxAttachmentMb(默认 25)限制单附件大小,超限跳过并逐条报告,绝不静默丢弃。 - 全文落盘须显式请求:索引只存元数据与摘要;
.eml导出是唯一把正文全文写到磁盘的路径,且只在用户明确要求导出时发生。 - 统计纯本地:
office_stats_*只读本地索引与审计日志,零网络请求;求职台账的自动归并只前进(已投 → 笔试 → 面试 → offer),降级与拒绝状态必须手动修正,防止误判污染台账。 - 清理建议只输出:
office_inbox_clean只生成建议清单与 List-Unsubscribe 链接,绝不代为退订、删除、移动或发送;任何处置动作由用户在邮箱客户端自行完成。退订链接本身视为不可信输入,不由插件请求。
- 继续使用最小化索引:三项工具只处理本地索引中的元数据与短摘要,不新增邮件全文落盘。
- 每项行动提供依据:行动类型、截止状态和优先级同时返回规则证据,方便使用者回到原邮件复核。
- 模糊时间明确保留:无法从摘要识别具体日期时标记为
unscheduled,不虚构截止时间。 - 回复草稿保留人工判断:
office_context_reply聚合同主题的已索引摘要并生成三种草稿,输出始终标记requiresUserReview: true。 - 发送边界保持独立:回复工具不发送邮件。真实发送仍要调用
office_mail_preview生成预览,再由用户确认后调用office_mail_send。
- 完整线程按需读取:
office_thread_summary和office_reply_draft默认使用本地短摘要。只有调用者明确选择contextMode: full时才通过只读 IMAP 与BODY.PEEK重新获取选定邮件。 - 完整正文不扩充索引:full 模式下的正文只存在于当前进程内存,每封邮件受
maxThreadCharsPerMessage限制,处理完成后不会写回index.jsonl。 - 线程数量有硬上限:
maxThreadMessages限制一次完整上下文操作触碰的邮件数,避免异常线程造成资源耗尽。 - 附件路径严格限制:
office_attachment_ask只读取workDir内的文件,并受maxAttachmentReadMb限制。工具不会修改或上传附件。 - 证据粒度明确:PDF、DOCX、PPTX、XLSX 与文本附件分别返回页、段落、幻灯片、工作表行和文本行范围。回答应引用这些位置,并由使用者复核关键结论。
- 图片需要视觉复核:位图附件仅返回受限的本地文件路径和基本元数据,交给具备视觉能力的本地读取器处理。工具不会静默调用第三方 OCR 服务。
- 材料状态允许人工覆盖:
office_collection_track保留manualStatus与备注。重新扫描会继续保留人工确认,避免自动识别覆盖辅导员或行政人员的判断。 - 催办始终经过发送护栏:材料追踪只生成缺失清单和提醒所需数据,不会自动发送催办。邮件仍需预览、检查收件人并明确确认。
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,并有端到端用例验证该边界。维护者会在上游发布修复后及时升级并重新审计。