Een transactie van amper 0,0002
USDC was genoeg om een val van $2 miljoen klaar te zetten. Een wallet die door blockchainonderzoekers aan Bofur Capital wordt gekoppeld, kopieerde later het verkeerde ontvangstadres en stuurde de miljoenen rechtstreeks naar de aanvaller.
Geen gestolen seed phrase. Geen gekraakt DeFi-protocol.
De gebruiker ondertekende de fatale transactie zelf.
Aanvaller plant adres in transactiegeschiedenis
Blockchainbeveiliger PeckShield meldde het incident op 22 augustus.
De aanval gebruikte een techniek die bekendstaat als address poisoning. Een fraudeur stuurt daarbij een kleine transactie vanaf een adres dat sterk lijkt op een adres waarmee het doelwit normaal zaken doet.
In dit geval ging het om slechts 0,0002 USDC.
Daarmee verscheen het misleidende adres in de transactiegeschiedenis van de
wallet.
Dat klinkt onschuldig. Het gevaar zit in wat daarna gebeurt.
Een Ethereum-adres bestaat uit 42 tekens. Walletsoftware toont daarvan vaak alleen het begin en einde.
Een aanvaller kan grote aantallen adressen genereren totdat er één ontstaat dat visueel sterk genoeg op het echte adres lijkt.
Wie daarna alleen 0xf0e6...21af controleert, kan een compleet ander adres voor zich hebben.
$2 miljoen verdwijnt na Compound-opname
De grote fout kwam nadat de betreffende wallet geld uit Compound had gehaald.
Compound ondersteunt via zijn officiële protocoldocumentatie opnames waarbij
crypto vanuit een positie naar een extern adres wordt gestuurd.
Kort na zo'n opname werd ongeveer $2 miljoen aan USDC naar het nagemaakte adres overgemaakt.
De
blockchain deed vervolgens exact wat hij moest doen.
De handtekening was geldig. Het ontvangstadres bestond. De transactie voldeed aan de regels.
Dat het verkeerde adres was ingevoerd, kan Ethereum niet weten.
Daarmee is dit fundamenteel anders dan een exploit waarbij iemand een fout in een
smart contract misbruikt.
De blockchain werd niet gekraakt. De aanvaller manipuleerde de informatie waarop de gebruiker vertrouwde voordat hij zelf de transactie ondertekende.
Juist daarom is deze aanval lastig op protocolniveau te stoppen.
Gestolen USDC wordt naar DAI omgezet
Na ontvangst bleef de aanvaller niet in USDC zitten.
Volgens PeckShield werd het geld omgezet in ongeveer 2 miljoen DAI. De fondsen werden daarna gevolgd naar een adres dat eindigt op 1816a.
Dat wisselen van stablecoin is niet zomaar een cosmetische stap.
USDC wordt uitgegeven door Circle en kent mogelijkheden om bepaalde adressen op contractniveau te blokkeren.
DAI werkt anders.
De officiële Dai-documentatie bevat geen vergelijkbare algemene blacklistfunctie waarmee willekeurige adressen simpelweg kunnen worden bevroren. Daarmee is het na de swap niet vanzelfsprekend dat de uitgever de gestolen tokens rechtstreeks stil kan zetten.
De
stablecoin blijft wel zichtbaar op Ethereum.
Als het geld later naar een gecentraliseerde exchange of andere partij met identiteitscontroles beweegt, kunnen er opnieuw aanknopingspunten ontstaan voor onderzoek of beslag.
Traceerbaar betekent alleen nog niet automatisch terughaalbaar.
Het probleem zat niet bij Compound
Ook de timing na de Compound-opname kan verwarrend zijn.
Voor zover nu uit de analyse blijkt, werd het DeFi-protocol zelf niet gehackt.
De wallet kreeg eerst de beschikking over het geld. Daarna ging het mis bij de daaropvolgende transfer.
Dat onderscheid is belangrijk voor
DeFi.
Een protocol kan technisch correct werken terwijl een gebruiker alsnog geld verliest doordat het bestemmingsadres buiten het protocol verkeerd wordt gekozen.
De zwakke plek was hier dus niet de uitleencode.
Het was het adresboek in het hoofd van de gebruiker.
Alleen eerste en laatste tekens controleren is precies de val
Address poisoning bestaat omdat mensen lange cryptografische adressen niet graag volledig lezen.
Dat weten aanvallers.
Ze hoeven niet exact hetzelfde adres te genereren. Dat kan praktisch niet.
Ze hoeven alleen genoeg zichtbare tekens te laten overeenkomen om de verkorte weergave in een wallet overtuigend te maken.
Een transactiegeschiedenis is daardoor geen betrouwbaar adresboek.
Dat geldt ook wanneer er al maanden betalingen naar dezelfde tegenpartij worden gedaan.
Een aanvaller hoeft maar één overtuigende vermelding tussen die transacties te krijgen.
Een testtransactie alleen beschermt niet
Vaak wordt bij grote cryptotransacties geadviseerd eerst een klein bedrag te sturen.
Dat helpt, maar alleen wanneer de controle goed wordt uitgevoerd.
Wie het vergiftigde adres uit zijn geschiedenis kopieert, daar €10 naartoe stuurt en vervolgens opnieuw precies datzelfde adres gebruikt voor $2 miljoen, heeft alleen twee verkeerde transacties uitgevoerd.
Een testbetaling wordt pas nuttig wanneer de ontvanger onafhankelijk bevestigt dat het geld op het juiste adres is aangekomen.
Voor bedrijven die miljoenen verplaatsen zijn sterkere controles logischer:
- Gebruik vooraf goedgekeurde adressen uit een eigen adresboek in plaats van de transactiegeschiedenis.
- Laat een tweede persoon het volledige bestemmingsadres onafhankelijk controleren bij grote transfers.
- Bevestig een testtransactie via een afzonderlijk communicatiekanaal voordat het resterende bedrag vertrekt.
Dat kost minuten.
Deze fout kostte ongeveer $2 miljoen.
Een professionele wallet is niet immuun voor een simpele truc
Het opvallendste aan de aanval is uiteindelijk hoe weinig technische toegang de fraudeur nodig had.
Geen private key.
Geen malware die aantoonbaar een wallet overnam.
Geen lek bij Compound.
Voor zover de huidige analyse laat zien, hoefde de aanvaller vooral te voorspellen dat iemand een eerder gebruikt adres uit zijn transactiegeschiedenis zou kopiëren.
Daarmee verschuift ook de veiligheidsles.
Wie miljoenen aan crypto beheert, kan zijn
wallet technisch uitstekend beveiligen en alsnog verliezen op het moment dat één verkeerd adres als betrouwbaar wordt aangezien.
De transactie van $2 miljoen was cryptografisch volledig geldig.
Alleen de bestemming klopte niet.