T09 · Insecure Skill Coding Practices
- Location
scripts/deploy.sh:107- Finding
Arbitrary Command Execution Through Unvalidated Bash Array Subscripts
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a real OpenClaw team deployment helper, but its deployment script handles credentials and user-provided paths/code unsafely enough that it should be reviewed before installation.
Install only after reviewing or fixing scripts/deploy.sh. In particular, do not run it as root or against production OpenClaw credentials until identifiers are strictly validated, generated Python is data-driven rather than source-interpolated, path containment is enforced, and child agents receive scoped credentials instead of copies of the main auth profile.
scripts/deploy.sh:107Arbitrary Command Execution Through Unvalidated Bash Array Subscripts
scripts/deploy.sh:232Arbitrary Python Code Injection Through an Unquoted Generated Heredoc
scripts/deploy.sh:113Directory Traversal Through Unvalidated Team and Member Identifiers
scripts/deploy.sh:193Main-Agent Authentication Profiles Are Replicated to Every Generated Agent
The skill advertises interactive deployment, presets, custom team creation, and hybrid mode, but the analyzed behavior reportedly only reads local configuration and invokes openclaw CLI checks for audit/verification. This mismatch can mislead users into granting trust or running commands under false assumptions, which is a security-relevant integrity issue because operators may execute a skill believing it performs safe deployment logic when it actually inspects local state and performs validation actions.
The skill documentation is entirely in Chinese and the interactive examples explicitly require Chinese input such as '团队名称 (中文,如 代码开发团队)'. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is clearly documented and justified, which is not present here.
Without declared permissions the skill's intent is opaque and cannot be validated.
The manifest description forces a specific language/locale presentation for users by providing the core skill summary only in Chinese. The file does not indicate that the skill is region-specific or that users may choose another language, which conflicts with the language/locale policy criteria.
The operational instructions, usage guidance, and warnings are all written in Chinese, effectively imposing a language requirement on users. There is no opt-in, alternative language, or documented reason that the skill must be Chinese-only.
The manifest and script banner emphasize support for 自定义团队结构, and earlier code collects custom team/member input. However, the Python generator does not parse or use TEAM_MEMBERS; it explicitly comments '简化处理,使用预设' and builds agent lists from hardcoded presets or ['member1', 'member2'], so the actual deployed config snippet does not reflect the user's custom structure.
The --preset path immediately backs up configuration, creates directories under /root/.openclaw, and copies authentication-related files without prompting the user or printing a clear warning before making those changes. Although the interactive path has a confirmation for preset selection, that disclosure does not apply when the script is run directly with --preset.
The script's comments and all user-visible status messages are in Chinese, including the banner and validation results. This imposes a specific language on users without opt-in or documented locale justification, which matches the language/locale policy violation category.
The package description is written only in Chinese ("交互式部署多 Agent 团队协作架构,支持自定义团队结构") with no indication that users can choose another language or that the skill is intended exclusively for a Chinese-language audience. This creates a natural-language locale constraint in metadata that may violate language-choice policy for general-purpose skills.
Comments and all interactive prompts are written in Chinese, and the script does not provide any option to select another language or indicate that it is intended only for a Chinese-speaking environment. This creates a natural-language locale constraint without user opt-in.
The comment '# 读取团队成员' suggests the generator will consume the collected team member configuration. In practice, the next line notes '简化处理,使用预设', and the loop uses presets.get(...) rather than parsed TEAM_MEMBERS, which contradicts the stated intent of that section.