3 issues
Medium
Path traversal prevention example can be bypassed with sibling directory names - `.agents/skills/security-review/references/file-security.md:38`
The safe_join function example uses str(target).startswith(str(base)) to verify the resolved path is under the base directory. This check is flawed: if base is /uploads and an attacker crafts a path resolving to /uploads_malicious/file, the startswith check passes because /uploads_malicious.startswith(/uploads) is True. Developers copying this security guidance may inadvertently introduce path traversal vulnerabilities.
Also found at:
.agents/skills/security-review/references/modern-threats.md:373.agents/skills/security-review/references/modern-threats.md:334
Bash tool granted without clear justification in skill instructions - `.agents/skills/security-review/SKILL.md:4`
The skill grants Bash tool access but has no scripts directory and the SKILL.md instructions don't reference any CLI tools, linters, shell commands, or scripts that would require Bash execution. This violates the least privilege principle. Per permission-analysis.md, Bash is justified when 'Running bundled scripts, git/gh CLI, build tools' but unjustified when there are 'No scripts or CLI commands in instructions'.
Also found at:
warden.toml:54
Low
Task tool granted without clear delegation pattern in instructions - `.agents/skills/security-review/SKILL.md:4`
The skill grants Task tool access, which allows spawning subagents, but the SKILL.md instructions don't describe any parallel work delegation or subagent usage patterns. While this may be intended for complex multi-file security reviews, the instructions don't explicitly justify this tool. Per permission-analysis.md, Task is justified for 'parallel work delegation' but the skill could potentially operate sequentially without it.
4 skills analyzed
| Skill | Findings | Duration | Cost |
|---|---|---|---|
| code-review | 0 | 87.2s | $1.94 |
| find-bugs | 1 | 410.6s | $2.53 |
| skill-scanner | 2 | 309.2s | $5.49 |
| security-review | 0 | 472.4s | $1.45 |
Duration: 1279.4s · Tokens: 5.1M in / 62.5k out · Cost: $11.42 (+extraction: $0.00, +merge: $0.00, +dedup: $0.00)