Prüfung zum Registered Information Security Specialist – Frühjahr 2024 (Reiwa 6), Nachmittag, Aufgabe 1 erklärt – JWT alg=none, API-Autorisierung und vorläufige WAF-Abwehr

· Aktualisiert am: · · Registered Information Security Specialist, RISS-Prüfung, API, API-Sicherheit, JWT, Authentifizierung, Autorisierung, WAF, Log4Shell, Informationssicherheit, Schwachstelle, IPA

Änderungsverlauf (Erstfassung, veröffentlicht am 6. Aug 2026)
Erstveröffentlichung
Diesen Artikel zitieren(DOI (registriertes Archiv): 10.5281/zenodo.22175992)

Die folgenden DOIs verweisen auf bereits archivierte Versionen, die vom aktuellen Text abweichen können. Verwenden Sie die URL dieser Seite, um auf den aktuellen Text zu verweisen.

Go Komura (2026). Prüfung zum Registered Information Security Specialist – Frühjahr 2024 (Reiwa 6), Nachmittag, Aufgabe 1 erklärt – JWT alg=none, API-Autorisierung und vorläufige WAF-Abwehr. KomuraSoft LLC. https://comcomponent.com/de/blog/sc-exam-r6s-pm-q1-api-security/

DOI (registriertes Archiv)
10.5281/zenodo.22175992
DOI (zuletzt registrierte Version)
10.5281/zenodo.22175993

Wir prüfen das JWT, und trotzdem lässt sich jemand anderes vortäuschen. Das JWT ist völlig gültig, und trotzdem lassen sich fremde Informationen lesen. Die beiden klingen ähnlich, werden aber an unterschiedlichen Stellen behoben. Das Erste ist ein Problem der Tokenprüfung, das Zweite ein Problem der Autorisierung über die Zieldaten.

Aufgabe 1 der Nachmittagssitzung der Prüfung zum Registered Information Security Specialist, Frühjahr 2024 (Reiwa 6), nimmt eine von einem Smartphone aufgerufene API zum Gegenstand und verlangt, diese unterschiedlichen Prüfungen auseinanderzuhalten. Die erste Hälfte behandelt JWT, Benutzer-ID, aktualisierbare Felder und den Authentifizierungscode; die zweite Hälfte eine Bibliotheksschwachstelle und eine WAF.1

Dieser Artikel stützt sich auf die offiziellen Musterlösungen und den Auswertungskommentar und arbeitet jedes Stück in der Reihenfolge Kern der Antwort, dann die Belege im Aufgabentext, dann der Entwurf, den Sie in der Praxis hinzufügen ab. Lesen Sie ihn so, dass Sie das, was innerhalb der Zeichenvorgabe der Prüfung zu schreiben ist, nicht mit dem verwechseln, was ein reales System tatsächlich braucht.23

1. Zuerst das Fazit — eine bestandene Prüfung erlaubt nicht, die nächste auszulassen

Das Prinzip, das diesen Artikel durchzieht, lautet: Behandeln Sie den Erfolg der vorherigen Prüfung nie als Grund, die nächste Vertrauensgrenze auszulassen. Eine Vertrauensgrenze ist die Linie, die festlegt, unter welchen Bedingungen ein von außen kommender Wert vertraut werden darf.

Ein gültiges JWT zu besitzen heißt nicht, fremde Informationen lesen zu dürfen. Die eigenen Informationen aktualisieren zu können heißt nicht, auch den Zahlstatus ändern zu dürfen. Ablauf des Authentifizierungscodes und WAF verlangen jeweils eigene Prüfungen und eigene Betriebspraktiken.

Übersicht der Antworten

Die folgende Tabelle gibt die Kernpunkte der offiziellen Antworten. Für die textlichen Antworten prüfen Sie Zeichenzahl und Belege jeder Teilaufgabe in dem zugehörigen Kapitel.2

Teilaufgabe und Lücke Kern der Antwort Ausführliche Erklärung
Teilaufgabe 1, Lücke a zustandslos Kapitel 3
Teilaufgabe 2(1), Lücke b 500 Sekunden Kapitel 4
Teilaufgabe 2(2) Prüfen, dass alg im JWT-Header nicht NONE ist Kapitel 5
Teilaufgabe 2(3) Prüfen, dass die Benutzer-ID im JWT mit mid übereinstimmt Kapitel 6
Teilaufgabe 2(4), Lücke c Gemeinsames Modul P Kapitel 7
Teilaufgabe 2(5), Lücke d Konto sperren, sobald aufeinanderfolgende Fehlversuche den Schwellenwert überschreiten Kapitel 8
Teilaufgabe 3(1) Zugriffe auf index.html des Testservers aufzeichnen und prüfen Kapitel 9
Teilaufgabe 3(2), Lücken e und f Beide Header Abschnitt 10.1
Teilaufgabe 3(3) Ein regulärer Ausdruck, der Groß- und Kleinschreibung abdeckt Abschnitt 10.2
Teilaufgabe 3(4) Sperrung durch Fehlalarme vermeiden und Alarme prüfen Abschnitt 10.3

Beginnen Sie mit Kapitel 2 für den Aufbau der Aufgabe, und lesen Sie die Kapitel 3 bis 10 in der Reihenfolge der Teilaufgaben, um das Ganze zu verfolgen. Wie die Antworten zu schreiben sind, steht in Kapitel 12, die Checkliste für Entwurf und Code-Review in der Praxis in Kapitel 13.

In der Abbildung kennzeichnet eine durchgezogene Linie eine stets geltende Beziehung und eine gestrichelte Linie eine bedingte (die Bedingungen stehen bei jeder Beziehung auf der Detailseite). Die vollständige Liste der Beziehungen (18 insgesamt, mit Beleg und Sicherheitsgrad) und die Definitionen der wichtigsten Konzepte sind auf der Detailseite der Wissenskarte (auf Japanisch) zusammengestellt. Daten: JSON-LD / Turtle

2. Aufbau der Aufgabe — fünf Prüfungen getrennt lesen

Schauplatz ist das Unternehmen G, das einen neuen Gesundheitsdienst anbieten will. Nutzerinnen und Nutzer geben über eine Smartphone-App Mahlzeiten, Gewicht und Ähnliches ein und erhalten eine Einschätzung des Gesundheitsrisikos sowie Hinweise zum Speiseplan. Das System ist in der Cloud aufgebaut und kombiniert API-Gateway, ereignisgetriebene Verarbeitung und eine verwaltete Datenbank.

Produkt- und Dienstnamen im Aufgabentext sind abstrahiert. Dieser Artikel übernimmt die Abbildungen und Tabellen des Aufgabenhefts nicht unverändert, sondern beschreibt die Struktur, die zum Verständnis der Teilaufgaben nötig ist. Stellen, die den Kern der offiziellen Antworten wiedergeben, werden von den hier ergänzten praktischen Hinweisen getrennt.1

Überblick über die AufgabeAuthentifizierungscode, JWT, Ziel-ID, aktualisierte Felder und Ausführung aus externer Eingabe jeweils als eigene Prüfung lesen.Anfrage der nutzenden PersonAbgleich des AuthentifizierungscodesAusstellung und Prüfung des JWTNutzer-APIAutorisierung der Ziel-midAutorisierung des update-statusExterne Eingabe ins Protokoll schreibenVerletzliche BibliothekExterne Codeausführung über JNDI

Abbildung 1: Von der Authentifizierung über die API-Operationen bis zur Protokollverarbeitung gibt es mehr als eine Stelle, an der einem Wert vertraut wird.

2.1. Authentifizierung, Tokenprüfung und zwei Arten der Autorisierung trennen

Auch nachdem der Authentifizierungscode die Person bestätigt und das JWT ausgestellt und geprüft wurde, bleibt die Autorisierung über Daten und über einzelne Felder. Der Pfad, der externe Eingabe ins Protokoll schreibt, braucht ebenfalls eine Grenze, die verhindert, dass Eingabe als Befehl behandelt wird.

[Benutzer-ID und Passwort]
          |
          v
[Prüfung des 4-stelligen Codes] ---- ohne Versuchslimit ----> Brute-Force
          |
          v
[JWT ausstellen]
          |
          v
[JWT-Bibliothek] ------- lässt alg=none zu ------> Verfälschung der Benutzer-ID
          |
          v
[Nutzer-API]
    |             |
    |             +-- reicht status unverändert weiter -----> Lücke der Autorisierung auf Eigenschaftsebene
    |
    +-- vertraut mid --------------------------------------> Lücke der Autorisierung auf Objektebene

[Externe Eingabe ins Protokoll schreiben]
          |
          v
[Verletzliche Bibliothek] ---- JNDI/LDAP/HTTP ------> externe Codeausführung

Am wichtigsten ist hier die folgende Unterscheidung.

Prüfung Was sie fragt Wie sie in dieser Aufgabe gebrochen wurde
Authentifizierung Wer sind Sie Brute-Force des 4-stelligen Codes
Tokenprüfung Ist diese Identitätsinformation unverändert alg=none
Autorisierung auf Objektebene Dürfen Sie auf die Daten dieser Person zugreifen Vertauschen von mid
Autorisierung auf Eigenschaftsebene Dürfen Sie dieses Feld ändern status=paid
Grenze von Eingabe zu Ausführung Kann externe Eingabe als Befehl gelesen werden JNDI Lookup

Dass die vorherige Prüfung gelungen ist, ist kein Grund, die nächste auszulassen. Auch wer ein gültiges JWT besitzt, darf deshalb nicht fremde Daten lesen. Auch wer die eigenen Daten aktualisieren kann, darf deshalb nicht den Zahlstatus ändern.

Können Sie diese Stufen trennen, ist die Antwort zu jeder Teilaufgabe kein Auswendiglernen mehr.

Unterschied zwischen Authentifizierung und AutorisierungDie Bestätigung des Subjekts ist eine Sache, und die Prüfung, ob dieses Subjekt Zieldaten oder ein Feld bedienen darf, ist eine eigene Prüfung.Authentifizierung und TokenprüfungFeststellen, wessen Anfrage das istDarf sie diese Daten erreichenDarf sie dieses Feld ändern

Abbildung 2: Unterschied zwischen Authentifizierung und Autorisierung. Die Authentifizierung kommt zuerst, die Autorisierung ist eine eigene Prüfung.

2.2. Die Teile von Teilaufgabe 2 am vom Angreifer geänderten Wert unterscheiden

Die in Teilaufgabe 2 leicht zu verwechselnden Punkte ordnen sich, sobald Sie den vom Angreifer kontrollierten Wert betrachten.

Angriff Vom Angreifer geänderter Wert Was nicht hätte vertraut werden dürfen Grundlegende Abhilfe
JWT-Verfälschung alg im JWT-Header und Benutzer-ID in der Payload Der Prüfalgorithmus, den das Token selbst angibt Erlaubte Algorithmen serverseitig festlegen
Lesen fremder Informationen mid in der Anfrage Die vom Client gelieferte Ziel-ID Mit dem Subjekt des JWT abgleichen oder die Ziel-ID aus dem JWT ableiten
Wechsel zu einem zahlenden Nutzer Undokumentiertes status Jede automatisch gebundene Eigenschaft Aktualisierbare Eigenschaften auf eine Positivliste setzen
Knacken des 4-stelligen Codes Kandidatenwerte für otp Unbegrenzte Authentifizierungsversuche Fehlerzahl begrenzen, Verzögerungen und Risikobewertung hinzufügen

Wichtig ist, dass Sie das nicht alles unter Eingabewerte prüfen zusammenwerfen.

  • alg ist eine Richtlinie der kryptografischen Verarbeitung
  • mid ist Autorisierung auf Objektebene
  • status ist Autorisierung auf Eigenschaftsebene
  • otp ist Widerstand gegen Online-Raten

Obwohl sie in derselben HTTP-Anfrage sitzen, ist der Grund, sie zu schützen, jeweils ein anderer.

3. Teilaufgabe 1 — zustandslos hält trotzdem Geschäftsdaten und Fehlerzahlen

Teilaufgabe 1 fragt nach einem Entwurfsprinzip von RESTful APIs: der Eigenschaft, keine Sitzungsverwaltung zu betreiben.

Antwort: Lücke a ist zustandslos.2

3.1. Der Beleg — jede Anfrage trägt allein alles, was zur Verarbeitung nötig ist

Zustandslos heißt, dass jede Anfrage für sich die zur Verarbeitung nötigen Informationen trägt, sodass der Server sich den Gesprächszustand der vorherigen Anfrage nicht merken muss. In dieser Aufgabe hängt die Smartphone-App an jede Anfrage ein JWT im Authorization-Header. Der Server prüft dieses JWT und identifiziert die nutzende Person für diese Anfrage.

3.2. Leicht falsch gelesen — es heißt nicht, Daten oder Fehlerzahlen wegzuwerfen

Der leichte Fehler ist, zustandslos als der Server hält gar keinen Zustand zu lesen. Tatsächlich hält er ganz normal Folgendes.

  • Die Datenbank mit Nutzerinformationen und Gesundheitsdaten
  • Den Zahlstatus
  • Wert, Ablauf und Fehlerzahl des Authentifizierungscodes
  • Den Signaturschlüssel des JWT
  • Widerrufsinformationen, falls der Entwurf eine Widerrufsliste verwendet
  • Protokolle und Prüfaufzeichnungen

Was er aufgibt, ist, jeden API-Aufruf von serverseitigem Sitzungszustand abhängig zu machen, der nur dazu da ist, ein Gespräch fortzusetzen.

Zustandslos zu sein verbessert die Sicherheit auch nicht automatisch. Das JWT jedes Mal zu senden erleichtert die horizontale Verteilung, aber ist die JWT-Prüfung falsch, breitet sich der Fehler ebenfalls gleichmäßig auf alle Knoten aus. Eine architektonische Eigenschaft und sicherheitstechnische Korrektheit sind getrennt.

Zustandslos und gespeicherter ZustandJede Anfrage ohne Abhängigkeit von der Gesprächshistorie zu verarbeiten speichert trotzdem Zustand wie Geschäftsdaten und Fehlerzahlen.Anfrage mit JWTNutzende Person allein aus dieser Anfrage identifizierenVerarbeiten und antwortenNutzerinformationen, Abrechnung, FehlerzahlKeine Abhängigkeit vom vorherigen Gespräch

Abbildung 3: Die Abhängigkeit vom Gespräch zu entfernen und Geschäfts- sowie Sicherheitszustand zu speichern sind miteinander vereinbar.

4. Teilaufgabe 2(1) — die mittlere Zeit zum Knacken eines 4-stelligen Codes berechnen

Antwort: Lücke b ist 500. Die Einheit ist Sekunden.2

4.1. Der Beleg — Kandidatenraum, Versuchsgeschwindigkeit und Gültigkeitsdauer zusammenstellen

Stimmt Benutzer-ID und Passwort, sendet die Authentifizierungs-API eine vierstellige Zahl per E-Mail. Stimmen anschließend Benutzer-ID und vierstelliger Code überein, wird ein JWT ausgestellt. Der Code ist ab Erzeugung 10 Minuten gültig.

In der Diagnose waren 10 Versuche pro Sekunde möglich. Gefragt ist, in wie vielen Sekunden der Code im Mittel geknackt wird.

Die Rechnung verwendet die Hälfte des Kandidatenraums

Eine vierstellige Zahl einschließlich führender Nullen hat die folgenden 10.000 Möglichkeiten.

0000, 0001, 0002, ... , 9999

Wird der korrekte Wert gleichmäßig gewählt und ohne Wiederholung der Reihe nach versucht, rechnet die Prüfung die mittlere Versuchszahl als Hälfte des Kandidatenraums.

Mittlere Versuche = 10.000 / 2 = 5.000 Versuche
Mittlere Zeit     = 5.000 / 10 Versuche pro Sekunde = 500 Sekunden

Diese Näherung ergibt die offizielle Antwort von 500 Sekunden. Streng über die Versuche 1 bis 10.000 gemittelt wären es 5.000,5 Versuche; hier folgen wir der Prüfungsantwort.

Im Höchstfall dauert es 1.000 Sekunden, aber die Aufgabe fragt nach dem Mittel. Und die Gültigkeitsdauer des Codes beträgt 600 Sekunden, länger als die mittleren 500 Sekunden zum Knacken. Deshalb wurde beurteilt, dass er mit hoher Wahrscheinlichkeit geknackt wird.

Zeitgefühl beim 4-stelligen AuthentifizierungscodeIn der Prüfungsnäherung sind es im Mittel 500 Sekunden, und ohne Wiederholung lassen sich in 600 Sekunden Gültigkeit 60 Prozent der Kandidaten prüfen.Kandidatenraum 10000Im Mittel etwa 5000 VersucheBei 10 pro Sekunde etwa 500 SekundenKürzer als 600 Sekunden GültigkeitIn 600 Sekunden 6000 Kandidaten

Abbildung 4: Zeitgefühl beim 4-stelligen Authentifizierungscode. Die Hälfte der Kandidaten im Mittel zu versuchen trifft innerhalb der Gültigkeit.

4.2. Praktischer Hinweis — nicht nur die Ablaufzeit, sondern die mögliche Versuchszahl betrachten

Die Stärke eines Authentifizierungscodes ergibt sich weder allein aus der Stellenzahl noch allein aus der Gültigkeitsdauer.

Versuche innerhalb der Gültigkeit
= Versuche pro Sekunde × Gültigkeitsdauer
= 10 × 600
= 6.000 Versuche

Ohne Wiederholung der Reihe nach lassen sich 60 Prozent von 10.000 innerhalb der Gültigkeit prüfen. Eine Ablaufzeit allein reicht nicht, wenn die Versuchszahl unbegrenzt ist.

Die geltende NIST SP 800-63B verlangt für kurzlebige Geheimnisse in der Out-of-Band-Authentifizierung mindestens 6 Stellen und macht unter 64 Bit eine Begrenzung der Versuchszahl verpflichtend. Außerdem verlangt sie, E-Mail nicht als Out-of-Band-Authentifizierung zu verwenden4. In der Prüfung antworten Sie innerhalb der gegebenen Spezifikation von 4 Stellen und E-Mail-Versand; in einem neuen praktischen Entwurf sollten Sie diese Voraussetzungen selbst prüfen.

5. Teilaufgabe 2(2) — dem Angreifer nicht die JWT-Prüfmethode wählen lassen

Kern der Antwort

Die Teilaufgabe fragt, gegen welche Daten die korrigierte Bibliothek Q welche Prüfung durchführt, jeweils in höchstens 20 Zeichen.

Die Musterlösung lautet wie folgt.

Punkt Kern der Antwort
Zu prüfende Daten Der in alg im JWT-Header angegebene Wert
Inhalt der Prüfung Prüfen, dass er nicht NONE ist

Das ist die unmittelbare Korrektur der im Aufgabentext beschriebenen Schwachstelle.2 Nur die Signatur prüfen zu antworten wiederholt eine bereits vorhandene Verarbeitung. Der Auswertungskommentar nennt genau solche Fehlantworten.3

5.1. Der Beleg — die vorhandene Signaturprüfung wählt falsch

Das JWT der Aufgabe besteht aus Header, Payload und Signatur.

base64url(header).base64url(payload).base64url(signature)

Im Header war als Signaturalgorithmus RS256 verzeichnet. In der Payload stehen Benutzer-ID, Ausgabezeit und Ablauf.

Die diagnostizierende Person änderte zwei Dinge.

  1. alg im Header von RS256 nach NONE
  2. Die Benutzer-ID in der Payload zu einer anderen Person

Dieses JWT gesendet, gelang die Prüfung, und es ließ sich jemand anderes vortäuschen.

Ablauf des JWT-alg=none-AngriffsÄndert der Angreifer Prüfmethode und Benutzer-ID, nimmt eine Bibliothek, die none zulässt, das verfälschte JWT an.Gültiges JWT beschaffenalg auf none setzenuser auf eine andere Person setzenBibliothek überspringt die SignaturprüfungAls andere Person angenommen

Abbildung 5: Ablauf des JWT-alg=none-Angriffs. Der Angreifer wählt den Prüfalgorithmus.

none ist kein Wert, den die Spezifikation auslässt

RFC 7519 definiert ein JWT ohne Signatur und ohne Verschlüsselung, dessen alg none ist, als Unsecured JWT5. Der Wert none existiert also in der Spezifikation.

Das Problem ist, dass eine API, die nur signierte JWTs annehmen sollte, das vom Angreifer angegebene none angenommen hat.

Die verletzliche Verarbeitung sieht begrifflich so aus.

1. JWT-Header lesen
2. Am im Header stehenden alg die Prüfmethode wählen
3. Ist alg none, die Signatur nicht prüfen
4. Der Benutzer-ID in der Payload vertrauen

Aus einer vom Angreifer kontrollierten Eingabe wird die Stärke der Sicherheit selbst gewählt.

5.2. Praktischer Hinweis — erlaubte Algorithmen serverseitig festlegen

Hier müssen Prüfungsantwort und praktische Empfehlung getrennt werden.

RFC 8725 verlangt, dass eine JWT-Bibliothek die Menge erlaubter Algorithmen von der aufrufenden Seite vorgegeben bekommt und keine anderen verwendet6. Also so:

Schlechte Idee:
  annehmen, wenn token.header.alg != "none"

Gute Idee:
  nur annehmen, wenn in serverConfig.allowedAlgorithms enthalten
  Beispiel: allowedAlgorithms = ["RS256"]

Nur none abzulehnen lässt schwache Algorithmen und die Verwechslung von Public-Key- und Shared-Key-Verfahren übrig. Die Annahme nicht durch Verneinungen zu erweitern, sondern die erlaubten Bedingungen eng festzulegen, ist der Grundsatz.

Bei der JWT-Prüfung prüfen Sie neben dem Algorithmus je nach Verwendung mindestens Folgendes.

Punkt Was zu prüfen ist
Signatur Lässt sie sich mit dem vorgesehenen Schlüssel und Algorithmus prüfen
iss Ist es ein vertrauenswürdiger Aussteller
aud Ist das Token für diese API ausgestellt
exp Liegt es innerhalb der Gültigkeit
nbf Liegt es nicht vor dem Nutzungsbeginn
sub oder Benutzer-ID Ist es ein gültiges Subjekt der Anwendung
Tokenart Werden ID-Token und Access-Token nicht verwechselt

In dieser Aufgabe heißt der Payload-Schlüssel user; in der Praxis verwenden Sie das übliche sub oder definieren die Bedeutung eines eigenen Claims klar.

Sichere und unsichere JWT-PrüfungDie Prüfmethode nicht aus der Angabe des Tokens wählen, sondern Signatur und Claims prüfen, nachdem die serverseitigen Erlaubnisbedingungen erfüllt sind.NeinJaJWT empfangenErlaubter Server-alg?AblehnenSignatur und Claims prüfenAls geprüftes Subjekt behandelnUnsichere VerarbeitungPrüfung wegen angegebenem none überspringen

Abbildung 6: Sichere und unsichere Prüfung. In der Praxis legen Sie die erlaubten Algorithmen eng fest.

5.3. Signatur und Geheimhaltung trennen — base64url ist keine Verschlüsselung

Ein weiteres Missverständnis bei JWT: Header und Payload sind in base64url dargestellt, aber das ist keine Verschlüsselung. Jede Person kann sie decodieren und lesen.

Die Signatur garantiert nur, dass der Inhalt nach der Ausstellung nicht verändert wurde, sofern sie korrekt geprüft wurde. Das heißt nicht, dass schutzbedürftige personenbezogene Daten in die Payload eines signierten JWT dürfen.

JWT-Signatur und Geheimhaltung sind getrenntbase64url ist eine auch für Dritte lesbare Darstellung; Erkennung von Verfälschung durch die Signatur und Vertraulichkeit sind getrennt zu denken.Signiertes JWTHeader und Payload lesenbase64url decodierenInhalt wird nicht geheimSignatur korrekt prüfenPrüfen, ob unverändert

Abbildung 7: Die Signatur dient der Erkennung von Verfälschung, nicht dazu, den Inhalt unlesbar zu machen.

6. Teilaufgabe 2(3) — ein gültiges JWT und ein gültiges Ziel sind getrennt

Kern der Antwort

Unterstreichung 2 in Tabelle 5 fragt in höchstens 40 Zeichen nach der Verarbeitung, die in die Aufrufverarbeitung des gemeinsamen Moduls P einzufügen ist.

Die Musterlösung lautet:2

Verarbeitung, die prüft, ob die im JWT enthaltene Benutzer-ID mit dem Wert von mid übereinstimmt

Die im Aufgabentext vorgeschriebene Einfügestelle ist nicht das gemeinsame Modul P selbst, sondern die P-Aufrufverarbeitung, die P aufruft. Dort fügen Sie den Abgleich von JWT und mid hinzu.1

In der Praxis ist das Ziel, die Autorisierung einschließlich der Seite von P in der gemeinsamen Schicht, die Daten erreicht, durchgängig durchzuführen. Dann wirkt dieselbe Autorisierung auf GET und PUT und auf künftige APIs, die P nutzen. Vergleichslogik in jeden Bildschirm oder Endpunkt zu kopieren führt zu Auslassungen.

6.1. Der Beleg — Subjekt des JWT und Ziel-mid kommen getrennt an

Dies ist ein Angriff, der das JWT selbst nicht verfälscht.

Die Nutzer-API nimmt per GET oder PUT eine Benutzer-ID namens mid entgegen. Das gemeinsame Modul P holt und aktualisiert die an diese mid gebundenen Nutzerinformationen aus der Datenbank.

Das Angriffsmuster ist einfach.

Benutzer-ID im JWT: user01    ← korrekt signiertes JWT
mid der Anfrage: user02       ← vom Angreifer geändert

Die JWT-Signatur ist korrekt, die Authentifizierung gelingt. Die API vertraut jedoch mid=user02 und gibt die Informationen von user02 zurück.

Das ist ein typischer Fall von Broken Object Level Authorization (BOLA) in der OWASP API Security Top 10 2023. Wenn über eine vom Nutzer angegebene Objekt-ID auf Daten zugegriffen wird, muss die Autorisierung für dieses Objekt jedes Mal geprüft werden7.

BOLA-AngriffSubjekt des gültigen JWT und Anfrage-mid unterscheiden sich, und allein anhand von mid werden fremde Informationen zurückgegeben.Korrekt signiertes JWT (user01)Nutzer-APIGeänderte mid (user02)Kein Abgleich mit dem SubjektDaten von user02 holen und aktualisieren

Abbildung 8: BOLA-Angriff. Die Authentifizierung gelingt, die Autorisierung wird nicht geprüft.

6.2. Praktischer Hinweis — eine nur für die eigene Person bestimmte API sollte mid nicht annehmen

Eine API, die nur die eigenen Informationen holt und aktualisiert, braucht keine Benutzer-ID vom Client.

GET /users/me
Authorization: Bearer <JWT>

Serverseitig entnehmen Sie das Subjekt dem geprüften JWT.

principal = validateJwt(request.authorization)
userId = principal.subject
return repository.getUser(userId)

Aktualisieren ebenso.

principal = validateJwt(request.authorization)
input = validateProfileUpdate(request.body)
repository.updateProfile(
    userId = principal.subject,
    name = input.name,
    age = input.age
)

Eine Vergleichsverarbeitung schützt, wenn sie geschrieben ist. Nimmt der Entwurf die Ziel-ID gar nicht von außen entgegen, verringert sich die Sorte von Fehlern, die Vergleichsverarbeitung zu vergessen.

Muss eine Administration fremde Nutzerinformationen bedienen, trennen Sie so.

PUT /users/me                  für gewöhnliche Nutzerinnen und Nutzer
PUT /admin/users/{userId}      für Administration

Für die Administration verlangen Sie andere Rechte, Prüfprotokolle und bei Bedarf erneute Authentifizierung. Das macht die Grenze der Autorisierungsrichtlinie sichtbarer als eine Ausnahme nur für den Administrationsfall in der allgemeinen API.

BOLA verhindernÜbereinstimmung von geprüftem Subjekt und mid prüfen oder in einer nur für die eigene Person bestimmten API das Ziel aus dem Subjekt ableiten, um Vergleichsauslassungen zu verringern.mid entgegennehmenJaNeinNur-eigene APISubjekt des geprüften JWTWie die Ziel-ID bestimmt wirdStimmt mit dem Subjekt überein?Eigene Daten bedienenAblehnenZiel-ID aus dem Subjekt ableiten

Abbildung 9: BOLA verhindern. mid nicht entgegennehmen oder mit dem Subjekt des JWT abgleichen.

6.3. Zur Erinnerung — wer Sie sind und was Sie tun dürfen sind getrennt

In Prüfung und Praxis hilft die folgende Formulierung.

  • Authentifizierung: wer Sie sind
  • Autorisierung: was diese Person tun darf

Dass die JWT-Signaturprüfung gelungen ist, reicht bis dahin, diesem Token als Subjekt zu vertrauen. Dass dieses Subjekt user02 lesen darf, muss getrennt geprüft werden.

7. Teilaufgabe 2(4) — nur Felder annehmen, die aktualisiert werden dürfen

Antwort: Lücke c ist gemeinsames Modul P.2

7.1. Der Beleg — wohin das spezifikationsfremde status gereicht wurde

In der Spezifikation der Nutzer-API sind als Aktualisierungsparameter definiert:

mid   Benutzer-ID
name  Name
age   Alter

Die diagnostizierende Person fügte jedoch den nicht spezifizierten Wert hinzu:

status=paid

Daraufhin wurde der Status einer kostenlosen nutzenden Person zu einer zahlenden.

Laut Aufgabentext prüfte Dienst L die empfangenen Parameter nicht und reichte alle an das gemeinsame Modul P weiter. P konnte die Datenbank unverändert aktualisieren.

Die Stelle, die spezifikationsfremde Werte entgegennimmt und bis zum Nutzerstatus aktualisieren kann, ist also das gemeinsame Modul P.

Mass AssignmentWird auch spezifikationsfremdes status an das gemeinsame Modul weitergereicht und aktualisiert, kann die nutzende Person den Zahlstatus ändern.Spezifikation ist mid, name, agestatus=paid hinzufügenAlle Parameter an P reichenUnverändert ins interne Datenobjekt übernehmenZahlstatus wird paid

Abbildung 10: Mass Assignment. Eine spezifikationsfremde Eigenschaft wird unverändert ins interne Objekt übernommen.

7.2. Unterschied zu BOLA — nicht das Ziel, sondern die Felder darin schützen

Das Vertauschen von mid im vorigen Kapitel und das Hinzufügen von status ähneln sich, die zu schützende Körnung unterscheidet sich.

Schwachstelle Was der Angreifer ändert Was eigentlich zu prüfen ist
Vertauschen von mid Das Zielobjekt Darf diese Person auf diesen Nutzerdatensatz zugreifen
Hinzufügen von status Eine Eigenschaft im Objekt Darf diese Person dieses Feld ändern

Die OWASP API Security Top 10 2023 behandelt Letzteres als Broken Object Property Level Authorization und ordnet das frühere Mass Assignment dieser Klasse zu8.

7.3. Praktischer Hinweis — den Eingabetyp für Aktualisierungen zur Positivliste machen

Eine verletzliche Implementierung sieht begrifflich so aus.

entity = repository.find(body.mid)
bindAllProperties(entity, body)
repository.save(entity)

Auch wenn die Oberfläche nur Eingabefelder für name und age hat, kann ein Angreifer die HTTP-Anfrage direkt erzeugen. Was in der UI fehlt, ist keine Sicherheitsgrenze.

Eine sichere Implementierung macht die aktualisierbaren Felder ausdrücklich.

input = parseExactSchema(body, fields = ["name", "age"])

entity = repository.find(authenticatedUserId)
entity.name = input.name
entity.age  = input.age
repository.save(entity)

Wichtig sind zwei Punkte.

  1. Im Eingabetyp für Aktualisierungen nur Felder legen, die die nutzende Person ändern darf
  2. Spezifikationsfremde unbekannte Felder nicht ignorieren, sondern möglichst als Fehler ablehnen

Unbekannte Felder still zu ignorieren verdeckt, dass ein Angriff gescheitert ist, und übergeht Implementierungsfehler des Clients und Anzeichen von Angriffen. Gibt es keinen Kompatibilitätsgrund, lässt sich mit einem strengen Schema leichter untersuchen.

Autorisierung auf FeldebeneDen Eingabetyp für Aktualisierungen auf name und age beschränken und den Zahlstatus über einen eigenen Pfad aus geprüften Zahlungsbenachrichtigungen aktualisieren.JaNeinAnfrage zur ProfilaktualisierungNur name und age?Nur erlaubte Felder aktualisierenUnbekannte Felder ablehnenGeprüfte ZahlungsbenachrichtigungpaymentId abgleichen und Doppelverarbeitung verhindernstatus über eigenen Pfad aktualisieren

Abbildung 11: Autorisierung auf Feldebene. Aktualisierbare Felder per Positivliste beschränken und den Zahlstatus auf einem anderen Pfad ändern.

7.4. Den Zahlstatus nur aus einem geprüften Zahlungsergebnis ändern

status=paid ist kein Teil des Nutzerprofils. Es ist ein Zustand, der aus der serverseitigen Tatsache folgt, dass eine Zahlung gelungen ist.

Aktualisierung des Nutzerprofils
  -> nur name / age änderbar

Geprüfte Benachrichtigung vom Zahlungsdienst
  -> paymentId abgleichen
  -> Doppelverarbeitung verhindern
  -> status auf paid setzen

Auch wenn sie in derselben Datenbankspalte liegen, sind Berechtigung und Pfad der Änderung getrennt. Wird die interne Entität unverändert als Eingabetyp der externen API verwendet, verschwindet diese Grenze.

7.5. Gemeinsame Bausteine sollen Autorisierung und Eingabebeschränkung enthalten

In dieser Aufgabe treten zwei gemeinsame Bausteine auf: die JWT-Verwaltungsbibliothek Q und das gemeinsame Modul P.

Gemeinsame Bausteine haben große Vorteile.

  • Eine Stelle zu korrigieren wirkt auf alle nutzenden APIs
  • Autorisierung und Prüfung müssen nicht in jeder Funktion wiederholt werden
  • Der Testgegenstand lässt sich bündeln
  • Form von Protokoll und Prüfung lässt sich vereinheitlichen

Andererseits breitet sich ein Fehler auf das Ganze aus.

  • Nimmt Bibliothek Q alg=none an, werden alle APIs, die JWT nutzen, gefährlich
  • Nimmt gemeinsames Modul P beliebige mid oder status an, werden GET und PUT gefährlich
  • Wird die verletzliche Bibliothek H in der Grundlage verwendet, werden mehrere Pfade, die HTTP-Header protokollieren, zur Angriffsfläche

Gemeinsam zu machen ist also nicht bloßer Datenzugriff. Sicherheitsinvarianten müssen gemeinsam gemacht und dieser gemeinsame Baustein für sich streng geprüft werden.

Zum Beispiel so als Vertrag von P:

P.getOwnUser(authenticatedSubject)
P.updateOwnProfile(authenticatedSubject, ProfileUpdate{name, age})

Niedrige APIs der folgenden Art sollten der allgemeinen aufrufenden Seite nicht unverändert offenstehen.

P.getUser(arbitraryMid)
P.updateUser(arbitraryMap)

Letztere braucht nur begrenzte Pfade wie die Administration. Die Freiheit der niedrigen Schicht an alle APIs zu verteilen ist ein Entwurf, der darauf hofft, dass jede aufrufende Seite sie jedes Mal richtig verwendet.

Vertrag gemeinsamer Bausteine eng haltenAutorisierung und Eingabetyp in den Vertrag des gemeinsamen Bausteins aufzunehmen verringert die Abhängigkeit davon, dass die aufrufende Seite jedes Mal richtig verwendet.API für gewöhnliche Nutzerinnen und NutzerGeprüftes Subjekt und Update-DTOAutorisierung im gemeinsamen Baustein vereinheitlichenErlaubte Daten bedienenBedienung beliebiger IDs und MapsAuf begrenzte Pfade wie Administration trennenGemeinsamen Baustein streng testen

Abbildung 12: Gemeinsam zu machen sind nicht nur der Datenzugriff, sondern die zu schützenden Bedingungen von Autorisierung und Eingabe.

8. Teilaufgabe 2(5) — Fehlversuche zählen und das Brute-Force stoppen

Gegen das Brute-Force des 4-stelligen Codes ist die in Lücke d von Tabelle 5 einzufügende Verarbeitung in höchstens 30 Zeichen zu beantworten. Der Schwellenwert ist 10.

Die Musterlösung lautet:2

Verarbeitung, die das Konto sperrt, sobald die Zahl aufeinanderfolgender Fehlversuche den Schwellenwert überschreitet

8.1. Der Beleg — die Fehlerzahl ist Zustand, den Sicherheitsentscheidungen brauchen

Das widerspricht dem Zustandslos von Teilaufgabe 1 nicht. Keinen Gesprächszustand der API-Aufrufe als Serversitzung zu halten und die für Sicherheitsentscheidungen nötige Fehlerzahl dauerhaft zu speichern sind getrennt.

Mit und ohne Begrenzung der VersuchszahlDie Fehlerzahl zu halten und bei Überschreiten des Schwellenwerts zu sperren stoppt unbegrenztes Online-Raten.JaNeinAbgleich des Codes fehlgeschlagenFehlerzahl des Kontos aktualisierenSchwellenwert überschritten?Konto sperrenVerbleibende Versuche zulassenOhne Begrenzung kann weitergeraten werden

Abbildung 13: Mit und ohne Zahlenbegrenzung. Eine Begrenzung der Fehlversuche stoppt Brute-Force praktisch.

8.2. Praktischer Hinweis — auch auf Aussperren durch Sperren vorbereiten

Eine kontobezogene Zahlenbegrenzung ist nötig, kennt der Angreifer jedoch die Benutzer-ID einer anderen Person, kann er absichtlich bis über den Schwellenwert scheitern und die rechtmäßige Person aussperren. Deshalb kombinieren Sie in der Praxis Folgendes.

Steuerung Rolle
Fehlerzahl je Konto Brute-Force gegen ein Konto stoppen
Gestaffelte Wartezeit Tippfehler rechtmäßiger Personen zulassen und die Angriffsgeschwindigkeit senken
Steuerung nach Quell-IP, Gerät, ASN Angriffe dämpfen, die wenige Male gegen viele Konten versuchen
Risikobasierte Bewertung Ungewöhnliche Region, Gerät, Geschwindigkeit stärker beschränken
Benachrichtigung der nutzenden Person Angriff oder Fehlbedienung erkennbar machen
Sicheres Wiederherstellungsverfahren Den Weg zur Aufhebung der Sperre nicht zur Angriffsfläche machen

Außerdem darf die Fehlerzahl beim erneuten Senden eines Codes nicht auf 0 zurückgesetzt werden. Sonst kann der Angreifer das Versuchskontingent jedes Mal wiederbeleben, wenn er die Sende-API aufruft. Auch die geltende NIST SP 800-63B verlangt, die Fehlerzahl beim Erzeugen eines neuen Authentifizierungsgeheimnisses nicht zurückzusetzen4.

8.3. Neuausstellung, Wiederverwendung und Sende-API als ein Satz schützen

Im Aufgabentext steht die Gültigkeitsdauer im Zentrum; in der Praxis brauchen Sie außerdem Folgendes.

  • Einen erfolgreichen Code sofort ungültig machen
  • Wiederverwendung desselben Codes ablehnen
  • Den Code selbst nicht ins Protokoll schreiben
  • Antworten so gestalten, dass sich aus Erfolg oder Misserfolg des Abgleichs nicht auf die Existenz der Person schließen lässt
  • Auch die API zum Senden des Codes zahlenmäßig begrenzen

Ein kurzes Geheimnis darf seine Sicherheit nicht allein der Zufallserzeugung überlassen.

Maßnahmen zum AuthentifizierungscodeNeben Kandidatenraum und Gültigkeit Fehlerzahl halten, nach Erfolg ungültig machen, benachrichtigen und Wiederherstellung kombinieren.JaNeinCode ausstellen und neu ausstellenFehlerzahl nicht zurücksetzenMit Begrenzung von Zahl und Geschwindigkeit abgleichenAbgleich gelungen?Code sofort ungültig machenFehler aufzeichnen, verzögern, sperrenBenachrichtigung und sicheres WiederherstellenAuch Sende-API begrenzen, Code nicht aufzeichnen

Abbildung 14: Maßnahmen zum Authentifizierungscode. Nicht nur Stellenzahl und Ablauf, sondern Versuchssteuerung und Betrieb kombinieren.

9. Teilaufgabe 3(1) — die Ausführung des Prüfbefehls am Zugriffsprotokoll feststellen

Kern der Antwort

Teilaufgabe 3(1) fragt, was auf dem Testserver zu implementieren ist, um festzustellen, dass der Befehl ausgeführt wurde.

Die Musterlösung lautet:

Eine Einrichtung, die Zugriffe auf index.html des Testservers aufzeichnet und prüft2

9.1. Der Beleg — beobachten, dass die Kette bis zum letzten Prüfbefehl gelangt ist

Nach Betriebsbeginn wird in der weit verbreiteten Open-Source-Bibliothek H die schwerwiegende Schwachstelle V veröffentlicht. Der Ablauf im Aufgabentext ist:

  1. Der Angreifer sendet eine Zeichenfolge mit JNDI Lookup in einem HTTP-Header
  2. Der angegriffene Server schreibt den Wert ins Protokoll
  3. Die verletzliche Bibliothek wertet den JNDI Lookup aus und fragt den Angriffs-LDAP-Server
  4. Die LDAP-Antwort liefert die URL des Angriffs-HTTP-Servers
  5. Der angegriffene Server holt die Klassendatei und führt den Befehl aus

Das liest sich als Angriff vom Typ Log4Shell (CVE-2021-44228) mit verschwiegenem Eigennamen. Auch Apache beschreibt die Schwachstelle so, dass steuerbare Protokollnachrichten oder Parameter beliebigen von einem LDAP-Server geladenen Code ausführen können9.

Bestätigungsablauf einer Schwachstelle vom Typ Log4ShellNicht nur JNDI-Auflösung und Klassenholung, sondern das Holen von index.html durch den Prüfbefehl im Protokoll bestätigen.Externe Eingabe im HTTP-HeaderProtokollverarbeitung des ZielserversÜber JNDI LDAP abfragenURL der Klassenquelle empfangenZielserver holt die KlassePrüfbefehl auf dem Zielserver ausführenindex.html des Testservers holenDiesen Zugriff aufzeichnen und prüfen

Abbildung 15: Bestätigungsablauf einer Schwachstelle vom Typ Log4Shell. Statt eines zerstörerischen Befehls die Ankunft über die Aufzeichnung eines HTTP-Zugriffs bestätigen.

Der Prüfbefehl bewirkt nur einen harmlosen HTTP-Zugriff

Unternehmen G führt einen das System nicht beeinträchtigenden Prüfcode aus und prüft, ob Schwachstelle V von außen ausnutzbar ist. Der Befehl des Prüfcode holt nur index.html des Testservers.

Bleibt im Zugriffsprotokoll des Webservers ein GET vom angegriffenen Server, lässt sich mindestens die folgende Kette bestätigen.

Externe HTTP-Anfrage
  -> Protokollverarbeitung
  -> JNDI Lookup
  -> LDAP-Antwort
  -> Klassenholung
  -> Ausführung des Prüfbefehls
  -> HTTP-Zugriff auf den Testserver

9.2. Warum das Protokoll des Testservers statt einer Anzeige auf dem Bildschirm

Das Angriffsziel ist der Server. Auf dem Browserbildschirm der nutzenden Person muss sich nichts ändern. Und selbst wenn die Schwachstelle besteht, kann ausgehende Kommunikation unterwegs an einer Firewall enden.

Zeichnet der Testserver Zugriffe auf, ist das ein beobachtbarer Beleg, dass der angegriffene Server nach außen gelangt ist.

9.3. Praktischer Hinweis — mit Genehmigung und kleinster Nebenwirkung feststellen

Führen Sie gleichartige Prüfungen in der Praxis nur unter folgenden Bedingungen durch.

  • Ausdrückliche Genehmigung der Eigentümerin oder des Eigentümers des Zielsystems
  • Eine Prüfmethode ohne oder mit hinnehmbarer Auswirkung auf den Produktivbetrieb
  • Keine zerstörerischen Befehle wie Schreiben, Löschen oder Konfigurationsänderung
  • Prüfdomäne und -server selbst verwalten
  • Prüfzeit, Quelle, Ziel und erwarteten Callback aufzeichnen
  • Temporäre LDAP- und HTTP-Server sowie Zugangsdaten nach der Prüfung entfernen

Feststellen, dass beliebige Codeausführung möglich ist, und beliebigen gefährlichen Code ausführen ist nicht dasselbe. Beschränken Sie sich auf die kleinste Nebenwirkung, die den Zweck erfüllt.

Prüfung auf die kleinste Nebenwirkung beschränkenMit Genehmigung harmlose Bestätigung und Beobachtungsbedingungen festlegen und nach der Ausführung Prüfumgebung und Zugangsdaten entfernen.Ausdrückliche Genehmigung der Eigentümerin oder des EigentümersAuswirkung und Beobachtungsbedingungen festlegenZugriff auf einem verwalteten Server aufzeichnenMit erwarteter Zeit und Quelle abgleichenPrüfumgebung und Zugangsdaten entfernenNicht schreiben, löschen oder Einstellungen ändern

Abbildung 16: Zuerst die zu beobachtende Tatsache festlegen und harmlose Bestätigung sowie Aufräumen in das Prüfverfahren aufnehmen.

10. Teilaufgaben 3(2) bis (4) — Prüfziel, Muster und Verhalten der WAF festlegen

10.1. Teilaufgabe 3(2) — beide Prüfziele sind Header

Die WAF von Dienst N kann als Prüfziel GET, POST, PUT, ANY, Header, COOKIE und Multipart wählen.

Der Angriffscode sitzt im Wert des HTTP-Headers x-api-version. Deshalb sind Lücke e und f in Tabelle 6 beide Header.2

Der Beleg ist der Ort, an dem die Angriffszeichenfolge sitzt

Das ist weniger Allgemeinwissen als das Lesen des Datenflusses im Aufgabentext.

Ort der Angriffszeichenfolge:
  Header x-api-version
          |
          v
Prüfziel der WAF:
  Header

ANY in dieser Aufgabe prüft Parameterwerte aller Methoden und ist von Header, das Header prüft, getrennt.1

Es ist weder ein GET-Parameter noch ein POST-Rumpf. Wählen Sie nicht Angriff, also ANY aus der Funktionsliste, sondern den Ort, an dem der Angreifer im Aufgabentext den Wert eingesetzt hat.

Prüfziel der WAF wählenNicht vom Angriffsnamen, sondern vom im Aufgabentext genannten Speicherort der Angriffszeichenfolge das Prüfziel der WAF festlegen.Speicherort der Angriffszeichenfolge lesenHeader x-api-versionPrüfziel ist HeaderWeiter zum Muster einschließlich Groß- und KleinschreibungANY sind Parameter aller Methoden

Abbildung 17: Nicht vom Angriffsnamen raten, sondern den Speicherort Header dem Prüfziel zuordnen.

10.2. Teilaufgabe 3(3) — für jedes Zeichen Groß- und Kleinschreibung zulassen

Der erste Entwurf war begrifflich die folgende Regel.

Header  \Wjndi\W  sperren
Header  \Wldap\W  sperren

Durch Vertauschen von Groß- und Kleinschreibung wie jNdI lässt sich ein nur kleingeschriebenes Muster umgehen.

Die Musterlösung zu Teilaufgabe 3(3) ist eine der folgenden.2

\W[jJ][nN][dD][iI]\W
\W(j|J)(n|N)(d|D)(i|I)\W

Im Aufgabenheft kann der Backslash in japanischer Umgebung wie das Yen-Zeichen aussehen; als regulärer Ausdruck ist es \W. \W trifft Zeichen außer Buchstaben, Ziffern und Unterstrich. In der Syntax von JNDI Lookup stehen vor und hinter jndi Nicht-Wort-Zeichen wie ${ und :, deshalb werden sie einbezogen.

Dasselbe gilt für ldap.

\W[lL][dD][aA][pP]\W

10.3. Teilaufgabe 3(4) — Erkennung dient dazu, Fehlersperrung zu vermeiden

Zur geänderten WAF-Regel rät RISS-Fachkraft Z, das Verhalten für eine gewisse Zeit nach Produktivstart nicht auf Sperrung, sondern auf Erkennung zu setzen.

Die Teilaufgabe fragt in jeweils höchstens 25 Zeichen nach dem Vorteil der Erkennung und nach dem, was zur Minimierung des Schadens durchzuführen ist.

Die Musterlösung lautet:2

Punkt Kern der Antwort
Vorteil Sperrung durch Fehlalarme lässt sich vermeiden
Durchzuführen Bei Eingang eines Alarms prüfen, ob es ein Angriff ist

Der Beleg — Erkennung gehört mit dem Prüfen der Alarme zusammen

Im Erkennungsmodus wird übereinstimmender Verkehr durchgelassen, ins Protokoll geschrieben und alarmiert. Steht in einem normalen API-Aufruf zufällig jndi oder ldap, wird der Betrieb nicht sofort gestoppt.

Dafür braucht der Betrieb Folgendes.

Alarm empfangen
   |
   v
Betroffene Anfrage prüfen
   |
   +-- Normalverkehr -> Regel verengen, Ausnahmebedingungen erwägen
   |
   +-- Angriff     -> Ziel isolieren, Protokoll sichern, Auswirkung untersuchen, zur Sperrung

Sieht niemand die Alarme, hat der Erkennungsmodus keine Schutzwirkung. Erkennung ist ein Satz mit einem Betrieb, der beobachtet und entscheidet.

10.4. Praktischer Hinweis — beobachten, anpassen, dann zur Sperrung wechseln

Ein übliches Einführungsverfahren ist:

  1. Im Erkennungsmodus auf den echten Verkehr anwenden
  2. Fehlalarme und richtige Erkennungen trennen
  3. Zielheader, Pfad, API, Zeichengrenzen anpassen
  4. Bestätigen, dass die Auswirkung auf normalen Verkehr hinnehmbar ist
  5. In den Sperrmodus wechseln
  6. Sperrzahl und betriebliche Auswirkung überwachen

Das ist der Grundsatz in ruhigen Zeiten. Ist die Schwachstelle schwerwiegend, wird sie bereits ausgenutzt und gibt es keine Alternative, kann der Schaden durch Kompromittierung größer sein als der Stopp durch Fehlalarme, und Sie sperren von Anfang an. In der Prüfungssituation wird zuerst Erkennung gewählt, um zu prüfen, ob der Dienst weiter wie bisher nutzbar ist.

Von der WAF-Erkennung zur SperrungAlarme während der Erkennung prüfen, Fehlalarme anpassen und Angriffe behandeln, danach auch nach der Sperrung überwachen.FehlalarmAngriffVerkehr im Erkennungsmodus beobachtenInhalt des AlarmsRegel oder Ausnahmebedingungen anpassenIsolieren, Protokoll sichern, Auswirkung untersuchenZur Sperrung wechselnAuswirkung auf normalen Verkehr bestätigenSperrzahl und betriebliche Auswirkung überwachen

Abbildung 18: Von der Erkennung zur Sperrung. Zuerst beobachten und anpassen, die Auswirkung als hinnehmbar bestätigen und dann sperren.

11. Schwachstellenbehandlung in der Praxis — mit der WAF Zeit gewinnen, während Aktualisierung und Untersuchung laufen

Im Aufgabentext gab es auf der offiziellen Seite von Bibliothek H noch keine korrigierte Fassung und keine vorläufige Maßnahme, und eine umfassende WAF-Regel des Cloud-Anbieters sollte bis zu 72 Stunden dauern. Deshalb stellt Unternehmen G die Auswirkung selbst fest und wehrt vorläufig wenigstens die bekannten Muster ab.

Was die Prüfung fragt, sind vorläufige WAF-Regeln und ihr Betrieb; die WAF behebt die Schwachstelle selbst nicht. Feststellung der Auswirkung, vorläufige Milderung und grundlegende Korrektur lassen sich dort, wo sie nicht aufeinander warten müssen, parallel vorantreiben. Der Gesamtablauf einschließlich praktischer Ergänzungen ist:

Stufe Zweck Entsprechung in Aufgabe und Praxis
Feststellung der Auswirkung Entscheiden, ob das eigene Unternehmen wirklich gefährdet ist Mit harmlosem Callback prüfen, ob externe Ausnutzung möglich ist
Vorläufige Milderung Zeit bis zur Korrektur gewinnen WAF-Regel, Erkennung und Sperrung, Beschränkung ausgehender Kommunikation
Grundlegende Korrektur Die verletzliche Ursache entfernen Auf die korrigierte Bibliotheksfassung aktualisieren
Nachträgliche Prüfung Untersuchen, ob bereits ausgenutzt wurde Untersuchung der Protokolle von WAF, App, DNS, Proxy und Ähnlichem
Wiederholungsvermeidung Die nächste Entscheidung beschleunigen Bestandsaufnahme der Abhängigkeiten, SBOM, Aktualisierungsverfahren, Kontaktwege

11.1. Die vorläufige Regel nicht für eine vollständige Log4Shell-Abwehr halten

Die Prüfung verlangt den regulären Ausdruck, der der im Text gezeigten Umgehung entspricht. Bei tatsächlichen Angriffen gibt es Aufteilungen der Zeichenfolge, andere Lookups, Kodierung, andere Protokolle, die sich mit Signaturen allein schwer vollständig abdecken lassen.

Die praktische Einordnung ist daher:

  1. Jetzt bekannte Angriffsmuster vorläufig mit der WAF stoppen
  2. Prüfen, ob die betroffene Bibliothek wirklich enthalten ist
  3. Ausgehendes LDAP, RMI und unnötiges HTTP beschränken
  4. Auf die korrigierte Fassung aktualisieren
  5. Auch nach der Aktualisierung Protokolle prüfen und untersuchen, ob kompromittiert wurde

Die WAF ist die Schicht, die Zeit gewinnt, bis die korrigierte Fassung da ist.

Einordnung der WAFErkennung beobachtet bei durchgelassenem Verkehr; Sperrung und Beschränkung ausgehender Kommunikation mildern, während die Ursache durch Aktualisierung entfernt wird.Veröffentlichung einer schwerwiegenden SchwachstelleFeststellung der Auswirkung und vorläufige ReaktionProtokoll und Alarme durch Erkennung gewinnenSperrung und Beschränkung ausgehender KommunikationAuf Beobachtung gestützt anpassen und behandelnAuf korrigierte Bibliotheksfassung aktualisierenNachträglich prüfen, ob kompromittiert wurde

Abbildung 19: Einordnung der WAF. Die WAF gewinnt Zeit bis zur korrigierten Fassung; die grundlegende Maßnahme ist die Aktualisierung.

11.2. Vorbereitung in ruhigen Zeiten — verwendete Bibliotheken und Einsatzorte kennen

Im Aufgabentext heißt es, selbst wenn Unternehmen G bei F nachfragt, ob Bibliothek H verwendet wird, sei eine ausführliche Konfigurationsanalyse nötig und die Antwort dauere.

In der Praxis verzögert sich die Reaktion, wenn nach Veröffentlichung einer schwerwiegenden Schwachstelle erst mit der Suche nach JAR-Dateien begonnen wird. Mindestens Folgendes sollte in ruhigen Zeiten vorliegen.

  • Liste direkter und transitiver Abhängigkeiten
  • Tatsächlich in den Lieferungen enthaltene Komponenten und Versionen
  • Auf welche Dienste, Container, Geräte sie verteilt sind
  • Verfahren, abhängige Bibliotheken zu aktualisieren, neu zu bauen und neu zu verteilen
  • Kontaktweg zur Genehmigung dringender Änderungen
  • Erlaubte Ziele ausgehender Kommunikation und die Auswirkung, sie zu stoppen
  • Speicherort der Protokolle und Suchverfahren

SBOM ist kein Selbstzweck. Sie ist ein Index, um in kurzer Zeit zu beantworten, welche laufenden Systeme diese Schwachstelle betrifft.

Abhängigkeiten mit laufenden Systemen verknüpfenAbhängige Komponenten und Verteilungsziele in ruhigen Zeiten zuordnen, damit Untersuchung und Aktualisierungsentscheidung nach Veröffentlichung einer Schwachstelle schneller sind.Liste direkter und transitiver AbhängigkeitenTatsächliche Version in der LieferungLaufende Dienste und EinsatzorteBetroffene in kurzer Zeit entscheidenGenehmigen, neu bauen, neu verteilenAuch Kommunikationsziele und Protokollorte kennen

Abbildung 20: SBOM zu sammeln ist nicht der Zweck; sie ist ein Index, um Betroffene und Aktualisierungsweg schnell zu entscheiden.

11.3. Nachträgliche Prüfung — die Untersuchung nicht beenden, nur weil aktualisiert wurde

Es ist möglich, dass vor oder nach der Veröffentlichung der Schwachstelle bereits angegriffen wurde. Eine Aktualisierung auf die korrigierte Fassung stoppt künftige Ausnutzung, löscht aber kompromittierte Zugangsdaten oder hinterlegte Hintertüren nicht.

Bei einem Typ Log4Shell untersuchen Sie mindestens:

  • HTTP-Anfragen mit verdächtigen Zeichenfolgen, die auf JNDI oder LDAP deuten
  • Kommunikation vom Anwendungsserver zu externem LDAP, RMI, HTTP
  • Start ungewöhnlicher Kindprozesse
  • Erstellung verdächtiger JAR-, class-, Skript- oder ausführbarer Dateien
  • Zugriff auf Cloud-Zugangsdaten oder Umgebungsvariablen
  • Authentifizierung, Rechteänderungen und externe Sendungen vor und nach der Aktualisierung

Wichtig ist, nicht allein aus WAF-Protokollen zu schließen, dass nicht angegriffen wurde. Es gibt interne Pfade an der WAF vorbei und Protokolle, die aus der Vergangenheit nicht erhalten sind.

Aktualisierung und Kompromittierungsuntersuchung trennenKünftige Ausnutzung durch Aktualisierung auf die korrigierte Fassung zu stoppen und zu untersuchen, ob bereits kompromittiert wurde, sind getrennt nötig.Auf die korrigierte Fassung aktualisierenKünftige Ausnutzung stoppenAufzeichnungen vor und nach der Aktualisierung untersuchenKommunikation, Prozesse, Dateien abgleichenZugangsdaten und externe Sendungen prüfenVergangene Kompromittierung verschwindet nicht

Abbildung 21: Korrektur der Ursache und Untersuchung bereits eingetretener Kompromittierung getrennt vorantreiben.

12. Antworten schreiben — die Differenz zur Spezifikation in den Begriffen des Aufgabentexts nennen

Diese Aufgabe ist weniger eine Wissensfrage als eine Frage, die Differenz von Spezifikation und Implementierung zu lesen.

12.1 Spezifikation und Implementierung in den Tabellen trennen

Beim status-Problem geht in der Implementierung ein Wert durch, der in der API-Spezifikation nicht steht.

Spezifikation:
  mid / name / age

Implementierung:
  alle empfangenen Parameter an P senden

Ist diese Differenz sichtbar, ist Lücke c das gemeinsame Modul P.

12.2 Unter den vom Angreifer geänderten Wert eine Linie ziehen

Die in den Angriffen geänderten Werte sind:

  • alg im JWT-Header
  • Benutzer-ID in der JWT-Payload
  • mid im API-Parameter
  • Spezifikationsfremdes status
  • otp der Authentifizierungs-API
  • HTTP-Header x-api-version

Die Teilaufgaben fragen fast alle, wo dieser Wert geprüft werden sollte.

12.3 Die Antwort auf die Begriffe des Aufgabentexts zurückführen

In der Praxis können Sie BOLA, Mass Assignment, Rate Limiting sagen. Was die Teilaufgabe verlangt, ist jedoch eine konkrete Verarbeitung, die zum Aufbau des Aufgabentexts passt.

Schlechtes Beispiel:

Die Autorisierung angemessen durchführen.

Gutes Beispiel:

Prüfen, ob die im JWT enthaltene Benutzer-ID mit dem Wert von mid übereinstimmt.

Schlechtes Beispiel:

Brute-Force-Maßnahmen ergreifen.

Gutes Beispiel:

Das Konto sperren, sobald aufeinanderfolgende Fehlversuche den Schwellenwert überschreiten.

Den abstrakten Namen zu kennen reicht nicht für eine in der Zeichenzahl bewertbare Antwort.

12.4 Bei der WAF verfolgen, wo es hineingelangt ist

Das Prüfziel der WAF raten Sie nicht aus der Angriffsart, sondern legen es vom Speicherort der Angriffszeichenfolge fest.

in den Header x-api-version gesetzt
        ↓
Prüfziel ist Header

Im Auswertungskommentar gilt die Gesamtrichtigkeit als durchschnittlich, Teilaufgabe 2(2) und 3(1) als etwas niedriger.3 Die etwas niedrigere Richtigkeit von 3(1) kam daher, dass viele Antworten nicht zum Angriffsablauf in Abbildung 6 passten. Schon die Angriffsfolge in Pfeile umzuschreiben zeigt, was zu beobachten ist.

Vom Aufgabentext zur Antwort zurückDifferenz von Spezifikation und Implementierung, geänderte Werte und vertraute Verarbeitung verfolgen und die konkrete Verarbeitung in den Begriffen des Aufgabentexts schreiben.Spezifikation und Implementierung nebeneinanderlegenGeänderten Wert bestimmenVerfolgen, wo vertraut wurdeHinzu zufügende Verarbeitung festlegenAuf Begriffe und Zeichenzahl des Aufgabentexts zurückführen

Abbildung 22: Nicht Begriffe auswendig lernen, sondern den Wertefluss verfolgen und als konkrete Verarbeitung antworten.

13. Checkliste für API-Reviews in der Praxis

Eine Checkliste, um diese Aufgabe in tatsächlichen Entwurf und Code-Review mitzunehmen.

JWT-Prüfung

  • Der erlaubte Signaturalgorithmus ist in der Serverkonfiguration festgelegt
  • none und unerwartete Algorithmen werden abgelehnt
  • Signatur, iss, aud, exp, nbf werden je nach Verwendung geprüft
  • ID-Token, Access-Token und Refresh-Token werden nicht verwechselt
  • Es gibt ein Verfahren für Schlüsselrotation und Widerruf
  • In der JWT-Payload stehen keine geheim zu haltenden Informationen

Autorisierung auf Objektebene

  • Eine Änderung der ID in der Anfrage erreicht keine fremden Daten
  • Autorisiert wird bei Liste, Detail, Aktualisierung, Löschen und Download
  • Die Autorisierung erfolgt nicht in der Oberfläche, sondern in der gemeinsamen Schicht, die Daten erreicht
  • Bei einer nur für die eigene Person bestimmten API wurde erwogen, die Ziel-ID aus dem Token abzuleiten
  • Administrationsoperationen sind von der API für gewöhnliche Nutzerinnen und Nutzer und von deren Richtlinie getrennt

Autorisierung auf Eigenschaftsebene

  • Externer Eingabetyp und Datenbankentität sind getrennt
  • Aktualisierbare Felder sind auf einer Positivliste aufgezählt
  • Spezifikationsfremde Eigenschaften werden abgelehnt oder geprüft
  • Zustände wie Rechte, Abrechnung, Freigabe, Eigentum lassen sich nicht aus Nutzereingabe ändern
  • Die Antwort enthält keine unnötigen vertraulichen Eigenschaften

Authentifizierungsversuche

  • Es gibt eine Begrenzung der Fehlversuche je Konto
  • Es gibt gestaffelte Verzögerung oder Steuerung nach Quelle
  • Die Fehlerzahl wird bei Neuausstellung des Codes nicht zurückgesetzt
  • Der Authentifizierungscode ist nur einmal verwendbar
  • Authentifizierungscode und Passwort stehen nicht im Protokoll
  • Aufhebung der Sperre und Wiederherstellung sind kein zweiter schwacher Authentifizierungspfad

Schwerwiegende Schwachstellen abhängiger Bibliotheken

  • Laufende Dienste und Abhängigkeitsversionen lassen sich zuordnen
  • Es gibt ein Verfahren, die Auswirkung auf harmlose Weise zu prüfen
  • Vorläufige Maßnahmen wie WAF oder Beschränkung ausgehender Kommunikation lassen sich anwenden
  • Es gibt einen Betrieb, in dem Zuständige Erkennungsalarme prüfen
  • Es gibt einen Notfall-Release-Pfad zur Aktualisierung auf die korrigierte Fassung
  • Die Möglichkeit früherer Ausnutzung wird vor der Aktualisierung in den Protokollen untersucht
Der Review versucht als Nächstes nach dem NormalfallNicht nur den Erfolg der normalen Anfrage, sondern Änderung von ID und Feldern sowie wiederholte Versuche getrennt bestätigen und die Maßnahme der gemeinsamen Schicht prüfen.Erfolg der normalen Anfrage bestätigenNur die Ziel-ID ändern und prüfenUnbekanntes Aktualisierungsfeld hinzufügen und prüfenAuthentifizierungsfehler und Neuausstellung wiederholenAblehnung, Aufzeichnung, Wiederherstellung prüfenJeweils als eigene Prüfung behandeln

Abbildung 23: Vom Erfolg des Normalfalls ausgehend prüfen, ob die getrennten Grenzen wirklich ablehnen.

14. Zusammenfassung — die nächste Vertrauensgrenze nicht auslassen

Nachmittagsaufgabe 1 im Frühjahr des Reiwa-6-Jahres ist eine Aufgabe, die Punkte der API-Sicherheit einzeln getrennt zu lesen.

Ein JWT zu verwenden bedeutet keine sichere Authentifizierung. Darf der Angreifer den Signaturalgorithmus wählen, lässt sich die Benutzer-ID umschreiben.

Eine korrekte JWT-Signatur bedeutet keine korrekte Autorisierung. Wird der mid der Anfrage vertraut, erreicht eine rechtmäßige Person fremde Informationen.

Das eigene Objekt aktualisieren zu können bedeutet nicht, alle Eigenschaften ändern zu dürfen. Wird ein interner Zustand wie status automatisch gebunden, lassen sich Rechte oder Zahlstatus umschreiben.

Eine Gültigkeitsdauer des Authentifizierungscodes bedeutet keine Stärke gegen Brute-Force. Kandidatenraum und Versuchsgeschwindigkeit sind zu rechnen, die Fehlerzahl zu begrenzen.

Eine Regel in die WAF zu legen bedeutet nicht, die Schwachstelle behoben zu haben. Mit Erkennung und Sperrung wird Zeit gewonnen, die Auswirkung festgestellt, am Ende die Bibliothek aktualisiert.

Zuordnung von Schwachstellen und MaßnahmenFür Token und Authentifizierungsversuche, Ziel und Aktualisierungsfelder sowie Ausführung aus externer Eingabe jeweils Maßnahmen vorsehen.Zu vertrauende Grenzen trennenToken und AuthentifizierungsversucheZieldaten und AktualisierungsfelderAusführung aus externer EingabeErlaubten alg festlegen, Versuche begrenzenSubjekt abgleichen, Update-DTO beschränkenVorläufig mildern und Bibliothek aktualisieren

Abbildung 24: Zuordnung von Schwachstellen und Maßnahmen. Die Maßnahmen an den gebrochenen Grenzen trennen.

Das Prinzip, das diese Aufgabe durchzieht, ist eines.

Den Erfolg der vorherigen Prüfung nicht als Grund nehmen, die nächste Vertrauensgrenze auszulassen.

In den vorangehenden Artikeln der Reihe sind gespeicherte XSS in Nachmittagsaufgabe 1 Herbst Reiwa 5 und Informationsabfluss über Gäste-WLAN in Nachmittagsaufgabe 2 Herbst Reiwa 5 erklärt. Für Prüfpunkte einer gesamten Website siehe auch IPA Sichere Website-Erstellung als Checkliste nutzen.

Abschließende ZusammenfassungDen Erfolg der vorherigen Prüfung nicht als Grund nehmen, die nächste Prüfung oder betriebliche Maßnahme auszulassen.Gesondert prüfenWeil gelungen, auslassenVorherige Prüfung gelungenErfüllt auch die nächste Prüfung?Urteile Grenze für Grenze aufbauenUngeprüfte Grenze bleibtIn alltäglichen Entwurf und Prüfung übernehmen

Abbildung 25: Abschließende Zusammenfassung. Vertrauensgrenzen stufenweise prüfen und keine auslassen.

  1. IPA, Aufgabenheft Nachmittag, Prüfung zum Registered Information Security Specialist, Frühjahr Reiwa 6. Der Aufgabentext, den dieser Artikel behandelt. ↩ ↩2 ↩3 ↩4

  2. IPA, Musterlösungen Nachmittag, Prüfung zum Registered Information Security Specialist, Frühjahr Reiwa 6. Offizielle Musterlösungen zu den Teilaufgaben. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12

  3. IPA, Auswertungskommentar Nachmittag, Prüfung zum Registered Information Security Specialist, Frühjahr Reiwa 6. Erläuterung von Richtigkeit und Fehlantworttendenzen. ↩ ↩2 ↩3

  4. NIST, SP 800-63B: Authentication and Authenticator Management. Zeigt Stellenzahl kurzlebiger Geheimnisse, Begrenzung der Versuchszahl, Fehlerzahl bei Neuausstellung und den Verzicht auf E-Mail als Out-of-Band-Authentifizierung. ↩ ↩2

  5. RFC Editor, RFC 7519: JSON Web Token (JWT). JWT-Spezifikation einschließlich Unsecured JWT und alg=none. ↩

  6. RFC Editor, RFC 8725: JSON Web Token Best Current Practices. BCP zu festgelegten erlaubten Algorithmen und zur Prüfung von Aussteller, Subjekt und Audience. ↩

  7. OWASP, API1:2023 Broken Object Level Authorization. Erläutert, warum die Autorisierung für jede vom Nutzer angegebene Objekt-ID zu prüfen ist. ↩

  8. OWASP, API3:2023 Broken Object Property Level Authorization. Erläutert Lücken der Autorisierung auf Eigenschaftsebene einschließlich Mass Assignment und Gegenmaßnahmen. ↩

  9. Apache Logging Services, Security. Erläutert Auswirkung von CVE-2021-44228, Codeausführung über JNDI und LDAP sowie die korrigierte Fassung. ↩

Aktuelle Artikel mit denselben Schlagwörtern führen zu verwandten Themen weiter.

Diese Seiten ordnen den Artikel in einen größeren Leistungs- und Entscheidungskontext ein.

Dieser Artikel ist direkt mit den folgenden Leistungen verbunden.

Website-Entwicklung

Bei Mitglieder-APIs und der Anbindung von Smartphone-Apps wirken sich JWT-Prüfung, Autorisierung auf Objektebene und die Beschränkung aktualisierbarer Eigenschaften unmittelbar auf die Sicherheit des Websystems aus.

Häufige Fragen

Fragen, die in Beratungen zu diesem Artikelthema häufig gestellt werden.

Warum lässt sich jemand anderes vortäuschen, obwohl die JWT-Signaturprüfung erfolgreich war?
In dieser Aufgabe akzeptierte die JWT-Verwaltungsbibliothek das alg im JWT-Header genau so, wie der Angreifer es vorgab, und behandelte ein JWT mit alg=none als gültig – ohne Signatur. Deshalb gelingt die Prüfung auch dann, wenn die Benutzer-ID in der Payload umgeschrieben wird. Die Prüfungsantwort lautet, als zu prüfenden Wert das alg im JWT-Header heranzuziehen und zu bestätigen, dass sein Wert nicht NONE ist. In der Praxis reicht es allerdings nicht, nur NONE abzulehnen. Legen Sie in der serverseitigen Konfiguration die erlaubten Algorithmen fest, etwa auf RS256, und verwenden Sie den vom Token selbst angegebenen Algorithmus nie unmittelbar für die Auswahl. Prüfen Sie außerdem je nach Verwendungszweck issuer, audience, Gültigkeitsdauer und subject.
Reicht es als Autorisierungsmaßnahme, die Benutzer-ID im JWT mit der mid der Anfrage zu vergleichen?
Für die Zwecke dieser Prüfungsantwort ist das ausreichend. Prüft das gemeinsame Modul P, ob die im JWT enthaltene Benutzer-ID mit mid übereinstimmt, lässt sich ein Angriff stoppen, der eine fremde mid angibt. Bei einer API, die aber nur die eigenen Informationen des Aufrufenden behandelt, ist es in der Praxis sicherer, mid gar nicht erst vom Client entgegenzunehmen und die Benutzer-ID stattdessen aus dem subject des geprüften JWT zu bestimmen. Mit Endpunkten wie GET /users/me oder PUT /users/me lässt sich vermeiden, dass die Vergleichsprüfung überhaupt vergessen werden kann. Eine API, über die ein Administrator andere Nutzer bearbeitet, gehört auf einen eigenen Endpunkt mit eigener Autorisierungsrichtlinie.
Warum lässt sich der Angriff, der status hinzufügt, nicht allein durch gewöhnliche Eingabevalidierung verhindern?
Weil es nichts nützt, die Länge von name oder den Wertebereich von age zu prüfen, wenn status – ein Feld, das gar nicht erst angenommen werden sollte – ohnehin automatisch gebunden und an das interne Objekt weitergereicht wird. Das Problem ist nicht das Format eines Werts, sondern die Autorisierung auf Eigenschaftsebene: ob der Nutzer diese Eigenschaft überhaupt ändern darf. Definieren Sie im Eingabetyp für Aktualisierungen ausschließlich name und age, und lehnen Sie unbekannte Eigenschaften ab. Der Zahlungsstatus darf nur durch serverseitig vertrauenswürdige Ereignisse geändert werden, etwa das Erfolgsergebnis des Zahlungsdiensts.
Der vierstellige Authentifizierungscode verfällt nach 10 Minuten – warum ist das trotzdem gefährlich?
Weil es von 0000 bis 9999 nur 10.000 mögliche Werte gibt und bei 10 Versuchen pro Sekunde im Durchschnitt nach 5.000 Versuchen, also 500 Sekunden, der Treffer gelingt. Die Gültigkeitsdauer von 10 Minuten entspricht 600 Sekunden – probiert man sich also der Reihe nach ohne Wiederholung durch, lassen sich innerhalb der Gültigkeitsdauer 6.000 Kombinationen prüfen. Die Ablaufzeit allein stoppt ein Brute-Force nicht. Kandidatenzahl, Versuchsgeschwindigkeit und Obergrenze der Versuche müssen gemeinsam entworfen werden.
Die Prüfungsantwort ist eine Kontosperre – reicht in der Praxis auch eine sofortige Sperre allein?
Nein. In die Lücke der Aufgabe gehört zwar eine Verarbeitung, die das Konto sperrt, sobald die Anzahl aufeinanderfolgender Fehlversuche einen Schwellenwert überschreitet, doch eine feste, dauerhafte Sperre allein erlaubt einem Angreifer, absichtlich das Konto einer anderen Person zu sperren und so einen Denial-of-Service auszulösen. In der Praxis kombiniert man eine kontobezogene Fehlerzahl, gestaffelte Wartezeiten, eine Risikobewertung nach Quelle oder Gerät, Benachrichtigungen und ein Wiederherstellungsverfahren. Wichtig ist auch, dass die Fehlerzahl beim Ausstellen eines neuen Codes nicht auf null zurückgesetzt wird.
Was bringt es, die WAF auf Erkennung statt auf Sperrung zu stellen?
Dass geschäftlicher Datenverkehr auch dann nicht gestoppt wird, wenn eine normale Zeichenfolge fälschlich als Angriff eingestuft wird. Die Musterlösung nennt als Vorteil, dass sich eine Sperrung durch Fehlalarme vermeiden lässt, und als durchzuführende Maßnahme, bei Eingang eines Alarms zu prüfen, ob es sich um einen Angriff handelt. Der Erkennungsmodus ist keine Einstellung zum Sich-selbst-Überlassen. Er dient als Beobachtungszeitraum, in dem Sie Protokolle prüfen, Fehlalarme aussortieren, die Regel anpassen und dann zur Sperrung übergehen. In einem Notfall, in dem eine bekannte, kritische Schwachstelle bereits aktiv ausgenutzt wird, kann es angemessen sein, das Verfügbarkeitsrisiko gegen den Schaden abzuwägen und von Anfang an zu sperren.
Ist die Bibliothek H in dieser Aufgabe Log4j?
Der Aufgabentext verschweigt zwar den Produktnamen, doch der Ablauf des Angriffs – JNDI Lookup, ein LDAP-Server, das Nachladen einer Klasse von einem HTTP-Server, eine in einen HTTP-Header eingebettete Zeichenfolge und ein hoher CVSS-v3.1-Basiswert – lässt sich naheliegend als Abstraktion von CVE-2021-44228 lesen, bekannt als Log4Shell. Dieser Artikel erklärt diese Entsprechung, doch in der Prüfung muss der konkrete Produktname nicht genannt werden. Sie lässt sich allein aus dem vorgegebenen Angriffsablauf und der WAF-Spezifikation beantworten.
Was sollte man aus dieser Aufgabe für die eigene Praxis mitnehmen?
Dass eine erfolgreiche Authentifizierung, ein unverändertes JWT, der erlaubte Zugriff auf das Zielobjekt und die erlaubte Änderung der Zieleigenschaft allesamt getrennte Prüfungen sind. Hinzu kommt, dass ein kurzer Authentifizierungscode eine Begrenzung der Versuchszahl braucht und dass bei einer schwerwiegenden Bibliotheksschwachstelle Wirkungsprüfung, vorläufige Verteidigung und grundlegende Korrektur parallel vorangetrieben werden. Im Kern der Praxis stehen: Autorisierung in gemeinsamen Bausteinen bündeln, das Eingabeschema als Positivliste gestalten, die Prüfbedingungen des JWT serverseitig festlegen und abhängige Bibliotheken im Blick behalten, damit sie aktualisiert werden können.

Autorenprofil

Profilseite des Artikelautors.

Go Komura

Geschäftsführer von KomuraSoft LLC

Spezialisiert auf Windows-Softwareentwicklung, technische Beratung und Fehleranalyse, insbesondere bei bestehenden Systemen und schwer reproduzierbaren Störungen.

Zurück zum Blog