Was schiefgehen kann
Einen Befund schreiben
„Die
Diese Lektion gibt einem Befund seine Form, arbeitet ein Beispiel vollständig durch und lässt dich dann zwei weitere vervollständigen. In der nächsten Lektion kommen sie in SECURITY.md, die Datei in deinem Projekt, die auflistet, was mit dem Dienst nicht stimmt.
Vier Teile
Ein Befund beantwortet vier Fragen. Die Datei mit den Befunden in deinem Projekt verwendet die englischen Namen der Teile, deshalb stehen sie auch hier.
Exposed (offengelegt). Was bekommt ein Angreifer zu lesen oder zu ändern? Nenne das Schutzgut.
Attack (Angriff). Wie erreicht er es, und was muss er schon haben? Nenne den Angreifer.
Fix (Behebung). Welche Änderung würde die Lücke schließen?
Proof (Nachweis). Was würde zeigen, dass sie geschlossen ist? Der stärkste Nachweis ist ein Test, der den Angriff ausführt und heute fehlschlägt.
Die ersten beiden Teile kommen direkt aus dem Bedrohungsmodell der letzten Lektion: ein Schutzgut und ein Angreifer mit einer bestimmten Reichweite. Die letzten beiden machen den Befund nützlich. Eine Behebung sagt, was zu tun ist. Ein Nachweis sagt, woran du es erkennen wirst.
Ein durchgearbeiteter Befund
Hier sind die Tokens, die dein Server akzeptiert, so wie sample_state() sie aufbaut:
"tokens": {
"tok-ana-writes-7Qx2": {"user": "ana", "can_write": True},
"tok-ben-reads-K9pz": {"user": "ben", "can_write": False},
},
Geh damit durch die vier Teile.
Exposed: die Macht, als ana Bücher hinzuzufügen, zu ändern und zu löschen.
Attack: Das Schreib-Token ist ein fester
im . Jeder, der die Datei liest oder eine Sicherung des Zustands, hat es. Es hört nie auf zu funktionieren. Fix: ein Token, das der Server selbst erzeugt, das nur der Server erzeugt haben kann und das abläuft.
Proof: ein Test, der den alten String
tok-ana-writes-7Qx2mit einem Schreibzugriff sendet und 401 erwartet.
Jeder Teil besteht aus einem oder zwei Sätzen, und jeder nennt etwas Bestimmtes. Das ist Befund F6 in der Nummerierung des Kurses, und Kapitel 5 schließt ihn. Du musst ihn jetzt nicht beheben. Ihn aufzuschreiben ist die Arbeit dieses Kapitels.
Welche Aussage ist ein Befund, den du beheben und testen könntest?
Du bist dran, zur Hälfte ausgefüllt
Jetzt der Session-Speicher. Das sind die zwei Stellen in deinem Server, die damit zu tun haben, wie lange eine Session dauert:
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
und in session_cookie() die Zeile cookie["session"]["max-age"] = max_age, wobei max_age 3600 ist, sofern der Aufrufer nichts anderes sagt.
Das
Es gibt True aus. Nichts im Server liest eine Uhr, also bleibt der Eintrag, bis sich jemand mit dieser ID abmeldet. Wenn das niemand tut, bleibt er, solange der Server läuft. Max-Age ist eine Bitte an den Client. Ein Client, der eine Kopie der ID behalten hat, oder ein Angreifer, der sie einmal kopiert hat, kann sie weiter senden, und der Server akzeptiert sie trotzdem.
Zwei Teile des Befunds sind vorgegeben:
Exposed: eine angemeldete Session, solange der Server läuft.
Attack: Eine Session-ID, die jemals kopiert wurde, funktioniert weiter.
Max-Agebittet den Client zu vergessen, und der Server vergisst nie.
Der Server beendet eine Session nie nach Zeit. Welches Paar vervollständigt den Befund?
Du bist dran
Der letzte betrifft das Cookie selbst. Das ist die ganze
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()
Für die ID abc gibt sie session=abc; HttpOnly; Max-Age=3600; Path=/ zurück.
Ein Cookie kann noch zwei weitere Dinge sagen, und dieses sagt keins davon. Secure bedeutet: Sende mich nur über HTTPS. SameSite bedeutet: Sende mich nicht mit Anfragen, die auf einer anderen Website beginnen. HTTP with Python hat beide genannt, und heute musst du sie nur wiedererkennen. Kapitel 4 behandelt beide, und Kapitel 8 zeigt, was ohne das zweite schiefgeht.
Hier sind vier Sätze aus einem Befund über dieses Cookie. Welcher ist sein Attack?
Die zwei Entwürfe
Hier sind beide Befunde als Zeilen, im Aufbau, den SECURITY.md verwendet. Die Datei nennt den Nachweis Test, weil ein Nachweis in diesem Kurs immer ein Test ist. Keiner der beiden Befunde hat schon einen.
| # | Exposed | Attack | Fix | Test |
|---|---|---|---|---|
| F3 | Eine angemeldete Session, solange der Server läuft | Eine Session-ID, die jemals kopiert wurde, funktioniert weiter: Max-Age bittet den Client zu vergessen, und der Server vergisst nie | Festhalten, wann eine Session begonnen hat und zuletzt benutzt wurde, und alte ablehnen und entfernen | none yet |
| F4 | Das Session-Cookie, überall dort, wohin ein Browser es zu senden bereit ist | Das Cookie trägt nur HttpOnly, Max-Age und Path, also sagt nichts einem Browser, es auf HTTPS oder auf Anfragen von dieser Website zu beschränken | Secure und SameSite bewusst setzen | none yet |
In der nächsten Lektion kopierst du diese Zeilen, oder deine eigene Formulierung davon, in SECURITY.md.
Beide Zeilen enden mit „none yet“, und das ist die Schwachstelle eines Befunds auf Papier: Er ist eine Behauptung. Der vierte Teil macht aus einer Behauptung etwas, das ein Computer prüfen kann. Die nächste Lektion schreibt den ersten, für einen Befund, den du noch nicht gesehen hast.