Back to skill

Security audit

Startup Guide

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a coherent Korean startup guide, but it tells agents to run shell commands with user-provided values without validation.

Review this skill before installing. It appears intended for Korean startup guidance, but agents should not execute its documented shell commands with raw user input; use a typed tool or sanitized argument array instead. Users should also treat legal, tax, funding, and permit outputs as informational and confirm them with official Korean agencies or qualified professionals.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
playbook.md:22
Finding
Shell Command Injection Through User-Controlled Industry or Law Name## Vulnerability Details **File Location**: `playbook.md`, lines 22–25 **Vulnerability Type**: Shell command injection **Risk Level**: High **Vulnerable Code**: ```markdown ### 2-1. 허가·신고 법령 → law-search 연계 ```bash bash skills/law-search/scripts/law_search.sh "[업종] 허가 신고" 5 bash skills/law-search/scripts/law_search.sh "[법령명]" 3 ``` ``` ### Technical Analysis The playbook directs the agent to interpolate an industry name or law name into a Bash command. The industry name is free-form user input required by the License Check workflow, as documented in `playbook.md:14` and `references/intent_router.md:27`. Double quotes do not make arbitrary text safe for shell evaluation. Bash still evaluates command substitutions such as `$(command)` and backtick expressions inside double-quoted strings. If the agent replaces either placeholder with untrusted input and executes the resulting command through a shell, the input can alter command evaluation. For example, an attacker-controlled industry value containing `$(attacker_command)` would cause Bash to execute `attacker_command` before invoking `law_search.sh`. The actual reachable impact depends on the privileges, environment, filesystem access, network access, and sandboxing of the agent runtime. ### Attack Path 1. An attacker submits a License Check request with a malicious industry or law-name value containing Bash command-substitution syntax. 2. The agent classifies the request as License Check and follows the data-collection procedure in `playbook.md`. 3. The agent substitutes the untrusted value into the documented shell command. 4. The command is passed to Bash for evaluation. 5. Bash evaluates the injected command substitution before running `law_search.sh`. 6. The injected command executes with the permissions of the agent process. ### Impact Assessment Successful exploitation permits arbitrary command execution within the agent runtime's security boundary. ...[truncated 732 chars]
Remediation
## Remediation Suggestions 1. **Avoid shell-string construction.** Invoke `law_search.sh` using a process API that accepts an argument array and does not start a shell. For example, pass the script path, search term, and result limit as separate arguments. 2. **Validate untrusted values.** Apply an allowlist appropriate for Korean and English industry or law names. Reject shell metacharacters, control characters, newlines, command substitutions, redirection operators, and unexpected path syntax. 3. **Use positional parameters if Bash is unavoidable.** Supply validated input as a positional parameter to a fixed script rather than inserting it into command text that Bash reevaluates. 4. **Do not rely on double quotes alone.** Explicitly document that placeholders must never be replaced in an evaluated command string. 5. **Apply least privilege.** Run the workflow in a sandbox with minimal filesystem permissions, no unnecessary credentials, restricted executable access, and outbound network controls. 6. **Add adversarial tests.** Test inputs containing `$(...)`, backticks, semicolons, pipes, redirections, newlines, quotes, and long malformed values, and verify that none are interpreted by a shell. 7. **Prefer a structured integration.** Expose the law-search functionality as a typed tool or API with a string parameter and numeric result limit instead of documenting raw shell commands.
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (12)

Vague Triggers

Medium
Confidence
90% confidence
Finding
The manifest advertises many broad trigger terms such as "창업", "법인", and "스타트업" that can appear in ordinary conversation, increasing the chance this skill is invoked when the user did not specifically request it. In a skill that routes into legal, tax, registration, and funding guidance, accidental activation can cause irrelevant or overconfident business advice to be surfaced in sensitive decision contexts.

Natural-Language Policy Violations

Medium
Confidence
78% confidence
Finding
The skill is written entirely in Korean and targets Korean government/business processes, but it does not explicitly declare a locale restriction or language negotiation behavior. This can lead to misuse by non-Korean users or in non-Korean contexts, causing misunderstood legal or administrative guidance, though the issue is primarily reliability and scope control rather than a direct security exploit.

Vague Triggers

Medium
Confidence
90% confidence
Finding
The trigger set for the startup checklist includes very common conversational phrases such as '뭐부터 해?' that can appear in many non-startup contexts. This can cause unintended routing into a business guidance skill, leading to irrelevant responses or accidental collection of business-related details from users who did not intend to invoke this domain.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The license-check intent uses generic phrases like '허가 필요해?' and '신고 해야 해?' that are broadly applicable across legal, administrative, and everyday situations. In this skill, that ambiguity is more dangerous because the response may present regulated-business compliance guidance, potentially confusing users and causing them to rely on the wrong workflow or authority.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The business verification intent includes colloquial language like '이 회사 살아있어?' which is broad and may match casual conversation unrelated to formal business-status lookup. Because this intent leads to company-info skill invocation and expects a 10-digit business number, accidental activation could prompt users for sensitive business identifiers or misroute unrelated queries into verification flows.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The file’s user-facing instructions, examples, and required disclaimer are all presented only in Korean. Under the language/locale policy, forcing a specific language without user opt-in can be a natural-language policy violation unless the locale restriction is explicitly justified.

Vague Triggers

Medium
Confidence
85% confidence
Finding
Several example utterances are broad and semantically close to normal conversation, while routing boundaries between intents are not clearly defined. This creates ambiguity that can misroute users to the wrong workflow or delegated skill, potentially producing incorrect regulatory, funding, or tax guidance.

Vague Triggers

Medium
Confidence
91% confidence
Finding
The Beginner Mode auto-switch is triggered by very common words like 'easily', 'it's my first time', or 'difficult', which can appear in many ordinary startup questions without meaning the user wants simplified routing. This can cause unintended intent downgrades or routing changes, reducing answer accuracy and making the skill easier to manipulate with trivial phrasing.

Natural-Language Policy Violations

Medium
Confidence
98% confidence
Finding
The entire markdown template is written in Korean and presents fixed Korean output formats, with no indication that users may choose another language or locale. This is a natural-language policy concern because it imposes a specific language by default rather than offering opt-in or documenting a justified regional restriction.

Natural-Language Policy Violations

Low
Confidence
78% confidence
Finding
The output text explicitly states "초보자 모드 강제," which indicates a fixed interaction mode imposed on the user rather than offering a choice. This is a natural-language policy concern because it forces a communication style without opt-in or an explicit user preference.

Natural-Language Policy Violations

Low
Confidence
88% confidence
Finding
All user-facing routing instructions and trigger phrases are presented exclusively in Korean, and the file does not state that the skill is intentionally limited to Korean-speaking users or a Korea-specific deployment context. This can amount to a language policy issue when no opt-in or documented justification is provided.

Natural-Language Policy Violations

Low
Confidence
90% confidence
Finding
This markdown file presents all guidance exclusively in Korean and does not state that the skill is Korea-specific or that language choice is intentional. Under the language/locale policy, forcing a specific language without user opt-in can be a natural-language policy violation.

Static analysis

No suspicious patterns detected.