Back to skill

Security audit

MIJ Kakao Local API (PowerShell)

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real Kakao Local API helper, but it needs review because it handles location data and API keys while its promised gitignore protection for a plaintext key file is missing.

Install only if you are comfortable sending searched addresses, keywords, and optional coordinates to Kakao. Prefer the environment-variable API key method, avoid creating data/config.json inside a source-controlled directory, and do not copy the cache/favorites examples unless you intend to store local location history and can protect or delete those files.

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
SKILL.md:32
Finding
Plaintext API Key May Be Committed Because Promised Gitignore Protection Is Missing## Vulnerability Details **File Location**: `SKILL.md:32-40` **Related Code Location**: `references/kakao_local.ps1.md:102-110` **Vulnerability Type**: Plaintext credential exposure caused by insecure configuration guidance **Risk Level**: Medium The documentation instructs users to create a plaintext API-key file within the project: ```markdown ### 방법 2: Config 파일 `skills/kakao-local/data/config.json` (create this file) 생성: ```json { "api_key": "your_rest_api_key_here" } ``` **⚠️ 주의**: `config.json`은 `.gitignore`에 추가하여 커밋 금지 ``` The script then reads and uses the credential directly from that file: ```powershell # 3순위: config.json 파일 $configPath = Join-Path $PSScriptRoot "..\data\config.json" if (Test-Path $configPath) { try { $config = Get-Content $configPath -Raw -Encoding UTF8 | ConvertFrom-Json if ($config.api_key -and $config.api_key -ne "your_rest_api_key_here") { return $config.api_key } } catch { # 파일 읽기 실패 시 무시 } } ``` ### Technical Analysis The project documentation and displayed file tree claim that `config.json` is protected by `.gitignore`, but the audited package contains no `.gitignore`. A user following the documented fallback stores a valid Kakao REST API key as plaintext under the repository without the promised source-control exclusion. This is an insecure secret-management practice. The vulnerability does not automatically transmit the key to an attacker, but it creates a credible disclosure path through routine source-control operations. The environmental-variable method is safer and is correctly recommended, but the insecure file-based method remains supported without an effective packaging safeguard. ### Attack Path 1. A user follows `SKILL.md` and creates `data/config.json`. 2. The user places a valid Kakao REST API key in the `api_key` field. 3. The user relies on the documentation's statement that the file is gitignored. 4. Because the package contains no `.gi ...[truncated 1026 chars]
Remediation
## Remediation Suggestions 1. Add an actual project-root `.gitignore` containing a narrowly scoped rule: ```gitignore /data/config.json ``` 2. Ensure the published package includes that file rather than merely documenting it. 3. Prefer process-scoped environment variables or an operating-system credential manager. Consider removing the plaintext configuration fallback entirely. 4. If file-based configuration must remain supported: - Store it outside the repository by default. - Restrict its filesystem ACLs to the current user. - Reject placeholder values and validate file permissions. - Emit a warning when the file is located inside a source-controlled working tree. - Check whether it is tracked, for example with `git ls-files --error-unmatch`, when Git is available. 5. Add automated packaging and CI checks that fail if: - `data/config.json` is tracked. - A value matching the API-key configuration pattern appears in committed files. - The required `.gitignore` rule is absent. 6. If a key has already been committed, revoke and rotate it immediately, remove it from repository history, and audit its usage for unauthorized requests.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (9)

Hidden Instructions

High
Category
Prompt Injection
Content
# config.json.template\n\n`json\n{
  "api_key": "your_rest_api_key_here"
}
\n`\n
Confidence
93% confidence
Finding
The file contains a hidden leading character at the start of the document, consistent with a BOM or other invisible Unicode character. Invisible characters can interfere with parsers, cause security tooling to misread content, and create opportunities for hidden-instruction or obfuscation attacks even in otherwise simple configuration templates.

Hidden Instructions

High
Category
Prompt Injection
Content
# kakao_local.ps1\n\n`powershell\n<#
.SYNOPSIS
    Kakao Local API Skill for OpenClaw
Confidence
60% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
# kakao_local.ps1\n\n`powershell\n<#
.SYNOPSIS
    Kakao Local API Skill for OpenClaw
Confidence
60% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill sends user-provided addresses, place keywords, and optionally precise coordinates to the external Kakao Local API, but the description does not prominently disclose this data flow or its privacy implications. Users or higher-level agents may unknowingly transmit sensitive location data to a third party, creating privacy, compliance, and consent risks.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The skill is described as an API wrapper for address normalization and place search, but the integration section shows writing normalized places to `places.json` and caching search results to `cache.json`. Those local state-management capabilities are separate from the core advertised function and are not justified by the stated purpose in the absence of a broader manifest declaring persistence behavior.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The examples explicitly save favorites and cached search results containing addresses, coordinates, timestamps, and place data to local files without warning that this creates persistent sensitive location records. If those files are accessed by other users, malware, backups, or accidental commits, they can reveal movement patterns, home/work locations, or user interests.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The script transmits user-supplied address, keyword, and optional coordinate/radius data to Kakao's external API, but the file provides no runtime notice, consent flow, or privacy warning. In an agent/skill context, this can expose sensitive location or address data to a third party without the user's clear awareness, which is a genuine privacy and data-handling risk even though it appears to be the intended functionality.

Context-Inappropriate Capability

Low
Confidence
84% confidence
Finding
The stated purpose of the skill is to call Kakao Local APIs for address normalization and place search. Reading credentials from environment variables is expected, but adding support for a local `config.json` containing the API key is an extra file-based secret handling capability that is not directly inherent to the business function and expands where sensitive data is read from.

Static analysis

No suspicious patterns detected.