25 Ağustos 2025'te Cantina ve Seal911'in yardımıyla Panoptic, yaklaşık 400.000 dolarlık risk altındaki fonları güvence altına alan bir beyaz şapka kurtarma operasyonu gerçekleştirdi [1]. Temel neden, s_positionsHash oluşturma sürecindeki bir kusurdu: protokol, pozisyon ID'lerinin Keccak256 hash'lerini tek bir parmak izinde toplamak için XOR kullandı. Bireysel Keccak256 hash'leri çarpışmaya dirençli olmaya devam etse de XOR'un matematiksel doğrusallığı, bileşik parmak izini güvensiz kılar. Bir saldırgan, XOR ile toplanmış hash'i herhangi bir hedef parmak iziyle eşleşen sahte pozisyon ID'leri oluşturabilir; böylece protokolün pozisyon doğrulamasını atlatarak borcu geri ödemeden teminatı çekebilir.
Arka Plan
Panoptic, kullanıcıların put ve call opsiyonları işlem yapmasına olanak tanıyan, Ethereum üzerine inşa edilmiş merkeziyetsiz bir sürekli opsiyon işlem protokolüdür.
withdraw() fonksiyonunun positionList adlı bir giriş parametresi vardır; bu parametre bir dizi tokenId'den oluşur. Her tokenId bir pozisyonu temsil eder. withdraw() fonksiyonu, her pozisyonun borç durumunu s_positionsHash değerine göre kontrol eder ve ardından kullanıcının teminatını geri alır.
Gaz tasarrufu amacıyla protokol, kullanıcının her pozisyonunu (yani tokenId'yi) depolamaz. Bunun yerine, kullanıcının tüm tokenId'lerine dayalı bir parmak izi hesaplar ve bunu s_positionsHash içinde kaydeder. Her s_positionsHash değerinin en anlamlı 8 biti numLegs'i, alt 248 biti ise kullanıcı pozisyon hash'ini temsil eder.
Geçirilen her tokenId için protokol, hash'ini hesaplar, alt 248 biti alır ve mevcut s_positionsHash değerinin alt 248 biti ile bit düzeyinde XOR işlemi gerçekleştirerek kullanıcı pozisyon hash'ini günceller.
Aynı zamanda countLegs, tokenId'nin sayısal aralığına göre ayarlanır: tokenId 'ün altındayken değişmez; , ve aralıklarında sırasıyla 1, 2 veya 3 artış gösterir. Bu değer son olarak s_positionsHash değerinin üst 8 bitine yazılarak numLegs güncellenir.
Güvenlik Açığı Analizi
Temel neden, sözleşmenin s_positionsHash oluşturma algoritmasındaki bir kusurdur; özellikle Keccak256 hash sonuçlarını toplamak için XOR işleminin kullanılması bu soruna yol açmaktadır. Tek bir hash fonksiyonu güvenli olmaya devam etse de XOR işleminin matematiksel doğrusallığı, genel parmak izi algoritmasını (yani hash'lerin XOR toplamını) güvensiz kılar [2].
Doğrusallık, bir saldırganın hash fonksiyonunu kendisini kırmasına (yani tokenId'yi hash'ten tersine çevirmesine) gerek olmadığı anlamına gelir. Bunun yerine kombinatoryal bir strateji kullanabilir: çok sayıda rastgele tokenId oluşturarak Keccak256(tokenId) hesaplar ve bu hash değerlerinden, tokenId hash'lerinin XOR toplamının hedef parmak iziyle tam olarak eşleştiği belirli bir alt küme seçer.
Bu sayede saldırgan, withdraw() çağrısında bir dizi sahte tokenId geçirerek sağlık kontrolünü atlayabilir ve s_positionsHash değerine karşılık gelen tüm teminatı geri alabilir.
Teori
Kullanıcının pozisyon parmak izi s_positionsHash değerinin kullanıcı pozisyon hash'inin , numLegs değerinin ise olduğunu ve kullanıcının tokenId'lerinin olduğunu varsayalım. Bu durumda:
Burada her 248-bitlik hash değeri 248 boyutlu bir vektör olarak görülebilir.
Dolayısıyla , 0 ve 1'lerden oluşan 248 boyutlu bir uzayda () yer alır. Bu uzayda XOR işlemi, vektör toplamaya eşdeğerdir (Ek I).
Saldırganın amacı, mevcut tüm vektörler arasından XOR toplamlarının alt 248 bitinin 'ye eşit olduğu adet 248 boyutlu vektör bulmaktır. Bu nedenle saldırganın hedefini bir doğrusal denklem sistemi olarak şu şekilde ifade edebiliriz:
Özellikle, 'yi doğrudan oluşturmaya çalışmamıza gerek yoktur. Bunun yerine adet doğrusal bağımsız hash vektörü (burada , boyut olan 248'e eşittir) seçer ve bunları sütun vektör olarak kullanarak boyutunda bir matrisi oluştururuz:
Problem artık şu şekilde dönüşür: şunu sağlayan bir katsayı vektörü bulmak:
Burada ve .
Doğrusal cebir teorisine göre, matrisi tam ranklı olduğu sürece tüm boyutlu uzayı kapsar. Bu, herhangi bir hedefi için denklem sisteminin benzersiz bir çözüme sahip olduğu anlamına gelir. için çözüm bulunduktan sonra, yalnızca olan vektörlerini tutmamız yeterlidir; bunların XOR toplamı 'ye eşittir.
Örnek
Anlayışı kolaylaştırmak için bu oluşturma sürecini bir örnek çalışmayla gösteriyoruz. Vektörlerin 3 boyutlu olduğunu, her boyutun yalnızca 0 veya 1'den oluştuğunu ve hedef hash değerinin 101, yani olduğunu varsayalım.
Ardından rastgele 3 hash değeri oluşturuyoruz:
Bu üç vektörü sütun olarak kullanarak matrisini oluşturuyoruz ve denklemini kuruyoruz:
Gauss eleme yöntemiyle çözersek elde ederiz. Bu, ve 'ü seçmemiz gerektiği ('e karşılık gelir) ve XOR toplamlarının hedef 'ye tam olarak eşit olduğu anlamına gelir.
n Adet Doğrusal Bağımsız Vektör Seçimi
Daha önce belirtildiği üzere, 'yi çözmek için tam ranklı bir matrisi oluşturmamız gerekir. Son derece büyük bir vektör uzayıyla () çalıştığımız göz önüne alındığında, temel soru şudur: Bu geniş uzaydan adet doğrusal bağımsız vektörü nasıl hızlıca seçeriz?
En basit yöntemi düşünelim: rastgele adet tokenId oluşturmak ve bunların hash sonuçlarını vektör olarak seçmek.
üzerinde, rastgele seçilen adet boyutlu vektörün tam ranklı bir matris oluşturma olasılığı :
büyük olduğunda (bu örnekte ), bu olasılık bir sabite yakınsar (Ek II):
Bu, her rastgele denemenin yaklaşık %28,9 başarı olasılığına sahip olduğu anlamına gelir. Ortalamada, bir saldırganın doğrusal bağımsız vektörler kümesi bulmak için yalnızca yaklaşık 3,5 denemeye ihtiyacı vardır. Bu nedenle hesaplama maliyeti son derece düşüktür ve saldırgan, koşulları sağlayan bir matrisini hızla oluşturabilir.
Üst 8 bitteki countLegs değerini kontrol etmek için, hedef countLegs değerine göre rastgele oluşturulan tokenId değerlerinin aralığını ayarlamamız yeterlidir.
Örneğin, sahte parmak izindeki numLegs değerinin 0 olmasını istiyorsak, oluşturulan adet rastgele tokenId'nin tamamının 'ten küçük olmasını sağlamamız yeterlidir. Bu aralıktaki tokenId'ler için bacak artışı 0 olduğundan, Gauss eleme çözümünün seçtiği vektörlerden bağımsız olarak, nihai birikimli numLegs değeri kaçınılmaz biçimde 0 olacaktır.
Saldırı Analizi
Beyaz şapkalı kurtarıcı birden fazla kurtarma işlemi başlattı. Basitlik açısından aşağıdaki tartışma yalnızca bu işlemlerden birine dayanmaktadır [3].
Temel mantık aşağıdaki 5 adımdan oluşmaktadır:
- Aave'den flash loan aracılığıyla 0,23e8 WBTC ve 28e18 WETH borç alınır.
- 0,23e8 WBTC ve 28e18 WETH, poWBTC sözleşmesine ve 0x1f8d_poWETH sözleşmesine yatırılır.
PanopticPoolsözleşmesininmintOptions()fonksiyonu, normal birpositionIdListile çağrılarak fon borç alınır ve kaldıraçlı bir pozisyon açılır.withdraw()çağrılarak sahtetokenId'ler geçirilir. Bu sahte pozisyonlarınpositionSizedeğeri 0 olduğundan fonksiyon,tokenRequireddeğerini 0 olarak döndürür; yani tüm pozisyonlar için gereken toplam teminat hatalı biçimde sıfır olarak hesaplanır. Bu arada, butokenId'lerin oluşturduğus_positionsHashdeğeri, 3. adımda oluşturulanla tam olarak aynıdır; bu da kurtarıcının herhangi bir borcu geri ödemeden tüm teminatı geri almasına olanak tanır.- Flash loan geri ödenir ve bir sonraki tur başlatılır.
Özet
Bu olay, yetkisiz teminat çekimine olanak tanıyan iki birleşik kusuru gün yüzüne çıkarmaktadır.
- XOR, hash'ler için güvenli bir toplama fonksiyonu değildir. Keccak256 çarpışmaya dirençlidir; ancak XOR'un doğrusallığı, birden fazla hash'in XOR toplamının bu özelliği miras alamayacağı anlamına gelir. Hash'leri herhangi bir hedef değerle XOR'layacak bir girdi kümesi oluşturmak, üzerinde bir doğrusal denklem sistemi çözümüne indirgenir; bu da hesaplama açısından son derece basittir. Hash kompozisyonu, çarpışma direncini koruyan işlemler gerektirmektedir; örneğin birleştirme ve ardından yeniden hash'leme gibi.
- Pozisyon ID'lerinin doğrulanmaması. Protokol, geçirilen
positionId'lerin geçerli opsiyon pozisyonlarına karşılık gelip gelmediğini doğrulamadı. 'ün altındaki değerler 0countLegsve 0positionSizetaşıdığından, sahte pozisyonlar borç oluşturmuyordu. Bu durum, saldırganın hedef parmak iziyle eşleşirken sıfır teminat gereksinimiyle sağlık kontrolünü geçmesine olanak tanıdı.
Referans
Ek
Aşağıdaki iki ek, ana metindeki ifadeler için matematiksel bir açıklama ve kanıt sunmaktadır: XOR işleminin vektör toplamaya eşdeğer olduğu (Ek I) ve rastgele bir matrisin tam ranklı olma olasılığı (Ek II).
Ek I
sonlu alanında toplama, modül 2 toplama olarak tanımlanır:
Bu işlemin Dışlayan VEYA (XOR, sembol ) mantıksal işlemiyle özdeş olduğu görülmektedir.
boyutlu vektör uzayı için (bu durumda ), ve iki vektörünün toplamı, bileşen bazında modül 2 toplama olarak tanımlanır:
Dolayısıyla vektör uzayında vektör toplamı, vektör bileşenleri üzerindeki bit düzeyinde XOR işlemine eşdeğerdir.
Ek II
Matrisin tam ranklı olabilmesi için bu vektörün doğrusal bağımsız olması gerekir.
İlk vektör , içinde sıfır vektörü dışında herhangi bir vektör olabilir; bu da seçenek sunar. İkinci vektör , tarafından gerilen alt uzayda yer almamalıdır; bu alt uzay vektör içerir ve seçenek bırakır. Bu mantığa göre 'inci vektör , önceki vektör tarafından gerilen alt uzayda yer alamaz; bu da olası seçenek sunar.
Bu tür matrislerin toplam sayısı (yani 'nin mertebesi) şöyledir:
Tüm olası matrislerin toplam sayısı ise 'dir.
Dolayısıyla olasılığı şöyle ifade edilir:
dönüşümüyle bu ifadeyi şu şekilde yeniden yazabiliriz:
iken bu çarpım bir sabite yakınsar:
Bu, büyük değerleri için rastgele bir matrisin tam ranklı olma olasılığının yaklaşık %28,9 olduğu anlamına gelir.
BlockSec Hakkında
BlockSec, tam yığın blok zinciri güvenliği ve kripto uyumluluk sağlayıcısıdır. Müşterilerin kod denetimi (akıllı sözleşmeler, blok zinciri ve cüzdanlar dahil) gerçekleştirmesine, saldırıları gerçek zamanlı olarak engellenmesine, olayları analiz etmesine, yasadışı fonları takip etmesine ve protokoller ile platformların tam yaşam döngüsü boyunca AML/CFT yükümlülüklerini karşılamasına yardımcı olan ürün ve hizmetler geliştiriyoruz.
BlockSec, saygın konferanslarda birden fazla blok zinciri güvenlik makalesi yayımlamış, DeFi uygulamalarının çeşitli sıfır gün saldırılarını raporlamış, 20 milyon dolardan fazlayı kurtarmak için birden fazla saldırıyı engellemiş ve milyarlarca dolarlık kripto para birimini güvence altına almıştır.
-
Resmi web sitesi: https://blocksec.com/
-
Resmi Twitter hesabı: https://twitter.com/BlockSecTeam



