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:
1 parent
5dc5ec9af2
commit
9064750f33
8 files changed
+133
-5
No files matched your search
@@ -18,6 +18,16 @@ def ensure_camera_dir():
|
||||
return CAMERA_DIR
|
||||
|
||||
|
||||
def validate_filename(filename):
|
||||
"""S9(审计 2026-08-20):--filename 仅允许纯文件名——
|
||||
拒绝路径分隔符/父目录引用/绝对路径,防止经 os.path.join 逃逸 CAMERA_DIR"""
|
||||
if not filename:
|
||||
return "文件名不能为空"
|
||||
if filename in (".", "..") or "/" in filename or "\\" in filename or os.path.isabs(filename):
|
||||
return f"非法文件名(不允许路径分隔符或父目录引用): {filename}"
|
||||
return None
|
||||
|
||||
|
||||
def list_cameras(max_test=10):
|
||||
"""列出可用的摄像头设备"""
|
||||
available_cameras = []
|
||||
@@ -341,6 +351,10 @@ def main():
|
||||
ensure_camera_dir()
|
||||
|
||||
if args.filename:
|
||||
filename_error = validate_filename(args.filename)
|
||||
if filename_error:
|
||||
print(f"❌ {filename_error}")
|
||||
sys.exit(1)
|
||||
save_path = os.path.join(CAMERA_DIR, args.filename)
|
||||
else:
|
||||
timestamp = time.strftime("%Y%m%d_%H%M%S")
|
||||
|
||||
Reference in new issue
Block a user