Im Jahr 2017 erlitt die Parity-Multi-Sig-Wallet-Bibliothek — verwendet als zugrundeliegender Vertrag für viele der größten Treasuries von Ethereum — zwei unterschiedliche katastrophale Vorfälle im Abstand von vier Monaten. Die kombinierte Auswirkung: etwa 30 Mio. $ gestohlen und weitere 150 Mio. $+ dauerhaft eingefroren ohne On-Chain-Pfad zur Wiederherstellung.
Was geschah
19. Juli 2017 — Der Drain (~30 Mio. $)
Die Parity-Multi-Sig war ein dünner Proxy, der über delegatecall in einen geteilten Bibliotheksvertrag aufrief. Die Bibliothek stellte eine initWallet-Funktion bereit, die, wenn auf einer Wallet aufgerufen, die Besitzer der Wallet festlegte. Die Funktion war von jedem aufrufbar, auf jeder Wallet, sogar nachdem die Wallet initialisiert worden war.
Ein Angreifer ging durch Ethereum, rief initWallet auf Parity-Wallets auf, die ihm nicht gehörten — überschrieb deren Besitzer mit seiner eigenen Adresse — und hob dann die Salden ab. Etwa 150.000 ETH (~30 Mio. $) wurden aus drei großen Wallets abgezogen, einschließlich derer von Edgeless Casino, Swarm City und æternity ICOs. Eine White-Hat-Gruppe front-runnte den Angreifer bei mehreren anderen Wallets und rettete schätzungsweise 200 Mio. $.
Parity deployte einen gepatchten Bibliotheksvertrag.
6. November 2017 — Der Freeze (~150 Mio. $+)
Die gepatchte Bibliothek enthielt noch ein subtiles Problem: initWallet konnte immer noch auf dem Bibliotheksvertrag selbst aufgerufen werden, was die Bibliothek in eine Multi-Sig-Wallet verwandelte, die dem Aufrufer gehörte. Ein Nutzer — devops199 auf GitHub — tat genau das und beanspruchte versehentlich den Besitz des Bibliotheksvertrags, rief dann die kill-Funktion der Bibliothek auf (ein selfdestruct), um seinen Fehler "rückgängig zu machen".
Selfdestruct entfernte den Bytecode der Bibliothek dauerhaft. Jede Parity-Multi-Sig, die existierte, hing davon ab, per delegatecall in diese Bibliothek aufzurufen, um zu funktionieren. Mit dem Verschwinden der Bibliothek wurden all diese Wallets zu Backsteinen — sie konnten ETH und Tokens empfangen, aber nichts darin konnte je abgehoben werden.
Etwa 513.743 ETH (150 Mio. $ zu der Zeit, mehrere Milliarden zu Spitzenpreisen) wurden über 151 Wallets eingefroren, einschließlich der Polkadot-ICO-Treasury (dasselbe Parity-Team).
Folgen
- Parity schlug EIP-999 vor, um die eingefrorenen Mittel über einen state-modifizierenden Hard Fork wiederherzustellen. Die Community lehnte ab; Ethereum wählte diesmal Unveränderlichkeit über Restitution, obwohl es achtzehn Monate zuvor das Gegenteil für The DAO getan hatte.
- Die Mittel bleiben bis heute auf Ethereum Mainnet eingefroren — ein permanentes Denkmal für das
delegatecall-Bibliotheksmuster.
Warum es wichtig ist
Parity etablierte zwei bleibende Praktiken: Initialisierungsfunktionen niemals exponieren, die wieder aufgerufen werden können, und kritische Implementierung nicht in eine geteilte, tötbare Bibliothek legen. Das moderne Äquivalent — UUPS-aktualisierbare Proxies — verbietet selfdestruct im Implementierungsvertrag ausdrücklich aus genau dem Grund, den Parity demonstrierte.
Das asymmetrische Ergebnis — DAO wiederhergestellt, Parity nicht — zeigte auch, wie Community-Konsens über Notfall-Interventionen grundlegend willkürlich ist und davon abhängt, wer fragt, wie groß der Verlust ist und wie politisch der Moment ist.
Quellen & On-Chain-Belege
- [01]openzeppelin.comhttps://www.openzeppelin.com/news/on-the-parity-wallet-multisig-hack-405a8c12e8f7
- [02]techcrunch.comhttps://techcrunch.com/2017/11/07/a-major-vulnerability-has-frozen-hundreds-of-millions-of-dollars-of-ethereum/
- [03]theregister.comhttps://www.theregister.com/2017/11/10/parity_280m_ethereum_wallet_lockdown_hack/