Back to skill

Security audit

skill-kit

Security checks for vulnerabilities and agentic risk

Overview

The skill is not clearly malicious, but its hook compiler can persistently register automatic scripts from installed skills with weak trust controls.

Install only if you need advanced skill maintenance and hook automation. Before running trigger compile, remove untrusted skills, run dry-run first, inspect the generated hook files and ~/.claude/settings.json changes, and avoid action: script triggers unless you trust the exact skill and script content.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/trigger-compile.sh:356
Finding

Untrusted Installed Skills Can Register Persistent Automatic Script Execution

Content
View full analysis

Vulnerability Details

File Location: scripts/trigger-compile.sh, lines 17–21, 40–55, 356–360, 394–400, 417, and 469
Vulnerability Type: Persistent execution of third-party Skill scripts without a trust allowlist
Risk Level: High

Complete Code Snippet

bash
SKILLS_DIRS=()
if [[ -d "$REPO_ROOT/skills" ]]; then
  SKILLS_DIRS+=("$REPO_ROOT/skills")
fi
SKILLS_DIRS+=("$HOME/.claude/skills")
for _mp in "$HOME/.claude/plugins/marketplaces"/*/skills; do
  [[ -d "$_mp" ]] && SKILLS_DIRS+=("$_mp")
done
bash
validate_trigger() {
  local skill_dir="$1" skill="$2" action="$3" scriptpath="$4"
  if [[ "$action" == "script" ]]; then
    if [[ -z "$scriptpath" ]]; then
      echo "ERROR: scriptpath is empty for skill '$skill'" >&2
      exit 1
    fi
    if [[ "$scriptpath" == /* ]] || [[ "$scriptpath" == *..* ]]; then
      echo "ERROR: scriptpath '$scriptpath' contains absolute path or path traversal (..) for skill '$skill'" >&2
      exit 1
    fi
    local local_script_path="$skill_dir/$scriptpath"
    if [[ ! -f "$local_script_path" ]]; then
      echo "ERROR: script file '$local_script_path' not found for skill '$skill'" >&2
      exit 1
    fi
  fi
}
bash
script+="// dispatch to skill-owned resource script; pass hook stdin through
{
  const { spawnSync } = require('child_process');
  const scriptPath = path.join($(js_str "$skilldir"), $(js_str "$scriptpath"));
  const __interpreter = scriptPath.endsWith('.js') ? 'node' : 'bash';
  const __t0 = Date.now();
  const result = spawnSync(__interpreter, [scriptPath], { input: INPUT, encoding: 'utf8', timeout: 8000 });
bash
echo "$script" > "$output_file"
chmod +x "$output_file"

local hook_cmd="node ~/.claude/hooks/trigger-${event}.js"
...
cp "$tmp_settings" "$SETTINGS"

Technical Analysis

The compiler scans not only repository-controlled Skills, but also all Skills under the user's installation directory and every discovered marketplace. A Skill declaring action: script ...[truncated 2387 chars]

Remediation
View remediation

Remediation Suggestions

  1. Do not enable action: script for marketplace or globally installed Skills by default.
  2. Maintain an explicit allowlist of trusted Skill directories, publishers, or immutable package identities.
  3. Before registration, show each script's resolved path, owning Skill, event, and cryptographic hash.
  4. Require explicit confirmation for every newly discovered or changed script trigger.
  5. Persist approvals against a content hash so an updated script cannot inherit approval for an older version.
  6. Resolve the script with realpath and verify that the final target remains inside the approved Skill directory, including when symlinks are present.
  7. Provide a mode that only compiles declarative suggest and block actions while rejecting executable script actions.
  8. Record provenance in the generated dispatcher and refuse conflicting or duplicate Skill identities from different sources.
  9. Prefer a constrained subprocess environment with a minimal environment-variable allowlist and restricted filesystem/network access where platform sandboxing is available.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/trigger-compile.sh:322
Finding

Skill Directory Name Injection Allows Arbitrary JavaScript in Generated Hooks

Content
View full analysis

Vulnerability Details

File Location: scripts/trigger-compile.sh, lines 65 and 322–324
Vulnerability Type: JavaScript source injection through an unescaped filesystem basename
Risk Level: Medium

Complete Code Snippet

bash
local skill_name
skill_name=$(basename "$skill_dir")
bash
case "$action" in
  suggest)
    script+="console.log('<skill-trigger name=\"$skill\">');
console.log($(js_str "$message"));
console.log('Call the Skill(\"$skill\") tool.');
console.log('</skill-trigger>');
"
    ;;

The generated source is subsequently persisted:

bash
echo "$script" > "$output_file"
chmod +x "$output_file"

Technical Analysis

The Skill name is taken directly from the Skill directory basename. No slug validation is applied before this value is inserted into JavaScript source.

Other generated values, such as messages and paths, are serialized through js_str, which uses jq to produce a valid JavaScript string literal. The Skill name in the suggest branch does not use this serializer. It is directly interpolated into two single-quoted JavaScript strings.

A directory basename may contain quotes, parentheses, and semicolons on supported filesystems. A crafted name can therefore terminate the generated string, insert JavaScript statements, and open another string to absorb the fixed suffix. For example, a basename shaped like the following demonstrates the injection grammar:

text
x');require('child_process').execFileSync('id');console.log('x

This transforms the generated hook into executable JavaScript containing execFileSync('id'). The same construction remains syntactically valid at both unescaped interpolation sites.

The compiler runs node --check only after writing and registering the generated hook. Syntax validation does not detect syntactically valid injected JavaScript.

Attack Path

  1. An attacker supplies an installed Skill whose directory basename contains JavaScript string-breaking characte ...[truncated 1092 chars]
Remediation
View remediation

Remediation Suggestions

  1. Enforce a strict Skill slug format before processing any declaration, for example:
    bash
    if [[ ! "$skill_name" =~ ^[a-z0-9][a-z0-9_-]*$ ]]; then
      echo "ERROR: invalid skill name: $skill_name" >&2
      exit 1
    fi
    
  2. Serialize every value inserted into generated JavaScript with js_str, including Skill names and event names.
  3. Avoid constructing executable source through shell string concatenation. Generate a structured data table with JSON and use a fixed dispatcher implementation to interpret that data.
  4. Validate both declared frontmatter name and directory basename, and reject mismatches.
  5. Perform all validation before writing hook files or updating settings.json.
  6. Write generated files to a temporary location, validate them, and atomically install them only after every check succeeds.
  7. Add regression tests using directory names containing quotes, newlines, backslashes, parentheses, and semicolons.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (138)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

If the implementation is actually a static linter/security scanner while claiming a much broader skill-management suite, that is a substantial description-behavior mismatch. More importantly, undeclared security auditing and shell-pattern scanning can inspect content users did not expect to expose, while the claimed auto-fix behavior may create false trust in unsupported actions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

If the implementation is actually a static linter/security scanner while claiming a much broader skill-management suite, that is a substantial description-behavior mismatch. More importantly, undeclared security auditing and shell-pattern scanning can inspect content users did not expect to expose, while the claimed auto-fix behavior may create false trust in unsupported actions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

If the implementation is actually a static linter/security scanner while claiming a much broader skill-management suite, that is a substantial description-behavior mismatch. More importantly, undeclared security auditing and shell-pattern scanning can inspect content users did not expect to expose, while the claimed auto-fix behavior may create false trust in unsupported actions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

If the implementation is actually a static linter/security scanner while claiming a much broader skill-management suite, that is a substantial description-behavior mismatch. More importantly, undeclared security auditing and shell-pattern scanning can inspect content users did not expect to expose, while the claimed auto-fix behavior may create false trust in unsupported actions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

If the implementation is actually a static linter/security scanner while claiming a much broader skill-management suite, that is a substantial description-behavior mismatch. More importantly, undeclared security auditing and shell-pattern scanning can inspect content users did not expect to expose, while the claimed auto-fix behavior may create false trust in unsupported actions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

If the implementation is actually a static linter/security scanner while claiming a much broader skill-management suite, that is a substantial description-behavior mismatch. More importantly, undeclared security auditing and shell-pattern scanning can inspect content users did not expect to expose, while the claimed auto-fix behavior may create false trust in unsupported actions.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 24)May include surrounding context.

md
| language | Enforce per-skill language consistency (description-language rule + Edit/Write pre-check) | [language.md](./language.md) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 25)May include surrounding context.

md
| lint | Validate and fix SKILL.md frontmatter | [lint.md](./lint.md) |

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · convert.md (reported line 17)May include surrounding context.

bash
# Global agent
cat ~/.claude/agents/<agent-name>.md

# Project agent
cat .claude/agents/<agent-name>.md

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · convert.md (reported line 20)May include surrounding context.

cat ~/.claude/agents/.md

Project agent

cat .claude/agents/.md

text

### 2. Conversion Rules

Self-Modification

High
Category
Rogue Agent
Confidence
86% confidence
Finding

The skill directs creation of a new persistent SKILL.md artifact in the user's Claude skills directory, which is a form of self-modification/persistence. While that is core to the feature, persistence in an agent-executed environment is security-sensitive because it can permanently change future assistant behavior if the converted content is unsafe or malformed.

Content

Scanner excerpt · convert.md (reported line 38)May include surrounding context.

md
Follow the [writer.md](./writer.md) guide to create the skill structure:

1. Create folder: `mkdir -p ~/.claude/skills/<skill-name>/scripts`
2. Write SKILL.md (frontmatter + body)
3. Copy scripts and `chmod +x`

### 4. Move Original

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · dedup.md (reported line 21)May include surrounding context.

Extract skill names from frontmatter:

bash
grep -h "^name:" ~/.claude/skills/*/SKILL.md 2>/dev/null | sed 's/name: *//' | sort -u

Step 2: Get Plugin Skill Names

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · dedup.md (reported line 27)May include surrounding context.

Step 2: Get Plugin Skill Names

bash
grep -rh "^name:" ~/.claude/plugins/marketplaces/*/plugins/*/skills/*/SKILL.md 2>/dev/null | sed 's/name: *//' | sort -u

Step 3: Find Duplicates

Anti-Refusal Statement

High
Category
Anti-Refusal
Confidence
80% confidence
Finding

Skill instructs the agent to omit warnings, disclaimers, or ethical commentary. Stripping safety caveats hides risk from the user and is a common jailbreak preamble.

Content

Scanner excerpt · invoke-discipline.md (reported line 129)May include surrounding context.

md
1. `bash <hook-kit-skill>/resources/workspace-config.sh --export`
2. Read `WSCFG_<ROLE>_KIND` for the role in question (`RAG`, `BACKLOG`, `CHECKLIST`, …)
3. Branch:
   - unset / `none` / resolver unavailable → skip quietly, no warning, no ask
   - set → dispatch using the accompanying `WSCFG_<ROLE>_*` values
   - caller passed an explicit `--<verb>=<skill>:<topic>` → that override wins

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · language.md (reported line 62)May include surrounding context.

md
## Hook installed

- Script: `~/.agents/skills/hook-kit/resources/edit-guard.sh` — function `check_skill_language_mismatch()` (consolidated from the retired standalone `block-skill-language-mismatch.sh`, now in `~/.claude/.bak/`)
- Registration: PreToolUse:Edit and PreToolUse:Write matchers in `~/.claude/settings.json` reference `edit-guard.sh` directly (no separate install copy)
- Scope: only `.md` files under `*/skills/<name>/`. Code/data files unaffected
- Detection: zero Hangul in SKILL.md `description` → strict mode (any Hangul in `NEW_CONTENT` → DENY exit 2). Hangul in description → permissive (Korean skills may include English technical terms)
- Quote handling: user quotes must be paraphrased into English before pasting into English skill files. The hook does not distinguish quote vs body content

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · trigger.md (reported line 196)May include surrounding context.

md
## Hook installed

- Script: `~/.agents/skills/hook-kit/resources/edit-guard.sh` — function `check_skill_language_mismatch()` (consolidated from the retired standalone `block-skill-language-mismatch.sh`, now in `~/.claude/.bak/`)
- Registration: PreToolUse:Edit and PreToolUse:Write matchers in `~/.claude/settings.json` reference `edit-guard.sh` directly (no separate install copy)
- Scope: only `.md` files under `*/skills/<name>/`. Code/data files unaffected
- Detection: zero Hangul in SKILL.md `description` → strict mode (any Hangul in `NEW_CONTENT` → DENY exit 2). Hangul in description → permissive (Korean skills may include English technical terms)
- Quote handling: user quotes must be paraphrased into English before pasting into English skill files. The hook does not distinguish quote vs body content

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · trigger.md (reported line 216)May include surrounding context.

md
## Hook installed

- Script: `~/.agents/skills/hook-kit/resources/edit-guard.sh` — function `check_skill_language_mismatch()` (consolidated from the retired standalone `block-skill-language-mismatch.sh`, now in `~/.claude/.bak/`)
- Registration: PreToolUse:Edit and PreToolUse:Write matchers in `~/.claude/settings.json` reference `edit-guard.sh` directly (no separate install copy)
- Scope: only `.md` files under `*/skills/<name>/`. Code/data files unaffected
- Detection: zero Hangul in SKILL.md `description` → strict mode (any Hangul in `NEW_CONTENT` → DENY exit 2). Hangul in description → permissive (Korean skills may include English technical terms)
- Quote handling: user quotes must be paraphrased into English before pasting into English skill files. The hook does not distinguish quote vs body content

Self-Modification

High
Category
Rogue Agent
Confidence
85% confidence
Finding

Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Content

Scanner excerpt · lint.md (reported line 72)May include surrounding context.

md
|---|---------------------------|---------------------------|---------------------|
| 1 | Append new topic description without measuring current length | `wc -c` or awk-length check before Edit; if `current + new > 1024`, compress first | claude-session: 1480 → 1547 over limit |
| 2 | Locale-mix in description (English skill with non-English keywords, or vice versa) | Single locale only. **English skill = 0 non-English keywords** (no "core noun" exception). Non-English skill = native keywords primary, English allowed only for proper nouns/technical terms (Vault, ArgoCD, K3s, etc.). See `opensource.md` "Skill language = description language" HARD STOP | ralph: an English keyword paired with two transliterated synonyms (`"ralph update"+"ralph <update-localized>"+"ralph <latest-localized>"`) → If ralph is an English skill, keep only the English form. If localized, keep only one localized form. No mix. |
| 3 | Multiple English synonym variants for the same action | One canonical verb + one canonical noun. No `"X fix"+"fix X"+"update X"+"modify X"` chains | skill-kit: `"skill upgrade"+"skill fix"+"fix skill"+"update skill"` → `"skill upgrade"` only |
| 4 | Topic description over 40 chars or with Step numbers / parenthetical context | Topic description = `<topic> - <one-liner ≤ 40 chars>`. Move Step numbers / nested context to topic .md | consolidate: `internal - Step 3.5 Internal Code Review fallback (CodeRabbit Free walkthrough only / Copilot failure) + Step 4.5 UI capture verification` → `internal - CodeRabbit fallback review` |
| 5 | Append `[filename.md]` to topic descriptions | Topics table already has the file path. description has topic + one-liner only | github-flow: 8x `[xxx.md]` removed (~100 chars saved) |
| 6 | Verbose prose context inside description (full sentences, "Applies to..." paragraphs) | description = one-line skill purpose + topic enumeration + Use when. Prose belongs in topic .md or SKILL.md body | code-workflow: `Applies to all tasks requiring co
...[truncated 25 chars]

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · lint.md (reported line 261)May include surrounding context.

md
| Platform | Install uv |
|----------|------------|
| macOS | `brew install uv` |
| Linux | `f=$(mktemp) && curl -LsSf https://astral.sh/uv/install.sh -o "$f" && sh "$f"; rm -f "$f"` |
| Windows (PowerShell) | `irm https://astral.sh/uv/install.ps1 \| iex` — runs in user scope, no elevation needed |

If neither `uv` nor a viable installer is available in the current environment, **skip Step 0 and proceed with Step 1** — the custom rules below provide partial coverage only (description-length budget, depends-on order, hardlink scan), not the upstream spec enforcement. **Report the skip explicitly** with a risk statement naming which upstream checks were not exercised (e.g., "Step 0 skipped — `skills-ref` name-match and properties-JSON validation not run").

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · lint.md (reported line 285)May include surrounding context.

bash
# Missing required fields
find ~/.claude/skills -name "SKILL.md" ! -path "*.bak*" -exec sh -c \
  'head -10 "$1" | grep -q "^name:" || echo "name missing: $1"' _ {} \;

find ~/.claude/skills -name "SKILL.md" ! -path "*.bak*" -exec sh -c \

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · lint.md (reported line 288)May include surrounding context.

bash
# Missing required fields
find ~/.claude/skills -name "SKILL.md" ! -path "*.bak*" -exec sh -c \
  'head -10 "$1" | grep -q "^name:" || echo "name missing: $1"' _ {} \;

find ~/.claude/skills -name "SKILL.md" ! -path "*.bak*" -exec sh -c \

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · lint.md (reported line 296)May include surrounding context.

bash
# Missing required fields
find ~/.claude/skills -name "SKILL.md" ! -path "*.bak*" -exec sh -c \
  'head -10 "$1" | grep -q "^name:" || echo "name missing: $1"' _ {} \;

find ~/.claude/skills -name "SKILL.md" ! -path "*.bak*" -exec sh -c \

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · lint.md (reported line 292)May include surrounding context.

md
'head -10 "$1" | grep -q "^description:" || echo "description missing: $1"' _ {} \;

# Invalid fields
grep -r "^triggers:" ~/.claude/skills --include="SKILL.md" | grep -v ".bak"
grep -r "^tools:" ~/.claude/skills --include="SKILL.md" | grep -v ".bak"

# Frontmatter position (must start on line 1)

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · lint.md (reported line 293)May include surrounding context.

md
# Invalid fields
grep -r "^triggers:" ~/.claude/skills --include="SKILL.md" | grep -v ".bak"
grep -r "^tools:" ~/.claude/skills --include="SKILL.md" | grep -v ".bak"

# Frontmatter position (must start on line 1)
find ~/.claude/skills -name "SKILL.md" ! -path "*.bak*" -exec sh -c \

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% 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).

Content

Scanner excerpt · lint.md (reported line 643)May include surrounding context.

md
| `STR-03` | Structure | Resolves and verifies markdown topic references cited in SKILL.md | Warning |
| `SEC-01` | Security | Detects dangerous download-and-execute pipes (`curl`/`wget` piped to shell) | Error |
| `SEC-02` | Security | Scans for leaked credentials, GitHub tokens (`ghp_*`), AWS keys, or bearer tokens | Error |
| `SEC-03` | Security | Flags unconstrained recursive deletion commands (`rm -rf /`, `~`, `$HOME`) | Error |
| `SEC-05` | Security | Flags prompt injection or prompt-override instructions | Error |

### Usage

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/trigger-compile.sh:360