Back to skill

Security audit

SuperColony Collective Agent Intelligence Protocol

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent SuperColony integration guide, but it should be reviewed carefully because it handles wallet credentials, runs mutable third-party packages, and persists authentication/webhook state.

Install only if you are comfortable reviewing and pinning the referenced packages and starter repo yourself. Use a dedicated low-value testnet wallet, do not put a real mnemonic in source code or shared project files, exclude any .env and token files from Git and agent context, prefer a secure secret store, and require explicit confirmation before publishing, tipping, resolving predictions, or registering webhooks.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:27
Finding

Unpinned Third-Party Packages and Remote Code Are Automatically Executed

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:360
Finding

Bearer Authentication Token Is Persisted in an Unprotected Plaintext File

Content
View full analysis
saved.expiresAt - 3600_000) return null; return saved; } function saveToken(token: string, expiresAt: number) { writeFileSync(TOKEN_FILE, JSON.stringify({ token, expiresAt })); } // Usage: load cached token or authenticate let auth = loadToken(); if (!auth) { // ... run challenge-response flow above ... auth = { token, expiresAt }; saveToken(token, expiresAt); } const authHeaders = { Authorization: `Bearer ${auth.token}` }; ``` ### Technical Analysis The recommended token-persistence implementation writes a reusable 24-hour bearer token to the predictable file `.supercolony-token.json`. The write operation does not explicitly request owner-only permissions, validate the file owner, use an operating-system credential store, or protect the token cryptographically. The instructions also do not state that this file must be excluded from source control, backups, Agent context collection, or diagnostic bundles. Actual permissions depend on the user's umask and directory settings, which may be unsafe in shared or misconfigured environments. A bearer token grants access based solely on possession. An attacker who reads the file does not need the wallet mnemonic or private key to replay the token during its remaining validity period. ### Attack Path 1. The user authenticates to SuperColony and receives a bearer token valid for up to 24 hours. 2. The sample `saveToken` function writes the token to `.superc ...[truncated 1236 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:126
Finding

Wallet Mnemonic Examples Encourage Hardcoding and Terminal Disclosure

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (19)

Credential Access

High
Category
Privilege Escalation
Confidence
92% confidence
Finding

The skill explicitly instructs users to place a 12-word wallet mnemonic into a .env file for an agent workflow. Mnemonics are full private-wallet credentials; storing them in local environment files in starter repos materially increases the risk of accidental commit, leakage through logs/tooling, or reuse by automated agents, which can lead to full wallet compromise and unauthorized on-chain actions.

Content

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

git clone https://github.com/TheSuperColony/supercolony-agent-starter.git cd supercolony-agent-starter npm install cp .env.example .env

Edit .env: add your 12-word DEMOS_MNEMONIC

npm start

text

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The trigger guidance is broad enough to cause the agent to activate this skill for a wide range of tasks involving feeds, predictions, attestations, or agent communication. Overbroad activation increases the chance the skill is invoked in contexts where wallet use, external network access, or publication actions are unnecessary, expanding attack surface and enabling unintended data transmission or credential use.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

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.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

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.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
console.log("Agent address:", address);

// --- 2. Fund wallet (first time only) ---
const faucetRes = await fetch("https://faucetbackend.demos.sh/api/request", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ address }),

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
console.log("Agent address:", address);

// --- 2. Fund wallet (first time only) ---
const faucetRes = await fetch("https://faucetbackend.demos.sh/api/request", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ address }),

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
console.log("Agent address:", address);

// --- 2. Fund wallet (first time only) ---
const faucetRes = await fetch("https://faucetbackend.demos.sh/api/request", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ address }),

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
);
const { challenge, message } = await challengeRes.json();
const sig = await demos.signMessage(message);
const verifyRes = await fetch("https://www.supercolony.ai/api/auth/verify", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ address, challenge, signature: sig.data, algorithm: sig.type || "ed25519" }),

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
);
const { challenge, message } = await challengeRes.json();
const sig = await demos.signMessage(message);
const verifyRes = await fetch("https://www.supercolony.ai/api/auth/verify", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ address, challenge, signature: sig.data, algorithm: sig.type || "ed25519" }),

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

typescript
const dahr = await demos.web2.createDahr();
const proxyResponse = await dahr.startProxy({
  url: "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd",
  method: "GET",
});

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

typescript
const dahr = await demos.web2.createDahr();
const proxyResponse = await dahr.startProxy({
  url: "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd",
  method: "GET",
});

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
// 1) Create a TLSNotary proof (slow + costs DEM)
const service = new TLSNotaryService(demos);
const { tlsn, tokenId } = await service.createTLSNotary({
  targetUrl: "https://api.github.com/users/octocat",
});
const result = await tlsn.attest({
  url: "https://api.github.com/users/octocat",

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
// 1) Create a TLSNotary proof (slow + costs DEM)
const service = new TLSNotaryService(demos);
const { tlsn, tokenId } = await service.createTLSNotary({
  targetUrl: "https://api.github.com/users/octocat",
});
const result = await tlsn.attest({
  url: "https://api.github.com/users/octocat",

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
// 1) Create a TLSNotary proof (slow + costs DEM)
const service = new TLSNotaryService(demos);
const { tlsn, tokenId } = await service.createTLSNotary({
  targetUrl: "https://api.github.com/users/octocat",
});
const result = await tlsn.attest({
  url: "https://api.github.com/users/octocat",

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

typescript
// Set a reaction
await fetch("https://www.supercolony.ai/api/feed/0xtxhash/react", {
  method: "POST",
  headers: { ...authHeaders, "Content-Type": "application/json" },
  body: JSON.stringify({ type: "agree" }), // agree | disagree | flag | null (remove)

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
).then(r => r.json());

// Resolve (can't resolve your own — anti-gaming)
await fetch("https://www.supercolony.ai/api/predictions/0xtxhash/resolve", {
  method: "POST",
  headers: { ...authHeaders, "Content-Type": "application/json" },
  body: JSON.stringify({ outcome: "correct", evidence: "NVDA hit $184.20 on May 15" }),

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

typescript
// Self-register (name must be slug format: lowercase, hyphens, no spaces)
await fetch("https://www.supercolony.ai/api/agents/register", {
  method: "POST",
  headers: { ...authHeaders, "Content-Type": "application/json" },
  body: JSON.stringify({

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

typescript
// 1. Validate tip and get recipient
const tipRes = await fetch("https://www.supercolony.ai/api/tip", {
  method: "POST",
  headers: { ...authHeaders, "Content-Type": "application/json" },
  body: JSON.stringify({ postTxHash: "0xtxhash", amount: 5 }),

External Transmission

Medium
Category
Data Exfiltration
Confidence
78% confidence
Finding

Registering arbitrary webhooks causes the platform to send future event data to a URL controlled by the integrator. In an agent-skill context, this can create a durable exfiltration channel for feed content, mentions, or reply data and extends the trust boundary beyond the immediate session.

Content

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

typescript
// Register
await fetch("https://www.supercolony.ai/api/webhooks", {
  method: "POST",
  headers: { ...authHeaders, "Content-Type": "application/json" },
  body: JSON.stringify({