Skip to content

Build1 publisherNot yet confirmed elsewhere2 min readPublished

FreeSWITCH mod_verto overflows its 2 MiB buffer when a browser declares a 10 MiB body

FreeSWITCH shipped version 1.11.1 to fix CVE-2026-49841, a CVSS 9.8 heap overflow in mod_verto that an unauthenticated browser request can trigger. The read loop copies up to the client's declared Content-Length into a fixed 2 MiB buffer.

The Engineer · Build desk

How we use AISend a correction

Illustration accompanying FreeSWITCH mod_verto overflows its 2 MiB buffer when a browser declares a 10 MiB body
Generated illustration

What happened

  • The overflow happens while FreeSWITCH is still parsing the request, so anyone who can reach the Verto HTTP endpoint can trigger it without a SIP credential.
  • Code execution would land in the process that handles call routing, SIP authentication, and the media path, which is the control plane of the phone system.
  • A ZoomEye query on October 5 returned 4,066 assets matching the FreeSWITCH service fingerprint and 401 whose web page carried a FreeSWITCH title.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • exposure In many FreeSWITCH deployments the Verto endpoint is published to the whole internet for browser clients, so the unauthenticated attack path is open on those hosts until they run 1.11.1.
  • constraint No configuration change removes the overflow, because the copy happens inside the handler itself, so a pre-1.11.1 host stays exploitable until it is upgraded.
  • decision A filter has to pass the large bodies that legitimate Verto clients send, so a crude Content-Length rule that blocks the attack also breaks calling.

mod_verto accepts form-encoded POST bodies from browsers running the Verto WebRTC client, and reserves 2 MiB for the body [7][1]. The same handler accepts a Content-Length header of just under 10 MiB [2]. The copy loop is bounded by that declared length, not by the size of the buffer, and nothing in the path compares the two before copying begins [3]. Announce just under 10 MiB and deliver it, and the copy runs past the end of the allocation [8]: roughly 8 MiB beyond a 2 MiB buffer [23].

The shape is familiar in C request handlers. One function decides how much memory to reserve, another decides how much to copy, and nothing forces the two numbers to agree [10]. Here the first number is a compile-time constant and the second is an integer the client supplies in a header [4]. A handler that uses that header as a loop bound is trusting an attacker-supplied integer [11]. According to the dev.to write-up, the safe version rejects a request whose declared length exceeds the buffer, or sizes the allocation from the declared length after applying an upper bound [12].

The 1.11.1 release note is the reference for which build closes which issue [19]. CVE-2026-49841, the 9.8 overflow, is fixed in 1.11.1 [9], while CVE-2026-49472, a function cloned from an outdated libexpat whose upstream patch was never carried across, was fixed one release earlier in 1.11.0 [18]. Only 1.11.1 or later closes both [24]. CVE-2026-49475 and CVE-2026-45771 were published in the same window [19].

If the upgrade has to wait, put the endpoint behind a reverse proxy that terminates TLS and enforces an allowlist of known networks, which removes the anonymous case an attacker will use [15]. Check whether mod_verto is loaded at all, because some installs turn it on for a trial and never turn it off [16]. If it is loaded but unused, it is still listening. Watch the host for crashes too. Exploit attempts are likely to bring the process down whether they fail or succeed, so if the signalling or media process keeps segfaulting, check those crashes against the HTTP access log [17].

The two ZoomEye counts describe different things. The app field comes from protocol behaviour, so it catches installs that never render a product name in a web page; the title field only matches where a management interface or default page exposes an HTML title [21]. Neither is a count of vulnerable systems [22].

What to watch

  • Publication of a working exploit for CVE-2026-49841. That would move the risk from exposed scanning to active exploitation.
  • Any correction to the 1.11.1 release note on which build closes CVE-2026-49475 and CVE-2026-45771.
  • Scanners moving from banner fingerprints to detecting the pre-1.11.1 version. With version detection, the ZoomEye counts would become an actual exposed population.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence62
Adoption
Insufficient
Hype gap+5
Incentives
Insufficient
Confidence58
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    In versions before 1.11.1, mod_verto allocates a fixed 2 MiB buffer for a POST body of type application/x-www-form-urlencoded.

  2. [2]

    The module accepts a Content-Length header of just under 10 MiB.

  3. [3]

    The loop that copies the body into the buffer is bounded by the declared Content-Length rather than the buffer size, and nothing in the code path compares the two before the copy begins.

Sources

1 independent publisher whose own reporting we read for this story.

  1. dev.to

    1 article · October 7, 2026

    FreeSWITCH mod_verto: a 2 MiB buffer and a 10 MiB Content-Length

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Topics

Entities

Loading related stories