Back to Blog

Yaklaşık 5,57 milyon USD Kayıp: X100 Freezer ve NEM İstismarları | BlockSec Haftalık Bülteni

Code Auditing
29 Ekim 2026
9 min read
Key Insights
  • İki olay: Sonraki X100 varlık çıkarımları hariç, kapsam dahilindeki kayıplar ~5,57 milyon USD.

  • NEM: hatalı vergi hesaplaşması.

  • X100: Yeni stake'ler anında oy gücü kazandı; tekliflerin uygulanması için zaman kilidi yoktu.

Geçtiğimiz hafta (19.10.2026–25.10.2026), bu rapor, tahmini kayıpları toplamda yaklaşık 5,57 milyon USD olan iki güvenlik olayını takip etti. Ayrıntılı analiz, Ethereum'da X100 Freezer'ın yönetişiminin ele geçirilmesine odaklanıyor.

Tarih Olay Tür Tahmini Kayıp*
21.10.2026 NEM Token Hatalı İş Mantığı ~820 bin USD
24.10.2026 X100 Freezer Hatalı Yönetişim Tasarımı ~4,75 milyon USD

*Kayıplar yaklaşık değerlerdir. X100 Freezer için verilen tutar, aşağıda incelenen temsili işlemi kapsar ve Phalcon'un ilk tahminiyle örtüşür; toplam tutara, ayrıca bildirilen sonraki varlık çekimleri dahil değildir. NEM için verilen tarih, zincir üstü işlemin tarihidir; kamuya açık uyarı 22 Ekim'de yayımlandı [1].

  • X100 Freezer: Bu olay, yönetişime katılma hakkının anında yürürlüğe girmesi ile yürütme için bir zaman kilidinin bulunmamasının birleşik riskini gösteriyor: Saldırgan, flash krediyle alınan fonları token satın alıp dondurmak için kullandı, Senato sandalyelerinin çoğunluğunu hemen elde etti ve kötü amaçlı bir hazine teklifini aynı işlem içinde kabul ettirip yürüttü.

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 Olayı: X100 Freezer

24.10.2026 tarihinde, Ethereum üzerindeki zincir üstü staking ve likidite yönetim sistemi X100 Freezer, burada incelenen işlemde yaklaşık 4,75 milyon USD tutarında kayba yol açan bir saldırıya uğradı. Hatalı bir yönetişim tasarımı, yeni edinilip dondurulan bakiyelerin hemen Senato sandalyesi kazandırmasına olanak tanıyordu; teklifin onaylanması ile yürütülmesi arasında da bir zaman kilidi yoktu. Saldırgan üç sandalyeden ikisini ele geçirdi, hazine takasını kendi kontrolündeki bir havuza yönlendirdi ve flash krediyi geri ödeyip kâr elde etmek için elde ettiği tokenların bir kısmını sattı [2].

Arka Plan

X100 kullanıcıları, ödül kazanmak için X tokenlarını kademeli staking pozisyonlarında dondurur. 0x79f3...2a46 adresindeki Freezer sözleşmesi, projenin Uniswap V3/V4 ve PancakeSwap V3 üzerindeki likiditesini de yönetir. DexTreasury üzerinden Senate yönetişim sözleşmesinden özellik devralır; Senato, teklif ve oylar yoluyla hazine işlemlerine karar verir.

Herkese açık freeze() giriş noktası, kullanıcının tokenlarını sözleşmeye aktarır; ardından bir staking pozisyonu oluşturmak ve bunun muhasebe kayıtlarını güncellemek için özel _freeze() fonksiyonunu çağırır. _tierTotal[owner][tier], her hesabın her kademede dondurduğu miktarı kaydeder. _freeze() bu bakiyeleri günceller ve _onStakeChanged(owner) aracılığıyla yönetişim sistemini bilgilendirir:

function _freeze(address owner, uint8 tier, uint256 amount) private returns (uint256 id) {
    _settle(owner);

    Account storage account = _accounts[owner];
    if (account.firstFreezeAt == 0) {
        account.firstFreezeAt = block.timestamp;
    }

    id = _create(owner, tier, amount, block.timestamp, block.timestamp);

    _tierTotal[owner][tier] += amount;
    totalFrozen += amount;
    totalFrozenIn[tier] += amount;
    _onStakeChanged(owner);

    emit Frozen(id, owner, tier, amount);
}

Bir hesap, Senato aday listesine katılmak için applyForSenate() fonksiyonunu çağırır. Bu çağrı, kaydı oluşturan, adaylık ücretini tahsil eden ve aynı stake güncelleme kancasını çağıran _register() fonksiyonunu çalıştırır:

function _register(address account) internal {
    require(!_registered[account], AlreadyRegistered(account));

    _registered[account] = true;
    _collectCandidacyFee(account);

    emit Registered(account);

    _onStakeChanged(account);
}

Kanca, kayıtlı olmayan hesapları atlar. Kayıtlı hesaplar için, hesapları _link() aracılığıyla ekleyerek veya taşıyarak dondurulmuş bakiyelere göre sıralanan bir liste tutar. isSenator(), bu listedeki ilk senateSize hesabı senatör olarak belirler. Sistem, her sandalyenin bir oy hakkı taşıdığı 3 ila 21 sandalyeyi destekler. Dondurulan tokenlar, _unfreezeAt() tarafından pozisyonun frozenAt zaman damgası ve staking kademesi kullanılarak hesaplanan bir çekim süresine tabidir.

Bir senatör, izin verilen bir hazine işlemini propose() aracılığıyla teklif eder; bu fonksiyon teklifi kaydeder ve teklif sahibinin destek oyunu otomatik olarak kullanır. Diğer senatörler oylarını vote() aracılığıyla kullanır; _tally() ise mevcut sandalyeler arasındaki destek oylarını sayar. Teklif, oluşturulma zamanını ve varsayılan değeri üç gün olan votingPeriod tarafından belirlenen son tarihi kaydeder.

v3Swap() gibi hazine fonksiyonları, DexTreasury._isProposable() içinde izin verilen teklif hedefleridir. Bunların onlySenate değiştiricisi, çağrının sözleşmenin kendisinden gelmesini gerektirir. Yürütme yolu, onaylanan teklif verilerini kullanarak sözleşmenin kendisine bu çağrıyı yapar. Ardından Freezer._afterExecute(), kalan X bakiyesinin totalFrozen değerini karşıladığını kontrol ederek dondurulmuş toplam ana parayı korur.

Güvenlik Açığı Analizi

Freezer'ın hatalı yönetişim tasarımında, yeni edinilen stake'in Senato yetkisi kazandırmasından önce bir bekleme süresi ve onaylanmış bir teklifin yürütülmesinden önce bir zaman kilidi yoktu.

İlk olarak, sıralamada kullanılan stake doğrudan güncel dondurulmuş bakiyelerden gelir. _stakeOf(), stake'in ne kadar süredir tutulduğunu kontrol etmeden veya geçmiş bir bakiyeyi okumadan _tierTotal değerlerini toplayan frozenOf() fonksiyonunu çağırır:

function _stakeOf(address account) internal view override returns (uint256) {
    return frozenOf(account);
}

function frozenOf(address owner) public view returns (uint256 total) {
    total = 0;
    for (uint8 tier = 0; tier < TIERS; ++tier) {
        total += _tierTotal[owner][tier];
    }
}

Yukarıda gösterilen yatırma ve kayıt yolları, katılma hakkını aynı çağrı dizisi içinde günceller. _freeze() pozisyon için zaman damgalarını kaydetse de sıralama ve senatör kontrolleri, asgari bir elde tutma süresi uygulamak için bunları kullanmaz. Bu nedenle, yeterli fona sahip yeni bir aday aynı işlem içinde bir sandalye elde edip teklif sunma ve oy kullanma haklarını kullanabilir. Token çekim süresi, bu yönetişim haklarını geciktirmez.

İkinci olarak, üç günlük oylama süresi yalnızca bir teklifin ne zaman sona ereceğini belirler. _state(), teklif oluşturulur oluşturulmaz Open değerini döndürür; teklif yürütülene, iptal edilene veya süresi dolana kadar bu durumda kalır. Çoğunluk kontrolü, geçen süreden bağımsızdır:

function _state(Proposal storage proposal) private view returns (ProposalState) {
    if (proposal.executed) {
        return ProposalState.Executed;
    }
    if (proposal.cancelled) {
        return ProposalState.Cancelled;
    }
    if (block.timestamp > proposal.deadline) {
        return ProposalState.Expired;
    }
    return ProposalState.Open;
}

function _isPassed(uint256 support) private view returns (bool) {
    return support * 2 > senateSize;
}

execute(), bir açık öneriyi destekleyen oylar senateSize değerinin yarısını aşar aşmaz kabul eder. Hazine işlemini çağırmadan önce ne createdAt tarihinden itibaren asgari bir süre geçip geçmediğini ne de onaydan sonra bir bekleme süresi olup olmadığını kontrol eder:

function execute(uint256 id) external {
    Proposal storage proposal = _requireOpen(id);

    uint256 size = senateSize;
    (uint256 support, address[] memory seats) = _tally(id);
    require(_isPassed(support), NotPassed(id, support, size));

    proposal.executed = true;

    (bool ok, bytes memory result) = address(this).call(proposal.data);
    if (!ok) {
        assembly ("memory-safe") {
            revert(add(result, 32), mload(result))
        }
    }

    _afterExecute(id);

    emit ProposalExecuted(id, _msgSender(), support, size, seats);
}

Sözleşmenin kendisine yaptığı çağrı onlySenate koşulunu karşılar; dolayısıyla hazine erişim kontrolü yürütmeye herhangi bir gecikme eklemez. Sondaki dondurulmuş anapara kontrolü, önerinin ne zaman yürütüleceğini kısıtlamaz veya hazine takasının asgari getirisini zorunlu kılmaz. Bu koşullar, yeni elde edilen bir çoğunluğun tek bir işlem içinde bir hazine işlemini yetkilendirip yürütmesine olanak tanır.

Saldırı Analizi

Aşağıdaki analiz 0x38c608...4d81d0 işlemine dayanmaktadır.

  • Adım 1: Saldırgan, flaş krediyle ödünç aldığı fonları kullanarak X tokenları satın aldı ve bunları kontrol ettiği iki sözleşmeye dağıttı. Ödünç alınan fonlar, iki staking pozisyonunu oluşturacak token alımını finanse etti.

  • Adım 2: Kontrol edilen sözleşmelerin her biri, elindeki X tokenları Freezer'da dondurdu ve applyForSenate() çağrısını yaptı. İşlem izi, her iki sözleşmenin de kayıt sonrasında bir Ranked olayı aldığını gösteriyor. Dondurulmuş bakiyeleri, işlem içinde iki Senato üyeliği elde etmelerini sağladı. Saldırı sırasında Senato'da üç üyelik vardı; dolayısıyla ikisini kontrol etmek, bir hazine önerisini geçirmek için gereken çoğunluğu sağlıyordu.

  • Adım 3: Saldırgan bir PancakeSwap V3 X/USDT havuzu oluşturdu ve havuza likidite sağladı. Kontrol ettiği sözleşmelerden biri bir hazine takası önerdi ve otomatik olarak destek oyu kullandı; diğeri ise ikinci destek oyunu kullandı. Çoğunluk eşiğine ulaşılınca Freezer, 7 numaralı öneriyi yürüttü. v3Swap() çağrısında girdi olarak 400.000 X ve amountOutMinimum = 0 belirtildi. Hazine yalnızca yaklaşık 35,68 USDT aldı. İşlem izinde yer alan votesFor = 2 ve senateSize = 3, elde edilen çoğunluğun işlemi yetkilendirdiğini gösteriyor.
  • Adım 4: Saldırgan, hazinenin X tokenlarını geri almak için yeni oluşturduğu PancakeSwap V3 havuzundan likidite çekti. Bu tokenların bir kısmını mevcut Uniswap V3 X/USDT havuzunda sattı ve flaş krediyi geri ödedi. Geri ödemenin kaynağı, dondurulmuş staking pozisyonlarından hemen yapılan bir çekim değil, sonrasında gerçekleştirilen satıştı.

Phalcon Explorer ile Başlayın

Bilinçli Hareket Etmek İçin İşlemleri Derinlemesine İnceleyin

Şimdi ücretsiz deneyin

Sonuç

Olay, kusurlu yönetişim tasarımından kaynaklandı: mevcut dondurulmuş bakiyeler derhâl yetki sağlıyor ve onaylanan öneriler bir zaman kilidi olmadan yürütülebiliyordu. Saldırgan, flaş kredinin geri ödenmesi gerekmeden önce çoğunluğu elde etmek ve kullanmak için bu koşulları bir araya getirdi. Ardından hazine, saldırganın kontrolündeki PancakeSwap V3 havuzu üzerinden 400.000 X tokenı yaklaşık 35,68 USDT karşılığında sattı. Saldırgan, hazinenin tokenlarını geri almak için bu havuzdan likidite çekti, tokenların bir kısmını ayrı bir havuz olan mevcut Uniswap V3 X/USDT havuzunda sattı ve elde ettiği geliri flaş krediyi geri ödeyip kâr elde etmek için kullandı.

Yönetişim, staking pozisyonları için asgari bir yaş şartı getirmeli veya üyelik uygunluğunu ve oy haklarını mevcut işlemden önceki bir blokta alınmış geçmiş bakiye anlık görüntüsüne göre belirlemelidir. Bu, işlem içinde finanse edilen pozisyonların hazine varlıklarının hareketini derhâl yetkilendirmesini önler. Onay ile yürütme arasındaki bir zaman kilidi, kontrolü ele geçirme ve varlıkları çıkarma sürecinin tamamının tek bir işlem içinde sonuçlanmasını önlemeli ve kötü niyetli bir öneriyi incelemek veya iptal etmek için zaman tanımalıdır. Bu kontroller, yönetişim sürecinin farklı aşamalarını ele alır ve akıllı sözleşme denetimi sırasında birlikte değerlendirilmelidir.

Kaynaklar

[1] BlockSec Phalcon: NEM Token olay analizi

[2] BlockSec Phalcon: X100 Freezer yönetişim olayı analizi

Ücretsiz Güvenlik Taraması

Kendi geliştirdiğimiz otomatik analiz motoruyla hızlı bir güvenlik incelemesi.

Ücretsiz tarayın

BlockSec Hakkında

BlockSec, uçtan uca hizmet sunan bir blokzincir güvenliği ve kripto uyum sağlayıcısıdır. Müşterilerin protokol ve platformların tüm yaşam döngüsü boyunca kod denetimi (akıllı sözleşmeler, blokzincirler ve cüzdanlar dâhil) yapmasına, saldırıları gerçek zamanlı olarak durdurmasına, olayları analiz etmesine, yasa dışı fonları izlemesine ve AML/CFT yükümlülüklerini yerine getirmesine yardımcı olan ürün ve hizmetler geliştiriyoruz.

BlockSec, saygın konferanslarda blokzincir güvenliği üzerine birden fazla makale yayımladı, DeFi uygulamalarına yönelik birkaç sıfırıncı gün saldırısını bildirdi, 20 milyon USD fazla varlığı kurtarmak için birden fazla saldırıyı engelledi ve milyarlarca tutarında kripto varlığı güvence altına aldı.

Sign up for the latest updates
Yaklaşık 3,87 milyon USD kayıp: Autheo Network ve UNCX saldırıları | BlockSec Haftalık Bülteni
Security Insights

Yaklaşık 3,87 milyon USD kayıp: Autheo Network ve UNCX saldırıları | BlockSec Haftalık Bülteni

Bu haftalık rapor, 12.10.2026–18.10.2026 tarihleri arasındaki 3 güvenlik olayını ve toplamda yaklaşık 3,87 milyon USD tutarındaki tahmini kaybı ele alıyor. Autheo Network, yaklaşık 1,76 milyon USD tutarında kayba yol açan bir özel anahtar ele geçirilmesi olayı yaşadı; Qubic Wallet, zayıf seed oluşturma nedeniyle yaklaşık 1,30 milyon USD kaybetti. UNCX Network’ün Smart Token Vesting V2 sözleşmelerinde ise Ethereum, BNB Chain, Base ve Robinhood Chain üzerinde yaklaşık 807 bin USD tutarında bir muhasebe hatası meydana geldi. Öne çıkarılan UNCX analizi, hatalı toplam pay hesaplamasının farklı token/pay oranlarıyla oluşturulan hak ediş dilimlerini nasıl birbirine karıştırdığını ve ortak havuzlardan hak edilenden fazla çekim yapılmasına nasıl olanak tanıdığını açıklıyor.

~542 bin dolar kayıp: MakerDaoBot Açığı | BlockSec Haftalık Bülteni
Security Insights

~542 bin dolar kayıp: MakerDaoBot Açığı | BlockSec Haftalık Bülteni

Ethereum'da 2026/10/05-2026/10/11 döneminde 1 güvenlik olayı yaşandı; kayıp yaklaşık 542 bin $. Kötü amaçlı adaptör, erişim kontrolü olmayan MakerDaoBot işleviyle botun MakerDAO bakiyelerinde yetki aldı; 4 eski ETH-A ihalesini kapatıp 200 ETH-A teminatını WETH'ye çevirdi. WETH, 200 ETH olarak saldırgana gönderildi.

~418M$ Kayboldu: Bitget, NEAR Intents İstismarları | BlockSec Weekly
Security Insights

~418M$ Kayboldu: Bitget, NEAR Intents İstismarları | BlockSec Weekly

Bu iki haftalık güvenlik raporu, 21 Eylül-4 Ekim 2026 arasında Ethereum, BNB Chain, Solana, Bitcoin, TRON, XRP Ledger, Zcash, Avalanche, NEAR ve ilgili ağlarda ~418,4M$ zararla sekiz olayı kaydeder. Analiz, Bitget'in 387,5M$'lık üçüncü taraf güvenlik ürünü açığını ve NEAR Intents'in 3,87M$'lık iade doğrulama hatasını kapsar.

Best Security Auditor for Web3

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

BlockSec Audit
Yaklaşık 5,57 milyon USD Kayıp: X100 Freezer ve NEM İstismarları | BlockSec Haftalık Bülteni