T09 · Insecure Skill Coding Practices
- Location
scripts/bring-cli.js:26- Finding
Plaintext Credential and Session Token Storage Without Enforced Access Controls
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill does what it claims for Bring! shopping lists, but it handles reusable account credentials and session tokens in ways users should review carefully before installing.
Install only if you are comfortable with a local CLI storing your Bring! password and tokens in plaintext files and using an unpinned global npm package. Prefer a version that prompts securely for credentials, stores secrets in an OS keychain or protected files, pins dependencies with a lockfile, and provides a clear logout/secret-removal command.
scripts/bring-cli.js:26Plaintext Credential and Session Token Storage Without Enforced Access Controls
SKILL.md:21Password Exposure Through Command-Line Arguments
SKILL.md:9Unpinned Globally Installed Authentication Dependency
The core declared behavior is present: the code can view lists/items and add or remove shopping list items. However, it also includes several undeclared capabilities that go beyond simple shopping list management: local credential storage, token caching, catalog/translation retrieval, default-list configuration, and list language detection/caching. These are materially broader than the declared description, even though they support the Bring! integration. Therefore this is a description-behavior mismatch due to undeclared capabilities and local access to sensitive credentials.
Referenced artifact was not completely inspected
The CLI lives at `scripts/bring-cli.js`. Always prefix with `NODE_PATH=$(npm root -g)`:
The setup flow instructs users to pass their email and password directly on the command line while also noting that configuration and tokens are stored locally. Command-line credentials can be exposed through shell history, process listings, logs, or agent telemetry, and local secret storage without an explicit warning increases the chance of accidental credential disclosure on shared or monitored systems.
Bearer and refresh tokens are cached to disk in a JSON file without user disclosure or access-control hardening. Anyone who can read that file may be able to impersonate the user for the token lifetime, and refresh tokens can extend that access beyond the current session.
The CLI stores the user's Bring account email and password in plaintext in a local JSON config file under the user's home directory. If the workstation, backups, logs, or dotfiles are exposed to another local user, malware, or accidental syncing, the credentials can be recovered and reused to access the user's account and shared shopping-list data.
Language-sensitive behavior initializes bestMatch with en-US, and several commands also default locale arguments to en-US. This can impose a specific language/locale choice when the user has not explicitly opted in, which may conflict with organizational language/locale policy.
No suspicious patterns detected.