Back to skill

Security audit

PowPow Pendaftaran — daftar Gelembung, sematkan catatan perjalanan ke peta, ngobrol dengan manusia digital

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent PowPow registration helper, but it handles passwords, email codes, payment setup, and reusable login tokens in ways users should review carefully before installing.

Install only if you are comfortable letting the agent help create a PowPow account, temporarily handle your password or generated password, receive your email verification code, and create login/payment links. Treat generated login links like passwords, avoid sharing screenshots or logs containing them, run cleanup when done, and prefer the manual web flow on shared machines or privacy-sensitive systems.

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 Permits Cross-User Session Disclosure and State Injection

Content
View full analysis

Vulnerability Details

File Location: scripts/powpow-register.mjs, lines 39–56 and 203–210
Vulnerability Type: Unsafe temporary file handling
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';

// ---------- 状态文件 ----------

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 sensitive session token is subsequently written to this fixed path:

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(),
});

Technical Analysis

The script stores workflow state at the fixed path os.tmpdir()/powpow-register-state.json. This state includes the user's email, account identifiers, order information, and authenticated PowPow JWT.

The mode: 0o600 option only reliably controls permissions when Node.js creates a new file. When the pathname already resolves to an existing file, writeFileSync truncates and writes that file without changing its existing permissions. The operation also does not explicitly reject symbolic links or verify that the existing object is a regular file owned by the current user.

On a multi-user host where the temporary directory is shared and operating-system hardening does not independently block the operation, another local user can prepare the predictable pathname as an attacker-readable and victim-writable file. The victim's registration process then writes its authe ...[truncated 2327 chars]

Remediation
View remediation

Remediation Suggestions

  1. Create a private, unpredictable per-user or per-workflow directory with mkdtempSync, set directory permissions to 0700, and place the state file inside that directory.
  2. Pass the randomized state location between invocations through a protected configuration mechanism rather than using one global filename.
  3. Create state files atomically with exclusive creation semantics, such as O_CREAT | O_EXCL, and fail if an unexpected object already exists.
  4. Where supported, use no-follow semantics and verify with lstat or fstat that the object is a regular file, is owned by the current effective user, and is not hard-linked unexpectedly.
  5. Open the file descriptor first, enforce mode 0600 with fchmod, and write through that validated descriptor instead of reopening a pathname.
  6. Use atomic replacement within the private directory for updates, while ensuring replacement cannot cross a symlink boundary.
  7. Keep separate state files for concurrent workflows so one registration cannot consume another user's or another invocation's account and payment state.
  8. Continue deleting state at workflow completion, but treat cleanup as defense in depth rather than the primary confidentiality control.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (22)

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

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
- Skrip utama `scripts/powpow-register.mjs`: **nol dependensi**, butuh **Node ≥ 18**. Sebelum mulai, jalankan sekali `node scripts/powpow-register.mjs status` u

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The login-link command places the session token directly in the URL query string, which can leak through browser history, clipboard sharing, logs, analytics, Referer headers, screenshots, and intermediary systems. Because the token is a bearer credential, anyone who obtains the URL may be able to hijack the user's authenticated session.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README explicitly describes agent-handled registration, profile photo upload, email verification handling, and optional payment/subscription monitoring, but it does not clearly disclose the privacy implications of transmitting personal data and account-linked metadata to the third-party service. In this context, users may provide email, profile image, usernames, and payment-adjacent information without informed consent about what is sent, retained temporarily, or exposed to the agent workflow.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill explicitly instructs the agent to collect or generate a password, receive the user's email verification code, create login links, and even open payment pages on the user's system, but the top-level description does not clearly warn users about these sensitive actions. That omission undermines informed consent and increases the chance a user will disclose credentials or authorize local/browser actions without realizing the agent will handle them directly.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The document directs an agent to collect and transmit sensitive user data including email, username, password-derived credentials, JWTs, and payment-related identifiers to an external service, but it does not require an explicit user-facing notice or consent checkpoint before those transmissions occur. In an agentic workflow, this omission is dangerous because users may not realize the assistant is facilitating account creation, authentication, and payment operations against a third-party platform, increasing privacy, compliance, and trust risks.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

These lines mandate a fixed communication style and include required closing blocks in Indonesian, but do not provide opt-in, fallback, or rationale for restricting language/locale. That is a natural-language policy issue because it forces a specific language behavior regardless of user preference.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The file is primarily written in Indonesian but includes user-facing strings such as "You're All Set!", "No subscription plans available", and Chinese guillemet-quoted text, indicating a fixed multilingual presentation. Under the policy rule, forcing or assuming specific languages without explicit user opt-in or documented regional justification is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The header comment describes status as 不含任何凭据 and says the state file stores only limited workflow data, but cmdStatus() only removes token before printing the rest of the state. That means fields like email, username, userId, outTradeNo, subscriptionId, and approveUrl can still be exposed despite the documentation implying a non-credential-safe status view.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script persists the session token to a predictable file in the system temp directory so later commands can reuse it. Even with mode 0600, storing bearer tokens on disk increases exposure to local compromise, accidental backup/log collection, or other processes/users that can read the file in shared or weakly isolated environments.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

Natural-language policy issues apply to all file types, including markdown. This README presents the skill entirely in Indonesian and does not indicate that users may choose another language or that the locale is intentionally restricted for a justified region-specific use case.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The file title and all procedural content are written in Indonesian, while also embedding some Chinese error strings, but there is no natural-language indication that users may choose another language or that the locale restriction is intentional and justified. Under the stated policy, forcing a specific language without opt-in can be a locale-policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

文件中的帮助文本、错误提示和操作说明几乎全部固定为中文,属于用户交互层面的语言强制。代码中未见用户可选语言机制,也未明确声明该工具仅面向特定中文用户群或区域场景。

Content

No source excerpt is available for this finding.