<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Absinthe (&gt;= 1.5.0, &lt; 1.10.2) — CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/products/absinthe--1.5.0--1.10.2/</link><description>Trending threats, MITRE ATT&amp;CK coverage, and detection metadata. Fed continuously.</description><generator>Hugo</generator><language>en</language><managingEditor>hello@craftedsignal.io</managingEditor><webMaster>hello@craftedsignal.io</webMaster><lastBuildDate>Thu, 14 May 2026 13:10:10 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/products/absinthe--1.5.0--1.10.2/feed.xml" rel="self" type="application/rss+xml"/><item><title>Absinthe GraphQL Atom Table Exhaustion Vulnerability</title><link>https://feed.craftedsignal.io/briefs/2026-05-absinthe-atom-dos/</link><pubDate>Thu, 14 May 2026 13:10:10 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-05-absinthe-atom-dos/</guid><description>Absinthe versions 1.5.0 before 1.10.2 are vulnerable to a denial-of-service attack (CVE-2026-42793) due to unbounded atom creation when parsing GraphQL SDL documents, allowing an attacker to exhaust the Erlang VM's atom table and crash the entire node by submitting a crafted document with numerous unique directive names.</description><content:encoded><![CDATA[<p>Absinthe, a GraphQL toolkit for Elixir, is susceptible to a denial-of-service vulnerability (CVE-2026-42793) affecting versions 1.5.0 prior to 1.10.2. The vulnerability stems from the way Absinthe parses GraphQL SDL documents. Specifically, every <code>directive @&lt;name&gt;</code> definition is converted into a newly created atom without any allow-list or length cap. Since Erlang atoms are never garbage-collected and the BEAM VM has a finite atom table (approximately 1,048,576 atoms), an attacker can exhaust this table by sending a specially crafted GraphQL document containing a large number of unique directive names. The attack requires no authentication and impacts all workloads on the Erlang node.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>An attacker crafts a GraphQL SDL document containing a large number of unique directive definitions (e.g., <code>directive @randomName1 on FIELD</code>, <code>directive @randomName2 on FIELD</code>, etc.).</li>
<li>The attacker sends an HTTP POST request to the <code>/graphql</code> endpoint of an application using <code>absinthe_plug</code>.</li>
<li><code>Plug.Parsers</code> processes the request and parses the GraphQL document using <code>Absinthe.Plug.Parser</code>.</li>
<li><code>Absinthe.Phase.Parse</code> is invoked to parse the SDL.</li>
<li><code>Absinthe.Blueprint.Draft.convert/2</code> processes the parsed SDL.</li>
<li>For each <code>DirectiveDefinition</code> node in the SDL, <code>Macro.underscore(node.name) |&gt; String.to_atom()</code> is called in <code>lib/absinthe/language/directive_definition.ex:27</code>, creating a new atom from the directive name. This also occurs in <code>lib/absinthe/language/enum_type_definition.ex:23</code>, <code>lib/absinthe/language/field_definition.ex:27</code>, etc.</li>
<li>If the attacker-controlled document contains enough unique directive names (approaching 1 million), the BEAM VM&rsquo;s atom table becomes exhausted.</li>
<li>Subsequent attempts to create new atoms result in a crash of the entire Erlang node, causing a denial of service.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>Successful exploitation of this vulnerability results in a denial-of-service condition, where the entire Erlang node crashes due to atom-table exhaustion. This impacts not only the Absinthe-based application but also any other Erlang-based workloads running on the same VM. The vulnerability can be triggered without authentication and requires only the ability to send a specially crafted GraphQL document to an exposed endpoint.</p>
<h2 id="recommendation">Recommendation</h2>
<ul>
<li>Upgrade to Absinthe version 1.10.2 or later to patch CVE-2026-42793.</li>
<li>Implement input validation and sanitization on any endpoint that accepts GraphQL SDL documents to prevent attackers from injecting a large number of unique directive names.</li>
<li>Monitor the Erlang VM&rsquo;s atom count using <code>:erlang.system_info(:atom_count)</code> and alert if it approaches the limit (approximately 1,048,576). This can provide early warning of an attempted atom-table exhaustion attack.</li>
<li>Deploy the Sigma rule &ldquo;Detect Absinthe GraphQL Atom Table Exhaustion Attempt&rdquo; to identify suspicious GraphQL payloads containing numerous unique directive definitions based on HTTP request logs.</li>
</ul>
]]></content:encoded><category domain="severity">medium</category><category domain="type">advisory</category><category>denial-of-service</category><category>graphql</category><category>atom-table-exhaustion</category></item></channel></rss>