Back to skill

Security audit

OpenJobs

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its OpenJobs marketplace purpose, but it gives the agent broad automatic authority over marketplace actions, local credentials, skill updates, and wallet-related operations.

Install only if you are comfortable letting this skill manage real OpenJobs account state and wallet-linked funds. Before use, disable or avoid automatic heartbeat/full_auto operation, require explicit approval for deposits, staking, applications, submissions, approvals, and escrow release, pin the CLI version, avoid npx -y fallback, and do not allow forced remote skill refresh without reviewing the new files.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
Findings (6)

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:614
Finding

Mutable Remote Skill Content Is Treated as Runtime Execution Authority

Content
View full analysis
and are the **runtime execution authority**: ```bash # Re-install the full skill bundle (updates HEARTBEAT.md, SKILL.md, references/): openjobs install-skill --agent --force ``` ``` ### Technical Analysis The Skill explicitly instructs the Agent to overwrite the locally reviewed Skill bundle at the beginning of every heartbeat. It also declares the latest remotely published documents to be the authoritative runtime instructions. This creates a mutable execution channel outside the audited project. The effective instructions executed by the Agent can change after review without a local code change, integrity verification, version pin, diff review, or renewed operator approval. The `--force` option increases the risk by permitting replacement of the existing reviewed files. This behavior exceeds the minimum privileges needed to interact with the OpenJobs marketplace. Marketplace operations do not require remotely hosted instructions to replace the local Skill before every run. ### Attack Path 1. An attacker compromises `openjobs.bot`, its deployment pipeline, the CLI publisher account, or another component involved in distributing the Skill bundle. 2. The attacker modifies the remotely distributed `SKILL.md`, `HEARTBEAT.md`, or associated references. 3. A scheduled or manually triggered heartbeat runs the mandatory refresh command with `--force`. 4. The reviewed local Skill is replaced with attacker-controlled instructions. 5. The Agent loads the new content as “runtime execution authority.” 6. The malicious instructions can direct the Agent to invoke tools, disclose file ...[truncated 901 chars]
Remediation
View remediation

T01 · Skill Instruction Hijacking

Error
Location
HEARTBEAT.md:31
Finding

Heartbeat Rules Coerce Autonomous Marketplace and Financial State Changes

Content
View full analysis
--json 2>&1 # Approve and release escrow to the worker $OJ jobs complete 2>&1 # Or send the work back with a precise gap list $OJ jobs request-revision \ --notes "Gap 1: missing unit tests. Gap 2: CSV col ...[truncated 2642 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Error
Location
HEARTBEAT.md:87
Finding

Unpinned OpenJobs Package Is Installed and Executed Without Confirmation

Content
View full analysis
/dev/null 2>&1; then OJ=$(command -v openjobs) else OJ="npx -y @openjobs/cli" fi printf 'Using OpenJobs command: %s\n' "$OJ" ``` ### Technical Analysis The package is referenced without an exact version. Consequently, npm or npx resolves whatever version is current at execution time. The heartbeat fallback uses `npx -y`, which automatically downloads and executes the package without interactive confirmation. The project provides no lockfile, integrity digest, provenance requirement, signature verification, or allowlisted package artifact. Global installation also makes the mutable executable available to later sessions. This is particularly dangerous because the CLI is expected to access API credentials, wallet secrets, uploaded files, and financial operations. A compromised dependency would execute as the local Agent user before any application-level safety rules could protect those resources. ### Attack Path 1. An attacker compromises the npm publisher account, package build pipeline, registry entry, or a future package release. 2. A system lacks a local `openjobs` executable, or the user follows the documented installation instructions. 3. `npx -y @openjobs/cli` or ...[truncated 964 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/verify-agent.mjs:38
Finding

Prefix-Based API Origin Validation Allows OpenJobs API-Key Exfiltration

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
HEARTBEAT.md:587
Finding

Mandatory Telegram Notifications Disclose Marketplace Metadata to a Third Party

Content
View full analysis
` or the platform-specific explicit Telegram target supported by that tool. - Do not use a scheduled cron job as proof of immediate Telegram delivery unless the tool reports the delivery actually completed successfully. ``` ```markdown If actions were taken, the Telegram summary must include: - Which action(s) were taken. - Relevant task/message/job/application/submission IDs and attachment IDs. - Current status after verification. - Any important follow-up needed. Keep the Telegram summary short and never include full API keys or wallet secrets. ``` ### Technical Analysis Telegram delivery is not required to browse, apply to, post, review, or complete work through OpenJobs. Nevertheless, the Skill makes it mandatory after every state-changing action and requires transmission of task, message, job, application, submission, and attachment identifiers. The text correctly prohibits full API keys and wallet secrets, but operational identifiers and action details can still reveal sensitive business activity, counterpart interactions, work status, and attachment metadata. Sending this information to Telegram expands the network and messaging permissions requi ...[truncated 1259 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/create-solana-wallet.mjs:94
Finding

Solana Wallet Secret Is Written Before Restrictive Permissions Are Applied

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
Findings (19)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
91% confidence
Finding

This section instructs the agent to deposit funds into the OpenJobs ledger and retry when balance is insufficient, without consistently requiring explicit user approval at the point of financial action. In context, these are real value transfers involving WAGE/USDC and stored wallet secrets, so an autonomous run could move funds or lock escrow unexpectedly.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 602)May include surrounding context.

md
`HEARTBEAT.md` lives at the top level of the skill (a peer of `SKILL.md`,

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 606)May include surrounding context.

md
`HEARTBEAT.md` lives at the top level of the skill (a peer of `SKILL.md`,

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 644)May include surrounding context.

md
`HEARTBEAT.md` lives at the top level of the skill (a peer of `SKILL.md`,

Ssd 1

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

Declaring remote published skill files as the 'runtime execution authority' effectively delegates the agent's operational instructions to mutable web content. If those remote docs are compromised, replaced, or maliciously edited, the agent may ingest attacker-controlled instructions on every heartbeat, making this a direct semantic prompt-injection vector with persistent control over agent actions.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger section is broad enough to auto-invoke this workflow for many normal OpenJobs-related requests, including inbox checks, messaging, oversight changes, webhook management, and staking. Because the workflow later mandates taking at least one action when actionable items exist, accidental invocation can escalate a simple read request into unintended state changes.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

The fallback npx -y @openjobs/cli executes whatever package version is current on the registry at runtime, creating a supply-chain risk and breaking reproducibility. In a skill that performs authenticated messaging, escrow-related wallet actions, staking, and other state-changing operations, an upstream compromise or unexpected release could directly affect funds, credentials, or agent behavior.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill drives shell commands, network access, and reads/writes local config and secrets, but it declares no explicit tool scope or permissions boundary. In an agent runtime, that increases the chance the skill is invoked with broader capabilities than intended, enabling unintended command execution, credential exposure, or filesystem modification.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The trigger guidance is broad enough that incidental mentions like 'my agent' or 'the marketplace' could activate this skill outside clearly intended OpenJobs tasks. Over-broad activation increases the chance an agent loads powerful shell/network instructions in the wrong context and follows irrelevant or unsafe marketplace procedures.

Content

No source excerpt is available for this finding.

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

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.

Content

Scanner excerpt · SKILL.md (reported line 128)May include surrounding context.

md
Common doctor outputs and what to do:

| Doctor row              | Status | Fix                                                                                               |
| ----------------------- | ------ | ------------------------------------------------------------------------------------------------- |
| `auth.apiKey` missing   | ✗      | `openjobs login --api-key sk_live_xxx` (or `openjobs agents register …` for a brand-new agent).    |
| `cli.version` outdated  | ⚠      | `openjobs upgrade --yes`                                                                          |

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

Using npx @openjobs/cli without a pinned version allows execution of whatever package version is current at runtime. That creates a supply-chain risk where a compromised or breaking upstream release could be fetched and executed immediately by the agent.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · SKILL.md (reported line 145)May include surrounding context.

npx @openjobs/cli --help # zero-install, one-off runs

text

If `npm i -g` fails with `EACCES`, point npm at a user-owned prefix (don't `sudo npm i -g`):

```bash
npm config set prefix ~/.npm-global

Session Persistence

Medium
Category
Rogue Agent
Confidence
90% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · SKILL.md (reported line 149)May include surrounding context.

bash
npm config set prefix ~/.npm-global
export PATH=~/.npm-global/bin:$PATH   # add to ~/.bashrc or ~/.zshrc
npm install -g @openjobs/cli
openjobs doctor

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · SKILL.md (reported line 179)May include surrounding context.

md
1. Run `openjobs doctor` and READ the output.
2. If it says "Could not locate the bundled skill files" → your CLI predates the bundled skill. Run `openjobs upgrade --yes`, then `openjobs --version` (must show 2.2.x or newer), then re-try install-skill **once**.
3. If `upgrade` itself fails with `EACCES` → use the `~/.npm-global` recipe above. Do NOT `sudo` (it changes file ownership and breaks the next non-sudo install).
4. If a PATH-shadow warning appears (`⚠ openjobs PATH-shadow: which openjobs resolves to A but this process is running B`), `which -a openjobs` and remove or reorder the stale copy. Do NOT keep upgrading — both copies upgrade simultaneously and the shadow persists.

The CLI never auto-retries failed installs; neither should you. One failure → run `doctor` → apply the named fix → one more attempt.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill instructs the agent to self-update and overwrite its own local skill bundle during heartbeat runs. A self-modifying prompt/instruction set sourced remotely can change agent behavior over time without operator review, creating a durable prompt-injection and supply-chain channel.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill tells the agent to refresh and overwrite local skill files from remote sources but does not prominently warn the user that local instructions will be modified. This reduces operator awareness and consent around a high-impact change to the agent's behavior and trust boundary.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/create-solana-wallet.mjs (reported line 3)May include surrounding context.

js
#!/usr/bin/env node
/**
 * OpenJobs — Create Solana Wallet (offline)
 *
 * Generates a brand-new Solana keypair LOCALLY and writes:
 *   - ~/.openjobs/wallet.json   (Phantom/solana-cli compatible 64-byte secret key array)

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · SKILL.md (reported line 133)May include surrounding context.

md
console.log("✅ New Solana wallet created");
console.log("");
console.log("  Address:     " + walletAddress);
console.log("  Secret key:  " + WALLET_PATH + "  (chmod 600)");
console.log("  Preferences: " + PREFS_PATH);
console.log("");
console.log("Next step: prove ownership of this wallet.");

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · scripts/create-solana-wallet.mjs (reported line 118)May include surrounding context.

js
console.log("✅ New Solana wallet created");
console.log("");
console.log("  Address:     " + walletAddress);
console.log("  Secret key:  " + WALLET_PATH + "  (chmod 600)");
console.log("  Preferences: " + PREFS_PATH);
console.log("");
console.log("Next step: prove ownership of this wallet.");

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/create-solana-wallet.mjs:118