Back to Blog

~88 Milyon Dolar Kayıp: COLDCARD ve LULA Açıkları | BlockSec Haftalık

Code Auditing
August 5, 2026
9 min read
Key Insights

Geçen hafta (2026/07/27 - 2026/08/02) boyunca, toplam yaklaşık 88 milyon dolarlık kayba yol açan aşağıdaki 2 önemli güvenlik olayı öne çıkarılmaktadır.

Tarih Olay Tür Tahmini Kayıp
2026/07/29 LULA İş Mantığı Hatası ~578.000 $
2026/07/30 COLDCARD Hatalı Entropi Üretimi ~1.370 BTC (~88M $)*

* COLDCARD'ın kaybı, doğrulama yöntemine göre farklılık göstermektedir: gösterilen ~1.370 BTC (~88M $), kamuya açık biçimde doğrulanabilir zincir üstü minimumdur (coldcardwatch.com); özel kanal mutabakatı (Galaxy Research, 73 kurbanla yapılan yazışmalardan) daha yüksek bir rakama işaret etmekte olup, şüpheli ancak doğrulanmamış boşaltmalar da dahil edildiğinde yaklaşık 1.596 BTC ve ~2.055 BTC'ye (~130M $) kadar çıkmaktadır.

Seçim gerekçeleri

  • LULA: Bir AMM çiftinin bakiyelerini taşıyabilen ve rezerv yeniden senkronizasyonunu zorlayabilen ayrıcalıklı bir token fonksiyonu, fiyat manipülasyonu yoluyla tekrarlanabilir bir likidite boşaltma ilkeline dönüşmektedir.
  • COLDCARD: Cüzdan donanım yazılımındaki bir derleme ve entegrasyon hatası, tohum üretimini sessiz sedasız deterministik bir yazılım yedeğine yönlendirerek entropi garantilerini zedeledi ve tohum kurtarmayı büyük ölçekli fon kaybına dönüşen çevrimdışı bir aramaya indirgedi.

Web3 için En İyi Güvenlik Denetçisi

Lansmandan önce tasarımı, kodu ve iş mantığını doğrulayın

Haftanın Öne Çıkanı: COLDCARD

Bu haftanın öne çıkanı olarak COLDCARD'ı seçtik; zira bir cüzdan entropi hatası dönemin en büyük kaybına yol açtı. Temel neden olan, bir yapılandırma makrosunun var olup olmadığını kontrol eden ancak etkin olup olmadığını kontrol etmeyen derleme koruyucusu, işlevsel testlerin yakalayamayacağı türden sessiz bir entegrasyon hatasıdır ve bu ders, zincir üstü güvenliğin zincir dışı rastgeleliğe bağlı olduğu her sistem için geçerlidir.

Bitcoin donanım cüzdanı COLDCARD, 2021 yılında tohum üretimini amaçlanan donanım rastgele sayı üreteci (RNG) yerine deterministik bir yazılım kaynağı kullanarak gerçekleştiren bir donanım yazılımı yayımladı [1][2]. Hata, Temmuz 2026'nın sonlarına kadar büyük ölçekte istismar edilmedi; bu tarihte etkilenen cüzdanlar 30 Temmuz'dan itibaren zincir üstü dalgalar halinde boşaltıldı: kamuoyunca doğrulanan kayıplar en az 1.370 BTC (~88M $, 5 Ağustos'taki 64.099 $ fiyatıyla) [3] iken, özel olarak doğrulanan raporlar rakamı yaklaşık 1.596 BTC'ye kadar çıkarmaktadır [4]. Temel neden, tohum üretimini amaçlanan donanım RNG'si yerine yazılım yedeğine yönlendiren bir derleme ve yapılandırma hatasıydı. Etkilenen cihazlar için bu durum, tohum kurtarmayı kriptografik açıdan uygulanamaz bir problemden çevrimdışı bir aramaya dönüştürdü.

Arka Plan

COLDCARD bir Bitcoin donanım cüzdanıdır. Bir cüzdanın özel anahtarları ve adresleri tek bir gizli değerden, yani tohumdan türetilir; dolayısıyla herhangi bir öz-saklama cüzdanının güvenliği bu tohumun iki özelliğine dayanır: gizli kalması ve üretildiğinde tahmin edilemez olması. Donanım cüzdanları büyük ölçüde birincisini korumak için mevcuttur; bu olay ise ikincisinin başarısızlığıdır. BIP-39 tohum ifadesi insan tarafından okunabilir, ancak tahmin edilemezlik gereksiniminin altındaki güvenlik özelliği hâlâ oluşturmak için kullanılan rastgele baytların entropisidir. Bu baytlar yeniden üretilebilirse, tohum da yeniden üretilebilir. Sezgi şuna benzer: kombinasyonu zar atılarak seçilen bir kasa — zarlar yüklüyse, kasayı kilidi ne kadar güçlü olursa olsun, önyargıyı bilen herkes açabilir.

Bir cüzdan için "yüklü zarlar", zayıf bir rastgele sayı üreteci anlamına gelir. Donanım cüzdanlarının güvenli mikrodenetleyicilerindeki bir donanım gerçek-rastgele-sayı üreticisinden (TRNG) tohum entropisi alması beklenir; çünkü yazılım sözde-rastgele üreteci (PRNG) deterministiktir: iç durumu ve çağrı geçmişi bilindiğinde, çıktısı tam olarak yeniden oynatılabilir. Üreticinin çıktıları tahmin edilebilirse, aday aralığı sayılabilir ve bir adres, xpub veya açık anahtar gibi kamuya açık cüzdan verileriyle eşleştirilebilir; bu da tohum kurtarmayı kriptografik açıdan uygulanamaz bir problemden çevrimdışı bir aramaya indirger.

COLDCARD'ın donanım yazılımı iki ayrı RNG yüzeyi ortaya koyuyordu. MicroPython, cüzdanın kripto kütüphanesinin beklediği global rng_get() sembolünü açığa çıkaran bir STM32 platform katmanıyla birlikte gelirken, COLDCARD kendi kurula özgü donanım RNG sarmalayıcısını da sürdürdü. Her iki yüzey de donanım entropisi sağlamak üzere tasarlanmıştır ve cüzdanın kripto kütüphanesi, donanım yazılımı derlendiğinde çözümlenen tek bir global RNG sembolü aracılığıyla bunlardan birine ulaşır.

Güvenlik Açığı Analizi

Temel neden, MICROPY_HW_ENABLE_RNG yapılandırma makrosu etrafındaki bir derleme ve entegrasyon hatasıydı. COLDCARD'ın üretim kart yapılandırması bu makroyu 0 olarak ayarladı; çünkü donanım yazılımı MicroPython'ın donanım RNG uygulaması yerine kendi kurula özgü donanım RNG sarmalayıcısını kullanmayı amaçlıyordu. Ancak cüzdan üretme yolu ngu.random.bytes(32)'ye taşınmıştı ve kripto kütüphanesinin STM32 yolu sonuçta MicroPython tarafından çözümlenen global rng_get() sembolüne bağımlıydı.

Problem zinciri şuydu:

generate_seed()
  -> ngu.random.bytes(32)
  -> libngu CHIP_TRNG_32()
  -> rng_get()
  -> MicroPython STM32 RNG modülü
  -> MICROPY_HW_ENABLE_RNG == 0 olduğu için Yasmarang yazılım yedeği

Kart yapılandırması MicroPython'ın donanım RNG dalını devre dışı bıraktı:

// Bunun kendi versiyonumuz var.
#define MICROPY_HW_ENABLE_RNG (0)

Kripto kütüphanesi, rng_get() çağrısından önce yalnızca makronun var olup olmadığını kontrol ettiği için, makroyu yine de donanım RNG'nin yeterli kanıtı olarak değerlendirdi [5]:

extern uint32_t rng_get(void);
#define CHIP_TRNG_32() rng_get()

#ifndef MICROPY_HW_ENABLE_RNG
#error "lütfen bir HW TRNG edinin"
#endif

Bu koruyucu, tehlikeli durumu gözden kaçırır: 0 olarak tanımlanan bir makro hâlâ tanımlıdır, dolayısıyla #ifndef kontrolü geçer ve derleme başarıyla tamamlanır. MicroPython, RNG uygulamasını makronun varlığına değil değerine göre seçtiğinden, MICROPY_HW_ENABLE_RNG == 0 ifadesi rng_get()'i COLDCARD'ın kurula özgü sarmalayıcısı yerine yazılım yedek dalına yönlendirdi [6]:

#if MICROPY_HW_ENABLE_RNG
    // STM32 donanım RNG
#else
    // Yasmarang yazılım yedeği
#endif

Sonuçlar, cihaz nesline göre farklılık gösterir. Mk2/Mk3 donanım yazılımı v4.0.0-v4.1.9 için Block'un analizi [7], ngu.random'a hiçbir kriptografik entropi eklenmediğini belirtmektedir; bu nedenle yedek durumu ve çağrı geçmişi bilindiğinde cüzdan üretimi deterministik hale gelebilir (Coinkite'ın tavsiyesi [2], Mk2/Mk3 aralığını biraz daha dar biçimde v4.0.1-v4.1.9 olarak kapsamlandırmaktadır). Mk4/Q/Mk5 için güvenli öğe materyali özetlendi, ancak ngu.random.reseed() içine yalnızca dört bayt aktarıldı; bu da güvenli yeniden tohumlamayı tek bir 32-bit durum sözcüğüyle sınırlandırdı ve bu, kullanıcıların beklediği cüzdan entropisinden çok daha az etkili bir arama alanıdır. Son 32 rastgele baytın özetlenmesi, sonucun entropisi artıramaz; yalnızca zaten sınırlı olan aday kümesini dönüştürür.

Saldırı Analizi

Bir akıllı sözleşme açığından farklı olarak, bu olayın izlenecek tek bir zincir üstü saldırı işlemi yoktur. Çevrimdışı bir tohum kurtarma problemi ve ardından zincir üstü boşaltmalardan ibaretti. Ön koşul, etkilenen kullanıcıların cüzdan tohumlarını savunmasız ngu.random.bytes(32) yoluyla üretmiş olmalarıydı; böylece tohum materyalleri tam donanım entropisi yerine yeniden üretilebilir bir yazılım yedek durumuna bağımlıydı. Etkilenen cüzdanların yalnızca tohumdan türetilebilir olduğuna ilişkin ikinci, çıkarımsal bir ön koşul daha mevcuttur: güçlü ve benzersiz bir BIP-39 parolası, RNG hatasının hiç dokunmadığı PBKDF2 aracılığıyla bağımsız, kullanıcı tarafından sağlanan entropiyi karıştırır ve bu tür cüzdanları saf tohum sayımının dışında bırakır; boşaltmaların ölçeği, etkilenen kullanıcıların büyük çoğunluğunun böyle bir parola belirlemediğini göstermektedir. Buradan itibaren kurtarma işlemi büyük olasılıkla üç adımda ilerledi:

  1. Saldırgan, cihaz meta verileri, önyükleme zamanlaması, RTC/SysTick varsayımları ve makul RNG çağrı geçmişini kullanarak aday RNG durumlarını kısıtladı veya saydı.
  2. Her aday durum için saldırgan, aday cüzdan tohumları türetti ve bunları adresler, xpub'lar veya üretilen açık anahtarlar gibi kamuya açık cüzdan verileriyle çevrimdışı olarak karşılaştırdı.
  3. Bir aday gerçek bir cüzdanla eşleştiğinde, saldırgan tohumu kurtardı, özel anahtarları yeniden oluşturdu ve ilgili BTC'yi boşalttı.

Zincir üstünde, hırsızlık 30 Temmuz'dan itibaren başlayan bir adres boşaltma patlaması olarak ortaya çıktı. Bağımsız zincir üstü sezgisel izleme [3], doğrulanmış minimum olmak üzere 4.580 doğrulanmış adresten en az 1.370 BTC (5 Ağustos BTC fiyatı olan 64.099 $ üzerinden yaklaşık 88M $) boşaltan birkaç boşaltma dalgasını tespit etmektedir. Öte yandan 73 kurbanla yapılan yazışmalar yoluyla doğrulanan özel bir kanal [4], rakamı yaklaşık 1.596 BTC olarak verirken, şüpheli ancak doğrulanmamış boşaltmalar eklendiğinde 2.055 BTC'ye (~130M $) yükselmektedir.

Sonuç

COLDCARD olayı bir entropi üretimi başarısızlığıydı: güvenlik açısından kritik tohum üretme API'si, bir derleme koruyucusunun yapılandırma makrosunun etkin olup olmadığını değil, var olup olmadığını kontrol etmesi nedeniyle sessiz sedasız amaçlanan donanım RNG yerine deterministik bir yazılım PRNG yedeğine yöneldi. Etkilenen cihazlar için bu durum, tohum kurtarmayı kriptografik açıdan uygulanamaz bir problemden çevrimdışı bir aramaya dönüştürdü ve sonuç, birden fazla dalgada boşaltılan 1.370 BTC'den fazla oldu [3] (özel kanal tahminleri bunu yaklaşık 1.596 ila 2.055 BTC olarak vermektedir [4]).

Temel mühendislik başarısızlığı, gönderilen donanım yazılımının güvenlik açısından en kritik API'sinin gerçekten amaçlanan donanım RNG'sine ulaştığını hiçbir zaman kanıtlamamasıdır. Üç uygulama bunu yakalayabilirdi: kriptografik entropi için derleme koruyucuları hem makro varlığını hem de makro değerini kontrol etmelidir; entropi yedekleri sessizce bir yazılım PRNG ikame etmek yerine kapalı konumda başarısız olmalıdır; ve son donanım yazılımı görüntüsünün doğrulanması, yalnızca kodun derlendiğini değil, sembol kökenini ve uçtan uca entropi akışını kapsamalıdır. Etkilenen bir tohum yerinde düzeltilemez; fonları sabit donanım yazılımıyla oluşturulmuş bir cüzdana taşınmalıdır ve güçlü, benzersiz bir parola, tohumu onarmadan anlık maruziyeti azaltır [2].

Hata modu vurgulanmaya değer: bu tür rastgelelik hataları, üretilen her tohum ayrı ayrı geçerli olduğundan işlevsel testlere karşı görünmezdir. Kusur, herhangi bir tek çıktıda değil, bunları üreten kaynaktadır: bu kaynak tahmin edilebilir ve yeniden üretilebilir olduğundan, tohumlar kolektif olarak küçük ve sayılabilir bir aralığa düşer. Zincir dışı anahtar üretme bileşenleri, birinci sınıf güvenlik denetimine layıktır.

Kaynaklar

Phalcon Explorer ile Başlayın

Akıllıca Hareket Etmek için İşlemlere Dalın

Şimdi ücretsiz deneyin

Bu Haftanın Diğer Olayları

LULA

BNB Chain üzerindeki bir BEP-20 token'ı olan LULA, 29 Temmuz 2026'da token sözleşmesindeki bir iş mantığı hatasına kurban giderek yaklaşık 578.000 $ kaybetti. Saldırgan tarafından erişilebilen bir yol, ayrıcalıklı recycle() fonksiyonunu tetikleyerek Rental sözleşmesinin LULA'yı doğrudan PancakeSwap V2 çiftinden transfer etmesine ve ardından sync() çağırarak çiftin rezervlerini manipüle edilmiş bakiyelere güncellemesine olanak tanıdı. Saldırgan, çiftin LULA rezervini sıfıra yakın küçültmek için recycle()'ı defalarca tetikledi, ardından az miktarda LULA'yı neredeyse tüm USDT karşılığında geri takas etti [1].

Arka Plan

LULA, kiralama tabanlı ekip ödül mekanizmasına sahip BNB Chain üzerinde bir BEP-20 token'ıdır. Uygun adresler, bir Rental sözleşmesinde bekleyen ekip ödülleri biriktirir ve bunları claimTeamReward() aracılığıyla talep eder. Talep akışı sırasında Rental sözleşmesi, ödül dağıtımı için LULA elde etmek amacıyla token'ın recycle() fonksiyonunu çağırır. recycle(), rastgele kullanıcılar tarafından çağrılamaz; yalnızca Rental sözleşmesi bunu çalıştırmak için yetkilendirilmiştir.

claimTeamReward() giriş noktası bir "yalnızca EOA" kontrolü içermektedir. msg.sender == tx.origin koşulunun sağlandığı, harici olarak sahiplenilen hesaplardan gelen doğrudan çağrıları destekler ve ayrıca devredilmiş kod önekini inceleyerek EIP-7702 devredilmiş çağrılarını da destekler.

Bir otomatik piyasa yapıcısında (AMM), bir çift takasları depolanan rezervlerinden fiyatlandırır ve bu rezervler çiftin sync() fonksiyonu aracılığıyla güncellenir; bu fonksiyon rezervleri çiftin mevcut token bakiyelerine göre ayarlar. Rezervler normalde gerçek ticareti takip eder çünkü takaslar ve likidite olaylarıyla birlikte hareket ederler; ancak bir çiftin token bakiyesi doğrudan transfer yoluyla da değiştirilebilir ve sync(), mevcut bakiyeyi — manipüle edilmiş olsa bile — depolanan rezervlere kopyalar.

Güvenlik Açığı Analizi

Temel neden, LULA.recycle() fonksiyonunun Rental sözleşmesinin LULA'yı doğrudan PancakeSwap V2 çiftinden transfer etmesine ve ardından sync() çağırarak çiftin rezervlerini manipüle edilmiş bakiyelere güncellemesine izin vermesiydi [1].

sync(), rezervleri çiftte kalan LULA bakiyesine göre ayarladığından, bu ayrıcalıklı yol USDT tarafına dokunmadan çiftin LULA rezervini keyfi ölçüde düşürebilir. LULA rezervi sıfıra yaklaştığında, çift az miktarda LULA'yı neredeyse tüm USDT'si değerinde fiyatlandırır.

Saldırı Analizi

Aşağıdaki analiz, 0xa219ab9...411d7c işlemine dayanmaktadır.

  • Adım 1: Saldırgan, manipülasyonu finanse etmek için ~197,05M USDT biriktirdi. Fonlar, Moolah/Lista, Aave V3, Venus, PancakeSwap V3, PancakeSwap Vault, Uniswap V4 PoolManager ve Uniswap V3 dahil olmak üzere birden fazla flaş kredi ve borç kaynağından geldi.
  • Adım 2: Saldırgan, PancakeSwap V2 yönlendiricisi aracılığıyla büyük bir USDT -> LULA takası gerçekleştirmek için ~197,05M USDT kullandı. Bu, çiftin LULA rezervini yaklaşık 8M LULA'dan 24.022 LULA'ya keskin biçimde düşürürken USDT tarafını yaklaşık 197,64M USDT'ye yükseltti.
  • Adım 3: Saldırgan, birden fazla EIP-7702 cüzdanı aracılığıyla ödül yolunu başlattı. Her cüzdan Rental sözleşmesinde claimTeamReward()'u çağırdı; bu da LULA.recycle()'ı tetikleyerek çiftin LULA rezervini 24.022 LULA'dan 0,004 LULA'ya düşürdü; çift ise hâlâ çok büyük bir USDT tarafı tutuyordu.
  • Adım 4: Saldırgan, yönlendirici aracılığıyla son bir PancakeSwap V2 takası gerçekleştirerek çifte yalnızca ~4.749 LULA gönderdi ve ~197,64M USDT aldı.
  • Adım 5: Saldırgan tüm flaş kredileri geri ödeyerek yaklaşık 578.000 $ kâr etti.

Sonuç

BNB Chain üzerindeki LULA token'ı, token sözleşmesindeki bir iş mantığı hatası nedeniyle yaklaşık 578.000 $ kaybetti: saldırgan tarafından erişilebilen bir yol, ayrıcalıklı recycle() fonksiyonunu tetikleyerek Rental sözleşmesinin LULA'yı doğrudan PancakeSwap V2 çiftinden transfer etmesine ve ardından sync() çağırarak çiftin rezervlerini manipüle edilmiş bakiyelere yeniden senkronize etmesine olanak tanıdı. Saldırgan, çiftin fiyatını çarpıtmak ve az miktarda LULA'yı neredeyse tüm USDT karşılığında geri takas etmek için bunu defalarca tetikledi.

Bir token sözleşmesi, bir AMM çiftinin bakiyelerini taşıyabilen ve rezerv yeniden senkronizasyonunu zorlayabilen bir ayrıcalıklı yolu asla açığa çıkarmamalıdır; zira bu, fiyat kontrolünü o yola erişebilecek herkese teslim eder. AMM çiftleriyle entegre olan token'lar, çiftin rezervlerini gerçek, piyasa odaklı bakiye değişikliklerine bağlı tutmalıdır ve fiyatlandırma için havuz rezervlerini okuyan herhangi bir mantık, bunları otoriter değil, manipüle edilebilir olarak değerlendirmelidir.

Kaynaklar

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit