T09 · Insecure Skill Coding Practices
- Location
lib/api.js:27- Finding
Ed25519 Private Key Stored in Plaintext Without Explicit Access Restrictions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill matches its marketplace purpose, but it can autonomously accept paid work, submit placeholder results, move token balances, and persist identity material with weak controls.
Review this skill carefully before installing. It is intended to act in an external agent marketplace and can persist an identity, send task and chat data to UID.LIFE, create proposals, transfer $SOUL, and run a background worker. Do not enable uid-start or use value-moving commands unless you are comfortable with autonomous contract actions, possible reputation or balance impact, and local plaintext identity storage.
lib/api.js:27Ed25519 Private Key Stored in Plaintext Without Explicit Access Restrictions
lib/api.js:38Handle-Only Login Provides No Proof of Identity Ownership
index.js:244Autonomous Worker Accepts Every Remote Proposal and Submits a Fabricated Fixed Result
The worker loop automatically accepts incoming contracts and completes them in the background without a clear upfront warning, per-contract confirmation, or runtime approval. In this skill's marketplace and currency context, that means third parties can trigger actions on the user's identity/account automatically, potentially causing financial commitments, spammed submissions, or reputation damage at scale.
The send-funds command performs a currency transfer immediately after parsing arguments, with no confirmation, recipient normalization/verification, or amount sanity checks. Because this skill directly controls a wallet-like balance, a mistaken command, prompt injection through an upstream agent, or recipient typo could cause irreversible loss of assets.
The contract payment command issues payment immediately with no confirmation or contextual warning, even though payment may be irreversible and tied to an on-platform asset balance. In a skill meant for autonomous agents, this is especially risky because an agent or user can pay the wrong contract, pay prematurely, or be induced by malicious instructions to release funds without review.
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.
})
});
if (!res.ok) throw new Error("Failed to update skills");
return await res.json();
}
sendFunds initiates a value transfer based only on the in-memory identity handle and caller-supplied recipient/amount, with no local confirmation, transaction signing, secondary authorization, or integrity protection visible in the client. In an agent context where tools may be invoked indirectly or by prompt-driven workflows, this makes unauthorized or unintended fund transfers materially easier.
The README promotes autonomous network participation, task acceptance, and delegation to other agents without warning users that prompts, data, or system-derived outputs may be transmitted to external services or third-party agents. In a security-sensitive agent environment, this can cause inadvertent data disclosure, unexpected resource consumption, and execution of externally sourced tasks with insufficient operator awareness.
The skill advertises and relies on networked commands against a live API endpoint but does not declare any explicit tool scope or permissions boundary. That mismatch can cause users or hosting agents to invoke network-capable behavior without clear consent or policy review, which is especially risky in a financial/identity-management skill.
The uid-start worker is documented to auto-accept and process contracts, which can create binding commitments or trigger downstream actions without per-task user confirmation. In a decentralized labor and payment context, this increases the chance of unauthorized work acceptance, spam contract capture, or automated engagement with malicious tasks.
The uid-send <handle> <amount> command enables direct token transfer to another agent but does not warn users about recipient verification or the irreversible nature of the transfer. In a decentralized identity system, handle confusion, impersonation, or simple mistakes can lead to unrecoverable loss of funds.
The uid-pay <contract_id> command releases payment for a contract but the skill text gives no warning that this is an irreversible transfer of funds. In a tokenized escrow/payment system, users may mistakenly approve fraudulent, incomplete, or spoofed contracts, resulting in permanent financial loss.
The manifest describes a compute-node role, but the code also includes agent discovery, hiring, and proposal creation features that let the skill delegate work and act on behalf of the user in the marketplace. This scope expansion is security-relevant because orchestration/delegation behavior can incur cost, data exposure, or workflow actions not implied by the advertised purpose.
The manifest frames the skill primarily as a network/compute-node integration for earning currency, but the implementation also exposes wallet-like fund movement and payment capabilities. This mismatch can cause users or higher-level agent frameworks to grant trust or permissions under incomplete assumptions, increasing the chance of unintended financial actions.
The autonomous worker claims to accept contracts, execute work, and submit results, but it actually sends canned logs and a fixed placeholder output regardless of task content. In a paid contract marketplace, this is dangerous because it can misrepresent task execution, trigger fraudulent or low-integrity submissions, and expose the user account to disputes, reputation loss, or policy violations.
The client persists the agent's private Ed25519 key material in plaintext inside .identity.json without encryption, access controls, or any user disclosure. If the local filesystem is readable by other users, malware, backups, or logs, an attacker can steal the private key and impersonate the agent, potentially taking over identity-linked actions and transactions.
The client sends task descriptions and bid data to a remote API when creating proposals, but the file contains no user-facing disclosure that potentially sensitive task content is transmitted off-system. Similar undisclosed transmissions also occur in logging/chat and contract completion flows, indicating missing warnings around remote data sharing.
The skill exposes a token transfer capability (uid-send) and a hiring/payment workflow but does not prominently warn that it can move assets or commit funds. In an autonomous agent setting, financial actions are sensitive because prompt injection, malicious job proposals, or operator misunderstanding could trigger unintended transfers or escrow commitments.
The skill explicitly defines an autonomous loop that checks inboxes, accepts jobs, performs work, and submits deliverables without requiring human review or safety gates. In a marketplace context, this can cause the agent to autonomously act on untrusted third-party tasking, leading to execution of risky instructions, data leakage, or harmful downstream actions.
Data is uploaded to cloud storage (S3 / GCS / Azure Blob). This may be a legitimate backup or exfiltration to an external bucket. Manual review is recommended.
def on_created(self, event):
if event.src_path.endswith('.csv'):
filename = os.path.basename(event.src_path)
self.s3.upload_file(event.src_path, self.bucket, filename)
print(f"Uploaded {filename} to S3")
# ... complete implementation
The dependency is specified with a caret range (^2.6.7), which permits installation of newer 2.x releases without explicit review. This weakens supply-chain control and reproducibility, and in a skill that integrates with decentralized identity, earnings, and agent hiring, a silently changed HTTP client could affect network security behavior or expose sensitive request metadata.
"description": "UID.LIFE Integration Skill",
"main": "index.js",
"dependencies": {
"node-fetch": "^2.6.7"
}
}
The manifest uses node-fetch without pinning an exact version, while the package has multiple known advisories affecting some releases. Because the resolved version is not fixed and no lockfile evidence is provided, the skill may install a vulnerable release, which is especially relevant for a network-facing integration that likely handles outbound requests tied to identity and economic operations.
No suspicious patterns detected.