Back to skill

Security audit

PowPow ምዝገባ — አረፋ ይመዝገቡ፣ የጉዞ ማስታወሻዎችን በካርታ ላይ ያስቀምጡ፣ ከዲጂታል ሰዎች ጋር ይነጋገሩ

Security checks for vulnerabilities and agentic risk

Overview

This PowPow registration helper is mostly coherent, but it needs review because it stores a login token in a predictable temporary file and can open payment pages through local browser commands.

Install only if you are comfortable letting the agent create a PowPow account with your email, password, optional avatar/phone, and optional payment order. Avoid using it on shared machines because the temporary state file can contain a session token; run cleanup after use, review any payment page before paying, and prefer manual registration/payment if you do not want the agent handling those steps.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/powpow-register.mjs:40
Finding

Predictable Shared Temporary State File Enables Local Session-Token Disclosure

Content
View full analysis

Vulnerability Details

File Location: scripts/powpow-register.mjs, lines 40–56 and 203–211
Vulnerability Type: Unsafe temporary file handling and local credential disclosure
Risk Level: Medium

Technical Analysis

The script stores workflow state at a fixed, predictable path in the shared operating-system temporary directory:

js
const STATE_FILE = join(tmpdir(), 'powpow-register-state.json');

The state-loading and state-saving code reopens this path without verifying its ownership, existing permissions, file type, or whether it was created by the current process:

js
function loadState() {
  try {
    return JSON.parse(readFileSync(STATE_FILE, 'utf8'));
  } catch {
    return {};
  }
}

function saveState(patch) {
  const s = { ...loadState(), ...patch };
  writeFileSync(STATE_FILE, JSON.stringify(s, null, 2), { mode: 0o600 });
  return s;
}

Following successful registration, the sensitive PowPow session token is written into this state file:

js
const token = r.cookies['powpow_token'] || '';
if (!token) die('注册成功但未捕获到会话 cookie(平台响应异常)');
saveState({
  username: r.data?.user?.username || username,
  nickname: r.data?.user?.nickname || nickname,
  userId: r.data?.userId,
  token,
  step: 'registered-pending',
  registeredAt: new Date().toISOString(),
});

The mode: 0o600 option protects a newly created file, but it does not reliably change the permissions of a file that already exists. On a multi-user system, an unprivileged local attacker can pre-create the predictable state file with permissions that allow the victim to overwrite it while preserving attacker read access.

The fixed path also permits state collisions between concurrent Skill executions under environments that share the same temporary directory. Moreover, loadState() accepts preexisting JSON without validating file ownership or provenance.

Attack Path

  1. An unprivi ...[truncated 1596 chars]
Remediation
View remediation

Remediation Suggestions

  1. Create a private per-user or per-process state directory with mode 0700, rather than placing the state file directly in a shared temporary directory.
  2. Generate an unpredictable per-session filename with mkdtempSync() or equivalent secure temporary-file functionality.
  3. Create the state file atomically with exclusive-creation semantics, such as O_CREAT | O_EXCL, and mode 0600.
  4. Reject preexisting files, symbolic links, and non-regular files. Where supported, use O_NOFOLLOW.
  5. Verify through fstat() that the opened file is owned by the current user, is a regular file, and has no group or other permissions.
  6. Keep and use the securely opened file descriptor instead of repeatedly reopening a pathname that can be replaced.
  7. Avoid merging untrusted preexisting state. Authenticate or strictly validate all loaded fields and bind state to the current process or workflow.
  8. Ensure cleanup securely removes the per-session state and reports deletion failures without exposing the token in logs.
  9. Consider storing the session token in memory only when workflow resumption is not required. If persistence is necessary, use an operating-system credential store or encrypted per-user storage.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (27)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- ዋናው ስክሪፕት `scripts/powpow-register.mjs`፦ **ዜሮ ጥገኛነት**፣ **Node ≥ 18** ያስፈልገዋል። ከመጀመር በፊት አካባቢው እንደሚሠራ ለማረጋገጥ አንዴ `node scripts/powpow-register.mjs status` ያሂዱ።

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The file is written entirely in Amharic, and the SKILL.md description explicitly mentions 'language specifications' as part of the main instructions. There is no visible statement in this README that users may choose another language or that the language restriction is region-specific and justified, which can violate language/locale choice policy.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill clearly instructs the agent to use network access and environment variables, and later to invoke scripts and external services, but it declares no explicit tool scope or allowed-tools boundary. That creates an authorization gap where the host agent may permit broader capabilities than users or reviewers expect, especially for a workflow that handles email, passwords, login links, and payment-related actions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill is designed to collect sensitive personal data including email, password, optional avatar, and potentially phone number, then transmit them to a remote service, but it does not present a clear upfront privacy warning or consent notice. In a registration-and-payment skill, this omission makes social engineering and uninformed disclosure materially more likely.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill directs the agent to execute OS-level commands like start/open/xdg-open to launch a locally generated payment page in the user's browser. Triggering local OS commands from a conversational skill increases the attack surface because file paths, handlers, or shell invocation behavior can be abused or produce unintended execution on the host environment.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The instruction says to follow PowPow's standard service language, which imposes a language/locale requirement in the conversation UX. The file does not offer the user a language choice or explain a justified region-specific constraint for forcing that language.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The documentation assures users that their data is never sent to third-party addresses, yet elsewhere instructs opening Bilibili and Alipay/PayPal pages. Even if core registration data targets the PowPow domain, this contradictory privacy claim can mislead users into consenting to a flow that does involve third-party services and associated metadata disclosure.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The listing description markets broader social/mapping and 'digital humans' capabilities than the skill metadata says it actually performs. This is dangerous because it misrepresents functionality to users and reviewers, potentially causing users to invoke the skill for actions outside its real scope and obscuring the fact that it performs sensitive agent-driven registration, login, and payment-adjacent actions.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The search keywords advertise social/map/travel-note features that do not match the declared registration-focused behavior. Misleading discovery metadata can route unrelated users into a skill that handles account creation and payment-related flows, increasing consent and transparency risks and making the skill easier to disguise during review.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This manifest explicitly sets the skill language to "am" while other user-facing metadata mixes Amharic and Chinese, and there is no indication that users can opt into another language or that the skill is region-specific. That creates a natural-language policy concern because the skill appears to enforce a specific language/locale without user choice.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The document is written entirely in Amharic, with some embedded Chinese phrases, and does not indicate that the user can choose their preferred language or locale. The policy requires flagging language or locale constraints when they are imposed without user opt-in or clear justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The file’s operational instructions are entirely in Amharic, while also embedding a few fixed English UI strings, and it does not state that language selection is optional or user-configurable. Under the policy rule, forcing a specific language or locale without opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This markdown file is written entirely in Amharic, while multiple embedded user-facing error strings and messages are in Chinese, and nowhere does it state that language selection is optional or region-specific. That creates a natural-language locale policy concern because the skill documentation appears to require fixed languages rather than offering user opt-in or explaining a justified locale constraint.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

All user-facing operational guidance in this file is presented in a single language, and the document does not indicate that the language is optional or limited to a specific regional deployment. This can violate language/locale policy when users or operators are not given a choice.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The guidance instructs the agent to proactively send screenshots whenever the user expresses general curiosity about the product or asks what it looks like, which broadens activation beyond tightly scoped registration support. In a chat agent, this can cause unnecessary file sharing in ordinary conversation, increasing the chance of context-inappropriate actions and accidental disclosure of bundled or fallback-hosted assets.

Content

No source excerpt is available for this finding.