# 恶意文档分析方法论坑与边界 ## PDF 结构组 - **对象流(ObjStm)藏对象**:对象可整体放进对象流内,`pdf-parser` 默认不展开——只按 `/JS` 全局搜会漏;`-O` 解析 ObjStm、`-f` 过 filter 后再查(SKILL.md 坑 1) - **filter 链不只 FlateDecode**:`-f` 只处理 FlateDecode/ASCIIHex/ASCII85/LZW/RunLength 五种;遇到 `CryptFilter`(加密流)或自定义 filter 解不出是正常的,不是工具坏了——qpdf 对损坏/畸形 PDF 也会直接报错,需容忍坏 xref 表(可试 `--ignore-xref-streams`) - **xref 损坏不等于假 PDF**:恶意 PDF 常带损坏/增量更新 xref 以干扰解析器——`pdf-parser -v` 显示 malformed 元素时逐条记录,别当分析失败 - **无恶意特征也有行为**:渲染引擎漏洞(阅读器 CVE)与结构特征无关——结构全干净仍要在沙箱动态打开,反例:只有字体/渲染路径的利用文档静态零特征 - **`pdfid` 计数是提示不是结论**:/JS 计数 0 但文件确实有 JS 的情况存在(对象流 + filter 组合)——计数只能做初筛 ## Office 宏组 - **VBA stomping:源码 ≠ 执行码**:Office 执行编译后 P-code;攻击者可把源码流替换成无害文本,olevba 提取出"干净"源码但实际跑的是另一份代码——olevba 有警告就默认源码不可信,以动态行为为准 - **MOTW 是执行开关**:从互联网下载的文档带 Zone.Identifier(MOTW),Office 2016+ 默认禁止其宏/ActiveX——沙箱里"打开没反应"先查 MOTW 与 Protected View,别急着下"良性"结论;反过来,**分析者自己的样本若被 Unblock-File 处理过,要记录这一改动**(改变了样本原始执行语义) - **DDE 不是默认向量**:2017 年后 Word 默认禁用 DDE 自动更新——老文档/老版本的 DDEAUTO 才触发;静态检出 DDEAUTO 需标注版本假设,动态触发不了不代表样本无害 - **宏入口不止 AutoOpen 系**:表单控件、按钮、工作表事件、快捷键触发宏的文档,静态只看自动宏会漏——遍历全部 `Sub`/`Function` 引用 - **XLM 与 VBA 并存**:老 .xls 可同时含 Excel 4.0 宏表与 VBA——只提 VBA 会漏 XLM 载荷;olevba 0.54+ 支持 XLM 识别,混淆深的 XLM 用 xlmdeobfuscator - **加密文档读不出是常态**:olevba 对加密 OOXML/CFB 无解——用 oleid 确认加密后再决定(口令提取不在本文档技能范围,走 [[re-crypto-keys]] 思路或诚实报告) ## RTF 与嵌入对象组 - **RTF 转义是混淆重灾区**:`\'XX` 逐字符十六进制转义可把整个文档变成不可读串——先还原再分析;`\*\` 目的性标记(星号=未知控制字)也可能夹带恶意数据 - **\objdata 里不只是 OLE**:嵌入对象的内容可以是被截断/改头的数据——提取后按头字节重新识别,不要默认"objdata = OLE" - **CLSID 已知好 ≠ 对象无害**:rtfobj 显示已注册的正常 CLSID,但对象内部数据仍可被利用(如公式编辑器类组件历史漏洞)——CLSID 只作筛选线索,不作结论 ## 环境与沙箱组 - **LibreOffice 默认不执行 VBA**:宏安全设置默认禁用——用 LibreOffice 动态验证"宏行为"会得到错误的空结果;要么装真实 Office,要么显式改宏安全设置并记录 - **延迟/环境检测型样本**:沙箱里静默 30-60 秒后才有行为(检测进程名/网络/交互)——观察窗口至少覆盖 2 分钟,并模拟滚动/点击/输入;反例:检测到无交互即退出的样本,UI 自动化能触发 - **网络隔离要双向**:INetSim/fake DNS 能拦外联,但样本也可能通过 DNS 隧道/隐蔽通道——抓包日志留证([[re-netcap]]),别只开拦截不开记录 ## 使用注意 - 沙箱执行是前置条件([[re-sandbox]],[[re-analyze/platform-tips]] 最高原则),未隔离环境不打开文档样本 - 所有结论按 [[decision-tree]] 证据分级标注强度;工具版本(oletools/libreoffice 版本)记录进分析日志