Aztec Connect, ZK-Rollup açıklığı nedeniyle 2,19 milyon dolarlık bir saldırıya uğradı

iconMetaEra
Paylaş
AI summary iconÖzet

Arka plan

14 Haziran 2026 tarihinde, kullanım dışı bırakılan Aztec Connect RollupProcessor sözleşmesi (0xff1f2b4adb9df6fc8eafecdcbf96a2b351680455) istismar edildi. Saldırgan, numRealTxs ile decoded_slots arasındaki sınır boşluğunu kullanarak, tek bir atomik işlemde L1 havuzundan yaklaşık 2,19 milyon dolarlık varlık çekti. Aztec Connect, Mart 2024'te kullanım dışı bırakıldı, ancak bu değişmez sözleşme, kalıtsal kullanıcı varlıklarını tuttuğu için riskli bir şekilde açık kaldı. Bu makale, sözleşmenin kaynak kodu ve zincir üzerindeki calldata verileri üzerinden bu saldırıya ait tüm teknik detayları yeniden oluşturur.

Saldırı Özeti

Sızıntı nedeni

RollupProcessorV3, rollup settlements işleminde L1 settlement döngüsünün dolaşım aralığı ile ZK açık girdi hash taahhüt aralığı arasında yapısal bir boşluk oluşturur. Saldırgan, bu boşluğu kullanarak 31/32 açık girdi yuvasının içeriğini ZK kanıtıyla L2 durum köküne taahhüt ederken, L1 sözleşmesi katmanında herhangi bir settlement doğrulaması geçmeden işlem yapar.

Decoder.sol: numRealTxs tamamen saldırgan tarafından kontrol edilir

numRealTxs, calldata'nın 4516. ofsetinden okunur ve hiçbir zincir içi kısıtlama yoktur:

decoded_slots, SHA256 önceden derlenmiş veri düzeni gereksinimi nedeniyle numTxsPerRollup'un katına yuvarlanır. Ancak bu yuvarlama işlemi, numRealTxs ile decoded_slots arasında bir saldırganın serbestçe doldurabileceği bir boşluk oluşturur.

RollupProcessorV3.sol: Setümlama döngüsü yalnızca numRealTxs adet slotu kapsar.

Güvenlik varsayımlarının kırılması

Normal işlem için güvenlik varsayımı şudur: Her açık giriş yuvası ya L1 sözleşmesi katmanında doğrulanır (yatırım sırasında pendingDepositBalance azaltılır), ya da ZK devresi publicValue == 0 kısıtlamasını uygular. Ancak bu güvenlik açıkları senaryosunda:

  1. SHA256, tüm 32 kuyruğu önceden derlenmiş halde kapsar (gerçek testte 8192 bayt = 32 × 256B giriş), gap kuyruklarının içeriği ZK kanıtıyla taahhüt edilmiştir.
  2. L1 hesaplama döngüsü yalnızca ilk 1 slot'u dolaşır; gap slotları [2..32] L1 düzeyinde herhangi bir doğrulamadan etkilenmez.
  3. ZK devresi, gap boşluğu publicValue üzerindeki (0 olması gereken) kısıtlamayı saldırganlar atladı veya uygulanmadı.

Üç koruma katmanı birbirine bağımlıdır, ancak hiçbirisi gap yuvası için bağımsız olarak güvenlik sağlamaz—ZK devre kısıtlamaları eksik olduğunda, L1 sözleşmesi katmanı da bunu tespit edemez.

Çift yol ayrımı modeli

Aynı calldata, iki farklı yol tarafından farklı üst sınırlarla tüketiliyor:

"Hangi slot'ların sayıldığına" dair iki yol arasındaki anlayış farklılığı (ZK 32 taneyi, L1 ise yalnızca 1 taneyi kabul eder), tamamen rastgele para bastırmanın kökenidir.

Saldırı süreci

0x074ec931…aee1 adresine ait saldırı işlemi, tek bir atomik işlem içinde 14 adet processRollup() çağrısını içeriyor ve "ilk 7 maden çıkarma + son 7 çekme" şeklinde iki aşamalı bir yapıya sahip.

Birinci Aşama: Madenleme — L2'de varlık oluşturma (Rollup #13277–13283, 7 kez)

1. Saldırgan EOA 0x0f18d8b44a740272f0be4d08338d2b165b7edd17, ana giriş kontratı 0x06f585f74e0da633ae813a0f23fb9900b61d0fcd'yi çağırarak 0x6f3ce701 seçicisini tetikledi.

2. Ana kontrol sözleşmesi, her biri birkaç zararlı rollup calldata'yi sabit kodlamış olan 3 adet ara sözleşmeyi sırayla çağırır. Her calldata'nın kritik parametreleri:

  • numRealTxs = 1, rollupSize = 1024, numInnerRollups = 32
  • 1. kuyruk (L1 görünür): proofId = 0 (noop), publicValue = 0
  • 2.–32. aralık (31 boşluk aralığı, L1 görünmez): proofId = 1 (yatırım), publicValue = N, publicOwner = Saldırgan L2 adresi
  • İlgili ZK kanıtı ile birlikte (devre kısıtlanmamış gap yuvası publicValue 0 olarak)

3. Relayer Sözleşmesi A, RollupProcessor.processRollup()’u sırayla çağırır (Rollup #13277–13281, 5 kez):

  • ZK kanıtı doğrulandı — SHA256 taahhüdü tüm 32 slotu kapsıyor
  • L1 hesaplama döngüsü sonu = 1 × TX_PUBLIC_INPUT_LENGTH = 1 kuyruk, yalnızca noop işlenir
  • gap boşluğu [2..32] için sahte yatırımlar, ZK ile yeni Merkle köküne taşınır → saldırganın L2 bakiyesi 5 × 31N artar

4. Relayer Sözleşmesi B, Rollup #13282–13283’ü aynı şekilde 2 kez işledi ve saldırganın L2 bakiyesine 2 × 31N daha eklendi. Bu noktada, saldırganın L2 hesabı toplamda 7 × 31N desteksiz yatırıma sahipken, L1 havuzu hiçbir şekilde azalmadı.

İkinci Aşama: Çekim — L2 sahte bakiyelerini L1 varlıklara dönüştürün (Rollup #13284–13290, 7 kez)

Saldırgan, 7 çekim rollup ile kazanma aşamasında elde edilen tüm L2 bakiyesini L1 varlıklara dönüştürdü:

  1. Rollup #13284 (DAI): withdraw() → RollupProcessor doğrudan 270.513,054 DAI transfer et → 0x0f18…edd17
  2. Rollup #13285 (wstETH): 167,890 wstETH transfer edildi → Saldırgan
  3. Rollup #13286 (yvDAI): 4.873,857 yvDAI transfer edildi → Saldırgan
  4. Rollup #13287 (yvWETH, ara sunucu sözleşme C devralındı): 16,570 yvWETH transfer et → Saldırgan
  5. Rollup #13288 (LUSD): 9.273,734 LUSD transfer edildi → Saldırgan
  6. Rollup #13289 (yvLUSD): 359,047 yvLUSD transfer edildi → Saldırgan
  7. Rollup #13290 (ETH, son işlem): RollupProcessor, dahili CALL ile 908,987 ETH'yi saldırgana aktardı.

Tek bir atomik işlem başarıyla yürütüldü (gasUsed = 4.513.539), sözleşmede kısmi geri alma mümkün değildir. Saldırgan, RollupProcessor'un meşru kullanıcı varlık havuzundan yaklaşık 2,19 milyon ABD doları elde etti.

Bakiye İzleme

Zincir üzerindeki kanıt izlemesine göre (2026-06-15 itibarıyla, olaydan yaklaşık 1 gün sonra), çalınan fonların durumu şöyledir:

Tüm varlıklar, tek bir işlem içinde RollupProcessor'dan ara saldırı kontratı 0x06f585…d0fcD üzerinden doğrudan saldırgan EOA 0x0F18D8b44a740272f0be4d08338d2b165b7EdD17'ye aktarıldı. Ara kontratın kalan bakiyesi yoktur.

Şu anda çalınan fonlar, saldırganın EOA'sında %100 orijinal halinde kalmıştır ve para aklama işlemi henüz başlatılmamıştır.

Özet

Bu saldırıdan alınan temel ders şudur: ZK-Rollup sözleşmelerinin sonuçlandırma döngüsü üst sınırı, ZK açık girdi hashlerinin taahhüt aralığıyla kesinlikle hizalanmalıdır. L1 sözleşme katmanındaki döngü sınırı numRealTxs ile SHA256 taahhüdünün decoded_slots arasında bir boşluk varsa, ZK devresinin bu boşluk slotlarına kısıtlama uygulamasına dayanan herhangi bir güvenlik varsayımı saldırganlar tarafından atlanabilir—L1, ZK kanıtı tarafından taahhüt edilen her açık girdi slotunu bağımsız olarak doğrulamalıdır ve doğrulama sorumluluğunu devre katmanına devretmemelidir.

SloMo Güvenlik Ekibi, proje sahiplerine Rollup sistemi dağıtımından önce tam bir dış güvenlik denetimi yapmayı, özellikle L1/L2 durum sınırındaki mantıksal tutarlılığı, calldata çözümlenmesinin güvenilir sınırlarını ve ZK açık girdilerin zincir içi ikinci doğrulamasını odaklanarak önerir. Kullanım dışı bırakılmış ancak eski varlıklara sahip olan sözleşmeler için, sürekli maruziyet riskini ortadan kaldırmak amacıyla düzenli bir varlık aktarımı veya imha önerilir.

Bu yazı, SlowMist Tehdit İstihbarat Ekibi tarafından MistEye Tehdit İstihbarat Sistemi, MistTrack İzleme Platformu ve SlowMist Agent AI tabanlı analizlerle hazırlanmıştır. Herhangi bir sorunuz varsa lütfen bize geri bildirimde bulunun.

Yasal Uyarı: Bu sayfadaki bilgiler üçüncü şahıslardan alınmış olabilir ve KuCoin'in görüşlerini veya fikirlerini yansıtmayabilir. Bu içerik, herhangi bir beyan veya garanti olmaksızın yalnızca genel bilgilendirme amacıyla sağlanmıştır ve finansal veya yatırım tavsiyesi olarak yorumlanamaz. KuCoin, herhangi bir hata veya eksiklikten veya bu bilgilerin kullanımından kaynaklanan sonuçtan sorumlu değildir. Dijital varlıklara yapılan yatırımlar riskli olabilir. Lütfen bir ürünün risklerini ve risk toleransınızı kendi finansal koşullarınıza göre dikkatlice değerlendirin. Daha fazla bilgi için lütfen Kullanım Koşullarımıza ve Risk Açıklamamıza bakınız.