Skip to main content

Elixir Mix CVE-2026-97209

| EUVDEUVD-2026-113759 MEDIUM
Insecure Temporary File (CWE-377)
2026-10-30 EEF
5.4
CVSS 4.0 · Vendor: EEF
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Pre-create /tmp/mix_deps_partition as attacker
  2. Delivery
    Victim runs partitioned mix deps.compile
  3. Exploit
    Swap serialized config before client reads
  4. Execution
    Inject compile: shell command into deps
  5. Impact
    Arbitrary command runs as victim user

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Secure temp file creation
Exploitation Conditions

Exploitation requires ALL of the following, none of which is default: (1) partitioned dependency compilation explicitly enabled via the MIX_OS_DEPS_COMPILE_PARTITION_COUNT environment variable set greater than 1 (off by default); (2) a mix deps.compile run - directly or via mix compile/mix test - that compiles at least two non-local dependencies; (3) a system temporary directory shared with other local users, which is the Linux default when TMPDIR is unset so System.tmp_dir() resolves to /tmp; and (4) a local, unprivileged attacker account on the same host who creates and owns /tmp/mix_deps_partition before the victim's build, then wins the race to rewrite the config file between the parent's File.write and the partition client's File.read!. Limiting factors: the attacker needs local access and must win a timing race (AT:P), the victim must actually launch a partitioned build (UI:P), and hosts with per-user temporary directories - macOS and Windows by default - are not affected unless TMPDIR points at a shared location. Even without pre-creating the directory, the world-readable partition file discloses project configuration (including Mix.install compile-time config) to other local users while the build runs.

Impact

This is a genuine but conditional local privilege-escalation / cross-user code-execution flaw (CWE-377, insecure temporary file) rather than a high-urgency remotely exploitable issue. The only severity signal in the input, a CVSS 4.0 base vector scoring 5.4 (medium), is internally consistent with the mechanism: AV:L (local attacker on the same host), AT:P (an attack requirement - the attacker must win the race between the parent's write and the partition client's read, and must pre-create the shared directory), PR:L (attacker needs their own unprivileged local account), UI:P (the victim must passively run a partitioned build), and VC:H/VI:H/VA:H (arbitrary shell commands run as the victim user). No EPSS score was provided, so exploitation-probability cannot be quantified. KEV status is not listed, so there is no indication of active exploitation - do not treat this as exploited in the wild. The GHSA advisory includes a step-by-step proof-of-concept methodology, so a public PoC reference exists, but it is not verified as working, drop-in exploit code. The vuln.today priority is 'this_month' (not act_now/emergency), which aligns with the medium CVSS and local/conditional nature: this is a real priority to patch on a normal cadence, especially for shared CI runners and multi-user developer hosts, but it is not a drop-everything remote RCE. The practical risk is tightly bounded by non-default configuration (partitioned compilation must be explicitly enabled) and by requiring a shared, attacker-accessible temp directory.

Exploit ScenarioDerived

On a shared multi-user Linux host (or shared CI runner) where TMPDIR is unset so System.tmp_dir() resolves to /tmp, a low-privileged local attacker pre-creates and owns /tmp/mix_deps_partition and watches it. When a victim developer or CI user runs mix deps.compile with MIX_OS_DEPS_COMPILE_PARTITION_COUNT>1 on a project with at least two non-local dependencies, Mix writes the Base64/term-encoded project config into that attacker-owned directory; before the partition VM reads it back, the attacker rewrites the serialized term to add a 'compile:' shell command to each dependency, and that command executes as the victim user. A detailed proof-of-concept exists in the GHSA advisory, but it is not verified as working exploit code.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 30, 2026

Insecure temporary-file handling in Mix's partitioned dependency compilation lets a local user on a shared host execute arbitrary shell commands as another user's build account. Elixir releases 1.20.0-rc.4 through 1.20.4 write the serialized project configuration into a fixed-name directory under the system temp dir (created with File.mkdir_p/1, which accepts a pre-existing directory regardless of owner) and each partition VM trusts the file it reads back, so an attacker who owns that directory can swap in a payload whose dependency compile: commands Mix then runs as the victim. Exploitation requires partitioned compilation explicitly enabled via MIX_OS_DEPS_COMPILE_PARTITION_COUNT greater than 1, a build compiling at least two non-local dependencies, a shared temp directory (Linux default when TMPDIR is unset; macOS and Windows use per-user temp dirs by default and are not affected), and a local low-privileged attacker account (PR:L) that wins a timing race; the vendor advisory documents a step-by-step proof-of-concept, there is no CISA KEV listing, and the vendor has released a fix in mix 1.20.5. Even without pre-creating the directory, the world-readable partition file discloses project configuration, including Mix.install compile-time config, to other local users during the build.

RemediationAI

Vendor-released patch: upgrade Elixir/mix to 1.20.5, which reworks the partition config handoff (fix commits 55eb91220a1de14dc5aa27029d1f45b0f5832b2d and 9adbe955c8664f4be77d879dd38c003dd39fa777, advisory https://github.com/elixir-lang/elixir/security/advisories/GHSA-96q6-xhwp-fc8q). If upgrading is not immediately possible, the vendor's documented workarounds are: on multi-user hosts, set TMPDIR to a private per-user directory with mode 0700 before running Mix so System.tmp_dir/0 resolves somewhere other users cannot pre-create or read (trade-off: this redirects temp files for every tool invoked in that shell, and builds must consistently run with the same TMPDIR or they will use different partition locations); or keep partitioned compilation disabled by leaving MIX_OS_DEPS_COMPILE_PARTITION_COUNT unset or at 1, which keeps the configuration inside the parent process (trade-off: loses parallel partitioned dependency compilation and therefore build speed on large projects). These workarounds also close the world-readable configuration disclosure that occurs even when no attacker pre-creates the directory. Priority is this month rather than emergency response, since the flaw requires local access, a non-default partitioned build, a shared temp directory and a race win.

Affected VersionsENISA

elixir 1.20.0-rc.4 <1.20.5
elixir 7f3d95b60c28ae3026a5c1bf943166391245bfd1 <*

Affected Packages

euvd elixir fix: 1.20.5

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

The root cause is CWE-377 (insecure temporary file) in Mix.Tasks.Deps.Partition.server/4 in lib/mix/lib/mix/tasks/deps.partition.ex. The parent process encodes Mix.ProjectStack.peek() with :erlang.term_to_binary/1, Base64/Base32-url encodes it, calls File.mkdir_p/1 on Path.join(System.tmp_dir(), "mix_deps_partition") and writes the payload to a randomly named file inside it using the default file mode. File.mkdir_p/1 succeeds on an existing directory no matter who owns it, so a local user who created mix_deps_partition first controls every file inside; the file's default permissions also make the configuration readable by other local users in a shared temp directory. Each partition is a fresh elixir VM started with --config-file <path>, and Mix.Tasks.Deps.Partition.client/0 reads the file with File.read!/1, decodes it with :erlang.binary_to_term/1 and pushes the decoded entry (project name, config and mix.exs path) onto Mix.ProjectStack with Mix.ProjectStack.push/3 without verifying it still matches what the parent wrote. Because a dependency's compile: option is a shell command Mix executes, a swapped payload yields code execution in the victim's build; on the development branch the payload additionally carries code_path and compiler_options, which the client applies via :code.set_path/1 and Code.compiler_options/1, giving the attacker control of the client VM's code path as well. The affected component is the mix package shipped with elixir-lang:elixir 1.20.0-rc.4 up to but not including 1.20.5; the feature was introduced by commit 7f3d95b and fixed by commits 55eb912 and 9adbe95, which add a --config-file/--config switch pair and pass config through the private path rather than trusting the shared file.

Know when Elixir 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

Vendor (EEF) PRIMARY 5.4 MEDIUM
CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
vuln.today AI 6.7 MEDIUM

Local attacker with own account (AV:L, PR:L) must win a race and pre-create the shared dir (AC:H), victim must run the build (UI:R), yielding arbitrary code as the victim (C/I/A:H).

3.1 AV:L/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
4.0 AV:L/AC:L/AT:P/PR:L/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (EEF).

CVSS VectorVendor: EEF

Attack Vector
Local
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
Low
User Interaction
Passive
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

DescriptionCVE.org

Insecure Temporary File vulnerability in Mix deps.partition in Elixir allows a local user to execute code as another user via a swapped partition config file. Partitioned dependency compilation passes the project configuration to each partition VM through a file in a fixed-name directory under the shared system temporary directory, and the partition trusts what it reads back. Another local user on the same host can exploit this during a mix deps.compile run that uses partitioned compilation.

Mix.Tasks.Deps.Partition.server/4 in lib/mix/lib/mix/tasks/deps.partition.ex creates the directory with File.mkdir_p/1, which accepts an existing directory without checking its owner, so a user who created it first can replace the file before client/0 reads it.

This issue affects mix: from 1.20.0-rc.4 before 1.20.5.

Threat Intelligence Overview

EPSS Score
0.1%
Top 98% exploitable
Prevalence
Medium
Elixir/Mix is a popular but niche language toolchain, not ubiquitous
Social Media
1
Sightings
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation
Poc
System Exposure· derived
Small
Automatable
No
Human Impact· derived
Medium
Technical Impact
Total

Priority Score

27
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +27
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

More in Elixir

View all
CVE-2026-54451 HIGH POC
8.2 Jul 15

Unbounded recursion in the Elixir `protobuf` Hex package (versions >= 0.8.0, < 0.16.1) lets unauthenticated remote attac

CVE-2026-91187 CRITICAL
9.3 Sep 24

Improper JWT signature verification in Dashbit's nimble_zta (0.1.2 up to but not including 0.1.3) lets an unauthenticate

CVE-2026-76949 CRITICAL
9.1 Sep 17

Session-swapping authentication bypass in the Elixir library AshAuthentication (versions 4.10.0 before 4.15.0 and 5.0.0-

CVE-2026-91039 CRITICAL
9.1 Sep 17

Authentication bypass in the Elixir library ash_authentication lets an attacker who operates one federated identity-prov

CVE-2026-88952 CRITICAL
9.1 Sep 17

Account takeover in AshAuthentication (Elixir/Ash) 4.14.0 through 4.14.x and 5.0.0-rc.10 through 5.0.0-rc.13 lets unauth

CVE-2026-77866 CRITICAL
9.0 Sep 15

Server-Side Request Forgery protection bypass in the Elixir safeurl library (versions 0.1.0 and later) allows unauthenti

CVE-2026-108529 HIGH
8.7 Oct 26

Unauthenticated remote CPU exhaustion in mtrudel Bandit's HTTP/2 server (versions before 1.14.0) is achievable by holdin

CVE-2026-110499 HIGH
8.7 Oct 26

Unbounded per-connection memory and CPU growth in the Elixir Bandit HTTP/2 server (0.3.6 up to 1.14.0) lets an unauthent

CVE-2026-111101 HIGH
8.7 Oct 26

Unauthenticated remote denial of service in the Elixir HTTP server Bandit (mtrudel/bandit) from 0.1.0 before 1.14.0 lets

CVE-2026-113436 HIGH
8.7 Oct 26

Unauthenticated remote attackers can consume disproportionate server CPU on Bandit (mtrudel/bandit, Elixir/Erlang) by se

CVE-2026-104635 HIGH
8.2 Oct 09

Memory-exhaustion denial of service in the elixir-protobuf library (protobuf) from 0.8.0 onward allows an unauthenticate

CVE-2026-94201 HIGH
8.2 Oct 05

Atom table exhaustion in the Ash framework (Elixir) allows an unauthenticated remote attacker to crash a BEAM node by su

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy