Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessPre-create /tmp/mix_deps_partition as attacker
-
DeliveryVictim runs partitioned mix deps.compile
-
ExploitSwap serialized config before client reads
-
ExecutionInject compile: shell command into deps
-
ImpactArbitrary 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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
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
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
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).
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
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
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
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Unbounded recursion in the Elixir `protobuf` Hex package (versions >= 0.8.0, < 0.16.1) lets unauthenticated remote attac
Improper JWT signature verification in Dashbit's nimble_zta (0.1.2 up to but not including 0.1.3) lets an unauthenticate
Session-swapping authentication bypass in the Elixir library AshAuthentication (versions 4.10.0 before 4.15.0 and 5.0.0-
Authentication bypass in the Elixir library ash_authentication lets an attacker who operates one federated identity-prov
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
Server-Side Request Forgery protection bypass in the Elixir safeurl library (versions 0.1.0 and later) allows unauthenti
Unauthenticated remote CPU exhaustion in mtrudel Bandit's HTTP/2 server (versions before 1.14.0) is achievable by holdin
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
Unauthenticated remote denial of service in the Elixir HTTP server Bandit (mtrudel/bandit) from 0.1.0 before 1.14.0 lets
Unauthenticated remote attackers can consume disproportionate server CPU on Bandit (mtrudel/bandit, Elixir/Erlang) by se
Memory-exhaustion denial of service in the elixir-protobuf library (protobuf) from 0.8.0 onward allows an unauthenticate
Atom table exhaustion in the Ash framework (Elixir) allows an unauthenticated remote attacker to crash a BEAM node by su
EUVD-2026-113759
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB