Vulnerabilities in pkg:npm/exiftool-vendored

PACKAGE
Advisory Identifier: GHSA-cw26-7653-2rp5
Advisory Summary

CVE-2026-43893 is a HIGH (CVSS 8.2) exiftool-vendored vulnerable to argument injection vulnerability (CWE-88: Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')) affecting Exiftool vendored libraries in the npm ecosystem. The issue involves exiftool-vendored vulnerable to argument injection via newline characters in tag names. Remediation is available by upgrading affected packages to version 35.19.0.

2 Known Advisory Record(s)
Package Vulnerability Intelligence

pkg:npm/exiftool-vendored

2 Known Advisory Record(s)

Vulnerability advisories affecting package pkg:npm/exiftool-vendored. Select an advisory below to view technical details or fixes.

Advisory ID CVE / NVD Severity Summary
GHSA-cw26-7653-2rp5 CVE-2026-43893 HIGH exiftool-vendored vulnerable to argument injection via newline characters in tag names
GHSA-4whq-r978-2x68 - HIGH Arbitrary code execution in ExifTool

CVE-2026-43893 at a Glance

CVE Identifier CVE-2026-43893
GHSA Identifier GHSA-cw26-7653-2rp5
Severity HIGH
CVSS v3.1 Base Score 8.2
CWE Classification CWE-88: Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')
Affected Product Exiftool vendored
Package Ecosystem npm
Published Date
Last Updated

Security Impact

CVSS: 8.2

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality Low (C:L)
Integrity High (I:H)
Availability None (A:N)

How to Fix CVE-2026-43893

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

exiftool-vendored fixed: 35.19.0
npm install exiftool-vendored@35.19.0
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 exiftool-vendored

How to Check if You Are Affected

To determine whether your Node.js application is affected by CVE-2026-43893, inspect your project dependencies using npm:

npm ls exiftool-vendored

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

Note: The npm ls exiftool-vendored 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-88: Improper Neutralization of Argument Delimiters in a Command ('Argument Injection'), where the product constructs a string for a command to be executed by a separate component in another control sphere, but it does not properly delimit the intended arguments, options, or switches within that command string. In Exiftool vendored, 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 `exiftool-vendored` starts ExifTool in `-stay_open True -@ -` mode, where arguments are read from stdin one per line. In affected versions, several caller-supplied strings were interpolated into ExifTool arguments without rejecting line delimiters. A newline or carriage return inside one of those strings could split a single intended argument into multiple ExifTool arguments, allowing argument injection. The fix also rejects NUL bytes as unsafe control characters. Applications that pass attacker-controlled strings to affected APIs may allow an attacker to make ExifTool read files accessible to the ExifTool process, or write output to attacker-chosen file system paths accessible to that process. No remote code execution has been demonstrated. The reported write-path issue is caused by unsanitized tag **keys**. Tag **values** passed to `ExifTool#write` are not affected, because `WriteTask` already encodes whitespace characters in values (e.g. `\n` -> `&#10;`) before transmission. Confirmed affected inputs: - **Tag-name arguments / tag keys** — keys of the `tags` object passed to `ExifTool#write`; entries of the `retain` option to `ExifTool#deleteAllTags`; entries of the `numericTags` option to `ExifTool#read`; the `tagname` argument to `ExifTool#extractBinaryTag` and `#extractBinaryTagToBuffer`. - **Filename / path arguments** to `ExifTool#write`, `#read`, `#readRaw`, `#deleteAllTags`, `#rewriteAllTags`, `#extractBinaryTag`, `#extractBinaryTagToBuffer`, and the binary-extraction convenience methods `#extractJpgFromRaw`, `#extractPreview`, and `#extractThumbnail`. `path.resolve()` does not strip newlines, so an application that accepts attacker-controlled filenames containing newline characters was vulnerable. - **The `imageHashType` option** to `ExifTool#read`. TypeScript types restrict this to a literal union, but JS callers or callers with weakened type checking could reach the sink. Applications that only pass hardcoded strings for tag names, options, and filenames are not affected. ### Patches Fixed in **v35.19.0**. Two layers of defense: 1. **Per-site input validation.** A new `validateTagName` helper rejects any tag-name string containing characters outside the ExifTool tag grammar (letters, digits, `:`, `-`, `_`, and the ExifTool modifiers `*`, `?`, `+`, `#`). Applied at every tag-name interpolation site. 2. **Defense-in-depth at the command renderer.** `ExifToolTask.renderCommand` now rejects _any_ argument containing `\r`, `\n`, or `\0` before it is sent to the ExifTool process. This catches injection via filename arguments, option values, and any future interpolation site that forgets the per-site validator. ### Workarounds Upgrade to v35.19.0 or later. If upgrading immediately is not possible, reject untrusted strings containing control characters before passing them to the affected APIs. Conservative guard: ```ts function assertSafeForExifTool(s: string): void { if (typeof s !== "string" || /[\x00-\x20=<>]/.test(s)) { throw new Error("Rejected unsafe string for ExifTool"); } } ``` Apply to tag names, `retain` / `numericTags` entries, binary-extraction tag names, filenames, and the `imageHashType` option. This is a denylist and is strictly weaker than the library's internal validator; it is sufficient to block the known PoCs but will accept strings that the library itself now rejects. ### Resources - ExifTool `-stay_open` / argument-file documentation: https://exiftool.org/exiftool_pod.html#stay_open-FLAG - ExifTool tag-name reference: https://exiftool.org/TagNames/ - CWE-88: Improper Neutralization of Argument Delimiters in a Command ('Argument Injection') — https://cwe.mitre.org/data/definitions/88.html ### Credit - Reporter: Hank Tam - Affiliation: Independent

CVE-2026-43893 Affected Exiftool vendored Versions

1 component(s)
Fixed Versions:
35.19.0
Product / Package Ecosystem Affected Versions Fixed Version
exiftool-vendored
npm
< 35.19.0
35.19.0

References

Frequently Asked Questions

What is CVE-2026-43893?
CVE-2026-43893 is a security vulnerability in Exiftool vendored involving exiftool-vendored vulnerable to argument injection via newline characters in tag names under CWE-88: Improper Neutralization of Argument Delimiters in a Command ('Argument Injection').
Which Exiftool vendored versions are affected?
Affected versions include releases prior to 35.19.0 across affected packages: exiftool-vendored.
What version fixes CVE-2026-43893?
Upgrading to 35.19.0 (or the latest patched release for your respective branch) resolves the vulnerability.
Is exiftool-vendored affected?
Yes, exiftool-vendored is affected in releases prior to 35.19.0. Upgrade your dependency to 35.19.0 or later.
What is the CVSS score of CVE-2026-43893?
CVE-2026-43893 has a CVSS v3.1 base score of 8.2 (HIGH) with vector string CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N.
What CWE is associated with CVE-2026-43893?
CVE-2026-43893 is classified under CWE-88: Improper Neutralization of Argument Delimiters in a Command ('Argument Injection') (The product constructs a string for a command to be executed by a separate component in another control sphere, but it does not properly delimit the intended arguments, options, or switches within that command string.).
How can I check npm dependencies for CVE-2026-43893?
Run the dependency tree command: 'npm ls exiftool-vendored'. 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-cw26-7653-2rp5",
  "modified" : "2026-05-13T14:19:52Z",
  "published" : "2026-05-05T19:53:47Z",
  "aliases" : [ "CVE-2026-43893" ],
  "summary" : "exiftool-vendored vulnerable to argument injection via newline characters in tag names",
  "details" : "### Impact\n\n`exiftool-vendored` starts ExifTool in `-stay_open True -@ -` mode, where arguments are read from stdin one per line. In affected versions, several caller-supplied strings were interpolated into ExifTool arguments without rejecting line delimiters. A newline or carriage return inside one of those strings could split a single intended argument into multiple ExifTool arguments, allowing argument injection. The fix also rejects NUL bytes as unsafe control characters.\n\nApplications that pass attacker-controlled strings to affected APIs may allow an attacker to make ExifTool read files accessible to the ExifTool process, or write output to attacker-chosen file system paths accessible to that process. No remote code execution has been demonstrated.\n\nThe reported write-path issue is caused by unsanitized tag **keys**. Tag **values** passed to `ExifTool#write` are not affected, because `WriteTask` already encodes whitespace characters in values (e.g. `\\n` -> `&#10;`) before transmission.\n\nConfirmed affected inputs:\n\n- **Tag-name arguments / tag keys** — keys of the `tags` object passed to `ExifTool#write`; entries of the `retain` option to `ExifTool#deleteAllTags`; entries of the `numericTags` option to `ExifTool#read`; the `tagname` argument to `ExifTool#extractBinaryTag` and `#extractBinaryTagToBuffer`.\n- **Filename / path arguments** to `ExifTool#write`, `#read`, `#readRaw`, `#deleteAllTags`, `#rewriteAllTags`, `#extractBinaryTag`, `#extractBinaryTagToBuffer`, and the binary-extraction convenience methods `#extractJpgFromRaw`, `#extractPreview`, and `#extractThumbnail`. `path.resolve()` does not strip newlines, so an application that accepts attacker-controlled filenames containing newline characters was vulnerable.\n- **The `imageHashType` option** to `ExifTool#read`. TypeScript types restrict this to a literal union, but JS callers or callers with weakened type checking could reach the sink.\n\nApplications that only pass hardcoded strings for tag names, options, and filenames are not affected.\n\n### Patches\n\nFixed in **v35.19.0**. Two layers of defense:\n\n1. **Per-site input validation.** A new `validateTagName` helper rejects any tag-name string containing characters outside the ExifTool tag grammar (letters, digits, `:`, `-`, `_`, and the ExifTool modifiers `*`, `?`, `+`, `#`). Applied at every tag-name interpolation site.\n2. **Defense-in-depth at the command renderer.** `ExifToolTask.renderCommand` now rejects _any_ argument containing `\\r`, `\\n`, or `\\0` before it is sent to the ExifTool process. This catches injection via filename arguments, option values, and any future interpolation site that forgets the per-site validator.\n\n### Workarounds\n\nUpgrade to v35.19.0 or later.\n\nIf upgrading immediately is not possible, reject untrusted strings containing control characters before passing them to the affected APIs. Conservative guard:\n\n```ts\nfunction assertSafeForExifTool(s: string): void {\n  if (typeof s !== \"string\" || /[\\x00-\\x20=<>]/.test(s)) {\n    throw new Error(\"Rejected unsafe string for ExifTool\");\n  }\n}\n```\n\nApply to tag names, `retain` / `numericTags` entries, binary-extraction tag names, filenames, and the `imageHashType` option. This is a denylist and is strictly weaker than the library's internal validator; it is sufficient to block the known PoCs but will accept strings that the library itself now rejects.\n\n### Resources\n\n- ExifTool `-stay_open` / argument-file documentation: https://exiftool.org/exiftool_pod.html#stay_open-FLAG\n- ExifTool tag-name reference: https://exiftool.org/TagNames/\n- CWE-88: Improper Neutralization of Argument Delimiters in a Command ('Argument Injection') — https://cwe.mitre.org/data/definitions/88.html\n\n### Credit\n\n- Reporter: Hank Tam\n- Affiliation: Independent",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "npm",
      "name" : "exiftool-vendored"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "35.19.0"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 35.18.0"
    }
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/photostructure/exiftool-vendored.js/security/advisories/GHSA-cw26-7653-2rp5"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-43893"
  }, {
    "type" : "WEB",
    "url" : "https://exiftool.org/TagNames"
  }, {
    "type" : "WEB",
    "url" : "https://exiftool.org/exiftool_pod.html#stay_open-FLAG"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/photostructure/exiftool-vendored.js"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-88" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-05-05T19:53:47Z",
    "nvd_published_at" : "2026-05-11T22:22:14Z"
  }
}