T09 · Insecure Skill Coding Practices
- Location
scripts/build_paper_deep_reading_bundle.py:292- Finding
Archive generation follows symlinks and can disclose files outside the workspace
- Content
View full analysis
dict[str, object]: errors = validate_workspace_dir(workspace_dir) output_zip.parent.mkdir(parents=True, exist_ok=True) with zipfile.ZipFile(output_zip, "w", compression=zipfile.ZIP_DEFLATED) as zf: for path in sorted(workspace_dir.rglob("*")): if path.is_dir(): continue zf.write(path, arcname=path.relative_to(workspace_dir).as_posix()) ``` `scripts/init_paper_deep_reading_scaffold.py:950-956`: ```python def build_zip(workspace_dir: Path, output_zip: Path) -> None: output_zip.parent.mkdir(parents=True, exist_ok=True) with zipfile.ZipFile(output_zip, "w", compression=zipfile.ZIP_DEFLATED) as zf: for path in sorted(workspace_dir.rglob("*")): if path.is_dir(): continue zf.write(path, arcname=path.relative_to(workspace_dir).as_posix()) ``` `scripts/package_clawhub_skill.py:29-37`: ```python with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf: for path in skill_dir.rglob("*"): rel = path.relative_to(skill_dir.parent) if any(part in ignore for part in rel.parts): continue if path.suffix.lower() in {".zip", ".pdf", ".png", ".jpg", ".jpeg", ".webp", ".gif", ".pptx", ".docx", ".xlsx"}: continue if path.is_file(): zf.write(path, rel.as_posix()) ``` ### Technical Analysis The archive builders recursively enumerate workspace entries and pass each file directly to `ZipFile.write()`. They do not reject symbolic links and do ...[truncated 1723 chars]- Remediation
View remediation
