Wat er mis kan gaan
Een bevinding schrijven
“De
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-7Qx2met 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
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-Agevraagt 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.
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.
| # | Exposed | Attack | Fix | Test |
|---|---|---|---|---|
| F3 | Een ingelogde sessie, zo lang als de server draait | Een sessie-id die ooit gekopieerd is, blijft werken: Max-Age vraagt de client om te vergeten, en de server vergeet nooit | Leg vast wanneer een sessie begon en voor het laatst gebruikt werd, en weiger en verwijder oude sessies | none yet |
| F4 | De sessiecookie, overal waar een browser hem wil sturen | De cookie draagt alleen HttpOnly, Max-Age en Path, dus niets vertelt een browser om hem bij HTTPS te houden of bij verzoeken vanaf deze site | Zet Secure en SameSite met opzet | none 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.