Summary
dcmjs: DS/IS VALUE REPRESENTATION INPUT VALIDATION BYPASS
dcmjs, a JavaScript library for DICOM manipulation used in web-based medical
imaging viewers, contains an input validation bypass in its handling of DS
(Decimal String) and IS (Integer String) value representations.
The DecimalString and IntegerString classes in ValueRepresentation.js use a
regex sanitizer followed by JavaScript's Number() constructor. While the regex
strips direct NaN/Infinity strings, it preserves scientific notation (including
the 'e' character), enabling:
- Infinity injection via scientific notation overflow (1e999999)
- NaN injection via sign-only remnants from stripped inf strings ("-inf" -> "-")
- IS accepting scientific notation in violation of PS3.5
Product: dcmjs (JavaScript DICOM manipulation library)
Repository: https://github.com/dcmjs-org/dcmjs
npm: https://www.npmjs.com/package/dcmjs
Affected Versions: < 0.52.0 (patched in 0.52.0, released 2026-05-19)
CVE: CVE-2026-46350 (assigned by GitHub 2026-05-13)
CWE: CWE-20 (Improper Input Validation)
CVSS Score: 7.5 (HIGH)
CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H
Maintainer note: The CVSS score above is the reporter's assessment; dcmjs rates this low, because malformed input produces NaN/Infinity in values the caller must range-check in any case (both are reachable by other means, and no trust boundary enforced by dcmjs is crossed).
dcmjs is a foundational library used by:
- OHIF Viewer (Open Health Imaging Foundation)
- Cornerstone.js ecosystem
- DICOMweb client/server implementations
- Research and clinical web-based PACS viewers
- Any Node.js or browser application parsing DICOM via dcmjs
In src/ValueRepresentation.js, both DecimalString and IntegerString use:
let returnVal = numberStr.trim().replace(/[^0-9.\\\-+e]/gi, "");
return returnVal === "" ? null : Number(returnVal);
The regex /[^0-9.\-+e]/gi strips characters NOT in the set {0-9, ., , -, +,
e, E}. This provides partial defense: direct "NaN" and "Infinity" strings are
stripped to empty/null. However:
(a) Scientific notation is fully preserved because 'e', digits, '+', '-', '.'
all pass the regex. "1e999999" passes intact, and Number("1e999999")
returns JavaScript Infinity.
(b) The string "-inf" is stripped to just "-" (only the minus passes the
regex). Number("-") returns JavaScript NaN.
(c) IntegerString uses the SAME regex/logic as DecimalString, meaning IS
accepts scientific notation ("1e5" -> 100000) in violation of PS3.5
Section 6.2, which restricts IS to characters 0-9, +, -.
(d) No range validation exists for IS values (PS3.5 requires [-2^31, 2^31-1])
or DS values (16-character max, fixed/floating-point only).
Attack Vector 1: Infinity via Scientific Notation Overflow
Input: DS or IS field containing "1e999999"
Regex: Passes (all chars in allowed set)
Result: Number("1e999999") -> Infinity
Impact: Infinity propagates through all downstream arithmetic
Attack Vector 2: Negative Infinity via Scientific Notation
Input: DS or IS field containing "-1e999999"
Regex: Passes
Result: Number("-1e999999") -> -Infinity
Impact: Negative Infinity in spatial/dosimetric calculations
Attack Vector 3: NaN via Sign-Only Remnant
Input: DS or IS field containing "-inf"
Regex: Strips to "-"
Result: Number("-") -> NaN
Impact: NaN propagates silently through arithmetic (IEEE 754)
Attack Vector 4: NaN via Plus-Only Remnant
Input: DS or IS field containing "+inf"
Regex: Strips to "+"
Result: Number("+") -> NaN
Impact: Same as above
Attack Vector 5: IS Scientific Notation Bypass
Input: IS field containing "1e5"
Regex: Passes
Result: Number("1e5") -> 100000
Impact: Integer fields accept non-integer representation, violating PS3.5
Attack Vector 6: IS Extreme Overflow
Input: IS field containing "1e18"
Regex: Passes
Result: Number("1e18") -> 1000000000000000000
Impact: Far exceeds IS range [-2^31, 2^31-1], no bounds check
dcmjs is used in web-based DICOM viewers and processing pipelines.
Corrupted values affect:
PixelSpacing / ImagePositionPatient: Spatial geometry corruption prevents
accurate measurement and registration in web viewersWindowCenter / WindowWidth: Display pipeline corruption makes images
unreadable (all black or all white)DoseGridScaling / NumberOfFrames: Radiation therapy dose display errors
and denial of service via frame count overflowRescaleSlope / RescaleIntercept: Hounsfield unit conversion produces
invalid values, corrupting quantitative analysisSliceThickness: Volume reconstruction fails in multiplanar reformats
Impact
The application does not adequately validate input before processing it, allowing unexpected values to reach sensitive code paths. Typical impact: varies by context: data corruption, logic bypass, or denial of service.
Affected versions
Security releases
Kodem intelligence
Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.
Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.
Already deployed Kodem?
See it in your environmentNew to Kodem? Get a demo →Remediation advice
Kodem Kai can prioritize this vulnerability in your dependency tree and generate a fix recommendation.
Frequently Asked Questions
- What is CVE-2026-46350? CVE-2026-46350 is a low-severity improper input validation vulnerability in dcmjs (npm), affecting versions < 0.52.0. It is fixed in 0.52.0. The application does not adequately validate input before processing it, allowing unexpected values to reach sensitive code paths.
- Which versions of dcmjs are affected by CVE-2026-46350? dcmjs (npm) versions < 0.52.0 is affected.
- Is there a fix for CVE-2026-46350? Yes. CVE-2026-46350 is fixed in 0.52.0. Upgrade to this version or later.
- Is CVE-2026-46350 exploitable, and should I be worried? Whether CVE-2026-46350 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
- What actually determines whether CVE-2026-46350 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
- How do I fix CVE-2026-46350? Upgrade
dcmjsto 0.52.0 or later.