Here's a fun one. ILIAS has two endpoints that don't require authentication. One of them writes to your session. The other one reads your session back and unserializes it without checking what it's reading. Chain them together and you get remote code execution.
That's CVE-2026-80428. DigiProSec found it and published a working exploit.
The whole thing runs as the web server user. No login required. Just two POST requests.
What's Affected
ILIAS versions before 9.22, 10.0 through 10.9, and 11.0 through 11.2. Fixed in 9.22, 10.10, and 11.3.
Here's a weird quirk. v11.x ships a broken shib_logout.php variant with a null $DIC, so it doesn't reach the vulnerable code as packaged. v9 and v10 are the exploitable ones in practice. But patch all three lines anyway.
How the Chain Works
First piece: ltiauth.php
This is an LTI entry point. Auth-exempt. Anyone can hit it.
When you send a request, it stores the entire request parameter array into the session table. The key is lti13_login_data. Normal enough.
But here's the catch. ILIAS has a custom session parser. If you put a \w+| marker inside a parameter value, it breaks the parser. Your raw serialized object gets handed to unserialize() as if it were a session value. That's the injection.
Second piece: shib_logout.php
This is a Shibboleth back-channel logout endpoint. Also auth-exempt.
A POST with any non-empty body starts a SoapServer. The LogoutNotification() handler then unserializes EVERY live session row in the database. No class allowlist. No type checking. Just unserialize() on whatever is there.
Since we just planted our serialized object in a session row via ltiauth.php, this handler picks it up and deserializes it.
Third piece: the gadget
The exploit uses GuzzleHttp\Cookie\FileCookieJar. That class is bundled in ILIAS's vendor tree. It has a __destruct() method that calls save($this->filename). And save() calls file_put_contents($filename, json_encode($cookies)).
So the attacker controls two things. The filename. And the content. The content is JSON that embeds PHP code. When the object gets destroyed at the end of the request, it writes the file.
Boom. Webshell.
The Exploit Script
DigiProSec published a Python script. It does four things:
- Seeds the session via ltiauth.php with a crafted serialized object
- Triggers unserialize via shib_logout.php with a SOAP envelope
- Checks if the webshell is live
- Runs commands through it
Usage looks like this:
python3 CVE-2026-80428.py <target> --cmd 'id'You can also drop into an interactive loop with --shell.
Two things you need to know. The docroot disk path is required for the file write. It defaults to /var/www/ilias/public. And if ILIAS is configured with a fixed HTTP path, you need to send the right Host header with --host-header.
Why This Matters
Unauthenticated RCE is about as bad as it gets. The webshell runs as the web server user. Apache or PHP-FPM, depending on your setup. That's usually enough to read config files, hit the database, and move laterally.
The chain also shows how two endpoints that are individually "fine" can become dangerous when chained. ltiauth.php was just storing session data. shib_logout.php was just deserializing sessions. Together they're a weapon.
What You Should Do
- Patch. Update to 9.22, 10.10, or 11.3. Check which line you're on.
- Check for webshells. Look for unexpected .php files in your web root. The exploit writes files with names like util_xxxxxx.php.
- Check your logs. Pay special attention to any POSTs to /ltiauth.php and /shib_logout.php that seem suspicious.
- Restrict auth-exempt endpoints. Unless you are using LTI or Shibboleth, it may be a good idea to restrict these endpoints completely.
- Assume compromise if you see suspicious files. Rotate credentials. Check for persistence. Consider rebuilding.
The Bottom Line
CVE-2026-80428 is an unauthenticated RCE in ILIAS. Two auth-exempt endpoints. One unserialize with no allowlist. One Guzzle gadget. That's all it takes.
Patch to 9.22, 10.10, or 11.3.
Quick Reference:
|
Key Point |
Detail |
|
Bug |
Unauthenticated PHP object injection → RCE |
|
CVE |
CVE-2026-80428 |
|
Affected |
< 9.22, 10.0 to 10.9, 11.0 to 11.2 |
|
Fixed |
9.22, 10.10, 11.3 |
|
Chain |
ltiauth.php → shib_logout.php → FileCookieJar |
|
Impact |
Webshell as web server user |
FAQ Section
What is CVE-2026-80428?
An unauthenticated PHP object injection in ILIAS. Two auth-exempt endpoints let an attacker plant a serialized object and trigger unserialize on it. The gadget drops a webshell.
How does the chain work?
ltiauth.php stores attacker-controlled session data. shib_logout.php unserializes it without an allowlist. The FileCookieJar gadget writes a PHP file to disk.
Which versions are affected?
ILIAS before 9.22, 10.0 through 10.9, and 11.0 through 11.2.
Does v11 work?
Not as packaged. v11.x ships a broken shib_logout.php with a null $DIC. v9 and v10 are exploitable.
What should I do?
Patch to 9.22, 10.10, or 11.3. Check for webshells. Review logs. Lock down auth-exempt endpoints if you don't use them.