fix: 渲染引擎全链路安全加固 P0+P1 #317
Reference in New Issue
Block a user
Delete Branch "fix/render-engine-security-p0-p1"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
fix: 渲染引擎全链路安全加固 P0+P1
🔍 安全复审结果:⚠️ 有条件通过
总体评价
PR在安全基础设施建设方面质量不错:
但 SSRF防护的接入点遗漏严重,特别是原审计报告P0-1明确指出的3个TTS下载点一个都没修,等于P0级问题实质上没解决。
🔴 必须修复(合并前)
1. TTS 3个下载点全部未接入SSRF防护(P0)
原审计报告P0-1明确指出的位置,一个都没修:
packages/application/tts_job/workflow.py:100—_transfer_audio_to_oss()httpx.getpackages/application/tts_job/workflow.py:467— 分段合成音频下载 httpx.getpackages/application/tts_job/streaming_service.py:228—_download_audio()httpx.get都使用
follow_redirects=True,无任何SSRF校验。2. BGM下载点未接入SSRF防护(P0/P1)
apps/worker/worker_app/tasks/generation.py:370— BGM外部直链urlretrieveapps/worker/worker_app/tasks/generation.py:407— BGM预设库urlretrieveapps/worker/worker_app/tasks/batch_download.py:112— 批量下载HTTP回退urlretrieve3. 重定向防护缺失(P0)
url_security.py只校验初始URL,不校验重定向目标。所有follow_redirects=True或默认跟随重定向的下载点,都可能被302跳转到内网IP绕过SSRF。建议:封装
safe_download()函数,每步重定向都重新校验URL。🟡 建议修复
4. 裸subprocess只修了3/8处(P1-1)
还剩:
asset_analyzer.py(3处)、ingest.py(1处)、voice_extraction.py(1处)、audio_merger.py(1处)5. 下载文件大小限制未实现(P1-3)
所有外部URL下载都没有大小上限,可能耗尽磁盘空间。
✅ 做得好的地方
path_security.py用Path.resolve() + relative_to()规范化校验,所有接入点(resolve_asset_path / PiP / 贴纸)都加固了📋 建议:补充核心下载点的SSRF防护和重定向防护后再合并。
完整复审报告已上传。
🔍 二轮复审结果:❌ 不通过
针对一轮复审提出的四大重点问题进行了逐一验证,结果如下:
📊 总体情况
核心P0问题全部未修复,较一轮无实质进展。
1️⃣ SSRF漏接点(6处全部未修)
tts_job/workflow.py:100_transfer_audio_to_oss()tts_job/workflow.py:467tts_job/streaming_service.py:228_download_audio()generation.py:370generation.py:407batch_download.py:112🆕 新增问题:
batch_download.py是本轮PR新增文件,其中_download_video_to_file()的 HTTP 回退下载也无 SSRF 校验。2️⃣ 重定向防护(完全未实现)
httpx.get全部follow_redirects=Trueurlretrieve默认跟随重定向url_security.py无重定向防护函数3️⃣ 裸subprocess(5处全部未修)
一轮指出的 5 处裸调用全部未动:
asset_analyzer.py3处(ffprobe/ffmpeg)ingest.py1处(ffprobe)voice_extraction.py1处(ffmpeg)✅ 已修的 3 处(compose_video、edit_plan_generation、unified_render_service)保持完好。
4️⃣ 下载大小/类型限制(完全未实现)
resp.content全量加载(OOM风险)✅ 保持完好的部分
path_security.py路径遍历防护 ✅(30/30 测试通过)url_security.pySSRF框架 ✅(26/26 测试通过)🔴 合并前必须修复(P0级)
validate_url_safetyvalidate_url_safetyvalidate_url_safetyfollow_redirects或封装安全下载函数结论:P0 问题全部未修复,不建议合并。请补修后重新提交复审。
🔒 三轮安全复审结论 ⚠️ 有条件通过
验证 commit:
2f03e139复审范围: 四大重点(6处SSRF / 重定向防护 / 5处裸subprocess / 下载大小类型限制)
📊 修复率总览
✅ 已修复的核心问题
1. SSRF防护(6/6)
workflow.py2处 +streaming_service.py1处)→ 全部接入safe_download_bytes/safe_download_filesafe_download_filebatch_download.pyHTTP回退下载 → 接入safe_download_file+ 视频MIME白名单2. 重定向防护
NoRedirectHandler禁用自动重定向 + 手动跟随 + 每跳重新校验URL + 5次上限safe_download_file/safe_download_bytes中3. 裸subprocess统一(5/5 worker侧)
asset_analyzer.py3处 →run_ffprobe/run_ffmpegingest.py1处 →run_ffprobevoice_extraction.py1处 →run_ffmpegrun_ffmpeg/run_ffprobe本身安全:列表参数 + 无shell + 超时 + 统一日志4. 下载大小/类型限制
⚠️ 遗留问题
P1(1个)
packages/application/tts_job/audio_merger.py:75— 仍为裸subprocess.run。列表参数无注入风险,但未接入统一run_ffmpeg。可能因 packages 层无法引用 worker 模块,建议后续将ffmpeg_utils下沉到packages/shared/。P2(2个)
_verify_url_accessible()HEAD请求默认跟随重定向,重定向目标未重新校验(仅HEAD,风险低)🏗️ 架构亮点
url_security.py已迁移至packages/shared/作为单一来源,worker端为薄兼容层 ✅🎯 合并建议
✅ 建议有条件合并。 P0级问题全部清零,核心风险已解除。遗留P1/P2风险较低,可在后续迭代中完善。
三轮复审完成,详细报告见附件
approved