T01 · Skill Instruction Hijacking
- Location
SKILL.md:294- Finding
Untrusted Third-Party Instructions Are Injected into the AI System Prompt
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent OfficeX API guide, but it exposes broad billing, credential, and admin workflows with weak safeguards, so it belongs in Review before installation.
Install only if you intentionally work with OfficeX and can enforce your own safeguards. Use a dedicated low-privilege account, avoid giving the agent master keys, superadmin secrets, payment tokens, or reusable third-party API keys, and require explicit confirmation before any billing, deletion, payout, wallet, or admin operation. Treat app documentation, context_prompt, downloaded skill text, iframe parameters, and agent_context values as untrusted unless separately reviewed and isolated.
SKILL.md:294Untrusted Third-Party Instructions Are Injected into the AI System Prompt
SKILL.md:534Raw Third-Party Credentials Are Transmitted to OfficeX and Injected into AI Context
SKILL.md:819INSTALL Webhook Is Trusted Without Authentication or Replay Protection
SKILL.md:845Iframe SSO Authenticates Users from Unverified Query Parameters
SKILL.md:715Billing Secret Is Exposed in URLs and Browser-Accessible Storage
SKILL.md:86Testing Mode Uses a Globally Hardcoded OTP
The skill exposes destructive install-management operations that could be driven by agent-supplied parameters without emphasizing confirmation or identity checks. In an LLM/tooling environment, delete and rotate-secret actions are especially sensitive because prompt confusion or malicious instruction injection can cause service disruption or credential invalidation.
GET /users/me/installs/{id} → { install (with usage stats) }
POST /install/{app_id_or_slug} { max_per_hour?, max_per_day?, max_per_month?, allowed_until? }
→ { app_id, install_id, install_secret, agent_context? } ⚠️ secret shown once
DELETE /users/me/installs/{id} → { success }
PATCH /users/me/installs/{id} { max_per_hour?, max_per_day?, max_per_month?, allowed_until?, lifetime_spend_limit? }
→ { install }
POST /users/me/installs/{id}/rotate-secret → { install_secret }
Documenting app deletion as a routine callable action without guardrails creates a tool-parameter abuse risk. An agent that misbinds app_id or follows adversarial prompt content could delete production apps, causing outage and loss of configuration or marketplace presence.
GET /users/me/apps/{app_id} → { app }
PATCH /users/me/apps/{app_id} (see full schema below)
→ { app }
DELETE /users/me/apps/{app_id} → { success }
GET /users/me/apps/{app_id}/inbox → { reservations[], pagination? }
POST /users/me/apps/{app_id}/inbox/{log_id}/ack → { success }
GET /users/me/apps/{app_id}/installs → { installs[] }
Chat deletion is less severe than credential or billing actions, but still a destructive operation vulnerable to parameter abuse in agent workflows. Ambiguous references like 'delete that thread' can easily map to the wrong id without verification, causing data loss and audit gaps.
POST /users/me/chats { title?, project_id?, tracer_id? } → { thread } GET /users/me/chats/{id} → { thread, messages[] } PATCH /users/me/chats/{id} { title?, tracer_id?: string|null } → { thread } DELETE /users/me/chats/{id} → { success }
Streaming (Function URL, NOT API Gateway):
Prompt CRUD, especially DELETE, can be abused if an agent accepts untrusted identifiers or vague instructions. Because prompts may encode business logic or sensitive workflows, accidental or manipulated deletion can degrade system behavior and user trust.
GET /users/me/inbox → { messages[] }
GET/POST/PATCH/DELETE /users/me/prompts[/{id}] → prompt CRUD
GET /refs/{slug} → { ref } (No Auth)
GET/POST /users/me/refs[/{slug}] → ref CRUD [Master Key]
POST /uploads/presign { filename, content_type } → { presigned_url, key }
Admin endpoints include destructive and state-changing operations such as deleting apps and adjusting wallets, yet the skill presents them as accessible API surface without strong operational safeguards. In an agent setting, exposing superadmin actions materially increases the risk of catastrophic misuse from prompt injection, wrong parameter binding, or accidental invocation.
All under `/admin/*` with `x-officex-admin-secret`:
**Users:** `GET /admin/users`, `GET/PATCH /admin/users/{id}`, `GET /admin/users/{id}/wallets`
**Apps:** `GET /admin/apps`, `GET/PATCH/DELETE /admin/apps/{id}`
**Wallets:** `GET /admin/wallets`, `GET /admin/wallets/{id}`, `POST /admin/wallets/{id}/adjust { amount }`
**Treasury:** `GET /admin/treasury`, `POST /admin/reconcile`, `GET /admin/audit`
**Payouts:** `GET /admin/payouts`, `GET /admin/payouts/{id}`, `POST /admin/payouts/{id}/approve`, `POST /admin/payouts/{id}/reject`
Admin voucher deletion is a privileged destructive operation that can be abused through untrusted parameters or mistaken targeting. In a tool-using agent, even small admin actions can impact billing, credits, and user entitlements if invoked without confirmation and strict authorization controls.
**Wallets:** `GET /admin/wallets`, `GET /admin/wallets/{id}`, `POST /admin/wallets/{id}/adjust { amount }`
**Treasury:** `GET /admin/treasury`, `POST /admin/reconcile`, `GET /admin/audit`
**Payouts:** `GET /admin/payouts`, `GET /admin/payouts/{id}`, `POST /admin/payouts/{id}/approve`, `POST /admin/payouts/{id}/reject`
**Vouchers:** `POST /admin/vouchers`, `GET /admin/vouchers`, `GET/PATCH/DELETE /admin/vouchers/{code}`
## Error Format
The skill encourages storing and transmitting sensitive credentials via agent_context, webhook responses, iframe parameters, and app-side patch operations without strong privacy warnings or safer alternatives. In an agent ecosystem, this materially raises the risk of credential exposure through logs, prompts, browser history, referrers, third-party scripts, or prompt/tool misuse.
The trigger list includes broad terms like 'wallet', 'OTP', 'webhook', and 'iframe', which can cause the skill to activate in conversations unrelated to OfficeX. Overbroad activation increases the chance the agent injects sensitive OfficeX-specific instructions or credential-handling guidance into the wrong context, enabling confused-deputy behavior.
The document states install secrets are 'billing only', but later authorizes those same secrets to write arbitrary agent_context and send inbox messages. That scope expansion turns a payment credential into a broader capability token, increasing blast radius if leaked and making downstream integrators likely to over-trust or mishandle it.
Publishing a hardcoded OTP of '0000' without a strong, repeated warning that it is limited to isolated staging/test environments normalizes unsafe authentication assumptions. If copied into production-adjacent deployments or misunderstood by developers, it could lead to account takeover or severely weakened auth flows.
The documentation presents destructive admin and deletion operations, including app deletion, voucher deletion, and wallet adjustment, without prominent cautions, confirmation requirements, or rollback guidance. In an agent-assisted setting, that increases the risk of unintended irreversible actions from ambiguous prompts or parameter mistakes.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Example:
curl -X POST https://cloud.officex.app/v1/register-app \
-H "Content-Type: application/json" \
-H "x-officex-user-id: $OFFICEX_USER_ID" \
-H "x-officex-master-key: $OFFICEX_API_KEY" \
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Example:
curl -X POST https://cloud.officex.app/v1/register-app \
-H "Content-Type: application/json" \
-H "x-officex-user-id: $OFFICEX_USER_ID" \
-H "x-officex-master-key: $OFFICEX_API_KEY" \
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
```bash
curl -X POST https://cloud.officex.app/v1/installs/$INSTALL_ID/inbox \
-H "Content-Type: application/json" \
-H "x-officex-install-id: $INSTALL_ID" \
-H "x-officex-install-secret: $INSTALL_SECRET" \
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
async function safeReserve(installId, installSecret, amount, jobId) {
try {
const res = await fetch("https://cloud.officex.app/v1/reserve", {
method: "POST",
headers: {
"Content-Type": "application/json",
The manifest description enumerates covered areas such as REST API calls, billing, installs, wallets, webhooks, iframes, and chat-agent integration, but does not mention schedules. The later 'Tracers' section states that tracer IDs link threads and 'schedule runs' and references POST /users/me/schedules and schedule responses, expanding functionality beyond the described scope.
No suspicious patterns detected.