Low Risk — Risk Score 18/100
Last scan:2 days ago Rescan
18 /100
category-collector
Shopify 网店分类链接采集器 - 从导航结构提取真实分类层级,处理 Ajax 懒加载,输出 CSV
Legitimate Shopify category scraper with benign code; pre-scan HIGH flag on hardcoded IP was a false positive (Chrome version string in User-Agent). Minor doc/code mismatch on declared permissions.
Skill Namecategory-collector
Duration88.2s
Enginepi
Safe to install
The skill is safe for use. Consider updating SKILL.md to remove the 'exec' tool declaration since no shell execution is present, and trim the 7 near-identical scripts to a single entry point.

Findings 4 items

Severity Finding Location
Low
Pre-scan HIGH IOC was a false positive
The hardcoded IP '120.0.0.0' flagged at collect-ajax.js:38 is actually the Chrome version number (120.0.0.0) embedded in the User-Agent string, not a network IP address. This pattern appears identically in all 5 collect*.js files.
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
→ No action needed — false positive. ClawSafe pre-scan pattern for IP addresses should be refined to exclude version numbers in User-Agent strings.
collect-ajax.js:38
Low
SKILL.md declares 'exec' tool but no shell execution is used
The allowed-tools list includes 'exec' (mapping to shell:WRITE), but no child_process, exec, spawn, or execSync calls exist in any of the JavaScript files. The skill only uses Node.js fs and Playwright APIs.
allowed-tools: exec, read, write, edit
→ Remove 'exec' from allowed-tools or add a comment explaining why it is declared if the code genuinely uses it. Alternatively, add 'browser' to the allowed-tools list since Playwright is the actual capability used.
SKILL.md:2
Low
Browser resource not declared in allowed-tools
All scraper scripts heavily use Playwright (browser automation): launching Chromium, navigating pages, hovering to trigger Ajax menus, taking screenshots. The 'browser' resource is not declared in allowed-tools.
const browser = await chromium.launch({ headless: false, timeout: 60000 })
→ Add 'browser' to allowed-tools: browser (maps to browser:WRITE for Playwright usage).
collect.js:33
Info
5 nearly identical script variants suggest messy development artifacts
collect.js, collect-ajax.js, collect-correct.js, collect-correct-hover.js, and collect-improved.js share >80% identical code. This is not a security issue but reduces maintainability and could confuse users about which script to run.
Multiple files with identical structure: collectCategories() + extractNavigationStructure() + generateCSV()
→ Consolidate into a single collect.js with a --method flag or remove the intermediate development versions.
collect.js, collect-ajax.js, collect-correct.js, collect-correct-hover.js, collect-improved.js:1
ResourceDeclaredInferredStatusEvidence
Filesystem WRITE WRITE ✓ Aligned fs.writeFileSync / fs.mkdirSync used in all collect*.js files for CSV and screen…
Network READ READ ✓ Aligned page.goto() fetches user-supplied URLs; no external data exfiltration found
Shell WRITE NONE ✗ Violation SKILL.md declares 'exec' but no child_process/exec/spawn/execSync found in any .…
Browser NONE WRITE ✗ Violation chromium.launch(), page.hover(), page.screenshot() used in all collect*.js files…
Environment NONE NONE No os.environ iteration or env key access found
Skill Invoke NONE NONE No inter-skill invocation found
Clipboard NONE NONE No clipboard read/write found
Database NONE NONE No database access found
1 High 8 findings
📡
High IP Address 硬编码 IP 地址
120.0.0.0
collect-ajax.js:38
🔗
Medium External URL 外部 URL
https://shop.futvortexstore.com/
README.md:36
🔗
Medium External URL 外部 URL
https://lulumonclick-eu.shop/collections/women-women-clothes-tank-tops
README.md:58
🔗
Medium External URL 外部 URL
https://shop.futvortexstore.com/collections/liverpool
SKILL.md:63
🔗
Medium External URL 外部 URL
https://.../collections/premier-league/liverpool
collect-correct-hover.js:299
🔗
Medium External URL 外部 URL
https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz
package-lock.json:20
🔗
Medium External URL 外部 URL
https://registry.npmmirror.com/playwright/-/playwright-1.58.2.tgz
package-lock.json:34
🔗
Medium External URL 外部 URL
https://registry.npmmirror.com/playwright-core/-/playwright-core-1.58.2.tgz
package-lock.json:52

File Tree

12 files · 60.2 KB · 2107 lines
JavaScript 7f · 1832L Markdown 2f · 174L JSON 3f · 101L
├─ 📜 collect-ajax.js JavaScript 351L · 10.1 KB
├─ 📜 collect-correct-hover.js JavaScript 327L · 9.2 KB
├─ 📜 collect-correct.js JavaScript 321L · 8.9 KB
├─ 📜 collect-improved.js JavaScript 336L · 9.4 KB
├─ 📜 collect.js JavaScript 346L · 10.3 KB
├─ 📜 debug-liverpool.js JavaScript 82L · 2.5 KB
├─ 📜 debug-nav.js JavaScript 69L · 1.8 KB
├─ 📋 package-lock.json JSON 63L · 1.7 KB
├─ 📋 package.json JSON 22L · 491 B
├─ 📝 README.md Markdown 78L · 2.1 KB
├─ 📋 setup.json JSON 16L · 478 B
└─ 📝 SKILL.md Markdown 96L · 3.0 KB

Dependencies 1 items

PackageVersionSourceKnown VulnsNotes
playwright ^1.40.0 npm No Version range not pinned, minor version updates could introduce breaking changes

Security Positives

✓ No child_process/exec/spawn usage — the skill is pure Node.js/Playwright
✓ No credential harvesting or environment variable enumeration
✓ No data exfiltration — network calls are only to user-supplied URLs
✓ No base64/eval/atob deobfuscation patterns
✓ No sensitive path access (~/.ssh, ~/.aws, .env files)
✓ No curl|bash or wget|sh remote script execution
✓ No hidden functionality — all behavior matches the stated purpose
✓ No HTML comment injection or steganography
✓ No C2 infrastructure, reverse shells, or suspicious outbound connections