← Alle berichten
14 aug 2026Matias Aguirre

Kernl 0.2.0: de Docker-stack draait niet langer zonder authenticatie

Loopback is geen vertrouwensgrens tegenover een browser. Deze release haalt de modus zonder authenticatie uit de quick start, zet CORS op deny-by-default, stopt met het uitdelen van licentiesleutels per e-mail, en repareert back-ups die de verkeerde database kopieerden.

kernlreleasesecuritycorsself-hostedopen-source
Kernl-illustratie: de mascotte omringd door holografische datapanelen
Kernl-illustratie: de mascotte omringd door holografische datapanelen

Deze Kernl-release gaat vrijwel volledig over beveiliging, en het belangrijkste probleem zat op het pad dat iedereen neemt: de Docker quick start.

Loopback is geen vertrouwensgrens

docker-compose.yml leverde KERNEL_ALLOW_UNAUTH=1 mee, gerechtvaardigd doordat het dashboard op 127.0.0.1 werd gepubliceerd. Die redenering houdt geen stand tegenover een browser.

Gecombineerd met een wildcard Access-Control-Allow-Origin op elke respons kon elke pagina die de gebruiker open had de hele kernel cross-origin lezen — en schrijven, inclusief het MCP-tooloppervlak. Dat een poort lokaal is, weerhoudt de browser van de gebruiker er niet van degene te zijn die het verzoek doet.

De quick start draait nu met het token dat de kernel bij de eerste start genereert.

CORS op weigeren

Access-Control-Allow-Origin wordt alleen verstuurd voor een origin die expliciet in CORS_ALLOWED_ORIGINS staat. Een lege lijst betekent alleen same-origin, en dat is wat het meegeleverde dashboard nodig heeft.

Voorheen betekende een lege lijst *, en kreeg een niet-overeenkomende origin de eerste geconfigureerde origin terug in plaats van een weigering.

Licentieherstel deelde de licentie uit

GET /api/license/lookup gaf de volledige licentie-JWT terug — de downloadcredential voor elke extensie die die klant bezit — aan iedereen die het e-mailadres kende. Als toegift bevestigde de 404 welke adressen van klanten waren en welke niet.

De licentie wordt nu gemaild naar het geregistreerde adres, met in beide gevallen hetzelfde 202-antwoord, of het adres nu van iemand is of niet.

Torrents is daarnaast op runtime afgeschermd. De betaalde extensie werd geleverd zonder licentiecontrole op de MCP-tools of op de /api/torrents/*-routes; het enige beschermde stuk was de download van de bundle.

Tot slot wordt het auth-token van de eerste start aan de browser doorgegeven via het URL-fragment, dat nooit naar de server gaat, in plaats van via een query string.

Back-ups pakten de verkeerde database, en meldden dat opgewekt

backup.sh kopieerde de ./data/kernel.db uit de repo — meestal een verouderd restant — in plaats van de database in het Docker-volume. Het gebruikte cp op een database in WAL-modus die door de kernel geopend was. En het eindigde met code 0 als er niets gevonden werd.

Het maakt nu een snapshot via SQLite (VACUUM INTO), controleert het resultaat voordat het een back-up genoemd wordt, en faalt luid. Ook .kernel-encryption-key wordt meegenomen, zonder welke versleutelde secrets in een teruggezette database onherstelbaar zijn.

Restores hadden het spiegelbeeldige probleem: restore.sh zette de database in de ./data van de repo, ook bij Docker-deployments, sloeg de encryptiesleutel over, en meldde “starting fresh” wanneer het archief helemaal geen database bevatte. Het vereist nu een expliciet doel met --docker of --native en weigert een leeg archief.

Twee dingen die succes meldden zonder iets te doen

  • Betaalde licenties werden geweigerd op elke installatie die geen Docker was. De kernel verwachtte issuer issuer.mtwkernel.com terwijl licenties worden uitgegeven door issuer.lifekernl.com, en alleen docker-compose.yml zette de override. Installaties via rpm, deb, dmg en msi konden een geldige sleutel niet activeren.
  • Code signing draaide nooit, met of zonder certificaten. De ondertekeningsstappen van de release-workflow waren afgeschermd met if: env.X != '', met X gedefinieerd in het env:-blok van diezelfde stap, dat niet in scope is voor de conditie van die stap zelf. Elke release publiceerde onondertekende artefacten en meldde succes.

De kernel bond zich ook aan loopback, zelfs met authenticatie aan: loadConfig() bepaalde de bind voordat de bootstrap het auth-token genereerde, waarmee een expliciete 0.0.0.0 permanent werd overschreven. Die beslissing valt nu op de plek waar het definitieve token bekend is.

En de eerste start van een native installatie liep dood op een inlogscherm dat om een token vroeg dat de gebruiker nooit was getoond. De macOS- en Windows-launchers geven het nu door; de Linux-launcher print waar je het vindt.

Zo werk je bij

curl -fsSL https://lifekernl.com/install.sh | sh

Kom je van 0.1.x met de Docker-stack, controleer dan je CORS_ALLOWED_ORIGINS vóór het bijwerken: een lege lijst betekent niet langer *. De volledige details staan in de CHANGELOG.

Delen
Volgende stap

Klaar om Uw Project te Starten?

Laten we bespreken hoe technologie uw organisatie kan transformeren. Wij bieden technische consultaties en maatwerkoplossingen afgestemd op institutionele vereisten. Plan een vrijblijvend strategisch gesprek.

Neem contact op
Gratis consultatieVrijblijvendSnelle reactie