# Patch Tuesday 工作流 每月第二个周二 (Pacific Time) 微软发布安全更新,俗称 Patch Tuesday。这是 N-day 研究最稳定的输入源:补丁数量大、价值高、披露口径统一。本文档给出从订阅公告到拿到可对比二进制的完整流程。 --- ## 1. 信息源订阅 | 来源 | 用途 | 备注 | |------|------|------| | MSRC Security Update Guide | 当月所有 CVE 列表 + CVSS + 受影响产品 | https://msrc.microsoft.com/update-guide/ 有 API | | MSRC CVRF API | 程序化拉当月 CVE JSON | `https://api.msrc.microsoft.com/cvrf/v3.0/cvrf/{YEAR}-{Mon}` | | Microsoft Update Catalog | 下 MSU/MSP 实物 | https://www.catalog.update.microsoft.com/ | | Patch Tuesday Dashboard (Tenable / Trend / Rapid7) | 第三方汇总优先级 | 看哪些标了 "exploited in the wild" | | ZDI advisories | ZDI 提交的 CVE 详细描述 | 经常有比 MSRC 更详细的 root cause hint | | Project Zero 周期性 issue tracker | 半年后会公开细节 | 可作为历史对照 | ### 拉当月 CVE 列表 (PowerShell) ```powershell $year = '2026'; $mon = 'May' $url = "https://api.msrc.microsoft.com/cvrf/v3.0/cvrf/$year-$mon" Invoke-RestMethod $url | ConvertTo-Json -Depth 10 | Out-File "C:\patches\msrc-$year-$mon.json" -Encoding utf8 ``` --- ## 2. 锁定高价值补丁 按以下顺序过滤当月公告: 1. **CVSS >= 7.0** 2. **Exploitation: Exploitation Detected / More Likely** 3. **组件白名单**(高价值攻击面): - `Windows Kernel` (ntoskrnl.exe) - `Win32k` (win32k.sys, win32kfull.sys, win32kbase.sys) - `Ancillary Function Driver for WinSock` (afd.sys) — 历史 LPE 大户 - `Common Log File System` (clfs.sys) — 过去三年多次被野利用 - `Print Spooler` (spoolsv.exe, win32spl.dll) - `Cloud Files Mini Filter Driver` (cldflt.sys) - `NTFS` (ntfs.sys) - `Hyper-V` (vmswitch.sys, hvix64.exe, hvax64.exe) - `Cryptography Services` / `NTLM` / `Kerberos` - `RDP` (rdpcorets.dll, rdpbase.dll) 4. **本地提权 (EoP) > RCE > Info Disclosure** — EoP 武器化门槛最低 5. **是否有 KB 直接对应** — 没有 KB 号的(例如纯 Defender 定义更新)跳过 --- ## 3. 下载 patched / unpatched 二进制 ### 3.1 Microsoft Update Catalog 手动下 ```text 1. 访问 https://www.catalog.update.microsoft.com/Search.aspx?q=KB5052000 2. 按 Products 过滤 (Windows 11, Server 2022 等) 3. 选目标架构 (x64 / arm64),下载 .msu 4. 同时下 N-1 版本 (上个月的 KB 号) 作为 unpatched 基线 ``` ### 3.2 程序化批量下 ```powershell # msdownload 第三方脚本 git clone https://github.com/JaschaUrbach/msu-downloader.git python msu-downloader.py --kb KB5052000 --arch x64 --out C:\patches\ ``` ### 3.3 wsuspect-proxy 拦截真实流量取最新补丁 适用于:MSRC 还没在 Catalog 上架,但已通过 WU 推送给客户端的早期窗口。 ```bash git clone https://github.com/ctxis/wsuspect-proxy.git cd wsuspect-proxy # 在被测机器上手工设 WSUS = http://attacker:8530,触发 wuauclt /detectnow python wsuspect-proxy.py --listen 0.0.0.0:8530 --dump-cabs C:\patches\dump\ ``` ### 3.4 Delta 包 vs Cumulative 包 - 微软现在主推 `.msu` cumulative update — 体积大但完整 - 也有 `.msu` Express / Delta 包 — 体积小但只含差异,对差分研究不友好 - 优先下 cumulative --- ## 4. 解包 MSU / CAB / MSP ### 4.1 MSU 解包(Windows) ```powershell # Step 1: MSU 是 cab 套娃,先解外层 expand.exe Windows-KB5052000-x64.msu -F:* C:\patches\out\ # Step 2: 解里面的 .cab expand.exe C:\patches\out\Windows-KB5052000-x64.cab -F:* C:\patches\out\ # Step 3: 关键文件在 amd64_microsoft-windows-{component}_*\ 下 # 例如 ntoskrnl.exe 在: # C:\patches\out\amd64_microsoft-windows-os-kernel_*\ntoskrnl.exe ``` ### 4.2 用 dism 装到离线镜像(拿干净的 patched 二进制) ```powershell # 挂载离线 WIM dism /mount-image /imagefile:install.wim /index:1 /mountdir:C:\mnt # 应用补丁 dism /image:C:\mnt /add-package /packagepath:Windows-KB5052000-x64.msu # 提取目标二进制 copy C:\mnt\Windows\System32\ntoskrnl.exe C:\patches\patched\ # 卸载 dism /unmount-image /mountdir:C:\mnt /commit ``` ### 4.3 MSP (Office 等) 解包 ```powershell # MSP 是 Windows Installer Patch msiexec /a base.msi /p update.msp TARGETDIR=C:\patches\office_patched # 或用 lessmsi (推荐, 不动注册表) lessmsi x update.msp C:\patches\office_msp\ ``` ### 4.4 用第三方工具一站式拆包 ```powershell # PatchExtract by Greg Linares - 一条命令解多层 .\PatchExtract.ps1 -PatchFile Windows-KB5052000-x64.msu -ExtractedFolder C:\patches\extracted\ ``` --- ## 5. 取符号 (PDB) ```powershell # Windows SDK 自带 symchk symchk /v /r C:\patches\patched\ntoskrnl.exe /s SRV*C:\sym*https://msdl.microsoft.com/download/symbols symchk /v /r C:\patches\unpatched\ntoskrnl.exe /s SRV*C:\sym*https://msdl.microsoft.com/download/symbols ``` 注意:微软偶尔会延迟或下架某个版本 PDB。如果当前下不到 N-1 的 PDB,用 `binary-diff` skill 把 N-2 的 PDB 符号迁移到 N-1。 --- ## 6. Windows 高价值二进制路径速查 | 文件 | 路径 | 关注组件 | |------|------|---------| | ntoskrnl.exe | System32\ | 内核核心、对象管理、Ob*、Ps*、Mm*、Io* | | win32k.sys | System32\ | GUI 子系统入口 | | win32kfull.sys | System32\ | GUI 完整版(桌面会话) | | win32kbase.sys | System32\ | GUI 基础库 | | afd.sys | System32\drivers\ | WinSock AFD,LPE 高发 | | clfs.sys | System32\drivers\ | CLFS,0-day 高发 | | cldflt.sys | System32\drivers\ | Cloud Files mini filter | | spoolsv.exe | System32\ | Print Spooler | | dwm.exe | System32\ | Desktop Window Manager | | lsass.exe | System32\ | LSA 认证 | | ntdll.dll | System32\ | syscall stub、PE loader | | ksecdd.sys | System32\drivers\ | Kernel security driver | --- ## 7. Linux 等价流程 ### 7.1 信息源 | 来源 | 适用 | |------|------| | Ubuntu USN | https://ubuntu.com/security/notices | | Red Hat RHSA | https://access.redhat.com/security/security-updates/ | | Debian DSA | https://www.debian.org/security/ | | CentOS / Rocky / Alma announce list | 通常 mirror Red Hat | | upstream kernel CVE list | https://cve.kernel.org/ | ### 7.2 拉补丁包 ```bash # Debian/Ubuntu apt download linux-image-5.15.0-101-generic apt download linux-image-5.15.0-100-generic apt download linux-image-unsigned-5.15.0-101-generic-dbgsym # CentOS/Rocky dnf download --downloadonly --downloaddir=./patched kernel-5.14.0-362.18.1.el9_3 dnf download --downloadonly --downloaddir=./unpatched kernel-5.14.0-362.13.1.el9_3 ``` ### 7.3 解包 ```bash # .deb dpkg-deb -x linux-image-5.15.0-101-generic_*.deb ./patched/ # .rpm rpm2cpio kernel-5.14.0-362.18.1.el9_3.x86_64.rpm | cpio -idmv -D ./patched/ ``` ### 7.4 从 vmlinuz 还原 vmlinux ```bash # 用内核自带 scripts/extract-vmlinux wget https://raw.githubusercontent.com/torvalds/linux/master/scripts/extract-vmlinux chmod +x extract-vmlinux ./extract-vmlinux ./patched/boot/vmlinuz-5.15.0-101-generic > vmlinux_5.15.0-101 ./extract-vmlinux ./unpatched/boot/vmlinuz-5.15.0-100-generic > vmlinux_5.15.0-100 ``` ### 7.5 关注子系统路径 | 子系统 | 历史 N-day 高发函数前缀 | |--------|----------------------| | net/ | `__skb_*`、`sk_*`、`tcp_*`、`udp_*`、`nf_*` | | fs/ | `do_*`、`vfs_*`、`__lookup_*` | | io_uring/ | 整个子系统(近三年漏洞王) | | netfilter/ | `nft_*`、`nf_tables_*` | | net/sched/ | tc 各 qdisc | | drivers/net/ | 各 NIC 驱动 | | bpf/ | verifier 类 | --- ## 8. 真实公开 CVE 案例参考 | CVE | 组件 | 类型 | 用于练手原因 | |------|------|------|------------| | CVE-2025-62215 | Windows Kernel | race condition + double free | 2025-11 公开,公告说"race + double free",差分入门题 | | CVE-2023-28252 | CLFS | OOB write → LPE | 野外利用,PoC 已公开,可对照学习方法 | | CVE-2022-37969 | CLFS | type confusion → LPE | 同样有公开分析 | | CVE-2021-40449 | Win32k | UAF → LPE | 公开报告完整 | | CVE-2022-21882 | Win32k | type confusion,由 CVE-2021-1732 不完整修复变出 | 经典"一鱼多吃"案例 | 练习建议:拿一个已经有公开分析的 CVE,按本流程独立差出来一次,再对照公开 writeup 校准方法论。 --- ## 9. 速查清单 - [ ] MSRC 月度公告已读,筛出 CVSS≥7 且组件在白名单内的 CVE - [ ] 从 Catalog 下到 unpatched (N-1) 和 patched (N) 的 MSU - [ ] 用 expand / dism 取出目标 .exe / .sys / .dll - [ ] symchk 把 PDB 都吃到(吃不到走 binary-diff 迁移) - [ ] 用 BinaryNinja / IDA / Ghidra 各开两个工程 - [ ] 跑 BinDiff / ghidriff,导出 diff 报告 - [ ] 按相似度过滤函数,进 `references/root-cause-and-poc.md` 反推根因 - [ ] 写 PoC,验证 unpatched 崩、patched 不崩 - [ ] 回写 field-journal 记录复用经验