fix(aibox/skills): Batch M 波次2 路径边界收口(S2/S3/S6/S9/S10/S11/S12/S13)

- gitclient: delete 限工作区内 .git 仓库(S2);分支名白名单防选项注入(S3)
- camera/screenshot: --filename 拒绝分隔符/绝对路径/父目录引用(S9/S10)
- facerec: person_name 白名单(兼容中文)接入 add/remove/get-info(S11)
- vision: 图片魔数白名单校验,data URL MIME 按实测类型(S12)
- sftp-transfer: listdir 条目名双向过滤防恶意服务端目录逃逸(S6)
- test-auto-appimage: exec_name 白名单防 sed 替换注入(S13)

测试 493 passed / 4 failed(既有平台环境项)/ 1 skipped,零回归
This commit is contained in:
qing committed 2026-08-20 13:11:07 +08:00
1 parent 5dc5ec9af2
commit 9064750f33
8 files changed
+133 -5

No files matched your search

+11
View File
@@ -29,6 +29,14 @@ def get_timestamp_filename(prefix="screenshot", extension="png"):
return f"{prefix}_{timestamp}.{extension}"
def validate_filename(filename):
"""S10(审计 2026-08-20):--filename 仅允许纯文件名——
拒绝路径分隔符/父目录引用/绝对路径,防止经 os.path.join 逃逸保存目录"""
if filename in (".", "..") or "/" in filename or "\\" in filename or os.path.isabs(filename):
return f"非法文件名(不允许路径分隔符或父目录引用): {filename}"
return None
def get_system():
"""获取当前操作系统"""
return platform.system()
@@ -154,6 +162,9 @@ def take_screenshot(output_dir=None, filename=None, delay=0):
os.makedirs(save_dir, exist_ok=True)
if filename:
filename_error = validate_filename(filename)
if filename_error:
return False, filename_error, None
filepath = os.path.join(save_dir, filename)
else:
filepath = os.path.join(save_dir, get_timestamp_filename())