Altı yıllık bekleyiş: MakerDAO bir kez daha nasıl hacklendi

Altı yıllık bekleyiş: MakerDAO bir kez daha nasıl hacklendi

Saldırgan, saldırıyı başlatmak için Tornado Cash'ten çekilen sadece 0.1 ETH'ye ihtiyaç duydu ve hırsızlığın ardından 200 ETH aynı servise geri akmaya başladı.

9 Eki 2026

Bu 200 ETH, sözleşmenin Mart 2020'deki «Kara Perşembe» tasfiyeleri sırasında sıfır teklifle kazandığı ancak hiçbir zaman nihai olarak talep etmediği dört adet 50 ETH'lik partiden oluşuyordu.

Eski sözleşmenin korumasız fonksiyonlarından biri, kendisini kimin çağırdığını kontrol etmiyordu. Bu durum, saldırganın kontrolündeki bir sözleşmeye, bu sözleşmenin MakerDAO sistemindeki hesabı üzerinde tam kontrol vermesine olanak sağladı. Saldırgan, tek bir işlemde eski müzayedeleri sonuçlandırdı ve orada tutulan teminatı çekti.

Önemli işlemler (saatler UTC)

SaatTXIDAçıklama
2026-10-06 05:57:230xd4c0b18a058e7f0a12855f30174f4cb1e973c15c886063deab97e1a21f048ac6Tornado Cash'ten 0.1 ETH çekimi. Bu, bu hesabın aldığı tek fonlamaydı.
2026-10-06 06:12:110x4a587af4213cc345c4c109fbf5fec46f9643183f91a9edf60305380f31ad1167Güvenlik açığını istismar etmek için kullanılan saldırı sözleşmesinin devreye alınması.
2026-10-06 06:13:110xbb6940f7c2a1e68cafbae7bb9b94d09af9af06ec3a114f6996f2cab993f3a88cSaldırı işlemi. Saldırı sözleşmesi, keeper fonksiyonu 0x8804d1de aracılığıyla devredilmiş izinler elde etti, 1457–1460 müzayedelerini sonuçlandırdı ve saldırganın harici sahipli hesabına (EOA) 200 ETH gönderdi.
2026-10-06 06:19:350xb8ecff9c129d8d9331c85558eaeddff29a38c4c16b71a40986acbf8f6febefebTornado Cash router'ına yapılan dokuz 10 ETH yatırımından ilki.

Önemli adresler

AdresRol
0x01EB957E5C7DcDDD60F3C875956cCc6fb9BdA5FASaldırganın harici sahipli hesabı (EOA).
0xEc997d2aD033277913d6002277353368E8321dcFSaldırı sözleşmesi.
0xf09a13072Ed939B79Bc25B66AA3a836ea6DCC170Kurbanın Vat'taki hesabı üzerinde hâlâ devredilmiş izinlere sahip olan kötü amaçlı adaptör modülü.
0x9c05a05893Ada984FC20D0DA0c046De5Cc0e8273Güvenlik açığı bulunan sözleşme (eski müzayede keeper'ı, AdminUpgradeabilityProxy).
0x68399ed8aa33C5b43F863EE6782de492006A5546Güvenlik açığı bulunan sözleşme implementasyonu (kaynak kodu doğrulanmamış).
0xaDC374E77b89Af0B8B39F7c47E8e0A37B6DaF073Mart 2020'de keeper'ın sahibi ve operatörü.
0xd8a04F5412223F513DC55F839574430f5EC15531MakerDAO ETH-A Flipper, teminat satışı için kullanılan ve kullanımdan kaldırılmış bir müzayede mekanizması.
0x35D1b3F3D7966A1DFe207aa4514C12a259A0492BMakerDAO Vat, temel muhasebe modülü.
0x2F0b23f53734252Bda2277357e97e1517d6B042AMakerDAO ETH-A GemJoin, teminat varlığı için çıkış noktası.
0xd90e2f925DA726b50C4Ed8D0Fb90Ad053324F31bÇalınan fonları alan adres olan Tornado Cash router'ı.
0x12D66f87A04A9E220743712cE6d9bB1B5616B8FcSaldırganın ilk fonlamasının kaynağı olan Tornado Cash 0.1 ETH havuzu.

Saldırının nasıl gerçekleştiği

Modülün devreye alınması

İstismar, saldırı sözleşmesinin 0xf09a13072Ed939B79Bc25B66AA3a836ea6DCC170 adresinde bir adaptör modülü oluşturmasıyla başladı. Oluşturma sırasında modül şu parametreleri aldı: Flipper, Vat, ETH-A GemJoin, teminat türü (ilk), WETH, bir ödeme adresi ve dört müzayede kimliği.

İzinlerin devredilmesi

Saldırı sözleşmesi, keeper fonksiyonu 0x8804d1de'yi çağırdı ve ona ⟦f09⟧ adresinde yeni oluşturulan adaptörü aktardı. Keeper daha sonra modülün drip() ve vat() fonksiyonlarını çağırdı, Vat.can() aracılığıyla kendisine daha önce izin verilip verilmediğini kontrol etti ve Vat.hope()'u çağırdı. Bu, modüle Vat sisteminde keeper'ın hesabını yönetme konusunda sınırsız izinler verdi.

Geri çağırma (callback)

Keeper daha sonra saldırı sözleşmesinin join() fonksiyonunu çağırdı. Bu, yeni izinlerin zaten geçerli olduğu bir anda, saldırganın yazdığı koda kontrolü devretti.

Açık artırmaların sonuçlandırılması

Geri çağırma içinde, modül hizmetten kaldırılan ETH-A Flipper'ın deal(id) fonksiyonunu 1457, 1458, 1459 ve 1460 açık artırmaları için çağırdı. Mart 2020'te keeper, dört 50 ETH'lik lotun her birini sıfır teklifle kazanmıştı, ancak anlaşmaları hiç sonuçlandırmamıştı. Açık artırmalar sonuçlandırıldığında, 200 ETH, keeper'ın Vat'taki hesabına ETH-A teminatı olarak işlendi.

Fonların çekilmesi

Modül, keeper'ın teminat bakiyesini okudu ve elde ettiği izinleri kullanarak flux() fonksiyonuyla 200 ETH'nin tamamını keeper'ın Vat'taki hesabından kendi adresine taşıdı. Ardından teminatı ETH-A GemJoin üzerinden 200 WETH olarak çekti ve WETH'i saldırı sözleşmesine gönderdi.

Güvenlik açığının temelinde ne yatıyor?

Saldırının temel nedeni, 0x68399ed8aa33C5b43F863EE6782de492006A5546 adresindeki keeper uygulamasında 0x8804d1de fonksiyonunda erişim kontrolünün bulunmamasıydı.

Hope, flux ve move işlemleri için keeper'ın sarmalayıcıları da dahil olmak üzere sözleşmenin diğer tüm yetkili fonksiyonları, önce bir ds-auth kontrolü çalıştırır ve yetkisiz çağrıları ds-auth-unauthorized hatasıyla reddeder.

Buna karşılık 0x8804d1de fonksiyonu herhangi bir adresi adaptör olarak kabul eder, keeper o adrese henüz izin vermemişse o adres için Vat.hope()'u çağırır ve ardından aynı adres üzerinde join()'i çağırır.

Keeper daha sonra join()'i çağırdığı için, saldırganın modülü bu izinlerin zaten geçerli olduğu bir anda kendi kodunu çalıştırabildi.

2020'daki dört kullanılmamış lot, bu güvenlik açığını saldırgan için kârlı hale getirdi. Herhangi biri bir açık artırma için deal fonksiyonunu çağırabilir.

DeFiTuna'ya yuvarlamayı öğrettiler: bir mantık hatası $570 bin USDC'ye mal oldu20 Tem 2026Devamını oku

Fonların hareketi

Saldırgan, güvenlik açığından yararlanmak için kullanılan işlem içinde doğrudan 200 ETH'nin tamamını aldı. Sadece altı dakika sonra, 06:19:35 UTC'de saldırgan, fonları Tornado Cash'e taşımaya başladı ve bunları 20 adet 10 ETH'lik yatırma işlemi olarak gönderdi.

#Hackleme#Ethereum#Mikserler#DeFi
200 ETH altı yıl bekledi: eski bir MakerDAO sözleşmesine yapılan saldırının hikayesi