„Wir konnten die Schwachstelle auf Netzwerken mit 18 Dezimalstellen nicht reproduzieren und schlossen fälschlich, dass sie nur Netze ohne 18 Dezimalstellen betrifft", schreibt Cosmos Labs in der Nachbetrachtung. Nach der Korrektur dieser Einschätzung entschied das Team dennoch gegen eine private Verteilung: „An diesem Punkt würde das Team bei einer Schwachstelle, die bekanntermaßen Nutzergelder in Produktionsnetzen bedroht, normalerweise sichere Kanäle nutzen, um einen Patch privat an die betroffenen Netzwerke zu verteilen. Da der Patch bereits öffentlich im Hauptzweig verfügbar war und keine Ausnutzung bekannt war, kam das Team zu dem Schluss, dass der Stillschweige-Patch-Prozess sicher sei."

Die eigene, am 27. Juli letztmals abgeglichene Bug-Bounty-Richtlinie sieht dafür einen anderen Weg vor: „Wenn ein Problem ein unmittelbares oder netzwerkweites Risiko darstellt, leitet Cosmos Labs Notfallmaßnahmen, private Fix-Verteilung oder koordinierte Upgrades ein, bevor eine öffentliche Offenlegung erfolgt."

Technisch liegt der Fehler in der Abstimmung des EVM-Zustands mit dem x/bank-Modul des Cosmos SDK. Die EVM StateDB kennt nur das verfügbare Guthaben eines Kontos, während Vesting-Konten im SDK-Zustand ein verfügbares und ein gesperrtes Guthaben führen – und sowohl x/staking als auch die Staking-Precompile erlauben die Delegation des gesperrten Anteils. Delegiert ein Vesting-Konto mehr als sein verfügbares Guthaben, wird beim Zurückschreiben der volle Betrag von der kleineren Zahl abgezogen. Die Subtraktion ist ungeprüft, der Kontostand läuft auf etwa 2^256 über.

Anzeige

Die anschließende Abstimmung prägt bei positiver Differenz neue Token und verbrennt bei negativer. Angreifer können so einen endlichen Betrag aus dem übergelaufenen Konto abziehen oder einem Opferkonto 2^256 minus dessen Guthaben senden, sodass die Abstimmung die realen Bestände verbrennt. Auf 0.6.x-Ketten führt eine große Prägung zu einem Überlauf der Gesamtmenge und hält die Kette an; 0.7.x-Ketten setzen Guthaben direkt in x/bank. Beide Hälften laufen in einer einzigen Transaktion mit Netto-Nulländerung, ausgeführt von einem Vertrag auf einer vorberechneten Adresse, die zuvor in ein Vesting-Konto verwandelt wurde. Voraussetzung ist, dass die Kette die Erstellung von Vesting-Konten ohne Berechtigung zulässt.

Das Advisory dokumentiert nur eine Upstream-Änderung: die SubBalance-Underflow-Absicherung, am 15. Mai als Pull Request #1176 in main aufgenommen und am 13. August zurückportiert. Zwei weitere Korrekturen bleiben unbenannt – Pull Request #1187 vom 20. Mai, dessen Backports binnen 24 Stunden zusammengeführt wurden, während der ebenso zustandsbrechende Backport von #1176 rund 90 Tage später folgte, sowie Commit 3524ebc, der Guthabenänderungen an Modulkonten unterbindet.

ZetaChain-Mitwirkender morde08 stellte am 21. August eine Portierung aller drei Fixes vor und wies darauf hin, dass der übernommene Patch den aktiven Pfad des Forks ungepatcht ließ, weil dort doppelte nicht exportierte Hilfsfunktionen existierten. Warden Protocol wählte einen anderen Weg und sperrte die Erstellung von Vesting-Konten vollständig. „Vesting-Konten sind auf Warden die einzige Quelle gesperrter Guthaben, und nichts hängt daran, dass Nutzer sie erstellen können; das Entfernen dieses Pfades schließt die Vorbedingung, statt sich auf die Korrektheit der Rekonstruktion zu verlassen", schrieb Warden-Mitwirkender jlehtimaki in einer Commit-Nachricht.

Ein öffentlicher Pull Request im Cosmos-EVM-Fork von Push Chain beschrieb die Lücke und den Ausnutzungspfad am 20. August um 07:16 UTC im Detail – acht Stunden und 15 Minuten nach Erscheinen der Releases. Der erste Angriff traf MANTRA elf Stunden und 50 Minuten später um 19:06 UTC. Ihre erste private Benachrichtigung per gesicherter E-Mail versandte Cosmos Labs am 21. August um 03:36 UTC, etwa zwei Stunden nachdem MANTRA den Vorfall gemeldet hatte. „Cosmos Labs hat in den letzten 13 Monaten Patches für 37 Schwachstellen stillschweigend veröffentlicht, ohne dass nachgelagerte Entwickler Exploit-Pfade öffentlich präzise beschrieben haben", heißt es in der Nachbetrachtung.

Die Release Notes von v0.6.2 und v0.7.2 verweisen beide auf wichtige Sicherheitskorrekturen, lassen den Sicherheits-Backport in ihren Changelogs jedoch aus; The Hacker News bestätigte am 29. August, dass keines der Releases die betreffenden Pull Requests nennt.

Angreifer verkauften nach Angaben von Cosmos Labs Vermögenswerte im Wert von rund 2,87 Millionen US-Dollar auf dezentralen Börsen (Preisbasis 19. August) – eine von den betroffenen Ketten gelieferte, nicht unabhängig geprüfte Zahl – sowie weitere 2,85 Millionen US-Dollar auf zentralen Börsen, geschätzt anhand öffentlicher Handelsvolumina. Das Cosmos-Ökosystem umfasst über 115 bekannte öffentliche Blockchains; ein vollständiges Verzeichnis der Netze, die seine Software einsetzen, besitzt das Unternehmen nach eigener Aussage nicht. The Hacker News hat Cosmos Labs um eine Stellungnahme gebeten, warum der Patch nach der Bestätigung der Betroffenheit aller Ketten nicht privat verteilt wurde.