T09 · Insecure Skill Coding Practices
- Location
SKILL.md:41- Finding
Plaintext Persistence of Sensitive Financial and Business Identity Data
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md, lines 41–44 and 132–134; related data model inschema/review-result.schema.json, lines 45–60
Vulnerability Type: Sensitive data exposure through unprotected persistent storage
Risk Level: MediumVulnerable Code Snippets
SKILL.md, lines 41–44:markdown - 이미지 파일 경로를 명시하고 "Read tool로 읽어라"고 지시 - 서류 유형별 체크리스트를 태스크에 포함 - **반환 형식을 JSON으로 지정** (교차 검증에 필요한 핵심 값) - 핵심 필드: 사업자등록번호, 상호, 대표자, 금액, 날짜, 계좌번호English meaning of the security-relevant instruction: the workflow requires extraction of business registration numbers, company and representative names, amounts, dates, and bank account numbers.
SKILL.md, lines 132–134:markdown **출력 파일:** - JSON 결과를 workspace에 저장: `reviews/REV-{YYYYMMDD}-{NNN}.json`English meaning: the JSON result is saved persistently in the workspace.
schema/review-result.schema.json, lines 45–60:json "extractedData": { "type": "object", "description": "OCR 추출 핵심 데이터", "properties": { "businessRegNo": { "type": "string", "description": "사업자등록번호" }, "companyName": { "type": "string", "description": "상호" }, "representative": { "type": "string", "description": "대표자" }, "address": { "type": "string", "description": "소재지" }, "supplyAmount": { "type": ["number", "null"], "description": "공급가액" }, "taxAmount": { "type": ["number", "null"], "description": "세액" }, "totalAmount": { "type": ["number", "null"], "description": "합계금액" }, "date": { "type": "string", "description": "주요 날짜 (작성일/계약일/이체일 등)" }, "bankName": { "type": ["string", "null"], "description": "은행명" }, "accountNo": { "type": ["string", "null"], "description": "계좌번호" }, "accountHolder": { "type": ["string", "null"], "description": "예금주" }, "items": { "type": "string", "description": "품목 요약" } } }Technical Analysis
The Skill is designed to process highly sensitive business documents, including bank-book copies, transfer confirmatio ...[truncated 2558 chars]
- Remediation
View remediation
Remediation Suggestions
-
Minimize stored data
- Do not retain full account numbers unless strictly required.
- Store only a masked form, such as
**********1234. - Replace business registration numbers and addresses with masked or hashed representations where cross-document comparison is sufficient.
-
Separate comparison data from report data
- Use complete values only in transient memory while performing cross-validation.
- Write only redacted values to the final JSON report.
- Store boolean comparison results rather than duplicating raw identifiers.
-
Require explicit consent
- Inform the user before retaining unredacted financial information.
- Require explicit approval for persistent storage.
- Default to a non-persistent or redacted review mode.
-
Protect files at rest
- Encrypt reports containing sensitive information.
- Create the
reviewsdirectory and report files with restrictive permissions accessible only to the intended user. - Ensure temporary images and intermediate OCR files receive equivalent protection.
-
Define retention controls
- Add a short default retention period.
- Automatically and securely delete reports and intermediate files after expiration.
- Document whether backups and synchronized copies are also deleted.
-
Prevent secondary disclosure
- Prohibit full account numbers and registration numbers in chat summaries, diagnostic logs, filenames, and exception messages.
- Review subagent traces and tool logs for inadvertent persistence of raw OCR data.
-
Harden the schema
- Replace
accountNowith fields such asaccountNoMaskedandaccountFingerprint. - Add structured fields recording whether consent was obtained and whether the output was redacted.
- Reject unmasked sensitive values in the default output schema.
- Replace
-
