CVE-2026-65623
Full vulnerability record from the local CVENow database.
Description
Inefficient Algorithmic Complexity vulnerability in mtrudel bandit allows unauthenticated remote denial of service via CPU exhaustion during WebSocket fragment reassembly. The size guard 'Elixir.Bandit.WebSocket.Connection':oversize_message?/2 called from handle_frame/3 in lib/bandit/websocket/connection.ex appends each non-final continuation frame to a left-nested iolist and then re-measures the entire accumulated buffer with IO.iodata_length/1 on every frame. Because the buffer grows by one element per frame and is fully re-traversed each time, reassembly work is quadratic (O(n^2)) in the number of continuation frames. The max_fragmented_message_size limit (default 8 MB) bounds total bytes but not frame count, and each frame can carry as little as one payload byte, so an attacker can send millions of tiny continuation frames using modest bandwidth to pin a CPU core for minutes to hours. Many concurrent connections can starve the whole server of CPU, denying service to legitimate users. The WebSocket read timeout does not help, because it is an idle timeout evaluated between reads and cannot preempt the synchronous reassembly work spent inside a single callback. This issue affects bandit: from 1.11.0 before 1.12.1.
View original CVE JSON
{
"id": "CVE-2026-65623",
"sourceIdentifier": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"published": "2026-07-24T17:17:34.107",
"lastModified": "2026-10-24T13:10:00.147",
"vulnStatus": "Awaiting Analysis",
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "Inefficient Algorithmic Complexity vulnerability in mtrudel bandit allows unauthenticated remote denial of service via CPU exhaustion during WebSocket fragment reassembly.\n\nThe size guard 'Elixir.Bandit.WebSocket.Connection':oversize_message?/2 called from handle_frame/3 in lib/bandit/websocket/connection.ex appends each non-final continuation frame to a left-nested iolist and then re-measures the entire accumulated buffer with IO.iodata_length/1 on every frame. Because the buffer grows by one element per frame and is fully re-traversed each time, reassembly work is quadratic (O(n^2)) in the number of continuation frames.\n\nThe max_fragmented_message_size limit (default 8 MB) bounds total bytes but not frame count, and each frame can carry as little as one payload byte, so an attacker can send millions of tiny continuation frames using modest bandwidth to pin a CPU core for minutes to hours. Many concurrent connections can starve the whole server of CPU, denying service to legitimate users. The WebSocket read timeout does not help, because it is an idle timeout evaluated between reads and cannot preempt the synchronous reassembly work spent inside a single callback.\n\nThis issue affects bandit: from 1.11.0 before 1.12.1."
},
{
"lang": "es",
"value": "Vulnerabilidad de complejidad algorítmica ineficiente en mtrudel bandit permite la denegación de servicio remota no autenticada a través del agotamiento de la CPU durante el reensamblaje de fragmentos de WebSocket.\n\nEl guardia de tamaño ’Elixir.Bandit.WebSocket.Connection’:oversize_message?/2, llamado desde handle_frame/3 en lib/bandit/websocket/connection.ex, añade cada trama de continuación no final a una iolist anidada a la izquierda y luego vuelve a medir todo el búfer acumulado con IO.iodata_length/1 en cada trama. Debido a que el búfer crece en un elemento por trama y se vuelve a recorrer completamente cada vez, el trabajo de reensamblaje es cuadrático (O(n^2)) en el número de tramas de continuación.\n\nEl límite max_fragmented_message_size (predeterminado 8 MB) limita el total de bytes pero no el recuento de tramas, y cada trama puede transportar tan solo un byte de carga útil, por lo que un atacante puede enviar millones de pequeñas tramas de continuación utilizando un ancho de banda modesto para fijar un núcleo de CPU durante minutos u horas. Muchas conexiones concurrentes pueden privar de CPU a todo el servidor, denegando el servicio a usuarios legítimos. El tiempo de espera de lectura de WebSocket no ayuda, porque es un tiempo de espera inactivo evaluado entre lecturas y no puede anticipar el trabajo de reensamblaje síncrono realizado dentro de una única devolución de llamada.\n\nEste problema afecta a bandit: desde 1.11.0 antes de 1.12.1."
}
],
"affected": [
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"affectedData": [
{
"vendor": "mtrudel",
"product": "bandit",
"defaultStatus": "unaffected",
"collectionURL": "https://repo.hex.pm",
"packageName": "bandit",
"cpes": [
"cpe:2.3:a:mtrudel:bandit:*:*:*:*:*:*:*:*"
],
"modules": [
"Elixir.Bandit.WebSocket.Connection"
],
"programFiles": [
"lib/bandit/websocket/connection.ex"
],
"programRoutines": [
{
"name": "'Elixir.Bandit.WebSocket.Connection':handle_frame/3"
},
{
"name": "'Elixir.Bandit.WebSocket.Connection':oversize_message?/2"
}
],
"repo": "https://github.com/mtrudel/bandit",
"packageURL": "pkg:hex/bandit",
"versions": [
{
"version": "1.11.0",
"lessThan": "1.12.1",
"versionType": "semver",
"status": "affected"
}
]
},
{
"vendor": "mtrudel",
"product": "bandit",
"defaultStatus": "unaffected",
"collectionURL": "https://github.com",
"packageName": "mtrudel/bandit",
"cpes": [
"cpe:2.3:a:mtrudel:bandit:*:*:*:*:*:*:*:*"
],
"modules": [
"Elixir.Bandit.WebSocket.Connection"
],
"programFiles": [
"lib/bandit/websocket/connection.ex"
],
"programRoutines": [
{
"name": "'Elixir.Bandit.WebSocket.Connection':handle_frame/3"
},
{
"name": "'Elixir.Bandit.WebSocket.Connection':oversize_message?/2"
}
],
"repo": "https://github.com/mtrudel/bandit",
"packageURL": "pkg:github/mtrudel/bandit",
"versions": [
{
"version": "21612c7c7b1ce43eccd36d3af3a2299d23513667",
"lessThan": "418ef7e906192a230ddba112f7a669c87b6b0e3a",
"versionType": "git",
"status": "affected"
}
]
}
]
}
],
"metrics": {
"cvssMetricV40": [
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"type": "Secondary",
"cvssData": {
"version": "4.0",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"baseScore": 8.7,
"baseSeverity": "HIGH",
"attackVector": "NETWORK",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"privilegesRequired": "NONE",
"userInteraction": "NONE",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "NONE",
"vulnAvailabilityImpact": "HIGH",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"subAvailabilityImpact": "NONE",
"exploitMaturity": "NOT_DEFINED",
"confidentialityRequirement": "NOT_DEFINED",
"integrityRequirement": "NOT_DEFINED",
"availabilityRequirement": "NOT_DEFINED",
"modifiedAttackVector": "NOT_DEFINED",
"modifiedAttackComplexity": "NOT_DEFINED",
"modifiedAttackRequirements": "NOT_DEFINED",
"modifiedPrivilegesRequired": "NOT_DEFINED",
"modifiedUserInteraction": "NOT_DEFINED",
"modifiedVulnConfidentialityImpact": "NOT_DEFINED",
"modifiedVulnIntegrityImpact": "NOT_DEFINED",
"modifiedVulnAvailabilityImpact": "NOT_DEFINED",
"modifiedSubConfidentialityImpact": "NOT_DEFINED",
"modifiedSubIntegrityImpact": "NOT_DEFINED",
"modifiedSubAvailabilityImpact": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"valueDensity": "NOT_DEFINED",
"vulnerabilityResponseEffort": "NOT_DEFINED",
"providerUrgency": "NOT_DEFINED"
}
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"timestamp": "2026-07-24T17:08:51.111665Z",
"id": "CVE-2026-65623",
"options": [
{
"exploitation": "poc"
},
{
"automatable": "yes"
},
{
"technicalImpact": "partial"
}
],
"role": "CISA Coordinator",
"version": "2.0.3"
}
}
]
},
"weaknesses": [
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"type": "Secondary",
"description": [
{
"lang": "en",
"value": "CWE-407"
}
]
}
],
"references": [
{
"url": "https://cna.erlef.org/cves/CVE-2026-65623.html",
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
},
{
"url": "https://github.com/mtrudel/bandit/commit/418ef7e906192a230ddba112f7a669c87b6b0e3a",
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
},
{
"url": "https://github.com/mtrudel/bandit/security/advisories/GHSA-vg8x-66vg-5pxh",
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
},
{
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-65623",
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
},
{
"url": "https://github.com/mtrudel/bandit/security/advisories/GHSA-vg8x-66vg-5pxh",
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0"
}
]
}