T09 · Insecure Skill Coding Practices
- Location
SKILL.md:28- Finding
Public Hosting Requirement Exposes Potentially Confidential Training Images
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md, lines 28 and 54
Vulnerability Type: Public exposure of sensitive training data
Risk Level: MediumVulnerable Instructions
SKILL.md:28:markdown 2. Curate and zip the dataset (see Technique), host the ZIP at a public URL the platform can fetch, and pass it as `inputs.dataset`.SKILL.md:54:markdown - `inputs.dataset` - a single **ZIP** at a public URL. **10 to 50 images**, a hard bound (below 10 and above 50 both reject). JPEG, PNG, or WebP. Max 50 MB per image (auto-downscaled to 4096px long side, so no pre-resize needed).Technical Analysis
The Skill explicitly directs the agent to place the training archive at a publicly accessible URL. The dataset may contain proprietary brand artwork, unreleased assets, personal images, or metadata embedded in image files.
The instructions do not require authentication, a short-lived signed URL, restrictive object-storage permissions, metadata removal, deletion after ingestion, or explicit user consent for third-party processing. An unlisted or difficult-to-guess public URL is not an access-control mechanism. Such URLs may be disclosed through application logs, browser history, API request records, referrer data, collaboration channels, or storage enumeration.
The recommendation to register the resulting model as private does not protect the source archive. Model visibility and dataset-object access are separate security boundaries.
Attack Path
- A user supplies confidential reference images for model training.
- Following the Skill, the agent packages the images into a ZIP archive.
- The archive is uploaded to storage with public-read access.
- Its URL is submitted to the external training platform and may consequently appear in request logs, execution history, monitoring systems, or shared transcripts.
- An unauthorized party obtains or discovers the URL.
- The party downloads the archive without authentication a ...[truncated 1054 chars]
- Remediation
View remediation
Remediation Suggestions
- Replace the public-hosting requirement with an approved private upload or platform-managed asset-ingestion mechanism.
- If URL-based retrieval is unavoidable, use a cryptographically strong, short-lived signed URL restricted to read-only access for the specific object.
- Set the URL expiration to the shortest interval sufficient for ingestion and revoke access immediately after the platform confirms retrieval.
- Delete the uploaded archive after ingestion and define a documented retention period for any platform-side copies.
- Strip EXIF and other unnecessary metadata from all images before packaging.
- Obtain explicit user approval before transmitting images to a third-party training service and disclose the recipient, purpose, retention policy, and applicable privacy terms.
- Use an unpredictable object identifier, disable directory listing, and ensure storage containers deny anonymous access by default.
- Prevent dataset URLs from being written to ordinary logs, analytics, chat transcripts, or error messages. Redact URLs where logging is operationally necessary.
- Add a preflight check that rejects sensitive datasets when secure transfer cannot be established.
- Clarify that setting
importModel.privateprotects model visibility only and does not secure the source dataset.
