blackjack550/vigil
GitHub: blackjack550/vigil
Vigil 是一个用 Go 编写的 FFmpeg 漏洞预检工具,在不解码视频的前提下通过解析容器头部结构和编码器 FourCC 来检测已知 CVE 风险。
Stars: 0 | Forks: 0
# Vigil
**Video Vulnerability Pre-Checker** — 静默守望,不解码、不触发、不放过。
Vigil 是一个 Go 语言编写的 FFmpeg 漏洞预检器。它在 **不解码视频内容** 的前提下,通过底层容器结构解析 + 编码器 FourCC 检测 + 已知 CVE 签名匹配,对视频文件进行安全风险评估。发现威胁后可执行 **对称清除**(剥离非必要危险结构)。
## 核心原则
| 原则 | 实现 |
|------|------|
| ❌ 不触发漏洞 | 仅 `ReadAt` 字节级探读,不调用任何解码库 |
| ❌ 不读取视频流 | 只解析容器头结构(box/atom/element 元数据),跳过 mdat/cluster |
| ✅ 安全边界 | 每次读限 16MB,总探测量限 64MB,整数溢出防护 |
| ✅ 对称清除 | 识别并移除 JUNK/UDTA/未知 boxes,不破坏可用视频数据 |
## 架构
视频文件 → 底层探测引擎 (probe) → 容器格式解析器
├─ MP4/MOV — box 树 + stsd FourCC
├─ AVI — RIFF + strf biCompression
└─ MKV — EBML + CodecID
↓
CVE 签名库 (30 条)
↓
风险评估 → 报告输出
↓
对称清除 (可选)
## 支持的 CVE 签名
共 **30 条签名**,覆盖 CVE-2020 ~ CVE-2026 全部高危/严重漏洞:
### 历史漏洞
| CVE | 严重度 | 影响范围 |
|-----|--------|----------|
| CVE-2023-49528 | High | MOV/MP4 box 大小整数回绕 → 堆溢出 |
| CVE-2022-3341 | High | 通用容器格式头部越界 |
| CVE-2021-38171 | High | trun box 负偏移 → OOB 读取 |
| CVE-2020-22015 | **Critical** | stsz sample 大小整数溢出 → 堆溢出 |
| CVE-2020-22033 | High | 索引表 chunk 偏移越界 |
### 2025-2026 最新漏洞
| CVE | 严重度 | 影响组件 | 检测方式 |
|-----|--------|----------|----------|
| CVE-2026-40962 | **Critical** | libavcodec/svtav1 | 检测 AV1 编码器 + 尺寸溢出 |
| CVE-2026-12706 | **Critical** | libavcodec/RASC | 检测 `rasc` FourCC |
| CVE-2026-8461 | **Critical** | libavcodec | 通用结构异常 → OOB 写入 |
| CVE-2026-6385 | **Critical** | 通用远程利用 | 多高风险管理累积 |
| CVE-2025-59731 | **Critical** | libavcodec/OpenEXR | 检测 EXR + DWAA 参数 |
| CVE-2025-59734 | **Critical** | libavcodec/SANM | 检测 `sanm`/`anim` FourCC |
| CVE-2025-9951 | **Critical** | libavcodec/JPEG2000 | 检测 `j2k1`/`mjp2` FourCC |
| CVE-2025-22920 | **Critical** | libavcodec | 帧缓冲区大小异常 |
| CVE-2026-30997 | High | libavcodec | 编码器参数提取异常 |
| CVE-2025-59729 | High | libavformat/DHAV | `dhav` 编码器检测 |
| CVE-2025-59730 | High | libavcodec/SANM | 帧维度异常 |
| CVE-2025-69693 | High | libavcodec/RV60 | 检测 `rv60`/`rv40` FourCC |
| CVE-2025-63757 | High | libswscale | 像素转换尺寸溢出 |
| CVE-2025-7700 | High | libavcodec/ALS | 检测 `als` 音频编码器 |
| CVE-2025-25473 | High | libavcodec | 参考帧参数异常 |
| CVE-2025-25469 | High | libavcodec | 内存分配异常 |
### 编码器自动映射(CODECDETECT)
Vigil 从容器头部提取编码器 FourCC,自动关联对应 CVE:
| 检测到的编码器 | 关联 CVE | 风险描述 |
|---------------|----------|----------|
| `rasc` / `ras` | CVE-2026-12706 | RASC UAF → **RCE** |
| `av01` / `av1` / `V_AV1` | CVE-2026-40962 | AV1/svtav1 整数溢出 |
| `sanm` / `anim` | CVE-2025-59734 | SANM UAF/OOB |
| `rv60` / `rv40` / `rv30` | CVE-2025-69693 | RealVideo OOB |
| `dhav` | CVE-2025-59729 | DHAV 整数下溢 |
| `j2k1` / `mjp2` | CVE-2025-9951 | JPEG2000 堆溢出 |
| `exr` | CVE-2025-59731 | EXR DWAA 栈溢出 → **RCE** |
| `als` / `A_ALS` | CVE-2025-7700 | ALS 音频 OOB |
| `dnx*` | CVE-2021-38114 | DNxHD 堆溢出 |
| `cfhd` | CVE-2022-3966 | CineForm OOB |
## 快速开始
# 构建
cd vigil
go build -o vigil.exe ./cmd/vigil/
# 扫描单个文件
vigil video.mp4
# 扫描目录(自动识别视频扩展名)
vigil ./videos/
# 递归扫描
vigil -r ./media/
# JSON 输出
vigil -json video.mp4
# 列出所有已知 CVE 签名
vigil signatures
# 详细模式(显示 box 树结构)
vigil -verbose video.mp4
# 对称清除预演(不实际修改文件)
vigil -dry-run video.mp4
# 执行对称清除(移除 JUNK/未知 boxes)
vigil -clean video.mp4
## 输出示例
### 干净文件
📄 Scanning: good.mp4
File: good.mp4
Size: 1.2 MB
Format: MP4
─────────────────────────────────────
✅ No anomalies detected
### 含漏洞文件
📄 Scanning: exploit.mp4
File: exploit.mp4
Size: 2.3 MB
Format: MP4
─────────────────────────────────────
🔴 Risk Score: 9.0/10 (Critical)
2 anomaly(ies) found
💀 Vulnerable Codec: RASC (Raster Animation) [CVE-2026-12706]
Detected codec 'rasc' (RASC (Raster Animation)) —
Use-after-free in RASC video decoder [CVE-2026-12706]
🔴 Negative trun data_offset [CVE-2021-38171] @0x20
trun data_offset=-1
### JSON 输出
{
"file": "video.mp4",
"format": "MP4",
"score": 9.0,
"risk": "Critical",
"safe": false,
"anomalies": 2,
"details": [
{"severity":"Critical","category":"Vulnerable Codec","cve":"CVE-2026-12706"},
{"severity":"High","category":"Negative trun data_offset","cve":"CVE-2021-38171"}
]
}
## 对称清除(对称清除)
检测到威胁后,Vigil 可以执行对称清除:
# 预演
vigil -dry-run suspicious.mp4
# 执行清除
vigil -clean suspicious.mp4
# 生成 suspicious_clean.mp4
# 自定义输出
vigil -clean -outdir ./clean_videos/ -suffix _sanitized video.mp4
清除操作:
- 移除 JUNK/FREE padding boxes(潜在隐写/漏洞载体)
- 移除未知/非标准 box 类型(潜在漏洞利用容器)
- 移除 udta/meta 元数据 box(常见攻击面)
- 保留 moov/trak/mdat 等核心结构(视频可用性)
## 开发
git clone
cd vigil
go build -o vigil.exe ./cmd/vigil/
go test ./... -v
go vet ./...
### 项目结构
vigil/
├── cmd/vigil/main.go # CLI 入口
├── internal/
│ ├── probe/probe.go # 安全文件探测引擎
│ ├── format/
│ │ ├── format.go # 格式接口 + 编码器映射
│ │ ├── mp4.go # MP4/MOV 解析器
│ │ ├── avi.go # AVI 解析器
│ │ └── mkv.go # MKV 解析器
│ ├── signatures/signatures.go # 30 条 CVE 签名
│ ├── assess/assess.go # 风险评估引擎
│ └── sanitize/sanitize.go # 对称清除模块
└── testdata/ # 测试文件
## 测试
# 单元测试
go test ./... -v
# 端到端扫描测试
vigil testdata/
## 安全声明
Vigil 的设计目标是 **不触发** 它所检测的漏洞。它通过以下方式保证安全:
1. 底层 `ReadAt` 位置读取 + 大小限制(16MB 块,64MB 总量)
2. 只解析容器结构头,不解码任何编码后的媒体流
3. 所有算术运算有整数溢出防护
4. 不对文件内容做可执行解释
## License
MIT
标签:EVTX分析, FFmpeg, Go语言, 多媒体安全, 文件解析, 文档结构分析, 日志审计, 程序破解