T09 · Insecure Skill Coding Practices
- Location
cwconfig.json:1- Finding
Hardcoded Cryptowerk Service Credentials Distributed with the Skill
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill’s proof-registration purpose is coherent, but it ships and persists Cryptowerk API credentials in the skill directory in a way users should review before installing.
Install only if you are comfortable with this skill contacting Cryptowerk’s external API and storing proof metadata locally. Before use, treat the bundled cwconfig.json values as exposed credentials, prefer user-provided or secret-manager credentials, keep any credential file out of synced or committed directories, and restrict its filesystem permissions.
cwconfig.json:1Hardcoded Cryptowerk Service Credentials Distributed with the Skill
scripts/cwcommon.py:99Issued Credentials Are Persisted Without Enforced Restrictive File Permissions
Without declared permissions the skill's intent is opaque and cannot be validated.
The guidance recommends storing credentials in the skill directory and only briefly mentions restricting permissions, but it does not clearly warn that local skill directories may be copied, synced, committed, or exposed to other users/processes. In a security-focused audit/proof skill, mishandling API credentials could let an attacker access proof services, register or query data under the user's account, or pivot into broader service abuse.
This function performs outbound API requests, including with API keys, without any visible user-facing disclosure or consent mechanism in the file. In an agent setting, silent network access can expose workflow metadata, trigger account actions, and violate user expectations about when external services are contacted.
The code stores issued API credentials in a local JSON configuration file without any warning, consent, or filesystem protection measures shown here. Persisting secrets silently increases the risk of later compromise through local file disclosure, accidental check-in, multi-user access, or reuse by other processes.
The code contains a built-in bootstrap API key and uses it to automatically request and persist service credentials in cwconfig.json. Even if intended for convenience, embedding a provisioning secret in distributable skill code expands trust beyond proof-only operations and allows anyone with the code to obtain or refresh credentials, creating unauthorized service access and credential leakage risk.
The download helper fetches remote content over HTTPS and writes it directly to a caller-specified file path with no user-facing warning and no integrity validation. In an agent ecosystem, silent remote file writes can be abused for payload staging, overwriting local artifacts, or planting misleading audit material, especially given this skill's trust-sensitive 'verifiable data' context.
The script computes a hash of a user-supplied file and sends that file-derived value to a remote service via apiRequest("register", ...), but the code provides no explicit user-facing disclosure, consent prompt, or confirmation at the point of transmission. Even though only the hash is sent rather than raw file contents, hashes of sensitive or low-entropy documents can still enable correlation, existence checks, and privacy leakage, and the skill context explicitly involves external proof registration, making silent transmission a real security/privacy concern rather than a false positive.
Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.
permit persons to whom the Software is furnished to do so.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
Although autoUpdate() currently returns immediately, the file still includes an active helper that can download arbitrary remote content and write it directly to disk. Retaining dormant update/download primitives in an agent skill increases the attack surface because later code changes, reuse from other modules, or prompt-driven invocation could enable unverified remote file writes.
This Python code makes an API request to the external service via apiRequest using a retrievalId derived from file metadata, but the script provides no print, comment, docstring, or confirmation indicating that data will be sent over the network. For code files, network transmission without any visible disclosure in the file is in scope unless the warning is otherwise documented; no such warning is visible here.
No suspicious patterns detected.