• fix(sikkerhed): resten af gennemgangen — SSRF, tre ubegrænsede veje, og fire hemmeligheder
    Release / Build and publish image (push) Failing after 9m54s

    kw released this 2026-08-20 06:39:52 +00:00 | 257 commits to main since this release

    H2 — SSRF gennem AI-udbyderens adresse. base_url blev gemt uden kontrol og
    hentet med en almindelig klient, og udbyderens svar blev givet tilbage ordret.
    Det var en fungerende skanner af det interne net for enhver bruger: peg den på en
    vært, læs de første tre hundrede bytes af det, der svarede. På en homelab er det
    det meste af, hvad der er værd at nå.

    Nu gennem safedial, og svarets krop går i loggen frem for i svaret. Operatøren
    har stadig brug for beskeden — for en lokal model er den som regel selve
    problemet — så den er der, bare kun for den, der kører instansen.

    M2 — Web Push havde tre. Endepunktet blev gemt ukontrolleret og POSTet til på
    en tidsplan, den, der ringer, selv vælger: sæt en påmindelse et minut ude, og
    serveren henter adressen, hvert minut. Upserten flyttede desuden ejerskabet med
    user_id = excluded.user_id, så enhver, der kendte en andens endepunkt, kunne
    overtage det — offerets telefon ville få angriberens beskeder og ingen af sine
    egne. Og DeletePushSubscription havde ingen ejer-kontrol.

    H3 — tre veje uden loft. FTS-udtrykket byggede omkring halvtreds bytes pr.
    ord uden grænse; en søgning på en kvart megabyte blev til to megabyte
    MATCH-udtryk og seksogtyve sekunder inde i SQLite, mens den holdt på én af kun
    fire til otte forbindelser. Nogle få af dem samtidig, og databasen er utilgængelig
    for alle på instansen, logins inklusive. filterquery.Parse er kvadratisk —
    halvtreds tusind led er syv sekunders CPU og seksogfyrre gigabyte allokering i én
    forespørgsel — og havde hverken loft på antal eller på dybde. Og noteimporten
    læste hver fil i arkivet uden grænse: 64 MB komprimeret kan blive til
    seksogtres gigabyte skrevet ned på den disk, databasen ligger på.

    M1 — comment_id blev taget på tro. Rettighedskontrollen så på opgaven i
    adressen, mens filen blev hængt på den kommentar, formularen bad om. En viewer på
    et delt projekt kan liste dets kommentarer, så hun kunne læse et id og lægge en
    fil under en andens kommentar i et projekt, hun kun må læse.

    M4 — fire hemmeligheder lå i klartekst i hver sikkerhedskopi. TOTP-koden og
    AI-nøglen forsegles nu; begge konverterer sig selv næste gang de skrives.
    Kalenderfeedets og mailadressens tokens gør ikke — de slås op på deres præcise
    værdi og vises i fladen mere end én gang, hvilket en hash ikke kan. Det står nu
    skrevet i SECURITY.md, som påstod det modsatte. At rette det betyder, at
    adressen kun kan vises én gang, og det er en beslutning om, hvordan funktionen
    virker.

    Og en prøve på, at politikken overhovedet bliver sendt. Det var den, der gjorde
    XSS-en i nat til indsat HTML frem for kørt script, og der var ingen prøve, der
    rørte den — en foranstaltning, ingen prøve rører, kan forsvinde i en oprydning,
    uden at nogen opdager det. Målt på script-src alene: style-src 'unsafe-inline'
    står der med vilje, og en indsat stil kan gøre en side grim, ikke køre kode.

    Co-Authored-By: Claude Opus 5 noreply@anthropic.com

    Downloads