T09 · Insecure Skill Coding Practices
- Location
scripts/generate_tests.py:173- Finding
Read-only mode can generate helpers that issue DELETE requests
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent API contract audit skill, but its optional live test generator can unexpectedly change data and persist credentials, so it should be reviewed before installation.
Use the static audit command only if you install this skill. Avoid scripts/generate_tests.py until the read-only delete path, credential handling, and template injection issues are fixed; do not run generated helpers against production or with real reusable credentials.
scripts/generate_tests.py:173Read-only mode can generate helpers that issue DELETE requests
scripts/generate_tests.py:41Test-account credentials are embedded in executable generated source files
scripts/generate_tests.py:441Untrusted configuration is interpolated into executable Python source
The skill positions itself as audit-first and says live verification is secondary and limited, yet the behavior described in the finding includes generating and encouraging execution of write-capable live API tests with authentication handling. That mismatch is dangerous because users may trust it as a safe static analyzer and accidentally run state-changing requests against real services, causing data modification or operational impact.
The skill positions itself as audit-first and says live verification is secondary and limited, yet the behavior described in the finding includes generating and encouraging execution of write-capable live API tests with authentication handling. That mismatch is dangerous because users may trust it as a safe static analyzer and accidentally run state-changing requests against real services, causing data modification or operational impact.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
any_req = re.search(r'\.anyRequest\(\)\.(permitAll|authenticated)\s*\(', text)
if any_req and any_req.group(1) == 'authenticated':
rules.append((re.compile(r'^/.*'), RequestHints(auth=['authenticated-route'])))
return rules
def match_security_hints(path: str, rules: List[Tuple[re.Pattern, RequestHints]]) -> RequestHints:
The skill instructs use of shell commands, file reads/writes, and potentially live verification, but it declares no explicit tool scope or permission boundaries. That omission can cause an agent runtime to over-grant capabilities, increasing the chance of unintended filesystem, environment, or network access during analysis or follow-up checks.
The finding summaries, unknown-status messages, and recommendations are written in Korean string literals, which imposes a specific language on downstream users or operators. The file does not offer a language/locale choice or explain that the tool is intentionally Korea-specific, so this appears to violate the language/locale policy.
The generated markdown includes multiple user-facing strings in Korean such as '위험도' and '즉시 확인할 항목'. This imposes a specific language on users without opt-in, which matches the natural-language locale policy violation criteria.
The string '외 ...건' is another user-visible Korean phrase in the generated report. Combined with other Korean literals, this indicates the skill consistently forces a locale rather than offering user choice.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}}
if "{login_request_encoding}" == "json":
r = requests.post(
f"{{API_BASE}}{login_endpoint}",
json=login_payload,
timeout=10
This code deliberately generates runnable scripts that perform authenticated CREATE/UPDATE/DELETE requests against a configured API and then prints commands encouraging users to execute them. In an audit-first static contract analysis skill, that materially expands the trust boundary and creates risk of unintended state changes, notification triggers, quota consumption, or data corruption, especially because the production guard is heuristic and bypassable.
The main flow loads arbitrary configuration and generates executable test files that may send authenticated write requests whenever --allow-writes is supplied, which is a weak control for a skill whose stated purpose is static compatibility analysis. The surrounding warnings help, but they do not prevent misuse, and the generated output directly instructs operators to run the files, making accidental live impact plausible.
The code scans for .env* files and reads their contents to derive a default base path, which is a sensitive configuration source. There is no confirmation prompt, logging, comment, or docstring at this operation to disclose that environment-derived configuration files will be accessed.
Using '없음' as a default output value is a user-facing language choice embedded directly in code. This is a smaller instance of the same locale policy issue because the skill does not provide opt-in or explain a Korean-only requirement.