CVE-2026-8469
Allocation of Resources Without Limits or Throttling vulnerability in phenixdigital phoenix_storybook allows unauthenticated denial-of-service via BEAM atom table exhaustion.
Multiple LiveView event handlers convert user-supplied event parameter strings to atoms using String.to_atom/1 without validation: 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':handle_set_variation_assign/3 interns every key of the psb-assign params map; 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':handle_toggle_variation_assign/3 interns the "attr" value from psb-toggle events; 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':to_variation_id/2 interns elements of "variation_id"; and 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':to_value/4 interns raw string values for attributes declared as :atom or :boolean.
Leer descripción completaMostrar menos
BEAM atoms are never garbage-collected, so each unique attacker-controlled string is a permanent allocation. Once the atom table ceiling (~1,048,576 atoms) is reached, the entire BEAM node aborts, taking down all applications running on it.
This issue affects phoenix_storybook from 0.2.0 before 1.1.0.
CVSS
- Versión: 4.0
- Vector: CVSS:4.0/AV:N/AC:L/AT:P/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
- Puntuación base: 8.2
Probabilidad de explotación (EPSS)
- Probabilidad de explotación en los próximos 30 días: 0.52%
- Percentil entre todas las CVEs puntuadas: 43
- Fecha de la puntuación: 6/10/2026
EPSS (Exploit Prediction Scoring System, de FIRST) estima la probabilidad de que una vulnerabilidad sea explotada en 30 días. Complementa a CVSS (impacto) y a CISA KEV (explotación confirmada).
🎯 Técnicas ATT&CK
Cómo se explota esta vulnerabilidad y qué consigue el atacante, en el lenguaje de MITRE ATT&CK.
- Explotación
T1190Exploit Public-Facing Applicationinitial access85 % - Impacto principal
T1499.004Application or System Exploitationimpact90 % - Impacto secundario
T1499Endpoint Denial of Serviceimpact75 %
CVE CWE-770 sin autenticación (PR:N) en aplicación web expuesta; atacante envía eventos malformados a handlers LiveView que convierten strings a atoms sin límite, agotando tabla BEAM (~1M atoms) → abort del nodo = DoS.
Inferido por nuestro agente de análisis a partir de la descripción oficial, el vector CVSS y la CWE, y comprobado por un supervisor. Puede contener errores.
🛡️ Mitigaciones ATT&CK que cubren estas técnicas
Tecnologías afectadas (1)
⚠ Inferidas por IA a partir de la descripción — NVD aún no ha analizado esta CVE; no son CPE verificados.
CWE
- CWE-770
Referencias
- https://cna.erlef.org/cves/CVE-2026-8469.html
- https://github.com/phenixdigital/phoenix_storybook/commit/96d524690af0fe197a49f60d18e564a620b9ef81
- https://github.com/phenixdigital/phoenix_storybook/security/advisories/GHSA-833p-95jq-929q
- https://osv.dev/vulnerability/EEF-CVE-2026-8469
- https://github.com/phenixdigital/phoenix_storybook/security/advisories/GHSA-833p-95jq-929q
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-8469",
"cveTags": [],
"metrics": {
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"id": "CVE-2026-8469",
"role": "CISA Coordinator",
"options": [
{
"exploitation": "poc"
},
{
"automatable": "yes"
},
{
"technicalImpact": "partial"
}
],
"version": "2.0.3",
"timestamp": "2026-05-21T13:55:42.783019Z"
}
}
],
"cvssMetricV40": [
{
"type": "Secondary",
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"cvssData": {
"Safety": "NOT_DEFINED",
"version": "4.0",
"Recovery": "NOT_DEFINED",
"baseScore": 8.2,
"Automatable": "NOT_DEFINED",
"attackVector": "NETWORK",
"baseSeverity": "HIGH",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/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",
"exploitMaturity": "NOT_DEFINED",
"providerUrgency": "NOT_DEFINED",
"userInteraction": "NONE",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"privilegesRequired": "NONE",
"subIntegrityImpact": "NONE",
"vulnIntegrityImpact": "NONE",
"integrityRequirement": "NOT_DEFINED",
"modifiedAttackVector": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"vulnAvailabilityImpact": "HIGH",
"availabilityRequirement": "NOT_DEFINED",
"modifiedUserInteraction": "NOT_DEFINED",
"modifiedAttackComplexity": "NOT_DEFINED",
"subConfidentialityImpact": "NONE",
"vulnConfidentialityImpact": "NONE",
"confidentialityRequirement": "NOT_DEFINED",
"modifiedAttackRequirements": "NOT_DEFINED",
"modifiedPrivilegesRequired": "NOT_DEFINED",
"modifiedSubIntegrityImpact": "NOT_DEFINED",
"modifiedVulnIntegrityImpact": "NOT_DEFINED",
"vulnerabilityResponseEffort": "NOT_DEFINED",
"modifiedSubAvailabilityImpact": "NOT_DEFINED",
"modifiedVulnAvailabilityImpact": "NOT_DEFINED",
"modifiedSubConfidentialityImpact": "NOT_DEFINED",
"modifiedVulnConfidentialityImpact": "NOT_DEFINED"
}
}
]
},
"affected": [
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"affectedData": [
{
"cpes": [
"cpe:2.3:a:phenixdigital:phoenix_storybook:*:*:*:*:*:*:*:*"
],
"repo": "https://github.com/phenixdigital/phoenix_storybook",
"vendor": "phenixdigital",
"modules": [
"Elixir.PhoenixStorybook.ExtraAssignsHelpers",
"Elixir.PhoenixStorybook.Story.Playground"
],
"product": "phoenix_storybook",
"versions": [
{
"status": "affected",
"version": "0.2.0",
"lessThan": "1.1.0",
"versionType": "semver"
}
],
"packageURL": "pkg:hex/phoenix_storybook",
"packageName": "phoenix_storybook",
"programFiles": [
"lib/phoenix_storybook/helpers/extra_assigns_helpers.ex",
"lib/phx_live_storybook/live/entry_live.ex"
],
"collectionURL": "https://repo.hex.pm",
"defaultStatus": "unaffected",
"programRoutines": [
{
"name": "'Elixir.PhoenixStorybook.ExtraAssignsHelpers':handle_set_variation_assign/3"
},
{
"name": "'Elixir.PhoenixStorybook.ExtraAssignsHelpers':handle_toggle_variation_assign/3"
},
{
"name": "'Elixir.PhoenixStorybook.ExtraAssignsHelpers':to_variation_id/2"
},
{
"name": "'Elixir.PhoenixStorybook.ExtraAssignsHelpers':to_value/4"
}
]
},
{
"cpes": [
"cpe:2.3:a:phenixdigital:phoenix_storybook:*:*:*:*:*:*:*:*"
],
"repo": "https://github.com/phenixdigital/phoenix_storybook",
"vendor": "phenixdigital",
"modules": [
"Elixir.PhoenixStorybook.ExtraAssignsHelpers",
"Elixir.PhoenixStorybook.Story.Playground"
],
"product": "phoenix_storybook",
"versions": [
{
"status": "affected",
"version": "0228669d55c23a754d1ef11f49a32121129d5395",
"lessThan": "96d524690af0fe197a49f60d18e564a620b9ef81",
"versionType": "git"
}
],
"packageURL": "pkg:github/phenixdigital/phoenix_storybook",
"packageName": "phenixdigital/phoenix_storybook",
"programFiles": [
"lib/phoenix_storybook/helpers/extra_assigns_helpers.ex",
"lib/phx_live_storybook/live/entry_live.ex"
],
"collectionURL": "https://github.com",
"defaultStatus": "unaffected",
"programRoutines": [
{
"name": "'Elixir.PhoenixStorybook.ExtraAssignsHelpers':handle_set_variation_assign/3"
},
{
"name": "'Elixir.PhoenixStorybook.ExtraAssignsHelpers':handle_toggle_variation_assign/3"
},
{
"name": "'Elixir.PhoenixStorybook.ExtraAssignsHelpers':to_variation_id/2"
},
{
"name": "'Elixir.PhoenixStorybook.ExtraAssignsHelpers':to_value/4"
}
]
}
]
}
],
"published": "2026-05-20T14:17:04.447",
"references": [
{
"url": "https://cna.erlef.org/cves/CVE-2026-8469.html",
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
},
{
"url": "https://github.com/phenixdigital/phoenix_storybook/commit/96d524690af0fe197a49f60d18e564a620b9ef81",
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
},
{
"url": "https://github.com/phenixdigital/phoenix_storybook/security/advisories/GHSA-833p-95jq-929q",
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
},
{
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-8469",
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
},
{
"url": "https://github.com/phenixdigital/phoenix_storybook/security/advisories/GHSA-833p-95jq-929q",
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0"
}
],
"vulnStatus": "Deferred",
"weaknesses": [
{
"type": "Secondary",
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"description": [
{
"lang": "en",
"value": "CWE-770"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "Allocation of Resources Without Limits or Throttling vulnerability in phenixdigital phoenix_storybook allows unauthenticated denial-of-service via BEAM atom table exhaustion.\n\nMultiple LiveView event handlers convert user-supplied event parameter strings to atoms using String.to_atom/1 without validation: 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':handle_set_variation_assign/3 interns every key of the psb-assign params map; 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':handle_toggle_variation_assign/3 interns the \"attr\" value from psb-toggle events; 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':to_variation_id/2 interns elements of \"variation_id\"; and 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':to_value/4 interns raw string values for attributes declared as :atom or :boolean. BEAM atoms are never garbage-collected, so each unique attacker-controlled string is a permanent allocation. Once the atom table ceiling (~1,048,576 atoms) is reached, the entire BEAM node aborts, taking down all applications running on it.\n\nThis issue affects phoenix_storybook from 0.2.0 before 1.1.0."
},
{
"lang": "es",
"value": "Vulnerabilidad de asignación de recursos sin límites ni limitación en phenixdigital phoenix_storybook permite una denegación de servicio no autenticada mediante el agotamiento de la tabla de átomos de BEAM.\n\nMúltiples manejadores de eventos de LiveView convierten cadenas de parámetros de eventos suministradas por el usuario en átomos utilizando String.to_atom/1 sin validación: 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':handle_set_variation_assign/3 interna cada clave del mapa de parámetros psb-assign; 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':handle_toggle_variation_assign/3 interna el valor 'attr' de los eventos psb-toggle; 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':to_variation_id/2 interna elementos de 'variation_id'; y 'Elixir.PhoenixStorybook.ExtraAssignsHelpers':to_value/4 interna valores de cadena sin procesar para atributos declarados como :atom o :boolean. Los átomos de BEAM nunca se recolectan por el recolector de basura, por lo que cada cadena única controlada por el atacante es una asignación permanente. Una vez que se alcanza el límite de la tabla de átomos (~1.048.576 átomos), el nodo BEAM completo aborta, derribando todas las aplicaciones que se ejecutan en él.\n\nEste problema afecta a phoenix_storybook desde 0.2.0 antes de 1.1.0."
}
],
"lastModified": "2026-07-23T12:10:00.110",
"sourceIdentifier": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
}