Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconCraft prompt-injection payload
-
DeliverySubmit payload through application input
-
ExploitLLM processes injected instruction
-
InstallModel re-emits spent tool_call_id
-
C2Tool calls filter to empty list
-
ExecuteLoop recurses with identical messages
-
ImpactUnbounded API calls exhaust service availability
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Loop termination conditions
MITRE ATT&CK
1 technique across 1 tactic: Impact The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The attacker must be able to supply content that reaches the LLM model's input context - typically through user-facing text fields in an ash_ai-backed application that passes user content into the prompt. The model must then be persuaded via injected instructions to re-emit a tool_call_id already recorded in conversation history (triggering unprocessed_tool_calls/2 to drop it), or to emit a call with an unrecognized tool name (triggering normalize_tool_calls/2 to drop it), such that the combined filter yields an empty list. Exploitation is significantly more damaging when the application configures max_iterations: :infinity, which removes the only natural termination bound; a finite max_iterations value caps wasted iterations but does not prevent each triggering request from consuming the full budget. Low-privilege application access is required (PR:L per CVSS 4.0); unauthenticated anonymous exploitation is not indicated by available data. Applications that do not pass untrusted external content into LLM prompts are not practically exploitable via the prompt-injection vector. |
| Impact | The CVSS 4.0 score of 6.0 (AV:N/AC:L/AT:P/PR:L/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N) reflects a moderate real-world priority. Network accessibility (AV:N) and low privilege (PR:L) lower the exploitation bar, but AT:P - specific attack requirements - is the critical limiting factor: the attacker must successfully influence the LLM's output, typically via prompt injection in user-supplied data that the model processes. This is a meaningful but non-trivial barrier; applications that pass untrusted user content directly into LLM prompts are meaningfully exposed. Availability impact is high (VA:H) with no confidentiality or integrity exposure, making service disruption and unbounded LLM API cost accrual the primary business risks rather than data breach. The vulnerability is not listed in CISA KEV and no public exploit code was identified in the input data, consistent with a newly disclosed, niche-library issue. EPSS data was not provided; given the narrow deployment footprint and the prompt-injection prerequisite, real-world exploitation probability is estimated low. Risk is most acute in deployments configured with max_iterations: :infinity that accept untrusted user input into LLM prompts. |
| Exploit ScenarioDerived | An attacker submits a message to an ash_ai-backed application containing prompt-injection instructions; the injected content causes the LLM to re-emit a tool_call_id already present in the session history. When unprocessed_tool_calls/2 filters out the spent ID, the resulting empty tool-call list triggers the no-progress recursion path, locking the ToolLoop worker and generating continuous, billable LLM API requests until the process is killed or an external resource limit is reached. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAI
Infinite-loop denial-of-service in ash_ai's ToolLoop component (versions 0.6.0 through <1.0.0) allows an attacker who can influence LLM model output - most practically via prompt injection - to hang the agent loop indefinitely and drive unbounded, repeated model API requests. When the LLM returns tool_call_ids that are either invalid or already present in the session history, the post-filter call list empties, yet the loop recurses with a byte-identical message state, making no forward progress and wasting unbounded API budget. No public exploit code or active exploitation has been identified at time of analysis; however, the prompt-injection attack path is well within reach of applications that ingest untrusted user content.
RemediationAI
Upgrade ash_ai to version 1.0.0 or later - the first release outside the affected range per the advisory's 'from 0.6.0 before 1.0.0' scope - which incorporates the fix from commit 53325fdab90afab628c6a53232ef2a9001580bd9 (https://github.com/ash-project/ash_ai/commit/53325fdab90afab628c6a53232ef2a9001580bd9). The patch modifies AshAi.ToolLoop to treat an empty post-filter tool-call list as a terminal condition rather than recursing. Consult the vendor advisory at https://github.com/ash-project/ash_ai/security/advisories/GHSA-rcx7-x2w5-mmc2 for any supplemental guidance. For teams unable to upgrade immediately, avoid configuring max_iterations: :infinity - setting a finite integer cap (e.g., max_iterations: 10) bounds resource exhaustion to a fixed number of wasted API calls rather than an unbounded loop, though it does not prevent the loop from consuming the full iteration budget on each triggering request. Additionally, sanitizing or strictly scoping user-supplied content that flows into LLM prompts reduces the prompt-injection surface that enables reliable exploitation.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
ash_ai is an Elixir library integrating large language model capabilities into applications built on the Ash Framework, implementing the iterative agent tool-use pattern: the LLM may request tool executions, results are appended to the message history, and the loop continues until the model returns a final response. AshAi.ToolLoop implements this in lib/ash_ai/tool_loop.ex across two parallel code paths. CWE-835 (Loop with Unreachable Exit Condition) manifests because after classifying a response as :tool_calls, the code called normalize_tool_calls/2 - which drops calls with unrecognized names - and unprocessed_tool_calls/2 - which drops calls whose tool_call_id already has a result in history. When both filters eliminated every call, the resulting empty list was not treated as terminal: no messages were appended, and the loop recursed with a logically identical conversation state, guaranteeing the same filtered-empty outcome forever. Under max_iterations: :infinity this never terminates; under a finite budget every iteration is wasted. The fix in commit 53325fdab90afab628c6a53232ef2a9001580bd9 promotes an empty post-filter list to a terminal guard condition. The CPE cpe:2.3:a:ash-project:ash_ai:*:*:*:*:*:*:*:* scopes impact to all ash_ai releases from 0.6.0 before 1.0.0.
Know when Ash Ai gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Network vector with high complexity due to the prompt-injection prerequisite; low privileges required; no confidentiality or integrity impact; high availability impact from the unbounded loop.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Loop with Unreachable Exit Condition (Infinite Loop) vulnerability in ash-project ash_ai allows an attacker who can influence a model's output to hang the tool loop and drive unbounded, repeated model requests.
AshAi.ToolLoop classifies a model response of :tool_calls, then filters the calls through normalize_tool_calls/2 and unprocessed_tool_calls/2. Both can empty the list: a call missing a valid name, or one reusing a tool_call_id that already has a result in history, is dropped. With an empty list the loop appended nothing and recursed with a byte-identical message list, so the conversation never advanced and the same request was re-sent every iteration. Under the supported max_iterations: :infinity this never terminated; otherwise it exhausted the full budget. Prompt-injected content can make the model re-emit a spent tool_call_id. The fix treats an empty post-filter list as terminal.
This issue affects ash_ai: from 0.6.0 before 1.0.0.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
Remote code execution in ash_ai (versions 0.1.0 through pre-1.0.0) allows unauthenticated network attackers to execute a
DNS-rebinding protection in AshAi.Mcp.Server (ash_ai 0.8.0-0.x) is bypassable because the default origin check trusts th
Authorization bypass in AshAi (ash_ai) versions 0.6.0 through pre-1.0.0 allows any authenticated tool caller to update o
Credential leakage in ash_ai (versions 0.1.0 through before 1.0.0) exposes embedding provider API keys and request inter
Field policy bypass in ash_ai (versions 0.1.0 through < 1.0.3) allows authenticated, low-privilege actors to read per-ac
Unfiltered exception serialization in ash_ai 0.6.0-0.x leaks internal application details - database schema, raw SQL fra
EUVD-2026-68307
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB