T08 · Insecure Dependencies
- Location
SKILL.md:397- Finding
Unpinned and Remotely Mutable Dependencies
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill matches its OpenServ management purpose, but it handles wallet keys, API tokens, remote resources, and destructive cleanup in ways users should review carefully before installing.
Review this skill before installing. Use a dedicated low-value wallet, keep .env and .openserv.json out of source control and logs, protect webhook URLs as secrets, pin package and skill versions, and avoid running destructive cleanup commands unless you have verified the target resources.
SKILL.md:397Unpinned and Remotely Mutable Dependencies
SKILL.md:346Wallet Private Key and Provisioning Credentials Persisted in Plaintext
examples/agent.ts:46Tokenized Webhook URLs Disclosed Through Application Logs
Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.
// Get stored IDs and tokens const info = getProvisionedInfo('my-agent', 'My Awesome Workflow')
// Clear state (forces fresh creation) clearProvisionedState()
The example explicitly reloads .env to access WALLET_PRIVATE_KEY, normalizing retrieval of a plaintext private key from a local file. That encourages insecure secret handling for a highly sensitive credential that can grant control over the associated wallet and any on-chain identity or funds tied to it.
import { PlatformClient } from '@openserv-labs/client'
// Reload .env to pick up WALLET_PRIVATE_KEY written by provision()
dotenv.config({ override: true })
try {
The function returns live credentials and identifiers intended for .env use, including apiKey, authToken, and triggerToken. Returning secrets from an example setup routine materially increases the chance they are captured by calling code, shell history, debugging tools, test output, CI logs, or accidentally committed environment files, enabling unauthorized API access or trigger invocation.
console.log(`Webhook: https://api.openserv.ai/webhooks/trigger/${trigger.token}`)
console.log('='.repeat(50))
// Return info for .env
return {
agentId: agent.id,
apiKey,
The documentation instructs reloading .env to pick up a freshly written WALLET_PRIVATE_KEY, normalizing storage of a highly sensitive private key in an environment file. Persisting blockchain private keys in .env increases the chance of accidental commit, local disclosure, process-level exposure, or reuse by unrelated components, and compromise would allow full wallet takeover and unauthorized on-chain actions.
Requires ETH on Base. The wallet starts unfunded. Always wrap in try/catch so failures don't crash the agent. Reload
.envafterprovision()withdotenv.config({ override: true })to pick up the freshly writtenWALLET_PRIVATE_KEY.
// Reload .env after provision() to pick up WALLET_PRIVATE_KEY
dotenv.config({ override: true })
try {
The skill documents code that uses environment variables and network access, but it declares no tool scope or allowed-tools metadata. In an agent ecosystem, that omission weakens least-privilege controls and can cause consumers to grant broader runtime capabilities than necessary without explicit visibility.
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
`provision()` creates two types of credentials. They are **not interchangeable**:
| Credential | Env Variable | Used By | Purpose |
| ------------- | ----------------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Agent API key | `OPENSERV_API_KEY` | SDK internals | Authenticates the agent when receiving tasks from the platform. Set automatically via `agent.instance`. **Do not** use with `PlatformClient`. |
| Wallet key | `WALLET_PRIVATE_KEY` | `PlatformClient` | Authenticates your account for management calls (list tasks, debug workflows, manage agents). |
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
| ------------- | ----------------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Agent API key | `OPENSERV_API_KEY` | SDK internals | Authenticates the agent when receiving tasks from the platform. Set automatically via `agent.instance`. **Do not** use with `PlatformClient`. |
| Wallet key | `WALLET_PRIVATE_KEY` | `PlatformClient` | Authenticates your account for management calls (list tasks, debug workflows, manage agents). |
| User API key | `OPENSERV_USER_API_KEY` | `PlatformClient` | Alternative to wallet auth. Get from the platform dashboard. |
If you get a **401 Unauthorized** when using `PlatformClient`, you are likely using the agent API key by mistake. Use wallet authentication or the user API key instead.
The documentation states that provision() writes WALLET_PRIVATE_KEY to .env at runtime and then instructs reloading it, but it does not give a strong warning about plaintext secret storage risks. Persisting wallet private keys to .env can lead to accidental source-control commits, local disclosure, or leakage through logs, backups, or support bundles.
The skill recommends running npx skills check without pinning a version, which can fetch and execute whatever package version is current at runtime. That creates a supply-chain risk because behavior may change unexpectedly or a compromised upstream release could execute code on the user's machine.
The unpinned npx skills update command executes remote package code with no version constraint, increasing exposure to malicious or breaking upstream releases. Because it explicitly updates installed skills, it may also modify local agent behavior in ways the user has not reviewed.
The npx skills add openserv-labs/skills example invokes an external package/repository reference without version pinning, exposing users to mutable upstream content and possible supply-chain compromise. In a skill-installation context, this is especially risky because the fetched content may influence future agent actions.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
})
console.log(`Webhook: https://api.openserv.ai/webhooks/trigger/${result.triggerToken}`)
// Start the agent - credentials already bound
await run(agent)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
})
console.log(`Webhook: https://api.openserv.ai/webhooks/trigger/${result.triggerToken}`)
// Start the agent - credentials already bound
await run(agent)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
})
console.log(`Webhook: https://api.openserv.ai/webhooks/trigger/${result.triggerToken}`)
// Start the agent - credentials already bound
await run(agent)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
})
console.log(`Webhook: https://api.openserv.ai/webhooks/trigger/${result.triggerToken}`)
// Start the agent - credentials already bound
await run(agent)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
})
console.log(`Webhook: https://api.openserv.ai/webhooks/trigger/${result.triggerToken}`)
// Start the agent - credentials already bound
await run(agent)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
})
console.log(`Webhook: https://api.openserv.ai/webhooks/trigger/${result.triggerToken}`)
// Start the agent - credentials already bound
await run(agent)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
})
console.log(`Webhook: https://api.openserv.ai/webhooks/trigger/${result.triggerToken}`)
// Start the agent - credentials already bound
await run(agent)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
})
console.log(`Webhook: https://api.openserv.ai/webhooks/trigger/${result.triggerToken}`)
// Start the agent - credentials already bound
await run(agent)
The script performs irreversible deletion of all workflows and agents when '--all' is supplied, without any interactive confirmation, dry-run, or secondary safeguard. In a platform-management skill context, this is more dangerous because the authenticated client acts on real remote resources, so a mistyped command, copied example, or automation misuse can cause immediate data/resource loss.
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.
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.
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.
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.
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.
Detected: suspicious.prompt_injection_instructions