v0.0.7 以攻击视角重新审计 F1–F10 落地代码,发现并修复 4 处报告未覆盖或 F4 漏网的漏洞。
安全修复
F11 残留/目录删除防 junction 跟随(高危)
deleteResidualFiles / deleteDirectory 原先使用 fs::remove_all,而 isProtectedPath 只比对字符串路径。若残留目录是 junction/符号链接,指向 C:\Windows\System32 等系统目录,remove_all 会跟随 junction 进入目标目录递归删除,造成灾难性误删。
修复:删除前用 fs::weakly_canonical 解析真实路径并重查 isProtectedPath;新增 isReparsePoint() 基于 GetFileAttributesW(FILE_ATTRIBUTE_REPARSE_POINT) 判定重解析点,仅 fs::remove 删除链接本体,绝不进入目标目录递归。
F12 安装器自解压路径穿越(中危)
自解压安装器原先 dest = target + "\\" + fe.rel,未校验 ..、绝对路径或 UNC。恶意或破损负载可把文件写出安装目录之外(如 C:\Windows\System32)。
修复:dest 经 GetFullPathNameW 解析后,严格校验落点必须位于 target\ 之内,越界文件跳过不写。
F13 MSI 卸载走完整路径(中危)
MSI 卸载原先调用裸 msiexec.exe。便携目录用户可写,可被植入同名恶意 msiexec.exe 劫持(F4 漏网项)。
修复:改为 System32\msiexec.exe 完整路径。
F14 自卸载防 junction 跟随(中危)
自卸载原先使用 PowerShell Remove-Item -Recurse -Force,会跟随 junction 删除系统目录,与 F11 同源。
修复:改用 cmd /c rmdir /s /q(不遍历 junction),PowerShell/cmd 均走 System32 完整路径。
验证
- 主程序
cmake --build重编registry.cpp+mainwindow.cpp+appicon.rc→ EXIT 0。 uninst.cpp/installer_base.exe重新编译链接 → EXIT 0。- 便携 zip 重建,内置
uninstaller.exe校验为 v0.0.7。
下载
- GitHub Release:卸载管理器 v0.0.7 (试用版)
- 项目仓库:Cai-zhi-huang/uninstaller-portable