T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/morning_briefing.sh:11- Finding
Hard-Coded Cross-User Credential File Access
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches a Korea weather and air-quality purpose, but one script reads an API key from a hard-coded other-user home path, which is a real credential-scope problem.
Install only if you are comfortable fixing or accepting the credential handling risk. Before use, change morning_briefing.sh to read the invoking user's configured key, store the key with 0700 directory and 0600 file permissions, and rotate the key if it was previously exposed through shell history or process monitoring.
scripts/morning_briefing.sh:11Hard-Coded Cross-User Credential File Access
SKILL.md:144API Key Setup Does Not Enforce Restrictive File Permissions
scripts/weather.sh:120API Key Exposed Through Curl Process Arguments
The manifest presents the skill as weather-only, while the documentation also includes cross-skill air-quality access and local credential file reads. Hidden or under-declared capabilities reduce transparency and can lead operators to grant or trust broader data access than intended, especially when local file access is involved.
The manifest presents the skill as weather-only, while the documentation also includes cross-skill air-quality access and local credential file reads. Hidden or under-declared capabilities reduce transparency and can lead operators to grant or trust broader data access than intended, especially when local file access is involved.
The skill documents shell scripts and outbound API usage but does not declare any explicit tool scope such as permissions or allowed-tools. In an agent environment, this creates an authorization gap where the runtime may permit broader shell or network access than users expect, increasing the chance of unintended command execution or external requests.
The description omits documented air-quality and notification-related scope, creating a capability disclosure gap. In agent ecosystems, incomplete disclosure can mislead reviewers and users about what external systems the skill may contact or what downstream actions it may trigger.
The intent router lists common conversational phrases such as "오늘 날씨 어때?", "기온 몇 도?", and routes based on simple keywords like 현재/지금, 내일/모레/주말, 브리핑. These are broad natural phrases and the file does not provide negative examples or constraints describing when the skill should not activate, increasing the risk of unintended invocation overlap with ordinary conversation.
The setup instructs users to persist an API key in a plaintext file under the home directory. Plaintext credential storage increases the risk of credential theft by other local processes, overly permissive file permissions, backups, or accidental disclosure through logs and support bundles.
mkdir -p ~/.config/data-go-kr
echo "YOUR_API_KEY" > ~/.config/data-go-kr/api_key
The script directly reads an API key from a sensitive local path, which is credential access covered by the missing-warning rule for code files. There is no confirmation prompt, user-facing disclosure, or explanatory comment warning that the skill accesses a credential file.
The manifest describes the skill as a KMA short-term forecast API for ultra-short-term observation and short-term forecast. In addition to those expected KMA weather calls, the code performs a separate AirKorea API request for particulate and ozone data, which is a distinct capability not covered by the stated description.
The script's human-facing comments, accepted aliases, and error/help text are partly or wholly Korean-specific, including Korean trigger values like 실황, 초단기, 예보, 단기, and 버전. Under the language/locale policy, forcing a specific language without user opt-in or clear justification is a policy concern.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
echo "API: $ENDPOINT | Date: $BASE_DATE | Time: $BASE_TIME | Grid: ($NX,$NY)" >&2
# 요청 실행
RESPONSE=$(curl -s -G "$URL" --data-urlencode "serviceKey=$API_KEY" \
--data "pageNo=1" \
--data "numOfRows=1000" \
--data "dataType=JSON" \
Most trigger examples, routing logic, setup text, and response guidance are written only in Korean, and the skill does not state that language handling is limited to Korean or offer any user language choice. This can violate a language/locale policy when a skill implicitly forces one language without opt-in or justification.
The natural-language comments, usage text, default station name, and output labels indicate the skill is designed specifically for Korean-language use, but there is no visible opt-in or documented locale restriction. This can violate the language/locale policy when a skill implicitly forces a specific language without user choice.
The manifest only states a weather forecast API purpose and does not mention local file access or credential loading behavior. While credentials may be needed operationally, reading a specific user-home config file is an additional capability outside the manifested intent as written.
This shell script accesses a sensitive API key from the user's config directory and later transmits it to a remote weather API. Although the code has developer comments and debug output, there is no explicit user-facing disclosure that credentials will be read and used in a network request.
No suspicious patterns detected.