T09 · Insecure Skill Coding Practices
- Location
scripts/plusultra.py:261- Finding
Blocked Commands May Be Persisted in a Plaintext Audit Log
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears purpose-built rather than deceptive, but its optional Claude Code hook broadly intercepts agent events and can persist command text in local logs.
Review carefully before enabling the Claude Code hooks. Prefer manual or pinned installation, understand that the hook can see broad agent events, and avoid putting secrets in commands because blocked command text may be retained in ~/.plus-ultra/audit.jsonl. This does not show exfiltration or destructive hidden behavior, but the logging and broad hook scope warrant Review.
scripts/plusultra.py:261Blocked Commands May Be Persisted in a Plaintext Audit Log
README.md:67Installation Documentation Uses an Unpinned npx-Resolved Tool
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.
4. In a disposable test session, verify that an unplanned recognized mutation is blocked and
that a changed turn requests a fresh reality verdict before completion.
The doctor checks for hook entries in `~/.claude/settings.json`; it does not prove the executable
is reachable, hooks are delivered, or enforcement works end to end.
### Record the actual verdicts
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
return "Bash"
# MUTATING_BASH is tested BEFORE the allowlist and searches the WHOLE command.
# SAFE_BASH is `^`-anchored, so consulting it first exempted everything chained
# after a harmless verb — `ls; rm -rf x` and `pwd && git push` both walked straight
# through the gate. The allowlist may now only exempt a command that contains no
# mutating segment anywhere.
if MUTATING_BASH.search(cmd):
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
The skill references shell commands, environment variables, and file writes (for example, recording to ~/.plus-ultra/audit.jsonl and invoking plusultra CLI commands) but does not declare any explicit tool scope or permissions boundary. In hosts that honor tool declarations, this can cause the skill to run with broader-than-expected capabilities or leave reviewers unable to assess whether command execution and filesystem access are intended, increasing the risk of accidental or unsafe mutation.
This JSON manifest uses the matcher value "*" for UserPromptSubmit, which is an extremely broad activation condition with no stated constraints or exclusions. Because the file provides no negative examples or scope limits, the hook may fire for essentially any matching prompt event, which fits the vague-trigger category for manifest files.
Hooking all PreToolUse events with a wildcard means every attempted tool invocation is intercepted by an external command. In this skill context, that increases the attack surface significantly because sensitive tool operations may be delayed, influenced, logged, or blocked by the hook process, and PreToolUse is especially security-relevant due to its position before consequential actions.
The Stop hook also uses matcher "*", which provides no meaningful limitation on trigger scope. This is an ambiguous, overbroad activation condition in a manifest file and increases the risk of unintended hook execution.
This code creates the OFF_FLAG file with open(OFF_FLAG, "w").close(), which is a filesystem write. Although the module and surrounding messages discuss bypass behavior, this specific file write has no inline comment or user disclosure before it occurs, which fits the code-file warning criterion for file writes lacking local disclosure.
Detected: suspicious.dynamic_code_execution