T09 · Insecure Skill Coding Practices
- Location
scripts/_common.sh:5- Finding
Environment-Controlled API Endpoint Can Exfiltrate Credentials and Business Data
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a coherent Korean business-number verification CLI, but it needs review because it can send API keys and business/KYB data to an environment-controlled endpoint.
Install only if you are comfortable sending Korean business registration numbers, and for validate checks representative names and opening dates, to the NTS/data.go.kr API. Before use, ensure NTS_BASE is unset or pinned to the official HTTPS endpoint, avoid running in environments with untrusted inherited variables, and treat generated audit files as sensitive business records.
scripts/_common.sh:5Environment-Controlled API Endpoint Can Exfiltrate Credentials and Business Data
scripts/_common.sh:78NTS API Key and Request Payload Are Exposed Through Process Arguments
Referenced artifact was not completely inspected
| `scripts/status.sh` | `POST /v1/status` | yes | Look up operating status (계속사업자/휴업자/폐업자) for up to 100 b_no per call. |
Referenced artifact was not completely inspected
| `scripts/status.sh` | `POST /v1/status` | yes | Look up operating status (계속사업자/휴업자/폐업자) for up to 100 b_no per call. |
Referenced artifact was not completely inspected
| `scripts/status.sh` | `POST /v1/status` | yes | Look up operating status (계속사업자/휴업자/폐업자) for up to 100 b_no per call. |
Referenced artifact was not completely inspected
| `scripts/status.sh` | `POST /v1/status` | yes | Look up operating status (계속사업자/휴업자/폐업자) for up to 100 b_no per call. |
Referenced artifact was not completely inspected
| `scripts/status.sh` | `POST /v1/status` | yes | Look up operating status (계속사업자/휴업자/폐업자) for up to 100 b_no per call. |
Referenced artifact was not completely inspected
| `scripts/bulk.sh` | `POST /v1/status` | yes | Read a file of b_no's, checksum-filter, batch-call status in groups of 100. |
Referenced artifact was not completely inspected
| `scripts/bulk.sh` | `POST /v1/status` | yes | Read a file of b_no's, checksum-filter, batch-call status in groups of 100. |
Referenced artifact was not completely inspected
| `scripts/bulk.sh` | `POST /v1/status` | yes | Read a file of b_no's, checksum-filter, batch-call status in groups of 100. |
Referenced artifact was not completely inspected
| `scripts/bulk.sh` | `POST /v1/status` | yes | Read a file of b_no's, checksum-filter, batch-call status in groups of 100. |
Referenced artifact was not completely inspected
| `scripts/bulk.sh` | `POST /v1/status` | yes | Read a file of b_no's, checksum-filter, batch-call status in groups of 100. |
Referenced artifact was not completely inspected
| `scripts/bulk.sh` | `POST /v1/status` | yes | Read a file of b_no's, checksum-filter, batch-call status in groups of 100. |
Referenced artifact was not completely inspected
| `scripts/bulk.sh` | `POST /v1/status` | yes | Read a file of b_no's, checksum-filter, batch-call status in groups of 100. |
The README encourages use of the validate command with a business number, opening date, and representative name, but it does not clearly disclose that these identifiers are sent to an external government API. This creates a privacy and data-handling risk because operators may unknowingly transmit personal or sensitive business information outside their environment, which is especially relevant in onboarding and KYB workflows.
The skill explicitly instructs users to run shell scripts and call external NTS endpoints, but it does not declare any tool scope such as allowed tools or permissions. In an agent environment, missing scope boundaries can let the skill invoke broader shell or network capabilities than users or orchestrators expect, increasing the risk of unintended outbound requests, data exposure, or command misuse.
The example writes vendor audit output to /tmp/vendor-audit.jsonl, a shared temporary location that may be readable by other local users or accidentally consumed by unrelated processes. The data includes business registration numbers, operating status, tax classification, and closure dates, which can expose sensitive supplier due-diligence results and create privacy or business-confidentiality risks.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Shared helpers for nts-bizno-cli scripts.
set -euo pipefail
NTS_BASE="${NTS_BASE:-https://api.odcloud.kr/api/nts-businessman/v1}"
require_key() {
if [[ -z "${NTS_API_KEY:-}" ]]; then
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
local path="$1" body_json="$2" body http key_q
key_q="serviceKey=$(urlencode "$NTS_API_KEY")"
body=$(mktemp); trap 'rm -f "$body"' RETURN
http=$(curl -sS -o "$body" -w '%{http_code}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-X POST \
This code performs a network request using the collected business numbers, which may be sensitive business data depending on context. Although the header comments describe batching and mention that valid numbers are sent to NTS, there is no interactive confirmation or explicit runtime disclosure before transmission.
The file includes Korean-only status labels and output strings such as 폐업, 면세사업자, and 한종희, but does not state that the skill is intended specifically for Korean tax workflows or offer an alternative language. This can violate language/locale policy when a skill implicitly forces a specific locale without user opt-in.
The script sends the provided business registration numbers to a remote NTS API via nts_post, which is a network operation transmitting user-supplied data. While the header comments describe usage and output, this file does not include a user-facing warning, confirmation, or explicit disclosure that the identifiers will be sent to an external service.