Bir aylık hazırlık: Allbridge projesi nasıl hacklendi ve Circle'ın bununla ne ilgisi var

Bir aylık hazırlık: Allbridge projesi nasıl hacklendi ve Circle'ın bununla ne ilgisi var

Saldırgan, 1 milyon USDC'lik bir transfere dair sahte bir mesaj oluşturmayı ve protokolü bu fonların gerçek olduğuna ikna etmeyi başardı.

24 Ağu 2026

19 Ağustos 2026'da, tanınmış cross-chain köprü Allbridge, yaklaşık $190,000'ın çalınmasıyla sonuçlanan bir saldırıya uğradı. Ancak saldırının kendisi tek bir günde gerçekleştirilmedi: saldırgan onu neredeyse bir ay boyunca hazırladı. Bu saldırının mekanizmasını ve cross-chain mesajların doğrulanmasındaki bir hatanın, saldırganın var olmayan bir USDC transferini gerçek gibi göstermesine nasıl olanak tanıdığını ayrıntılı olarak inceliyoruz.

Önceden bilinmesi gerekenler

Saldırının nasıl gerçekleştirildiğini anlamak için önce Circle'ın CCTP protokolünün ve onun kullandığı blok zincirleri arası mesaj iletim sisteminin nasıl çalıştığını kavramak gerekir.

CCTP üzerinden sıradan bir transfer birkaç aşamadan geçer. Önce kaynak ağdaki TokenMessenger USDC yakar. Ardından Circle'ın MessageTransmitter'ı mesajın gerçekliğini doğrular ve iletir. Bundan sonra hedef ağdaki TokenMessenger mesajı alır, kontrol eder ve karşılık gelen miktarda USDC oluşturur. Son olarak Router, fonların fiilen alındığını onayladıktan sonra USDC'yi kullanıcıya aktarır.

Mesajların iletiminden Circle MessageTransmitterV2 sözleşmesi sorumludur. Tam mesaj için bir attestation yayımlar - belirli bir cross-chain mesajın gerçekten doğrulandığına ve kimliğinin denetlendiğine dair Circle tarafından imzalanmış bir kanıt. Ancak bu attestation yalnızca mesajın içeriğinin Circle tarafından onaylandığını belirtir. Tek başına, mesajda belirtilen tutarın gerçekten aktarıldığını kanıtlamaz.

Hedef ağda token oluşturulmasından Circle TokenMessengerV2 sorumludur. MessageTransmitterV2 mesajı aldıktan sonra, mesaj başlığında belirtilen alıcı adresine dayanarak hangi sözleşmenin çağrılması gerektiğini belirler. Normal bir CCTP işleminde bu adres, hedef ağdaki TokenMessengerV2 sözleşmesine karşılık gelmelidir. Ardından kaynak TokenMessenger, token, tutar ve alıcı adresi kontrol edilir ve yalnızca tüm kontroller başarıyla geçildikten sonra yeni USDC oluşturulur.

Allbridge'in altyapısındaki CCTP modülü bu zincirde daha ileride yer alır. Tamamlanmış yatırmaları kabul eder ve bunları Router'ın tanıyabileceği kayıtlara dönüştürür, ardından Router tokenleri kullanıcıya aktarır. İşte tam da burada kritik önemde bir ayrıntı ortaya çıkar.

Bu aşamada Circle'ın sendMessage fonksiyonunun evrensel bir arayüz olduğu anlaşılır. Herhangi bir kullanıcı onu çağırabilir ve Circle'ın ardından doğruladığı bir cross-chain mesaj içeriği parçası iletebilir. Bu arayüzü çağırmanın kendisi, otomatik olarak ne USDC yakılmasına ne de yeni USDC oluşturulmasına yol açar. Sıradan bir CCTP transferi, ayrıca kaynak ağdaki TokenMessenger'ın katılımını gerektirir. Önce USDC yakar, ardından yok edilen tokenler hakkında bilgi içeren bir mesaj oluşturur. İncelenen saldırıda saldırgan bu aşamayı atladı: hiç USDC yakmadan basitçe bir cross-chain mesaj oluşturdu.

Zafiyetin kök nedeni

Allbridge CCTPTokenMessenger sözleşmesinde, cross-chain mesajları almaya yönelik receiveCctpMessage fonksiyonu, CCTP mesaj başlığındaki sender alanının uzaktaki TokenMessenger'ın adresiyle eşleşip eşleşmediğini kontrol etmiyordu. recipient alanı da Circle TokenMessengerV2 sözleşmesine karşı kontrol edilmiyordu.

Sonuç olarak MessageTransmitterV2.receiveMessage, alınan cross-chain mesajı saldırgan sözleşmeye iletiyor ve ona, sanki tokenler başarıyla oluşturulmuş gibi belirleme olanağı tanıyordu. Aynı zamanda Allbridge sözleşmesinin kendisi, sözde token oluşturmadan sonra Router'ın USDC bakiyesinin gerçekten artıp artmadığını ayrıca kontrol etmiyordu. Bunun yerine, saldırganın kendisinin oluşturduğu mesajda yer alan tutara güveniyor ve onu alınabilir bakiye olarak kaydediyordu. Bu tutar, cross-chain mesajın hookData'sı içindeki messageHash ile ilişkilendirilmiş receivedTokenAmount değerinde saklanıyordu.

hookData'da da ek koruma yoktu. Router bir ödeme gerçekleştirirken, messageHash'i çağrı parametrelerine dayanarak kendisi yeniden hesaplar, ardından o hash için daha önce oluşturulmuş dahili yatırma kaydını arar. Mesajı Polygon'a göndermeden önce bile saldırgan, aynı parametreler için gerekli hash'i kendisi hesaplayabilir ve messageHash'i cross-chain mesajın hookData'sına önceden kaydedebilirdi. Böylece Router'ın sonradan bulduğu kayıt, saldırganın kendisinin oluşturduğu dahili bir kayıttı ve fonların fiilen alınmasıyla hiçbir ilgisi yoktu.

Sonuç olarak saldırgan, Polygon ağındaki Circle MessageTransmitterV2 sözleşmesinin sendMessage'ını doğrudan çağırabildi ve keyfi bir cross-chain mesaj oluşturabildi. Circle bu mesajı imzaladıktan sonra saldırgan, Base ağında attestation kontrolünü başarıyla geçebildi. Sonuç olarak sahte mesaj gerçek bir cross-chain yatırma olarak algılandı, ardından Router tokenleri saldırganın belirttiği adrese aktardı.

Allbridge'e saldırı adım adım nasıl gerçekleştirildi

1. 26 Temmuz 2026'da saldırgan ilk kez doğrudan Polygon ağındaki Circle MessageTransmitterV2 sözleşmesinin sendMessage fonksiyonunu çağırdı. Bu, sıradan bir cross-chain mesaj gönderme işlemiydi. İşlem bir MessageSent olayı oluşturdu, ancak gerçek bir USDC yakımı olmadı. Ardından Circle tam mesaj için bir attestation yayımladı ve bu aşama normal şekilde, tam da protokolün öngördüğü gibi geçti.

Mesaja CCTP'ye özgü bir formatta veriler yerleştirildi. Kaynak ağ olarak Polygon, hedef ağ olarak Base belirtildi ve beyan edilen tutar 1,000,000 USDC idi. feeExecuted parametresi sıfıra ayarlandı ve destinationCaller, Allbridge CCTPTokenMessenger sözleşmesine işaret ediyordu.

Aynı zamanda saldırgan, mesaj başlığında kendi sözleşmesini recipient olarak ayarladı, mesaj gövdesinde yapılandırılmış uzak Messenger'ın adresini sourceSender olarak belirtti ve önceden hesapladığı Router messageHash'ini hookData'ya yerleştirdi. Tüm bu parametreler, sonradan Allbridge'in kontrollerini geçecek şekilde hazırlanmıştı.

2. Kötü amaçlı cross-chain mesajı oluşturduktan sonra saldırgan yaklaşık 24 gün bekledi. Beklemenin nedeni, Base ağındaki Router'ın çalışma özelliklerinde yatıyordu. Fonları yönlendirme işlevi gördüğü için, genellikle uzun süre önemli miktarda likidite tutmaz.

Ancak 19 Ağustos 2026'da, Allbridge relayer'ı başka bir kullanıcının gerçek bir CCTP yatırması sonucunda yaklaşık 191,112 USDC oluşturmuşken, Router'ın bakiyesi yaklaşık 191,156 USDC'ye ulaştı.

Bu fonlar gerçek kullanıcılara aitti ve alıcılarına gönderilmeyi bekleyen cross-chain transferleri temsil ediyordu. Saldırgan, Router'da planını gerçekleştirmeye yetecek likiditenin bulunduğu bu çok kısa dönemi bekledi ve gerçek yatırmanın gelmesinden yalnızca altı saniye sonra doğrudan saldırıya başladı.

3. Saldırgan sözleşme önce CCTPTokenMessenger sözleşmesinin receiveCctpMessage fonksiyonunu çağırdı; Polygon'daki önceki işlemden elde edilen mesajı ve imza verilerini (attestation) iletti.

destinationCaller ve sourceSender kontrolleri başarıyla geçti, çünkü her iki değer de saldırganın kendisi tarafından önceden seçilip oluşturulmuştu. Ardından saldırgan sözleşme, Circle MessageTransmitterV2 sözleşmesinin receiveMessage fonksiyonunu çağırdı.

Bu fonksiyon kapsamında saldırgan sözleşmeye bir geri çağrı (callback) yapıldı, çünkü mesaj başlığının recipient alanında belirtilen tam da oydu. Saldırgan sözleşme, Circle TokenMessenger üzerinden beklenen token oluşturma işlemini yapmadan, basitçe başarılı bir sonuç döndürdü.

Allbridge ayrıca Router'ın bakiyesini yeniden kontrol etmedi ve çağrılan sözleşmenin gerçekten Circle TokenMessengerV2 olduğundan emin olmadı. Bunun yerine, amount - feeExecuted değerini doğrudan receivedMessages[messageHash]'e kaydetti. Böylece, karşılık gelen hiçbir yatırma olmamasına rağmen, sistemin içinde sözde alınmış 1,000,000 USDC'lik bir kayıt ortaya çıktı.

4. Saldırganın önceden oluşturduğu cross-chain mesajda 1,000,000 USDC'lik bir tutar belirtildiğinden, o anda Router'ın bakiyesinde ise yalnızca yaklaşık 191,156 USDC bulunduğundan, saldırganın sonraki transferi gerçekleştirmek için yaklaşık 808,844 USDC'si eksikti.

Router'ın bakiyesini gerekli değere geçici olarak yükseltmek için saldırgan bir Aave flash kredisi (flash loan) kullandı. Bu, ona tek bir işlem süresince 808,844 USDC borç almasına ve Router'ın bakiyesini sahte mesajda belirtilen tutara çıkarmasına olanak tanıdı. Bundan sonra fonların daha ileri çekilmesi için koşullar sağlandı.

5. Ardından saldırgan, hesaplaşma işlemini gerçekleştirmek için Router'ın receiveToken fonksiyonunu çağırdı. Çağrı parametrelerine dayanarak Router hash'i kendisi yeniden hesapladı ve saldırganın önceden hesaplayıp hookData'ya yerleştirdiği messageHash ile tamamen eşleşen bir değer elde etti.

Bundan sonra Router yalnızca tek bir şeyi kontrol etti: CCTPTokenMessenger sözleşmesinde bu messageHash'e karşılık gelen bir receivedTokenAmount kaydının bulunup bulunmadığını ve sıfırı aşıp aşmadığını. Böyle bir kaydın varlığı, gerçek bir yatırmanın alındığının kanıtı olarak fiilen algılandı. Router %0.1'lik bir komisyon aldığından, onu düştükten sonra kalan 999,000 USDC'yi doğrudan saldırgan sözleşmeye aktardı.

Böylece, tüm işlem boyunca Router yalnızca CCTPTokenMessenger sözleşmesinde karşılık gelen bir dahili kredi bakiyesinin varlığını kontrol etti. Bu kredinin, blok zincirinde eşdeğer bir tutarda gerçek bir varlık girişine karşılık gelip gelmediğini yeniden doğrulamadı.

6. 999,000 USDC'yi aldıktan sonra saldırgan, flash kredinin anaparasını - 808,844 USDC - Aave'ye geri verdi ve kullanımı için yaklaşık 404.422012 USDC komisyon ödedi.

Kayıpların büyük kısmı, Router'a henüz gelmiş ve meşru alıcılarına henüz aktarılmamış gerçek cross-chain yatırmalara denk geldi. Dikkat çekici olan şu: yukarıda bahsedilen 1,000 USDC'lik Router komisyonları da daha sonra aynı saldırı yöntemini tekrarlayan başka saldırganlar tarafından çalındı.

Attestation sorunu

Saldırının temel nedeni, Allbridge tarafında cross-chain mesajın yetersiz doğrulanmasıydı. Bir Circle attestation'ı yalnızca mesajın içeriğinin, kimliği denetlendikten sonra değiştirilmediğini kanıtlar. Mesajın gerçekten kaynak ağda token yakımının veya hedef ağda token oluşturmanın sonucu olduğunu kanıtlamaz.

Allbridge, saldırganın CCTPTokenMessenger mesajında kendisinin oluşturduğu tutara, fonların kaynak adresine ve messageHash'e doğrudan güvendi. Bu veriler çekilebilir bakiye olarak kaydedildi ve fiilen sistem tarafından gerçek yatırma büyüklüğü olarak algılanmaya başlandı.

Cross-chain köprü sistemleri için temel ilke şudur: doğru şekilde kimliği denetlenmiş ve doğrulanmış bir mesaj, ağlar arası bir hesaplaşmanın gerçekleştirilmesi için gerekli bir koşuldur; ancak Router'ın nihai ödemesinin dayanağı varlıkların fiilen alınması olmalıdır.

#USDC#Hackleme
24 gün bekleyiş ve tek bir sahte transfer: Allbridge'e nasıl saldırıldı