0%

Wat er mis kan gaan

Een bevinding schrijven

“De zien er riskant uit” is een gevoel. Niemand kan het oplossen, en niemand kan testen of het is opgelost. Een bevinding (finding) is hetzelfde vermoeden zo opgeschreven dat allebei kan.

Deze les geeft een bevinding haar vorm, werkt één voorbeeld helemaal uit, en laat jou daarna nog twee afmaken. In de volgende les gaan ze in SECURITY.md, het bestand in je project dat opsomt wat er mis is met de dienst.

Vier delen

Een bevinding beantwoordt vier vragen.

  • Exposed (blootgesteld). Wat kan een aanvaller lezen of veranderen? Noem het bezit.

  • Attack (aanval). Hoe bereikt hij het, en wat moet hij al hebben? Noem de aanvaller.

  • Fix (oplossing). Welke verandering zou het dichten?

  • Proof (bewijs). Wat zou laten zien dat het gedicht is? Het sterkste bewijs is een test die de aanval uitvoert en vandaag faalt.

De eerste twee delen komen rechtstreeks uit het dreigingsmodel van de vorige les: een bezit, en een aanvaller met een bepaald bereik. De laatste twee maken de bevinding bruikbaar. Een oplossing zegt wat je moet doen. Een bewijs zegt hoe je het zult weten.

Een uitgewerkte bevinding

Hier zijn de tokens die je server accepteert, zoals sample_state() ze bouwt:

"tokens": {
    "tok-ana-writes-7Qx2": {"user": "ana", "can_write": True},
    "tok-ben-reads-K9pz": {"user": "ben", "can_write": False},
},

Loop de vier delen ermee door.

  • Exposed: de macht om als ana boeken toe te voegen, te veranderen en te verwijderen.

  • Attack: het schrijftoken is een vaste in de . Iedereen die het bestand leest, of een back-up van de state, heeft het. Het werkt voor altijd.

  • Fix: een token dat de server zelf maakt, dat alleen de server gemaakt kan hebben, en dat verloopt.

  • Proof: een test die de oude string tok-ana-writes-7Qx2 met een schrijfactie stuurt en 401 verwacht.

Elk deel is een of twee zinnen, en elk noemt iets specifieks. Dit is bevinding F6 in de nummering van de cursus, en hoofdstuk 5 dicht haar. Je hoeft haar nu niet op te lossen. Haar opschrijven is het werk van dit hoofdstuk.

Welke uitspraak is een bevinding die je kunt oplossen en testen?

Jouw beurt, half ingevuld

Nu de sessieopslag. Dit zijn de twee plekken in je server die gaan over hoe lang een sessie duurt:

def start_session(state, user):
    """Store a new session for user under a random id and return the id."""
    session_id = secrets.token_urlsafe(16)
    state["sessions"][session_id] = {"user": user}
    return session_id

en, in session_cookie(), de regel cookie["session"]["max-age"] = max_age, waarin max_age 3600 is, tenzij de aanroeper iets anders zegt.

De vertelt de client dus om de sessie-id na een uur te vergeten. Wat doet de server na een uur? Voer dit uit:

Try it

Het drukt True af. Niets in de server leest een klok, dus de vermelding blijft staan tot iemand met die id uitlogt. Als niemand dat doet, blijft ze zo lang als de server draait. Max-Age is een verzoek aan de client. Een client die een kopie van de id bewaarde, of een aanvaller die hem één keer kopieerde, kan hem blijven sturen, en de server accepteert hem nog steeds.

Twee delen van de bevinding zijn gegeven:

  • Exposed: een ingelogde sessie, zo lang als de server draait.

  • Attack: een sessie-id die ooit gekopieerd is, blijft werken. Max-Age vraagt de client om te vergeten, en de server vergeet nooit.

De server beëindigt een sessie nooit op tijd. Welk paar maakt de bevinding af?

Jouw beurt

De laatste is de cookie zelf. Dit is de hele :

def session_cookie(session_id, *, max_age=SESSION_AGE):
    """Return the Set-Cookie value that hands session_id to the client."""
    cookie = http.cookies.SimpleCookie()
    cookie["session"] = session_id
    cookie["session"]["httponly"] = True
    cookie["session"]["path"] = "/"
    cookie["session"]["max-age"] = max_age
    return cookie["session"].OutputString()

Voor de id abc geeft hij session=abc; HttpOnly; Max-Age=3600; Path=/ terug. with Python beschreef elk attribuut als een verzoek aan de client. Deze cookie doet drie verzoeken: houd me weg van paginascripts, stuur me mee met elk pad, vergeet me over een uur.

Een cookie kan nog twee dingen zeggen, en deze zegt geen van beide. Secure betekent: stuur me alleen over HTTPS. SameSite betekent: stuur me niet mee met verzoeken die op een andere website beginnen. HTTP with Python noemde ze allebei, en vandaag hoef je ze alleen te herkennen. Hoofdstuk 4 behandelt ze allebei, en hoofdstuk 8 laat zien wat er misgaat zonder de tweede.

Hier zijn vier zinnen uit een bevinding over deze cookie. Welke is de Attack?

De twee concepten

Hier zijn beide bevindingen als rijen, in de opmaak die SECURITY.md gebruikt. Het bestand noemt het bewijs Test, omdat een bewijs in deze cursus altijd een test is. Geen van beide bevindingen heeft er al een.

#ExposedAttackFixTest
F3Een ingelogde sessie, zo lang als de server draaitEen sessie-id die ooit gekopieerd is, blijft werken: Max-Age vraagt de client om te vergeten, en de server vergeet nooitLeg vast wanneer een sessie begon en voor het laatst gebruikt werd, en weiger en verwijder oude sessiesnone yet
F4De sessiecookie, overal waar een browser hem wil sturenDe cookie draagt alleen HttpOnly, Max-Age en Path, dus niets vertelt een browser om hem bij HTTPS te houden of bij verzoeken vanaf deze siteZet Secure en SameSite met opzetnone yet

In de volgende les kopieer je deze rijen, of je eigen formulering ervan, naar SECURITY.md.

Beide rijen eindigen met “none yet”, en dat is de zwakke plek van een bevinding op papier: het is een bewering. Het vierde deel is wat van een bewering iets maakt wat een computer kan controleren. De volgende les schrijft het eerste, voor een bevinding die je nog niet hebt gezien.