Van pre-auth RCE tot cryptominer: hoe CVE-2025-54068 mijn Laravel-server raakte

Van pre-auth RCE tot cryptominer: hoe CVE-2025-54068 mijn Laravel-server raakte

Ik werk al jaren met Laravel en Livewire, en ik hou een web server graag strak. Toch kreeg ik dit jaar een incident op mijn bord waar ik even goed voor moest gaan zitten. Een Livewire-kwetsbaarheid, code execution zonder inloggen, en een cryptominer die vrolijk mijn CPU stond leeg te trekken. Hieronder: wat er gebeurde, hoe ik het oploste, en wat ik ervan geleerd heb.

De kwetsbaarheid: CVE-2025-54068

Het draaide om CVE-2025-54068, een pre-authentication remote code execution (RCE) in Livewire 3. De aanval loopt via snapshot deserialization. Korte uitleg: Livewire serialiseert component-state naar een "snapshot" en stuurt die heen en weer tussen client en server. In kwetsbare versies kon een aanvaller die snapshot zo manipuleren dat er bij het deserialiseren code werd uitgevoerd. Zonder in te loggen. Pre-auth.

Dat is zo'n beetje het slechtste type kwetsbaarheid dat je kunt hebben: geen credentials nodig, direct code execution op je server.

Wat de aanvaller ermee deed

Twee dingen gingen mis:

1. Cryptominer. Zodra er code execution was, werd er een cryptominer geïnstalleerd en liet mijn server crashen. Irritant, maar op zich nog het minst erge.

2. Database-toegang via .env. Dit was de echte pijn. Met code execution op de server kon de aanvaller gewoon mijn .env uitlezen, en daar staan je database-credentials in. Daarmee lag mijn database open. Dat tilt een incident van "irritant" naar "serieus", want nu praat je over datalekken en niet alleen verspilde CPU.

De oplossing

Toen ik doorhad wat er speelde, heb ik de hele keten doorlopen. Niet alleen het gaatje dichten, maar aannemen dat de aanvaller overal is geweest.

  • Livewire upgraden naar een gepatchte versie. Dit dicht de daadwerkelijke RCE. Eerste prioriteit, want zolang dit openstaat kun je oneindig blijven opruimen.

  • Keys roteren. App key, database-credentials, en alles wat mogelijk uit die .env is gelekt. Als je ervan uit moet gaan dat je .env is gelezen, dan zijn al die secrets compromised. Roteren, geen discussie.

  • Scannen op webshells. Code execution betekent dat er mogelijk een achterdeurtje is achtergelaten. Dus grondig zoeken naar geïnjecteerde PHP-bestanden en verdachte scripts, zodat de aanvaller niet gewoon weer binnen kan wandelen nadat je de miner hebt verwijderd.

  • MySQL dichttimmeren. Toegang beperken, credentials vervangen, en controleren dat de database niet onnodig van buitenaf bereikbaar was.

De volgorde is belangrijk: eerst het gat dichten, dan pas opruimen. Andersom is dweilen met de kraan open.

Wat ik ervan geleerd heb

Een paar dingen die bij me zijn blijven hangen.

Dependencies zijn je attack surface. Livewire is prima software, maar elke package die je toevoegt is code die je niet zelf schrijft en niet zelf audit. Bijblijven met security advisories is geen bijzaak, het is onderhoud.

.env is een single point of failure. Zodra iemand code kan uitvoeren op je server, liggen al je secrets open. Dat betekent niet dat je .env moet weggooien, maar wel dat je moet nadenken over defense in depth: waarom kon die database eigenlijk zo makkelijk benaderd worden?

Ga uit van het ergste bij RCE. Een cryptominer is zichtbaar en irritant, maar het is vaak het minst schadelijke wat een aanvaller met code execution doet. De echte vraag is altijd: wat heeft die persoon nog meer gedaan terwijl hij binnen was? Roteer je keys, scan op persistence, en vertrouw niks.

Voor mij was dit incident een goede herinnering dat security geen eenmalige checklist is maar een houding. Het is inmiddels ook een verhaal dat ik met enige regelmaat vertel, want niets illustreert het belang van patchen zo goed als een miner die je stroomrekening opdrijft.


Draai je een Laravel/Livewire-app en wil je een keer sparren over security, remediation of gewoon hoe je je stack strak houdt? Neem gerust contact op.