T05 · Unauthorized Access and Privilege Escalation
- Location
SKILL.md:59- Finding
Monitoring Skill Exposes an Unauthenticated State-Changing Decision API
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This monitoring skill is mostly understandable, but it contradicts its read-only claims by documenting a state-changing treasury decision request over unauthenticated plain HTTP.
Install only if you will use it against an isolated local ZK-Bankir development server or after removing the decision-creation example. Do not use it for production or remote treasury monitoring without HTTPS, authentication, explicit confirmation for any state-changing request, and clear limits on admin data and webhook destinations.
SKILL.md:59Monitoring Skill Exposes an Unauthenticated State-Changing Decision API
SKILL.md:20Sensitive Treasury and Decision Data Is Transmitted over Unauthenticated Plain HTTP
Claiming the skill is 'read-only' while also documenting a write operation is a dangerous trust-boundary violation. Users and agents may authorize the skill with lower scrutiny, then unknowingly trigger decision creation against a treasury system.
The skill is presented as a monitoring/read-only capability, yet it includes a POST /api/v1/decisions example that creates a new decision entry. That mismatch can cause an operator or agent to perform state-changing treasury actions under the false assumption that the skill is safe and observational only.
Including bin/rails runner introduces local code-execution capability on the server filesystem, which is materially more privileged than ordinary API monitoring. In an agent context, this can expand the blast radius from read-only HTTP queries to arbitrary application-context command execution if instructions are generalized or misused.
The compliance section reinforces the false 'read-only' claim, increasing the chance that reviewers will trust the skill and skip deeper validation. In a financial context, contradictory claims around mutability are especially risky because they can mask unauthorized or accidental ledger changes.
The skill documents shell-capable operations (curl, jq, and a local bin/rails runner) but does not declare any tool scope or allowed-tools boundary. This weakens containment and makes it easier for an agent runtime to grant broader execution than users expect, especially in a skill handling treasury and admin endpoints.
The POST example creates a decision entry but is presented inline without a clear warning that it changes system state. In a treasury workflow, even policy-gated requests can generate audit records, trigger approvals, or initiate downstream financial processes that the user did not intend.
The POST request transmits decision data to an external service endpoint over HTTP, and the prerequisites explicitly note there is no authentication layer yet. In context, this is more dangerous than ordinary telemetry because it sends state-changing financial instructions over an unauthenticated channel, enabling interception, tampering, or unauthorized local-network access.
Create a new decision (policy-gated: auto <$1k, approval $1k-$10k, deny >$10k):
curl -s -X POST http://ZK_BANKIR_HOST/api/v1/decisions \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"decision":{"action":"BUY_BTC","amount":500}}' | jq .
The manifest says the treasury is monitored 'via API', but the hash-chain verification procedure is not an API call at all; it requires local code execution in the ZK-Bankir project directory on the server. That is a meaningful behavior mismatch because it expands from remote API monitoring to local host access and command execution.
Advertising Slack/Telegram webhook integration without warning about third-party data transmission can lead operators to exfiltrate balance, decision, or health data outside the primary environment. In a banking/treasury context, even monitoring metadata may be sensitive and should not be forwarded by default.
The manifest frames this skill as monitoring a ZK-Bankir treasury via API, including health, balances, decision tracking, and hash-chain verification. While hash-chain verification is mentioned, this implementation performs it by changing into a local application directory and invoking bin/rails runner, which is a broader local code-execution capability rather than a simple API read or verification call.
Documenting admin endpoint access without noting sensitivity can expose pending approvals and operational decision data to users or agents who may not understand the confidentiality implications. While this is not an exploit by itself, it encourages casual access to privileged monitoring surfaces.