T01 · Skill Instruction Hijacking
- Location
guidance/system-prompt.md:11- Finding
Agent Role and Instruction Hijacking Through VM Enforcement
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a powerful workflow runner, but its artifacts allow untrusted programs to spawn agents, fetch remote workflows, write persistent state, and expose database credentials with weak controls.
Install only if you are comfortable treating `.prose` files like executable workflows. Avoid running remote or untrusted programs, do not use production credentials or databases, keep PostgreSQL disabled unless you can isolate it securely, and inspect any workflow that requests persistence, shell/network access, or writes outside the current project.
guidance/system-prompt.md:11Agent Role and Instruction Hijacking Through VM Enforcement
SKILL.md:69Arbitrary Remote Workflow Retrieval and Execution
compiler.md:795Declared Agent Permissions Are Not Enforced During Subagent Spawning
state/postgres.md:64PostgreSQL Credentials Are Disclosed to Subagents and Logs
state/postgres.md:139Quick Setup Exposes an Unauthenticated PostgreSQL Service
state/sqlite.md:312Agent-Controlled Values Are Embedded Directly Into Shell-Executed SQL
prose.md:441Untrusted Programs Can Create Cross-Project Persistent Agent Memory
Referenced artifact was not completely inspected
ailed system description, they don't just describe it, they _simulate_ it. The `prose.md` specification describes a virtual machine with enough fidelity that a
Referenced artifact was not completely inspected
ailed system description, they don't just describe it, they _simulate_ it. The `prose.md` specification describes a virtual machine with enough fidelity that a
Referenced artifact was not completely inspected
ailed system description, they don't just describe it, they _simulate_ it. The `prose.md` specification describes a virtual machine with enough fidelity that a
Referenced artifact was not completely inspected
ailed system description, they don't just describe it, they _simulate_ it. The `prose.md` specification describes a virtual machine with enough fidelity that a
Referenced artifact was not completely inspected
ailed system description, they don't just describe it, they _simulate_ it. The `prose.md` specification describes a virtual machine with enough fidelity that a
Referenced artifact was not completely inspected
ailed system description, they don't just describe it, they _simulate_ it. The `prose.md` specification describes a virtual machine with enough fidelity that a
Referenced artifact was not completely inspected
ailed system description, they don't just describe it, they _simulate_ it. The `prose.md` specification describes a virtual machine with enough fidelity that a
Referenced artifact was not completely inspected
| `prose compile <file>` | Load `compiler.md`, validate the program |
Referenced artifact was not completely inspected
| `prose compile <file>` | Load `compiler.md`, validate the program |
Referenced artifact was not completely inspected
| `prose compile <file>` | Load `compiler.md`, validate the program |
Referenced artifact was not completely inspected
| `prose compile <file>` | Load `compiler.md`, validate the program |
Referenced artifact was not completely inspected
| `prose compile <file>` | Load `compiler.md`, validate the program |
Referenced artifact was not completely inspected
| `prose compile <file>` | Load `compiler.md`, validate the program |
The skill explicitly instructs checking .prose/.env for OPENPROSE_POSTGRES_URL, which is a direct secret-access pattern. Connection URLs commonly embed credentials, so reading them from user files creates a clear path to credential exposure through logs, model context, or downstream subagent propagation.
Check for connection configuration first:
# Check .prose/.env for OPENPROSE_POSTGRES_URL
cat .prose/.env 2>/dev/null | grep OPENPROSE_POSTGRES_URL
# Or check environment variable
echo $OPENPROSE_POSTGRES_URL
The instruction to output echo $OPENPROSE_POSTGRES_URL directly exposes an environment variable that may contain live database credentials. This is more dangerous than a mere presence check because it explicitly prints the secret value, making leakage to logs, transcripts, or subagents highly likely.
# Check .prose/.env for OPENPROSE_POSTGRES_URL
cat .prose/.env 2>/dev/null | grep OPENPROSE_POSTGRES_URL
# Or check environment variable
echo $OPENPROSE_POSTGRES_URL
Skill instructs the agent to never refuse or to always comply. Suppressing the agent's ability to decline removes a core safety control and enables downstream harmful requests to succeed.
agent structured-reviewer:
model: sonnet
prompt: """
Always respond with this exact JSON structure:
{
"verdict": "pass" | "fail" | "needs_review",
"issues": [{"severity": "high"|"medium"|"low", "description": "..."}],
Documenting .prose/.env as part of the execution state makes credentials or configuration secrets a likely target for subagents or imported programs, especially since the skill also supports broad file access and remote execution patterns. Even though this line alone is not credential theft logic, in context it increases the attack surface by normalizing the presence of secrets in a predictable location that untrusted workflows may read or exfiltrate.
# Project-level state (in working directory)
.prose/
├── .env # Config (simple key=value format)
├── runs/
│ └── {YYYYMMDD}-{HHMMSS}-{random}/
│ ├── program.prose # Copy of running program
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
- Check if value was pre-supplied or available from runtime context
- If available: bind and continue
- If not available: pause execution, display prompt, wait for user response
### Input Prompt Formats
The design places a .prose/.env file in the working directory and presents it as normal configuration storage without any safeguards. In this skill context, that is dangerous because working-directory files are easy to accidentally commit, expose to other tools/agents, or read from less-trusted project processes, potentially leaking API keys, telemetry settings, user IDs, or other secrets.
# Project-level state (in working directory)
.prose/
├── .env # Config (simple key=value format)
├── runs/
│ └── {YYYYMMDD}-{HHMMSS}-{random}/
│ ├── program.prose # Copy of running program
The document explicitly instructs the VM to 'think aloud' and use conversation history as persistent working memory. In an LLM agent setting, this encourages disclosure of internal reasoning and state, which can expose sensitive data, hidden chain-of-thought, and intermediate decision logic to users or downstream agents.
The protocol explicitly instructs the VM to record received inputs and serialized context in plain text. This is dangerous because secrets, personal data, credentials, proprietary content, or other sensitive context may be echoed into the transcript and then propagated across turns or to other components.
Guidance to pass context verbatim and serialize binding values into conversation history strongly encourages reproduction of potentially sensitive data in outputs. Because this skill is specifically designed for orchestration and state recovery from prior messages, the disclosure risk is amplified: once exposed in history, the data becomes part of the model's future working set.
The document explicitly tells users to treat exposed database credentials as non-sensitive because they are visible to subagents. That normalizes credential exposure and can lead to credential leakage through logs, prompts, transcripts, or downstream tools; if those credentials reach anything beyond a tightly isolated database, unauthorized access and data tampering become likely.
The recommended Docker example enables POSTGRES_HOST_AUTH_METHOD=trust and publishes port 5432, which creates an unauthenticated database service reachable from the host network. In common developer setups this can allow any local or adjacent process to connect without a password, leading to full read/write compromise of workflow state and potentially arbitrary SQL operations.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
mkdir -p .prose
echo "OPENPROSE_POSTGRES_URL=postgresql://postgres@localhost:5432/prose" > .prose/.env
Management commands:
No suspicious patterns detected.