0%

Was schiefgehen kann

Einen Befund schreiben

„Die sehen riskant aus“ ist ein Gefühl. Niemand kann es beheben, und niemand kann testen, ob es behoben wurde. Ein Befund (finding) ist derselbe Verdacht, so aufgeschrieben, dass beides möglich wird.

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-7Qx2 mit 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 sagt dem Client also, die Session-ID nach einer Stunde zu vergessen. Was tut der Server nach einer Stunde? Führ das aus:

Try it

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-Age bittet 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. with Python hat jedes Attribut als Bitte an den Client beschrieben. Dieses Cookie stellt drei Bitten: Halte mich von Skripten der Seite fern, sende mich mit jedem Pfad, vergiss mich in einer Stunde.

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.

#ExposedAttackFixTest
F3Eine angemeldete Session, solange der Server läuftEine Session-ID, die jemals kopiert wurde, funktioniert weiter: Max-Age bittet den Client zu vergessen, und der Server vergisst nieFesthalten, wann eine Session begonnen hat und zuletzt benutzt wurde, und alte ablehnen und entfernennone yet
F4Das Session-Cookie, überall dort, wohin ein Browser es zu senden bereit istDas 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änkenSecure und SameSite bewusst setzennone 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.