1. PDF文档安全自查的必要性
上周帮朋友处理一个工作文档时,突然弹出了奇怪的系统提示。事后排查发现,他收到的PDF里嵌入了恶意脚本。这种经历让我意识到,普通用户对PDF的安全风险普遍缺乏认知。事实上,PDF早已不仅是简单的文档格式,它支持JavaScript、嵌入式对象、表单提交等多种功能,这些都可能成为攻击载体。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 静态分析的核心思路
2.1 文件结构解析
PDF遵循ISO 32000标准,采用分层对象结构。用文本编辑器打开PDF时,你会看到类似这样的头信息:
code复制%PDF-1.7
%âãÏÓ
1 0 obj
<</Type /Catalog
/Pages 2 0 R
>>
endobj
重点关注/JavaScript、/AA(自动执行动作)、/OpenAction等关键字,它们可能触发恶意代码。我曾在一个钓鱼样本中发现如下危险结构:
code复制/OpenAction <<
/JS (app.alert(1);)
/S /JavaScript
>>
2.2 工具链选择
推荐使用以下工具组合进行深度检测:
- pdfid.py:提取PDF对象统计(来自Didier Stevens的工具包)
- peepdf:交互式分析框架
- QPDF:解构文件层次
- 自定义脚本:我用Python写的特征扫描器示例:
python复制import re
dangerous_patterns = [
r'/JS\s*\(',
r'/JavaScript\b',
r'/AA\b.*?/JS'
]
def scan_pdf(path):
with open(path, 'rb') as f:
content = f.read().decode('latin-1')
for pattern in dangerous_patterns:
if re.search(pattern, content):
return True
return False
3. 关键风险特征检测
3.1 JavaScript检测
PDF中的JS可能通过以下方式嵌入:
- 直接代码片段:
/JS (app.launchURL("http://malicious.site")) - 外部引用:
/JS (this.importDataObject("payload")) - 事件触发:如表单提交时执行的
/SubmitForm动作
实战案例:某病毒通过PDF的/PageOpen事件触发CVE-2010-1240漏洞利用代码。
3.2 隐藏对象分析
攻击者常使用以下手法:
- 对象流混淆:
/ObjStm压缩多个对象 - 增量更新:在文件尾部追加恶意内容
- 字体嵌入:利用漏洞的畸形字体文件
检测技巧:
bash复制qpdf --qdf input.pdf output.txt # 线性化还原
grep -aE '/EmbeddedFile|/ObjStm' output.txt
4. 深度检测流程
4.1 元数据审查
使用exiftool检查可疑元数据:
code复制exiftool -a -u -g1 file.pdf
重点关注:
CreateDate与ModifyDate异常- 非标准的
/Producer字段 - 自定义的
/Metadata流
4.2 内容树遍历
通过peepdf生成对象关系图:
python复制import peepdf
pdf = peepdf.PDFCore.PDFParser().parse("file.pdf")
for obj in pdf.body.objects:
if hasattr(obj, 'containsJS'):
print(f"Object {obj.id} contains JS")
5. 典型攻击模式识别
5.1 漏洞利用特征
常见CVE关联模式:
- CVE-2010-1240:
/Collab对象越界写入 - CVE-2017-3071:
/RichMedia执行Flash - CVE-2018-4990:
/Launch动作滥用
5.2 社会工程手法
- 伪造的"点击查看内容"按钮
- 虚假的表单提交提示
- 利用
/URI动作链接到钓鱼网站
检测示例:
bash复制pdfid.py -l file.pdf | grep -iE 'uri|launch'
6. 防御方案实施
6.1 阅读器加固建议
- Adobe Acrobat:禁用JavaScript(编辑→首选项→JavaScript)
- Foxit Reader:启用保护模式(文件→偏好设置→信任管理器)
- Chrome浏览器:更新至最新版(内置PDFium引擎)
6.2 企业级防护
部署以下技术组合:
- 沙箱检测:Cuckoo Sandbox动态分析
- 内容过滤:ClamAV+自定义PDF规则
- 策略控制:强制转换PDF/A格式
7. 应急响应措施
当检测到可疑PDF时:
- 立即隔离文件
- 使用
pdf-parser.py提取IOC:bash复制
pdf-parser.py --search javascript malicious.pdf - 检查系统进程是否存在:
powershell复制Get-Process | Where-Object { $_.Path -like "*temp*" } - 上报威胁情报平台
我曾处理过一个案例:攻击者通过PDF的/SubmitForm动作将窃取的凭据发送到远程服务器。通过分析网络流量中的POST请求特征,最终定位到了C2服务器。
8. 持续监控方案
建议建立自动化检测流水线:
- 使用PyPDF2批量扫描:
python复制from PyPDF2 import PdfReader reader = PdfReader("file.pdf") if reader.trailer.get('/Root', {}).get('/AA'): print("包含自动执行动作") - 集成YARA规则检测:
yara复制rule pdf_js { strings: $js = "/JS" nocase $openaction = "/OpenAction" condition: any of them } - 定期更新特征库(参考PDF协会安全公告)
最后分享一个实用技巧:用mutool清理可疑PDF:
bash复制mutool clean -d input.pdf output.pdf # 删除所有脚本和动作
