---
id: "CVE-2026-110684"
kind: "vulnerability"
aliases: ["CVE-2026-110684"]
title: "Cpanel::JSON::XS: encoding stringify values leaks memory until the process exhausts memory"
severity: "low"
cvss: null
epss: null
exploited: false
status: "open"
category: "package"
products: []
ecosystems: []
tags: ["cpanel-json-xs", "long-running-services", "package", "perl"]
not_affected_if: ["no-stringify-options", "version-4.80-or-later"]
published_at: "2026-10-19T19:17:21+00:00"
first_seen_at: "2026-10-23T21:57:18+00:00"
updated_at: "2026-10-25T05:10:46+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-110684", "first_seen_at": "2026-10-23T21:57:18+00:00"}]
---

# Cpanel::JSON::XS: encoding stringify values leaks memory until the process exhausts memory

Cpanel::JSON::XS versions from 3.0202 before 4.80 never release references to overloaded objects and string copies when encoding values as strings. Repeatedly encoding such data grows process memory without bound, which can exhaust memory and crash the service.

_Summary, check and fix written by a model from the sources; labelled as such._

## How to check

- Run `perl -MCpanel::JSON::XS -e 'print $Cpanel::JSON::XS::VERSION'` and check whether the version is at least `4.80`
- Check `cpanfile`, `Makefile.PL`, or `cpanm --info Cpanel::JSON::XS` for the pinned version
- Look for use of `allow_stringify`, `convert_blessed`, or `allow_bignum` on long-running encoders

## Fix

- Upgrade Cpanel::JSON::XS to `4.80` or later
- Restart long-running Perl processes after upgrading so the old module is unloaded

## Timeline

- 2026-10-23T21:57:18+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-110684

## From the sources

Cpanel::JSON::XS versions from 3.0202 before 4.80 for Perl leak memory and retain overloaded objects when encoding values as strings in encode_stringify.

encode_stringify writes a value in its string form under allow_stringify, under convert_blessed for objects without TO_JSON, and under allow_bignum. For an array or hash object with a "" overload, and from 4.20 a scalar object, it takes an extra reference that is never released, so the object and everything it references are never freed. From 4.10 it also never frees its copy of the string.

Repeatedly encoding data that contains such values grows process memory without bound.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
