Back to skill

Security audit

Bring Add

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent Bring! shopping-list CLI, but it needs review because it asks for a Bring! password and passes it to an unpinned, externally linked dependency.

Review this before installing if you care about Bring! account credential exposure. The CLI needs your Bring! email and password and can modify shopping lists when invoked. The main risk is the dependency setup: bring-shopping is unpinned and the lockfile points to a local linked path outside the package, so install only after pinning or replacing that dependency with a reviewed registry version with an integrity hash, and avoid exporting your password in shared shells, CI logs, or long-lived environments.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Error
Location
package.json:17
Finding
Unpinned and Non-Reproducible Credential-Handling Dependency## Vulnerability Details **File Location**: `package.json:17`; related lockfile evidence at `package-lock.json:12`, `package-lock.json:24-26`, and `package-lock.json:2104-2106` **Vulnerability Type**: Insecure third-party dependency and unsafe dependency source **Risk Level**: High ### Vulnerable Code `package.json:15-19`: ```json "dependencies": { "bring-shopping": "*", "chalk": "^4.1.2", "commander": "^11.1.0" } ``` `package-lock.json:2104-2107`: ```json "node_modules/bring-shopping": { "resolved": "../../skills-temp", "link": true }, ``` The dependency receives the user's Bring! credentials in `index.js:6` and `index.js:57-65`: ```js const Bring = require('bring-shopping'); ``` ```js const bring = new Bring({ mail: process.env.BRING_EMAIL, password: process.env.BRING_PASSWORD }); try { await bring.login(); ``` ### Technical Analysis The security-sensitive `bring-shopping` dependency is declared using the unrestricted wildcard version `"*"`. This permits future installations to select package releases that were not reviewed as part of this audit. The lockfile does not mitigate that exposure reliably because it resolves the package to `../../skills-temp`, a linked local directory outside the audited project. The implementation of that target is absent from the supplied artifact, and the lockfile entry provides neither an immutable registry artifact nor an integrity hash for this dependency. This dependency is security-critical because the application imports it and directly supplies the user's `BRING_EMAIL` and `BRING_PASSWORD` values to its constructor before invoking `login()`. Any malicious or substituted implementation would execute within the CLI's Node.js process and could access those credentials, the environment, files available to the user, and the user's network permissions. ### Attack Path 1. An attacker publishes or compromises a future `bring-shopping` release accepted by the wildcard constraint, or modifies/su ...[truncated 1468 chars]
Remediation
## Remediation Suggestions 1. Replace the wildcard dependency with an exact, reviewed version: ```json "bring-shopping": "2.0.1" ``` 2. Regenerate `package-lock.json` using the intended official registry. Verify that the resulting entry records: - An exact version. - An HTTPS registry URL. - A package integrity hash. - No `link: true` or relative external path. 3. Reject local, file-based, Git-based, or workspace-link dependency sources in release artifacts unless they are deliberately vendored and included in the security review. 4. Enforce reproducible installations in CI with `npm ci` and fail builds if the lockfile changes unexpectedly. 5. Add automated dependency-policy checks that prohibit wildcard versions and unexpected non-registry sources. 6. Review the selected `bring-shopping` release, including install scripts, runtime network behavior, credential handling, and transitive dependencies. 7. Use a restricted API token instead of an account password if the service supports token-based authentication. Avoid granting third-party libraries long-lived primary credentials where possible. 8. Correct `SKILL.md:145`, which says the implementation uses `node-bring-api`, so that documentation accurately identifies the dependency that receives user credentials.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (21)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The declared description says the skill adds items to Bring! lists, but the documented behavior also includes enumerating available shopping lists and interactive prompting. That mismatch matters because listing lists reveals user data beyond simple item creation, and undeclared interactive behavior can cause unexpected input capture or blocking in automation contexts.

Known Vulnerable Dependency: brace-expansion==1.1.11 — 5 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +2 more

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: flatted==3.3.2 — 2 advisory(ies): CVE-2026-32141 (flatted vulnerable to unbounded recursion DoS in parse() revive phase); CVE-2026-33228 (Prototype Pollution via parse() in NodeJS flatted)

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: brace-expansion==2.0.1 — 5 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +2 more

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: minimatch==5.1.6 — 3 advisory(ies): CVE-2026-27904 (minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regu); CVE-2026-26996 (minimatch has a ReDoS via repeated wildcards with non-matching literal in patter); CVE-2026-27903 (minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adja)

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: js-yaml==4.1.0 — 5 advisory(ies): CVE-2026-84375 (js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources); CVE-2026-59869 (js-yaml: YAML merge-key chains can force quadratic CPU consumption); GHSA-5p4m-2wfm-xmqj (JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026) +2 more

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: minimatch==3.1.2 — 3 advisory(ies): CVE-2026-27904 (minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regu); CVE-2026-26996 (minimatch has a ReDoS via repeated wildcards with non-matching literal in patter); CVE-2026-27903 (minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adja)

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: picomatch==2.3.1 — 2 advisory(ies): CVE-2026-33672 (Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Mat); CVE-2026-33671 (Picomatch has a ReDoS vulnerability via extglob quantifiers)

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: serialize-javascript==6.0.2 — 2 advisory(ies): GHSA-5c6j-r48x-rmvq (Serialize JavaScript is Vulnerable to RCE via RegExp.flags and Date.prototype.to); CVE-2026-34043 (Serialize JavaScript has CPU Exhaustion Denial of Service via crafted array-like)

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The README instructs users to place account credentials, including `BRING_PASSWORD`, into environment variables without any warning about exposure risks. In many environments, environment variables can leak through shell history, process inspection, debug logs, CI/CD job output, crash reports, or inherited subprocess environments, which can expose the Bring! account credentials.

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill documents use of sensitive environment variables (`BRING_EMAIL` and `BRING_PASSWORD`) and CLI/networked behavior, but it does not declare any tool scope or permissions metadata. That creates an authorization/visibility gap: an agent or reviewer cannot easily determine what sensitive resources the skill expects to access, increasing the risk of unintended credential exposure or execution in contexts where such access should be restricted.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The documentation instructs users to place a plaintext password in `BRING_PASSWORD` without any warning about credential sensitivity, storage lifetime, shell history exposure, or safer alternatives. Environment variables are commonly exposed to child processes, debugging tools, logs, or shared shell sessions, so normalizing this practice increases the chance of credential leakage.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The manifest says the skill is for adding items to Bring! shopping lists, including single, batch, stdin/file input, dry-run, and JSON output. This file also defines a separate `lists` command that logs into Bring and enumerates all available shopping lists, which is behavior beyond the described add-focused scope rather than a necessary implementation detail of adding items.

Description-Behavior Mismatch

Low
Confidence
96% confidence
Finding
The manifest says the skill is for adding items to Bring! shopping lists, including single, batch, stdin/file input, dry-run, and JSON output. The README documents an additional `lists` subcommand that enumerates available shopping lists, which is a distinct read/list-management capability not reflected in the stated description.

Context-Inappropriate Capability

Low
Confidence
77% confidence
Finding
The implementation requires and reads `BRING_EMAIL` and `BRING_PASSWORD` from the process environment to authenticate. While remote authentication may be needed for Bring integration, the manifest only describes add-item functionality and does not mention handling credentials or environment-based secret access, making this capability unjustified from the stated purpose alone.

Natural-Language Policy Violations

Low
Confidence
78% confidence
Finding
The item parsing logic and examples explicitly recognize German terms such as "Stück" and use German example inputs like "Tomaten" and "Zwiebeln." This bakes a locale-specific assumption into user-facing behavior without any opt-in or documented language choice.

Known Vulnerable Dependency: ajv==6.12.6 — 1 advisory(ies): CVE-2025-69873 (ajv has ReDoS when using `$data` option)

Low
Category
Supply Chain
Confidence
60% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: diff==5.2.0 — 1 advisory(ies): CVE-2026-24001 (jsdiff has a Denial of Service vulnerability in parsePatch and applyPatch)

Low
Category
Supply Chain
Confidence
60% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Unpinned Dependencies

Low
Category
Supply Chain
Content
],
  "license": "MIT",
  "dependencies": {
    "bring-shopping": "*",
    "chalk": "^4.1.2",
    "commander": "^11.1.0"
  },
Confidence
99% confidence
Finding
The dependency "bring-shopping": "*" is fully unpinned, allowing any published version to be installed, including a compromised or malicious future release. In a CLI skill that interacts with user accounts and shopping lists, a supply-chain compromise could execute arbitrary code during install or runtime and steal tokens or manipulate user data.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"license": "MIT",
  "dependencies": {
    "bring-shopping": "*",
    "chalk": "^4.1.2",
    "commander": "^11.1.0"
  },
  "engines": {
Confidence
88% confidence
Finding
Using a caret range for "chalk" permits automatic installation of newer compatible releases, which increases supply-chain exposure compared with exact pinning. Although chalk is a common low-risk utility library, a compromised release or dependency confusion event could still affect consumers of this CLI.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"dependencies": {
    "bring-shopping": "*",
    "chalk": "^4.1.2",
    "commander": "^11.1.0"
  },
  "engines": {
    "node": ">=18.0.0"
Confidence
90% confidence
Finding
Using a caret range for "commander" allows semver-compatible updates to be pulled in without explicit review, creating avoidable supply-chain risk. Because commander is a runtime CLI parsing library, a malicious or compromised update could affect command handling or execute attacker-controlled logic in environments where the tool is installed.

Static analysis

No suspicious patterns detected.