回应社区安全审查反馈(外部agent审查曾拒装): - 新增SECURITY.md:穷举全部出站域名/密钥边界/删除边界/子进程,供审查器逐条核验 - tts-doubao.mjs、ai-review-video.py移入scripts/cloud/,标注为可选云能力 - 外发前显式同意门:--yes或HUASHU_CLOUD_OK=1,否则打印数据流向并exit 2 - 修复:ai-review-video.py删除作者个人路径硬编码,只从skill根.env提取ARK_API_KEY单变量 - 修复:TTS endpoint强制*.bytedance.com/*.volces.com域名白名单,防.env篡改重定向 - 修复:narrate-pipeline.mjs两处execSync路径拼接改execFileSync参数数组 - 显式化:react-setup.md选项B标记仅限本地演示;hyperframes init装19个skill加预警; design-gate-hook.sh声明不会自动安装;README中英各加安全章节 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5.1 KiB
Security & Data-Flow Statement
This document exhaustively declares every network destination, credential touchpoint, subprocess, and deletion this skill can perform, so that users and automated security reviewers can verify the claims against the code.
TL;DR: the core pipeline (HTML design → render → MP4/PDF/PPTX export) runs 100% locally with zero network calls and zero API keys. All cloud-touching code is isolated in scripts/cloud/, is strictly optional, uses only keys you supply, sends data only to the corresponding vendor's official API, and refuses to run without explicit consent (--yes flag or HUASHU_CLOUD_OK=1). There is no telemetry. No data is ever sent to any server controlled by the skill author.
Complete list of network destinations
| Host | Where | What is sent | When |
|---|---|---|---|
ark.cn-beijing.volces.com (Volcengine Ark, ByteDance official API) |
scripts/cloud/ai-review-video.py |
Compressed segments of your own rendered video, for AI quality review, authenticated with your own ARK_API_KEY |
Only when you run it, and only after the consent gate |
openspeech.bytedance.com (ByteDance official TTS API) |
scripts/cloud/tts-doubao.mjs (also invoked by scripts/narrate-pipeline.mjs) |
The narration text you want synthesized, with your own key. The endpoint is validated against a hardcoded hostname allowlist (*.bytedance.com / *.volces.com) — a tampered .env cannot redirect your key or text elsewhere |
Only when you run it, and only after the consent gate |
commons.wikimedia.org (official Wikimedia API) |
scripts/fetch_images.py |
Image search keywords; downloads CC/public-domain images with license info printed for review | Only when the agent fetches stock imagery for a content design |
Brand official websites, simpleicons.org, Google favicon service |
references/brand-asset-protocol.md (instructions, no script) |
Plain GET requests to download publicly served logos/brand assets | Only when you ask for a brand-specific design |
fonts.googleapis.com, unpkg.com and similar CDNs |
Static <link>/<script> tags inside demo/output HTML |
Standard browser font/library fetches when you open a generated HTML file | Browser-side only; render scripts work offline-first |
That is the entire list. grep -rn "https://" --include="*.py" --include="*.mjs" --include="*.js" --include="*.sh" scripts/ to verify.
API keys
- No key is hardcoded anywhere; the repo ships only
.env.exampleplaceholders (.envis gitignored). - Keys are read from the skill's own root
.envor process environment — never from files elsewhere on your machine.ai-review-video.pyextracts only the singleARK_API_KEYvariable; it does not load the rest of the file into the environment. - Keys are transmitted exclusively to the corresponding vendor's official endpoint listed above, over HTTPS, as auth headers.
references/react-setup.mdoption B (pasting an Anthropic key into a demo page input) is explicitly marked local-demo-only and not recommended; the default options require no key at all.
Explicit consent gate
Both cloud scripts print exactly what will be sent to which host and exit before any network call unless you pass --yes or set HUASHU_CLOUD_OK=1. Everything else in this skill never needs the gate because it never leaves your machine.
Subprocesses
All subprocess calls invoke local media tools only: ffmpeg, ffprobe, ffplay, Playwright/Chromium for HTML rendering and screenshots. No shell-to-network combinations, no curl-pipe-sh patterns.
File deletion
Recursive deletion is limited to temp directories the scripts themselves create with unique timestamp+PID names (.video-tmp-*, .seek-tmp-*, _narration/.tmp, Python tempfile.TemporaryDirectory). No script ever deletes user data or anything outside its own scratch space.
Dependencies
Mainstream registry packages only (playwright, sharp, pptxgenjs, pdf-lib, requests), installed via standard npm/pip/uv — no binary downloads from arbitrary URLs. One documented exception to be aware of: npx hyperframes init (optional animation backend, see references/hyperframes-backend.md) installs 19 hyperframes documentation skills into ~/.claude/skills/. This is called out with a warning in the docs before the command.
Hooks
scripts/design-gate-hook.sh is never installed automatically — nothing in this skill writes to settings.json. If you manually opt in, its entire behavior is: block long-video render commands (exit 2) until a design-approval file exists. It makes no network calls, writes nothing, deletes nothing.
Proxy handling note
fetch_images.py and ai-review-video.py disable inheriting proxy environment variables (trust_env = False / clearing ALL_PROXY etc.) for their own requests. This exists to survive stale local proxy configurations that break TLS — not to evade monitoring. If you need these requests to go through your proxy, set it explicitly in the script invocation.
Reporting
Found something that contradicts this document? Please open an issue — a mismatch between this file and the code is treated as a bug.