Was ist eine Rennbedingung?
Da Entwickler häufig vergessen, dass Code von mehreren Threads gleichzeitig ausgeführt werden kann, testen sie das Produkt nicht auf eine Race-Bedingung, obwohl dieser Fehler häufig auftritt.
Aus Sicht des Backends sieht es so aus: Mehrere Threads greifen gleichzeitig auf dieselbe gemeinsam genutzte Ressource zu: Variablen oder Dateien, für die keine Blockierung oder Synchronisierung erfolgt. Dies führt zu einer inkonsistenten Datenausgabe.
Hier ist ein konkretes Beispiel für eine solche Sicherheitsanfälligkeit. Angenommen, wir haben eine Anwendung, mit der Sie Boni zwischen Zahlungsmappen übertragen können. Der Angreifer hat zwei Geldbörsen - A und B, und jede von ihnen hat 1000 Boni. Das Diagramm zeigt, wie ein Angreifer durch Manipulieren des Zeitpunkts des Sendens einer Anfrage für eine Transaktion den Überweisungsbetrag auf sein Konto erhöhen und 10 von 20 Boni erzielen kann.
Es gibt automatische Tools, um nach solchen Schwachstellen zu suchen. Zum Beispiel RacePWN, das in kürzester Zeit viele HTTP-Anforderungen an den Server sendet und die JSON-Konfiguration als Eingabe akzeptiert, was den Angriffsprozess für Cyberkriminelle erleichtert. Dies erfolgt manuell durch Senden von POST-Anfragen.
Sterblicher Rassenzustand
In den Vereinigten Staaten verursachte von Juni 1985 bis Januar 1987 ein Rennbedingungsfehler in einem Therac-25-Strahlentherapiegerät, das von der kanadischen staatlichen Organisation Atomic Energy of Canada Limited (AECL) entwickelt wurde , sechs Strahlenüberdosierungen . Die Opfer erhielten Dosen von Zehntausenden von Freuden. Die Stufe 1000 gilt als tödlich. Nach den daraus resultierenden Verbrennungen starben die Opfer innerhalb weniger Wochen. Nur ein Patient konnte überleben.
Frühere Therac-Modelle verfügten über Hardwareschutzmechanismen: unabhängige Sperrschaltungen, die den Elektronenstrahl steuern; mechanische Blocker; Hardware-Leistungsschalter; Sicherungen trennen. Der Hardwareschutz wurde in Therac-25 entfernt. Die Software war für die Sicherheit verantwortlich. Das Gerät hatte mehrere Betriebsarten, und aufgrund eines Rennbedingungsfehlers verstand der Arzt manchmal nicht, in welchem Modus das Gerät tatsächlich funktioniert. Während des Gerichtsverfahrens stellte sich heraus, dass die Therac-25-Software von einem Programmierer entwickelt wurde, AECL jedoch keine genauen Informationen darüber hatte, wer.
Infolge des Prozesses hat die US-Regierung die Anforderungen für das Design und den Betrieb von Systemen, deren Sicherheit für Menschen von entscheidender Bedeutung ist, ernsthaft verschärft.
Wie Sie sich schützen können
Der einfachste und kostengünstigste Weg, um das Problem der Rennbedingungen zu lösen, besteht darin, die Anwendungsarchitektur korrekt zu entwerfen. Hier ist, was dafür vorgesehen sein sollte.
- Sperren kritischer Datensätze in der Datenbank. Es gibt verschiedene Möglichkeiten, um sicherzustellen, dass Sie einen Stream zu einem bestimmten Zeitpunkt aufzeichnen. Die Hauptsache ist, nichts Unnötiges zu blockieren.
- Isolierung von Transaktionen in der Datenbank , wodurch sichergestellt wird, dass Transaktionen nacheinander festgeschrieben werden. Das Wichtigste dabei ist, ein Gleichgewicht zwischen Sicherheit und Geschwindigkeit zu finden.
- . . , , , . , , , .
Unser Kunde ist ein Online-Lebensmittellieferant, der die Funktion der Bereitstellung von Rabatten mit Gutscheinen unterstützt. Beim Testen haben wir eine Sicherheitsanfälligkeit festgestellt - beim Senden einer POST-Anfrage mit einem Gutscheinwert. Durch das Senden einer Anfrage mit unterschiedlichen Zeitverzögerungen konnte zweimal ein Rabatt gewährt werden. Anscheinend haben die Entwickler einen groben Fehler im Zusammenhang mit dem gemeinsamen Zugriff auf das mit dem Kauf identifizierte Objekt gemacht.
Höchstwahrscheinlich gab es einen solchen Pseudocode ohne Synchronisationsmechanismen:
…
1 Wenn promo_flag nicht gesetzt ist:
2 Price = get_price ()
3 Price - = price * promo_percent;
4 set_price (Preis)
5 set_promo_flag ()
...
Hier ist das Anwenden eines Promo-Codes und das Setzen des entsprechenden Flags keine atomare Operation. Als die zweite Anwendung des Aktionscodes begann, wurde die erste höchstwahrscheinlich in der 5. Zeile gestoppt (dh sie wurde noch nicht ausgeführt). In diesem Moment hat die Funktion get_price () in der zweiten Zeile einen neuen Preiswert zurückgegeben, der bereits einen Rabatt enthält.
Entscheidung
Das Problem wird einfach gelöst:
…
1 acqure_mutex ()
2 Wenn promo_flag nicht gesetzt ist:
3 Price = get_price ()
4 Price - = price * promo_percent;
5 set_price (price)
6 set_promo_flag ()
7 release_mutex ()
...
Jetzt wird die Anwendung des Promo-Codes einmal vollständig und vollständig durchgeführt. Selbst wenn eine Situation auftritt, in der der zweite Thread versucht, den Promo-Code anzuwenden, während der erste Prozess bereits mit der Verarbeitung beschäftigt ist, kann er dies nicht tun. Der Mutex blockiert den Zugriff auf den "kritischen Abschnitt" und der zweite Prozess muss warten, bis der erste abgeschlossen ist.
Die Rennbedingungen sind nicht zu unterschätzen. Besser Zeit und Ressourcen aufwenden, um nach Schwachstellen zu suchen, um unvorhergesehene Folgen zu vermeiden, auch für das Budget des Unternehmens.
Blog ITGLOBAL.COM - Managed IT, Private Clouds, IaaS, Informationssicherheitsdienste für Unternehmen:
- Wie wir die Sicherheitslücke im Mailserver der Bank gefunden haben und wie sie bedroht ist
- Informationssicherheit im Jahr 2021. Bedrohungen, Branchentrends
- Beliebte Websites sind immer noch anfällig für massive DDoS-Angriffe
- Warum ethische Hacker zusammenarbeiten sollten, um in Unternehmen einzudringen. Interview mit dem Insektenjäger Alex Chapman
- Angst vor Arbeitsautomatisierung und anderen Trends in der globalen und russischen Cybersicherheit