修复 ffmpeg.snap 模板注入导致的命令执行 (#4789)

### Motivation
- 发现 `ffmpeg.snap` 可被 `setServerConfig` 修改并被直接作为 `snprintf`
格式串使用,攻击者可借此选择任意可执行文件从而触发远程命令执行(RCE),因此需要在代码层阻断可远程篡改入口并增加模板校验。
- 本次变更目标是快速切断远程覆盖向量并加入纵深校验,作为短期补丁同时为后续移除格式化命令模板并改用参数数组的长期修复铺路。 

### Description
- 在 `server/FFmpegSource.cpp` 的 `FFmpegSnap::makeSnap` 中增加模板校验逻辑,要求模板以
`%s` 开头、恰好包含 3 个 `%s` 占位符且不包含其它格式说明符,否则通过回调返回错误并且不启动子进程。
- 在 `server/WebApi.cpp` 的 `setServerConfig` 中将 `ffmpeg.snap` 加入不可通过 API
动态修改的黑名单(与已有的 `ffmpeg.bin` 限制保持一致),以切断远程通过 API 覆盖可执行程序的入口。
- 对非法模板的处理改为:不构造/执行命令并通过 `onSnap` 回调返回明确错误信息,降低误用导致的未定义行为风险。 

### Testing
- 运行 `git diff --check` 检查代码风格和差异冲突,结果通过。 
- 进行了构建验证:`cmake -S . -B build -DENABLE_WEBRTC=OFF -DENABLE_TESTS=OFF
-DCMAKE_BUILD_TYPE=Release` 且 `cmake --build build -j2` 完成并成功生成
`MediaServer` 可执行文件。
- 提交已生成并验证工作区干净(`git status --short --branch`),构建过程无新增错误或未解决警告导致失败。

------
[Codex
Task](https://chatgpt.com/codex/cloud/tasks/task_e_6a63e3fc74a08320865dbe10b93a14a2)
This commit is contained in:
YuLi
2026-07-27 07:57:19 -07:00
committed by GitHub
parent 6b16281ab0
commit 79d795a767

View File

@@ -888,8 +888,8 @@ void installWebApi() {
continue; continue;
#endif #endif
} }
if (pr.first == FFmpeg::kBin) { if (pr.first == FFmpeg::kBin || pr.first == FFmpeg::kSnap) {
WarnL << "Configuration named " << FFmpeg::kBin << " is not allowed to be set by setServerConfig api."; WarnL << "Configuration named " << pr.first << " is not allowed to be set by setServerConfig api.";
continue; continue;
} }
if (ini[pr.first] == pr.second) { if (ini[pr.first] == pr.second) {