Back to skill

Security audit

한국 연금/노후 설계

Security checks for vulnerabilities and agentic risk

Overview

This is mostly a coherent Korean pension-planning guide, but it includes unsafe guidance to pass a personal identifier through a shell command for a nonexistent pension lookup script.

Review before installing. The skill is not showing malicious behavior, but users should avoid entering resident registration numbers or similar personal identifiers into shell commands. Prefer official authenticated pension portals for exact estimates, and treat the skill's calculations as informational estimates rather than financial advice.

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

Warning
Location
playbook.md:22
Finding
Sensitive Personal Identifier Passed Through Command-Line Arguments<![CDATA[ ## Vulnerability Details **File Location**: `playbook.md`, lines 22–24 **Vulnerability Type**: Sensitive data exposure through process arguments **Risk Level**: Medium ### Vulnerable Code ```bash # 키 활성화 후 사용 # bash skills/pension-guide/scripts/nps_query.sh "[주민번호 앞자리]" ``` ### Technical Analysis The playbook suggests passing the first portion of a Korean resident registration number to a shell script as a command-line argument. Command-line arguments are not an appropriate channel for sensitive personal identifiers because they may be exposed through: - Shell command history - Process inspection utilities - Terminal session recording - Execution telemetry and audit logs - Wrapper scripts or automation logs - Error reporting and debugging output The referenced `nps_query.sh` script is not included in the project. Moreover, `scripts/README.md` states that personal pension estimates cannot be retrieved through a public REST API because authenticated access is required. The documented command therefore creates unnecessary privacy risk without a supported functional purpose. No command injection is demonstrated because the referenced script is absent and its argument handling cannot be assessed. The confirmed issue is the unsafe recommendation to place a sensitive identifier in process arguments. ### Attack Path 1. A user or operator follows the command example in `playbook.md`. 2. The user replaces the placeholder with part of their resident registration number. 3. The shell records the command in history, or the execution environment captures the process arguments in logs or telemetry. 4. Another local user, administrator, support operator, log reader, or compromised monitoring component accesses the recorded command. 5. The exposed identifier may be correlated with other available personal information and used for privacy abuse or identity-focused social engineering. Exploitation requires the user to follow the documented example and an atta ...[truncated 614 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the command example that accepts a resident registration number. 2. Explicitly prohibit requesting or processing resident registration numbers for built-in pension estimates. 3. Direct users to the official authenticated pension portal at `https://csa.nps.or.kr` for personal records and exact estimates. 4. Use only non-sensitive inputs, such as age, contribution duration, and approximate average income, for local estimates. 5. If a legitimate authenticated integration is introduced later: - Apply strict data minimization. - Never pass sensitive values through command-line arguments. - Collect required values through a protected interactive prompt or secure credential mechanism. - Prevent values from appearing in logs, exceptions, telemetry, and shell history. - Keep sensitive values only in memory for the minimum necessary duration. - Document retention, access-control, and deletion requirements. 6. Remove references to nonexistent scripts or add validation ensuring that all documented integrations are implemented and security-reviewed before publication. ]]>
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 (10)

Vague Triggers

Medium
Confidence
95% confidence
Finding
The beginner_alias entries include very generic Korean phrases such as '쉽게', '기초', and '모르겠어' that commonly appear in unrelated conversations. This can cause unintended routing into the pension skill, leading to context hijacking, irrelevant financial guidance, and accidental collection of retirement-related inputs from users who did not intend to invoke this domain.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The pension_guide trigger set contains broad phrases like '국민연금 가입' and especially short/common tokens in the same intent family that may activate on informational or ambiguous user statements without clear request intent. In a finance-oriented skill, overbroad activation increases the chance of misrouting users into regulated-adjacent advice flows and presenting guidance in the wrong context.

Natural-Language Policy Violations

Medium
Confidence
89% confidence
Finding
The file’s natural-language instructions, examples, and required disclaimer are all presented only in Korean. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is explicitly justified, which is not stated here.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
This file instructs behavior and examples exclusively in Korean, including mode names, triggers, and outputs, but does not indicate that Korean is optional or that the skill is intentionally restricted to Korean-language users. That can violate a language/locale policy when no user opt-in or explicit justification is provided.

Vague Triggers

Medium
Confidence
93% confidence
Finding
The Beginner Mode auto-switch uses very generic keywords like '쉽게', '처음인데', and '어려워', which can appear in ordinary conversation even when the user is asking for a specific pension calculation or routing target. This can cause misclassification into a simplified mode, degrading accuracy and potentially suppressing more appropriate handling or referrals, but it does not create a direct security compromise such as code execution or data exfiltration.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
This markdown template forces a specific language/locale for all outputs, which can violate organizational language-choice policies when users are not given an opt-in or alternative. The file contains only Korean headings and response text, and no note explains that the skill is intentionally Korea-specific or that users may choose another language.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The file is entirely written in Korean and presents source-tiering and citation instructions only in that language, with no indication that users may choose another language or locale. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation.

Natural-Language Policy Violations

Low
Confidence
93% confidence
Finding
The manifest description and intent examples are predominantly in Korean and present the skill as a Korean-language experience, with no indication that users may opt into another language. This can violate language/locale policy when a skill implicitly requires a specific language without documenting that constraint or offering a choice.

Vague Triggers

Low
Confidence
97% confidence
Finding
Using 'IRP' alone as a trigger is overly broad because it is a short standalone acronym that may appear in other contexts, tools, or abbreviations. This can lead to accidental invocation of tax/pension comparison logic and delivery of financial recommendations when the user intended something else.

Vague Triggers

Low
Confidence
96% confidence
Finding
The standalone trigger 'TDF' is ambiguous and too short to reliably indicate retirement-portfolio intent. In this skill, that ambiguity matters because it can spuriously route users into investment allocation guidance or linked portfolio counseling without sufficient domain confirmation.

Static analysis

No suspicious patterns detected.