Geçtiğimiz hafta boyunca (2026/09/07 - 2026/09/13), toplam tahmini kaybı yaklaşık $320M olan 2 güvenlik olayı gözlemledik.
| Tarih | Olay | Tür | Tahmini Kayıp |
|---|---|---|---|
| 2026/09/06 * | Liquid Network | Kusurlu Önbellek Anahtarı Oluşturma | ~$320M |
| 2026/09/11 | Symbiosis | Kusurlu Zincir Dışı Mevduat Doğrulaması | ~$770K |
*Liquid Network olayı 6 Eylül'de meydana geldi ve geçen haftanın raporunda ele alınmadı. Bütünlük sağlamak için buraya dahil edilmiştir.
Web3 için En İyi Güvenlik Denetçisi
Başlatmadan önce tasarımı, kodu ve iş mantığını doğrulayın
Haftanın Öne Çıkanı: Liquid Network
Liquid Network olayı, ince önbellek anahtarı çakışması mekanizması ve yol açtığı büyük kayıplar nedeniyle seçildi. Saldırgan, doğrulama verileri daha önceki bir işlemin baytlarını yeniden bölen bir işlem oluşturarak, hiç kontrol edilmemiş bir kanıt için önbelleğe alınmış bir doğrulama sonucunun döndürülmesini sağladı.
2026/09/06 tarihinde, bir Bitcoin yan zinciri olan Liquid Network, yaklaşık $320M karşılığı sömürüldü [1]. Liquid'in çalıştırdığı düğüm yazılımı Elements'in rangeproof doğrulama önbelleğindeki bir çakışma, bir çıktı için kaydedilen bir valid hükmünün, tamamen farklı ikinci bir çıktı için döndürülmesine izin verdi; böylece o çıktının kanıtı hiç incelenmeden kabul edildi. Saldırgan bunu, hiçbir bitcoin ile desteklenmeyen 4.000 L-BTC oluşturmak için kullandı ve ardından bunları ağın olağan peg-out işlemiyle çekti. Ertesi gün federasyona 3.400 BTC iade edildi ve saldırganın elinde yaklaşık 598,5 BTC kaldı [2].
Arka Plan
Liquid Network, Bitcoin kod tabanından türetilen açık kaynaklı bir blockchain platformu olan Elements üzerine inşa edilmiş bir Bitcoin yan zinciridir. Ana zincirin izin verdiğinden daha hızlı, daha ucuz ve daha gizli şekilde bitcoin taşımak için vardır. Bitcoin iki ağ arasında çift yönlü bir peg ile geçer: bir peg-in işleminde kullanıcı, peg fonlarını birlikte saklayan, incelenmiş kuruluşlardan oluşan sabit bir grup olan ağın federasyonuna BTC kilitler ve eşit miktarda L-BTC alır; bir peg-out işleminde kullanıcı L-BTC'yi yok eder ve federasyon karşılık gelen BTC'yi serbest bırakır. Liquid blokları madencilikle üretilmez. Federasyonun görevli düğümlerinden dönen bir küme bunları önerir ve bir eşik değerde federasyon imzası bunları kesinleştirir.
Bitcoin gibi Liquid de fonları hesap bakiyeleri yerine harcanmamış işlem çıktıları olarak izler. Bir işlem mevcut harcanmamış çıktıları adlandırır, onların kilidini açar ve yenilerini oluşturur; oluşturduğu değer tükettiği değere eşit olmalıdır. Her çıktı bir kilitleme betiği, yani scriptPubKey taşır. Betiği OP_RETURN ile başlayan bir çıktı asla harcanamaz; veri taşımak için vardır ve bir peg-out tam olarak bu tür bir çıktı olarak ifade edilir.
Liquid ayrıca miktarları varsayılan olarak gizler. Bir çıktıya bir sayı yazmak yerine, o sayıya dair bir Pedersen taahhüdü yazar. Taahhütler toplanabilir olduğundan, bir düğüm ilgili değerlerin hiçbirini öğrenmeden bir işlemin girdilerinin ve çıktılarının dengelendiğini doğrulayabilir. Bu özellik iki taraflıdır: bir taahhüt, negatif gibi davranan bir değeri de pekâlâ gizleyebilir; bu da bir işlemin çıktılarının girdilerini aşmasına ve yine de dengelenmesine olanak tanır. Bu nedenle miktarı gizlenen her çıktı bir rangeproof taşır; bu, taahhüt edilen miktarın [0, 2^64) aralığında olduğunu kanıtlar. Bir rangeproof'u doğrulamak pahalıdır ve aynı çıktı birden fazla kez doğrulanır — işlem mempool'a girdiğinde ve tekrar bir bloğa geldiğinde — bu yüzden Elements, zaten kabul ettiği kanıtların bir önbelleğini tutar; anahtarı kanıt ve kontrol edildiği verilerdir.
Güvenlik Açığı Analizi
Kusur, her Liquid katılımcısının çalıştırdığı düğüm yazılımı olan Elements'in zaten doğrulanmış rangeproof'ları nasıl önbelleğe aldığındadır.
CachingRangeProofChecker::VerifyRangeProof() önündeki çıktı için bir önbellek girdisi türetir ve bir isabet olduğunda, kanıta hiç dokunmadan hemen başarı döndürür:

Girdi, dört alanı arka arkaya tek bir SHA-256 akışına yazan ve özeti sonlandıran ComputeEntryRangeProof()'tan gelir:

Dört alan şunlardır: rangeproof'un kendisi, miktara dair Pedersen taahhüdü, çıktının hangi varlığı tuttuğunu tanımlayan varlık üreteci ve kabul edilen bir kanıtın belirli bir kilitleme betiğine bağlanması için dahil edilen scriptPubKey.
Dört alanın hiçbiri uzunluk öneki veya ayırıcı taşımaz. Rangeproof ve scriptPubKey uzunluk olarak değişir; Pedersen taahhüdü ve varlık üreteci her zaman 33 baytlık noktalardır. Bu nedenle özet yalnızca birleştirilmiş baytları kaydeder; bir alanın nerede bitip diğerinin nerede başladığını işaretleyen hiçbir şey yoktur. Aynı bayt akışına birleşen iki farklı dört alan kümesi aynı girdiyi üretir ve hangisi önce doğrulanırsa, diğerinin aldığı hükmü arkasında bırakır. Hasher, düğüm başına rastgele bir tuzla başlatılır, ancak tuz her iki akışın da başına aynı şekilde eklenir; bu nedenle özeti değiştirir ama iki girdiyi birbirinden ayırmaz. Kusur, 94000967 commit'inde giderildi [3].
Saldırı Analizi
Aşağıdaki analiz, savunmasız kodu çalıştıran düğümler tarafından kabul edilen 271147...187ec5 ve f24a4b...0a183f işlemlerine dayanmaktadır.
- 1. Adım: Saldırgan, ilk çıktısı 67 baytlık veri taşıyan bir
OP_RETURNolan bir işlem yayımladı.
scriptPubKey'i 6a 43 — OP_RETURN opcode'u ve ardından 67 baytlık bir push — sonra iki 33 baytlık değer ve sonda bir 6a okur. Bu itilen 67 bayt, bu işlemin ihtiyaç duyduğu veri değildir. Henüz var olmayan bir çıktının değer taahhüdü ve varlık üretecidir. Bu çıktıyı doğrulamak, kendi dört alanı için olan girdi altında bir valid hükmü sakladı.
- 2. Adım: Saldırgan ardından enflasyon işlemini gönderdi.
OP_RETURNçıktısınınscriptPubKey'i tek bayt6a'dan oluşur ve değer taahhüdü tam olarak önceki işlemin push'unda gömülü olan 33 baytlık değerdir. Rangeproof alanı, önceki işlemin rangeproof'u, taahhüdü ve varlık üretecinden ve ardından iki bayt6a 43'ten oluşturulmuştu.

Bu çıktının dört alanı böylece, farklı sınırlar boyunca yeniden bölünmüş olarak, ilk işleminkiyle aynı bayt akışına birleşir:
Primer: P0 │ C0 │ X │ S0, where S0 = 6a 43 <33-byte C1> <33-byte X> 6a
Inflation: P1 │ C1 │ X │ S1, where P1 = P0 ‖ C0 ‖ X ‖ 6a 43 and S1 = 6a
Both concatenate to: P0 ‖ C0 ‖ X ‖ 6a 43 ‖ C1 ‖ X ‖ 6a
Önbellek önceki hükmü döndürdü ve P1 hiç doğrulanmadı — zaten bir rangeproof değil. C1, küçük bir negatif miktara taahhüt eder. İşlemin diğer çıktısı, saldırganın ex1q7kg...qa2w adresine yapılan normal bir pay-to-witness-public-key-hash çıktısı, gerçek bir rangeproof ile büyük bir pozitif taahhüt taşıyordu ve ikisi birbirini dengeledi, böylece işlem dengelendi. Hiçbir bitcoin ile desteklenmeyen 4.000 harcanmamış L-BTC bıraktı.
- 3. Adım: Saldırgan peg-out yaptı. İki işlem, olağan
OP_RETURNpeg-out çıktıları aracılığıyla3,996.01834922ve2.65138358L-BTC yaktı; toplamda3,998.66973280L-BTC. Peg-out'ları yetkilendiren görevli düğümler bunları aynı savunmasız kodla doğruladı ve bitcoin'i serbest bıraktı: Bitcoin üzerinde saldırgana3,995.99999857BTC ve2.49749857BTC ulaştı; toplamda3,998.49749714BTC.
Olay çözülürken ağ durakladı ve iki zincire ayrıldı [4], ardından geçersiz peg-out reddedilmiş olarak yeniden başladı [2]: bir blok gezgini bugün primer işlemin onaylandığını ancak enflasyon işleminin onaylanmadığını gösteriyor; serbest bıraktığı bitcoin federasyonun cüzdanından çoktan çıkmış olsa da. Ertesi gün 16:09:25 UTC'de saldırgan federasyonun peg cüzdanına 3,400.00000000 BTC iade etti ve kalan ~598,5 BTC ödenmemiş kaldı [2]; taraflar Bitcoin işlemlerine gömülü mesajlarla pazarlık yaptı [4].
Sonuç
Saldırgan hiçbir kriptografiyi kırmadı ve hiçbir anahtarı ele geçirmedi. Kusur, rangeproof önbelleğinin zaten neyi kontrol ettiğini nasıl tanımladığındaydı. Anahtarı, ikisi uzunluk olarak değişken olan dört alanı, her alanın nerede bittiğini işaretleyen hiçbir şey olmadan tek bir hash akışında birleştiriyordu; böylece ikinci bir alan kümesi aynı baytları yeniden bölebilir ve aynı girdiye denk gelebilirdi. Ardından, hiçbir düğümün asla doğrulamadığı bir kanıt için saklanan bir valid hükmü döndürüldü ve bir rangeproof arkasındaki miktarı kısıtlamayı bıraktığında, gizli bir defter gizli değerlerini negatif olmayan tutan tek şeyi kaybeder. Bir şekilde hazırlanmış çıktı 4.000 L-BTC oldu ve çift yönlü peg onları ana zincirde bitcoin'e dönüştürdü.
Birden fazla değişken uzunluklu girdiden türetilen her tanımlayıcı, aralarındaki sınırlara taahhüt etmelidir; bunu ya her alanın başına uzunluğunu ekleyerek ya da alanları ayrı sabit boyutlu yuvalara hashleyerek yapmalıdır. Bu olmadan türetme birebir değildir ve iki farklı girdi tek girdi sanılabilir. Gereklilik, bir önbelleğin bir kontrolün yerini aldığı her yerde en keskindir; çünkü orada bir isabet, onu çalıştırmama kararıdır.
Ücretsiz Güvenlik Taraması
Kendi otomatik analiz motorumuzla hızlı bir güvenlik kontrolü.
Ücretsiz tarayınBu Hafta Daha Fazla Olay
Symbiosis
2026/09/11 tarihinde, Symbiosis cross-chain köprüsünün Bitcoin rotası, BNB Smart Chain, Ethereum ve Rootstock dağıtımlarında sömürüldü; bu, likidite sağlayıcılarına ve kullanıcılara tahmini 9,97 BTC (~$770K, 11 Eylül'deki ~$77K fiyatıyla) kaybettirdi [5]. Bir Bitcoin mevduatından ne kadar sentetik bitcoin basılacağına karar veren zincir dışı kod, mevduat sahibinin kimliğini, mevduat sahibinin kontrol ettiği işlemin bir bölümünden aldı; bu da saldırganın yönetici olarak geçmesine ve minimum ücreti sıfırın altına itmesine izin verdi; ardından bu ücreti işaretini kontrol etmeden mevduattan çıkardı, böylece çıkarma işlemi toplama oldu.
Arka Plan
Symbiosis, değeri zincirler arasında varlığın kendisini transfer etmek yerine kilitleyip basarak taşıyan bir zincirler arası likidite protokolüdür: akıllı sözleşmelerin bulunduğu zincirlerde, kullanıcının token'ları kaynak zincirdeki Portal sözleşmesi tarafından kilitlenir ve Synthesis sözleşmesi ana zincirde eşit miktarda bir sentetik token, bir sToken, basar; sToken'ı yakmak orijinali serbest bırakır [6]. Bitcoin bu rotadan syBTC olarak gelir; bu, bitcoin'in kendi en küçük birimiyle eşleşen 8 ondalık basamağa sahip, BNB Smart Chain, Ethereum ve Rootstock üzerinde ihraç edilen ve havuzlarda BTCB, cbBTC, WBTC ve RBTC ile eşleştirilen bir token'dır [5].

Bitcoin'de bunların hiçbiri yoktur: akıllı sözleşme yoktur, dolayısıyla mevduatları kilitleyecek bir Portal sözleşmesi de yoktur. Onun yerine portal vardır — aynı rolü oynayan belirlenmiş bir Bitcoin adresi. Bir mevduat, ona ödeme yapan sıradan bir Bitcoin işlemidir; hedef zincir için talimatlar ona veri olarak eklenmiştir. Köprüye ait zincir dışı kod bu veriyi okuyarak kimin mevduat yaptığını, ne kadar yaptığını ve sentetik token'ın nereye gitmesi gerektiğini öğrenir ve portalın ücretini uygular — ücret, basılacak miktar sabitlenmeden önce mevduat tutarından çıkarılır — ve bu ücretin minimumu yöneticisinin belirlediği bir parametredir.
Bitcoin tarafıyla ilgili hiçbir şey hedef zincir tarafından görülemez, bu yüzden bir Relayers Network ortaya çıkan isteği karşı tarafa taşır. İstek, köprünün zincir üstü giriş noktası olan BridgeV2'ye, Synthesis'e ilettiği kodlanmış bir çağrı olarak ulaşır. Yetkilendirme bir MPC anahtarına dayanır: protokolün imzalayıcıları tek bir özel anahtarın paylarını tutar ve istek üzerinde ortaklaşa tek bir imza üretir. Aktarılan istekler için giriş noktası tek bir modifier taşır ve çağrıyı yönlendirmeden önce başka hiçbir şey yapmaz:

Bu modifier isteği hashler ve eşlik eden imzanın MPC adresi için geçerli olmasını gerektirir:

Sözleşmenin ortaya koyduğu şey, isteği MPC anahtarının imzaladığıdır. İsteğin taşıdığı miktar Bitcoin tarafında hesaplanır.
Güvenlik Açığı Analizi
Kusur hedef zincir sözleşmelerinde değildir. Bitcoin mevduatlarını okuyup bunları zincirler arası isteklere dönüştüren zincir dışı hizmettedir. Kaynak kodu kamuya açık değildir, bu nedenle aşağıdaki anlatım ekibin olay sonrası analizini [5] ve ilgili görünen bir kod parçacığı içeren 2024 tarihli bir üçüncü taraf denetim raporunu [7] takip eder.
Mevduat yolundaki iki kusurun bir araya gelmesi gerekiyordu ve olay sonrası analiz, hiçbirinin tek başına yeterli olmadığını belirtir.
Birincisi, mevduat sahibinin nasıl tanımlandığıdır. Bir mevduata eklenen talimatlar, onu kimin yaptığını ortaya çıkarmak için çözülür ve çözücü, bu kimliği işlem verisinin, girdiyi harcayan kişinin kontrol ettiği bir bölümünden aldı. Bu nedenle bir mevduat sahibi kendisini protokolün tanıdığı herhangi bir taraf olarak adlandırabilirdi; buna portalın kabul edeceği minimum ücreti belirleyen rol olan portal yöneticisi de dahil.
İkincisi, bu ücretin nasıl uygulandığıdır. 2024 denetimi, decodeWrap() içinde basılacak miktarı mevduat çıktısının değerinden ücreti çıkararak hesaplayan satırı bildirmişti:
Value: types.Satoshi(tx.TxOut[idx].Value) - info.PortalFee,
Bulgusu, types.Satoshi işaretli bir tamsayı türüyken PortalFee taşıyan info yapısının güvenilmez ve kullanıcı kontrollü olmasıydı; bu nedenle sonuç negatife çekilebiliyor ve hedef zincir için işaretsiz bir değer olarak serileştirildiğinde keyfi miktarda sentetik bitcoin basmaya yetecek kadar büyüyordu. Denetim, sorunun o sırada düzeltildiğini kaydetmişti [7]. 2026 olay sonrası analizi aynı tür bir başarısızlığı anlatır: ücret, işareti kontrol edilmeden mevduattan çıkarılmıştı [5], bu yüzden sıfırın altındaki bir ücret mevduatı azaltmak yerine büyüttü. Mevduat yolunda hiçbir şey, basılacak miktarı fiilen alınan bitcoin ile sınırlıyor gibi görünmüyor.
Saldırı Analizi
BNB Smart Chain, Ethereum ve Rootstock genelinde yaklaşık dört dakika içinde on iki sahte basım gerçekleşti [5]. Aşağıdaki analiz bunlardan birine, BNB Smart Chain üzerindeki 0x9a2bc0...21b9b959 işlemine dayanmaktadır.

-
1. Adım: Saldırgan, portal yöneticisi olarak geçerek portalın kabul ettiği minimum ücreti sıfırın altına indirdi; böylece negatif ücret beyan eden bir mevduat reddedilmek yerine işlenecekti [5].
-
2. Adım: Saldırgan 330 satoshi yatırdı; bu
0x000000000000014aolarak görünür. BNB Smart Chain'e ulaşan istek0x400000000000014ataşıyordu — aynı değerin2^62için biti set edilmiş hali,4,611,686,018,427,388,234temel birim. İkisi arasındaki fark tam olarak2^62'dir, bu yüzden bu mevduattan çıkarılan ücret-4,611,686,018,427,387,904satoshiydi:330 - (-4,611,686,018,427,387,904) = 4,611,686,018,427,388,234İstek bu biçimde imzalandı ve iletildi.
-
3. Adım:
receiveRequestV2Signed()istek üzerindeki MPC imzasını doğruladı ve onu iletti,metaMintSyntheticTokenBTC()'ye ulaştı. Bu fonksiyon, kaynak zincir kimliği için gerçek token'ın sentetik temsilini,syBTC'yi çözdü ve imzalanan tam miktar içinsynthesize()çağırdı. Tamamı saldırganın0x025122...5d3Ba2adresine transfer edildi:46,116,860,184.27388234 syBTC. -
4. Adım: Saldırgan sentetik token'ı onu tutan havuzlara sattı. Bir Uniswap v4
syBTC/WBTChavuzu üzerinden tek bir swap, yukarıdaki işlemin bastığının yaklaşık dört katı olan18,446,744,072,845,450,682temel birimsyBTCtakas etti ve4.38897292 WBTCçıkardı.

Daha sonra yönlendirilen bu swap'ın geliri kabaca 137 ether tuttu.
Ekip Bitcoin rotasını duraklattı ve saatler içinde yaklaşık 15,2 BTC portal fonu rezerv adreslerine taşındı [5]. Geri getirilen her şeyin %20'si oranında bir ödül teklif edildi ve 13 Eylül'e kadar açık kaldı [8]. Protokolün diğer rotaları etkilenmedi.
Sonuç
Hiçbir anahtar çalınmadı ve hiçbir sözleşme, çalıştırmak için yazılmadığı kodu çalıştırmaya kandırılmadı. Hedef zincirin kontrol ettiği imza gerçekti; yetkilendirdiği şey, zincir dışı kodun zaten iki ayrı şekilde yanlış ürettiği bir sayıydı: bir kez mevduat sahibinin kimliğini mevduat sahibinin kontrol ettiği bir alandan okuduğunda, saldırganın portal yöneticisi gibi görünmesine ve minimum ücretini sıfırın altına itmesine izin verdiğinde; bir kez de bu ücreti işaretini kontrol etmeden mevduattan çıkardığında, böylece negatif bir ücret mevduatı azaltmak yerine büyüttüğünde.
Güvenilmez girdiden okunan bir kimlik, kimlik değildir: ayrıcalıklı bir rol ancak mevduat sahibinin seçemeyeceği bir şeyle, örneğin harcanan girdiyi fiilen yetkilendiren adresin protokolün tuttuğu bir listeye karşı kontrol edilmesiyle tesis edilebilir — mevduat sahibinin doldurmakta serbest olduğu bir alanla değil. Çıkarılan bir değerin her iki tarafta sınırlara ihtiyacı vardır: bir ücretin sıfır ile mevduat arasında olması istenmeli ve basılacak miktarın kaynak zincirin fiilen aldığını aşmasına asla izin verilmemelidir. Bu sınırlardan herhangi biri bunu tek başına durdururdu.
Kaynaklar
[1] https://x.com/Liquid_BTC/status/2096696272447218108
[2] https://x.com/Liquid_BTC/status/2097404704028545175
[3] https://github.com/ElementsProject/elements/commit/94000967f6dc05b1afd435e79b1bbc597e29f816
[4] https://www.coindesk.com/markets/2026/09/08/white-hat-hackers-return-most-of-usd320m-bitcoin-taken-from-liquid-network
[5] https://x.com/symbiosis_fi/status/2099566361940795831
[6] https://docs.symbiosis.finance/crosschain-liquidity-engine/synthesizing-process
[7] https://github.com/symbiosis-finance/audits/blob/master/Symbiosis%20Relayers%20Network/Symbiosis%20Relayers%20Network%202024%20-%20Decurity.pdf
[8] https://x.com/symbiosis_fi/status/2098442463358718264
BlockSec Hakkında
BlockSec, tam kapsamlı bir blockchain güvenliği ve kripto uyumluluk sağlayıcısıdır. Müşterilerin kod denetimi yapmasına (akıllı sözleşmeler, blockchain ve cüzdanlar dahil), saldırıları gerçek zamanlı olarak durdurmasına, olayları analiz etmesine, yasa dışı fonları izlemesine ve AML/CFT yükümlülüklerini karşılamasına yardımcı olan ürün ve hizmetler geliştiriyoruz; bunlar protokollerin ve platformların tüm yaşam döngüsünü kapsar.
BlockSec, prestijli konferanslarda birden fazla blockchain güvenliği bildirisi yayımladı, DeFi uygulamalarına ait birçok sıfır gün saldırısını bildirdi, 20 milyon doların üzerinde kurtarma için birçok saldırıyı engelledi ve milyarlarca dolarlık kripto varlığı güvence altına aldı.
-
Resmî web sitesi: https://blocksec.com/
-
Resmî Twitter hesabı: https://twitter.com/BlockSecTeam



