Back to skill

Security audit

PowPow التسجيل — سجّل في فقاعة، ثبّت يوميات السفر على الخريطة وتحدث مع الأشخاص الرقميين

Security checks for vulnerabilities and agentic risk

Overview

This skill mostly matches its registration purpose, but it stores a login token in a predictable temporary file and should be reviewed before installation.

Install only if you are comfortable letting the agent create a PowPow account, handle your email verification code, generate or receive a password, store a temporary login token locally, and open official Alipay or PayPal payment pages if you choose to upgrade. Prefer using it on a single-user machine, run cleanup at the end, and avoid using it where other local users could access shared temp files.

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:39
Finding

Predictable Shared Temporary State File Can Expose Session Credentials

Content
View full analysis

Vulnerability Details

File Location: scripts/powpow-register.mjs, lines 39–56 and 203–211
Vulnerability Type: Predictable insecure temporary file containing an authentication token
Risk Level: Medium

Vulnerable Code

js
const BASE_URL = 'https://global.powpow.online';
const STATE_FILE = join(tmpdir(), 'powpow-register-state.json');
const PASSWORD_ENV = 'POWPOW_REGISTER_PASSWORD';

// ---------- State file ----------

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;
}

The session token is subsequently written through this function:

js
const token = r.cookies['powpow_token'] || '';
if (!token) die('Registration succeeded but no session cookie was captured');
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(),
});

Technical Analysis

The state file uses a fixed, globally predictable name under the operating system's shared temporary directory:

text
<system temporary directory>/powpow-register-state.json

Although writeFileSync specifies mode 0600, that mode primarily controls permissions when a new file is created. It does not safely claim the path, verify ownership, reject an existing attacker-owned file, or enforce the requested permissions on a file that already exists.

On a multi-user system where shared temporary-directory protections do not block this operation, a local attacker can pre-create the predictable path as an attacker-owned regular file with permissions that allow the Skill process to write it. When registration succeeds ...[truncated 2262 chars]

Remediation
View remediation

Remediation Suggestions

  1. Create a private per-user or per-run directory with mode 0700, preferably under an application-specific user data directory rather than a shared temporary directory.
  2. Use a cryptographically unpredictable directory name created with mkdtempSync, and retain its path only for the current workflow.
  3. Create the state file atomically with exclusive creation semantics such as O_CREAT | O_EXCL, and reject the operation if the path already exists unexpectedly.
  4. Use no-follow semantics where supported to prevent symbolic-link traversal.
  5. Before every read, write, or deletion, verify with lstat or an opened file descriptor that the object is a regular file, is owned by the current effective user, and is not linked unexpectedly.
  6. Explicitly enforce mode 0600 on the opened file rather than relying only on the creation mode.
  7. Write updates to a securely created file in the same private directory and atomically rename it into place.
  8. Keep the existing cleanup operation, and additionally remove the private state directory after deleting its contents.
  9. Consider avoiding persistent storage of the JWT entirely when the workflow can keep it in process memory.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (21)

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 skill description and operating instructions are presented entirely in Arabic, with no indication that users may choose another language or locale. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is explicitly justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill collects and processes sensitive data including email, password, optional avatar/phone, and may later direct the user into payment flows, yet it explicitly discourages proactive security warnings and does not prominently obtain informed consent up front. In a delegated registration flow, that omission increases the risk of users oversharing credentials or following external verification/payment steps without understanding the privacy and session implications.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The manifest sets the language to 'ar', which appears to constrain the skill to Arabic without any indication of user opt-in or a documented region-specific justification. Under the language/locale policy, forcing a specific language can be a policy concern unless the restriction is clearly optional or justified.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The notes describe broad agent-driven actions such as sending verification codes, registering, ordering, and automatically shifting to a payment path, but they do not define clear user-trigger boundaries or consent checkpoints. In an agent ecosystem, vague activation scope can cause the skill to initiate sensitive account or commerce actions with insufficient confirmation, increasing the risk of unintended registrations, purchases, or payment-related flows.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This file contains user-facing guidance and quoted UI messages in multiple fixed languages, including Chinese strings embedded in an otherwise Arabic document. Under the policy rule, forcing or assuming a specific language without user opt-in is a natural-language locale violation unless the locale restriction is clearly justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Natural-language policy issues apply to all file types, including markdown. This document consistently instructs operation in Arabic and provides no indication that users can opt into another language or that the skill is intentionally limited to Arabic-speaking contexts.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file’s natural-language interface is entirely in Chinese, including usage text, status/error messages, and operational instructions. This imposes a specific language on users without any visible opt-in or alternative locale, which matches the language/locale policy-violation category.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The header comment makes a concrete data-minimization claim that the state file stores only a small set of fields, but the implementation persists additional account, payment, and timestamp metadata. This mismatch can mislead operators and downstream automation about what sensitive data is retained, increasing privacy and compliance risk if the temp-file contents are exposed or handled under incorrect assumptions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

This markdown skill directs the agent to send local screenshots and later send one-click login links, but it does not clearly warn the user that clicking such links will authenticate them or that externally hosted fallback screenshots may be used if local assets are missing. Because the skill performs user-affecting actions inside the conversation, a brief disclosure would improve transparency.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

In the payment flow, the markdown tells the operator to run start <ملف صفحة الدفع> / open / xdg-open, which triggers a local file launch and sends the user into an external payment or authorization flow. While the broader document explains payment behavior, this step does not itself include a clear warning or caution about opening the file in the user's browser and transitioning to an external payment session.

Content

No source excerpt is available for this finding.