PHP2Shell: Read our blog on the critical RCE vulnerabilities affecting 70% of the Internet
Vulnerability DatabaseCVE-2026-104635

CVE-2026-104635: 
Alma Linux vulnerability analysis and mitigation

Overview

CVE-2026-104635 is an uncontrolled recursion vulnerability in the JSON decoder (Protobuf.JSON.Decode) of the elixir-protobuf protobuf Hex package that allows an unauthenticated remote attacker to crash the decoding process via a deeply nested JSON document. It affects versions >= 0.8.0 and <= 0.17.0 of the protobuf package for Elixir/Erlang; version 0.17.1 contains the fix. The vulnerability was published on October 9, 2026, and is classified as High severity with a CVSS v4.0 base score of 8.2 (GitHub Advisory, Red Hat CVE).

Technical details

The root cause is an uncontrolled recursion flaw (CWE-674) combined with allocation without limits (CWE-770) in lib/protobuf/json/decode.ex. The decode_singular/3 function's embedded-message clause calls internal_from_json_data/3 recursively for each nesting level without incrementing or checking the decoder's depth counter (state.depth remains 0 throughout). The existing depth guard increase_depth_and_maybe_throw/1 is only applied to Google.Protobuf.ListValue and Google.Protobuf.Struct well-known types, meaning the recursion_limit option has no effect on user-defined message types. An attacker targeting any endpoint that calls Protobuf.JSON.decode/3, decode!/3, or from_decoded/3 on a schema with a self-referential or cyclic message type (e.g., message TreeNode { TreeNode child = 1; }) can trigger unbounded recursion — approximately 100 KB of JSON yields ~5,000 nesting levels, each allocating a fresh stack frame and heap objects (GitHub Advisory, OSV).

Impact

Successful exploitation causes a deterministic crash of the BEAM decoding process through stack and memory exhaustion, resulting in a denial of service. Because the BEAM max_heap_size process flag defaults to unlimited, a sufficiently deep document or a handful of concurrent requests can plausibly exhaust the memory of the entire node, disrupting co-located workloads beyond just the targeted request process. Confidentiality and integrity are not affected — the impact is limited to availability (GitHub Advisory).

Exploitability

A proof-of-concept is publicly available on OSV.dev demonstrating the exploit steps, though no active in-the-wild exploitation has been observed. The attack requires no authentication, no privileges, and no user interaction — a single crafted HTTP request to a vulnerable endpoint is sufficient. The NVD SSVC assessment classifies exploitation as "poc" and automatable as "no" (due to the precondition that the target schema must contain a self-referential or cyclic message type). The EPSS score is approximately 0.387%, and the vulnerability is not currently listed in the CISA KEV catalog (OSV, Red Hat CVE).

Exploitation steps

  1. Reconnaissance: Identify application endpoints that accept JSON request bodies and decode them using Protobuf.JSON.decode/3, decode!/3, or from_decoded/3 into a protobuf schema containing a self-referential or cyclic message type (e.g., a TreeNode message with a child field of type TreeNode).
  2. Craft the payload: Build a deeply nested JSON document targeting the self-referential field. For example, wrap {} inside {"child": ...} approximately 5,000 times to produce a ~100 KB payload:
depth = 5_000
json = Enum.reduce(1..depth, "{}", fn _level, inner ->
  "{\"child\":" <> inner <> "}"
end)
  1. Send the request: Submit the crafted JSON body to the vulnerable endpoint via a standard HTTP POST request. No authentication headers or special privileges are required.
  2. Trigger unbounded recursion: The decoder recurses once per nesting level through internal_from_json_data/3 -> decode_message/4 -> decode_regular_fields/3 -> decode_value/3 -> decode_singular/3 and back, with no depth check applied. Even if recursion_limit: 100 is explicitly set, it has no effect on user-defined message types.
  3. Achieve denial of service: The decoding process exhausts stack frames and heap memory, crashing the BEAM process. Sending concurrent requests amplifies the impact, potentially exhausting node-wide memory and disrupting all co-located workloads (GitHub Advisory, OSV).

Indicators of compromise

  • Network: Unusually large JSON request bodies (>100 KB) sent to API endpoints that process protobuf-encoded data; repeated requests from the same source IP targeting JSON-accepting endpoints.
  • Logs: Application logs showing BEAM process crashes or out-of-memory errors coinciding with JSON decode operations; error entries referencing Protobuf.JSON.Decode or internal_from_json_data; absence of {:recursion_limit_exceeded, N} errors despite deeply nested input (indicating the unguarded code path was hit).
  • Process: Sudden termination of Elixir/Erlang BEAM worker processes; node-wide memory exhaustion events; supervisor restart storms following process crashes attributed to JSON decoding tasks.

Mitigation and workarounds

Upgrade the protobuf Hex package to version 0.17.1 or later, which fixes the vulnerability by adding increase_depth_and_maybe_throw/1 calls in decode_message/4 and the Google.Protobuf.Any clause of internal_from_json_data/3, enforcing the recursion_limit for all message types (GitHub Fix Commit). As an interim workaround without a code change, operators should enforce request body size limits (e.g., reject bodies >50 KB) and validate or reject deeply nested JSON at the web server or middleware layer before it reaches the decoder. Avoiding exposure of endpoints that decode attacker-controlled JSON into self-referential protobuf schemas is also advisable until patching is complete (GitHub Advisory, Red Hat Bugzilla).

Community reactions

The vulnerability was reported by researcher @manus-pi (GitHub) and published by the Erlang Ecosystem Foundation (EEF) CNA. The advisory notes this is a bypass of a prior related fix (GHSA-rv48-qqj5-crxg / CVE-2026-54451) that addressed the same unbounded recursion issue in the binary decoder (Protobuf.Decoder) in version 0.16.1, but did not cover the JSON decoder path — highlighting the risk of incomplete security fixes in serialization libraries (GitHub Advisory).

Additional resources

Linux Distribution fix status

Fix availability across major Linux distributions and their releases.

RHEL / CentOS

Affected

OpenShift

openshift/ose-rhel-coreos-8

Affected

RHEL 8

protobuf.src

Affected

RHEL 9

protobuf.src

Affected

RHEL 10

protobuf.src

Affected

Source: This report was generated using AI

Related Alma Linux vulnerabilities:

CVE ID

Severity

Score

Technologies

Component name

CISA KEV exploit

Has fix

Published date

CVE-2026-106072MEDIUM6.7
  • npm logonpm
  • nodejs-full-i18n
NoYesOct 23, 2026
CVE-2026-106074MEDIUM4.8
  • npm logonpm
  • v8-devel
NoYesOct 23, 2026
CVE-2026-106070LOW3.7
  • npm logonpm
  • nodejs
NoYesOct 23, 2026
CVE-2026-106071LOW3.6
  • npm logonpm
  • v8-devel
NoYesOct 23, 2026
CVE-2026-106073LOW3.3
  • npm logonpm
  • nodejs24
NoYesOct 23, 2026

Free Vulnerability Assessment

Benchmark your Cloud Security Posture

Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.

Request assessment

Get a personalized demo

Ready to see Wiz in action?

"Best User Experience I have ever seen, provides full visibility to cloud workloads."
David EstlickCISO
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
Adam FletcherChief Security Officer
"We know that if Wiz identifies something as critical, it actually is."
Greg PoniatowskiHead of Threat and Vulnerability Management