Back to Blog

$17 Milyon Dolarlık Kapalı Kaynak Akıllı Sözleşme İstismarı: SwapNet ve Aperture Finance'teki Keyfi Çağrı Güvenlik Açığı

Code Auditing
January 28, 2026
6 min read

25 Ocak 2026'da, Ethereum, Arbitrum, Base ve BSC üzerinde SwapNet ve Aperture Finance tarafından dağıtılan kurban sözleşmelerini hedef alan bir dizi şüpheli işlem tespit ettik; toplam kayıp 17 milyon doları aştı. Genel hatlarıyla, her iki olayın da temel nedeni ilk uyarılarımızda [1, 2] açıkça belirtilmişti: kurban sözleşmeler, yetersiz girdi doğrulaması nedeniyle keyfi çağrı yapılmasına olanak tanıyan bir özellik sunmakta; bu durum saldırganların mevcut token onaylarını kötüye kullanmasına ve varlıkları boşaltmak amacıyla transferFrom fonksiyonunu çağırmasına imkân vermektedir.

Ancak her iki kurban sözleşme grubu da kapalı kaynaklıdır ve derleme tersine çevrildiğinde binlerce satır kod ile derin iç içe geçmiş ve karmaşık dallanma mantığına dönüşmekte; bu durum analiz güçlüğünü önemli ölçüde artırmaktadır. Üstelik, etkilenen projeler tarafından yayımlanan olay sonrası raporlar [3, 4] ağırlıklı olarak iyileştirme ve kurtarma çalışmalarına odaklanmış; altta yatan teknik ayrıntılara ise sınırlı ölçüde yer verilmiştir. Sonuç olarak, güvenlik açığı bulunan çağrı yollarının nasıl oluşturulduğu ve mevcut kontrollerin istismarı neden engelleyemediği gibi çeşitli önemli sorular yanıtsız kalmaktadır.

Bu raporda, derlenmiş bayt kodu ve zincir üstü yürütme izlerine dayalı daha ayrıntılı bir teknik analiz sunuyoruz. Kaynak kodun bulunmaması görünürlüğü kısıtlasa da bayt kodu düzeyindeki analiz, güvenlik açığı bulunan mantığı yeniden oluşturmak için yeterlidir ve üst düzey uyarılardan hemen anlaşılamayan sözleşme tasarımına ilişkin ilginç bulgular ortaya koymaktadır.

Analize önce SwapNet olayının derinlemesine incelenmesiyle başlıyor, ardından Aperture Finance olayının ayrıntılı analizine geçiyoruz.


SwapNet Olayı

Arka Plan

SwapNet [5] AMM'ler ve özel piyasa yapıcılar dahil olmak üzere birden fazla zincir üstü kaynaktan likidite toplayarak optimal takas rotaları bulmak amacıyla tasarlanmış bir DEX toplayıcısıdır. Protokol ayrıca kullanıcıların takasları gerçekleştirirken özel yönlendiriciler veya havuzlar belirlemesine olanak tanıyarak ek esneklik sunmaktadır.

Temel Neden Analizi

Bu olay, bir saldırganın keyfi parametrelerle transferFrom() çağrılarını tetiklemesine olanak tanıyan kullanıcı tarafından sağlanan girdilerin yetersiz doğrulanmasından kaynaklanmaktadır. Bunun sonucunda, daha önce kurban sözleşmelere (örn. 0x616000e384Ef1C2B52f5f3A88D57a3B64F23757e) onaylanmış varlıklar saldırgana aktarılabilmektedir.

Derlenmiş tersine çevrilmiş bayt koduna dayanılarak, 0x87395540() fonksiyonunun kritik girdiler üzerinde uygun doğrulamadan yoksun olduğu anlaşılmaktadır. Beklenen yönlendirici veya havuz adresinin bir token adresiyle (örn. USDC) değiştirilmesi durumunda sözleşme, token'ı geçerli bir yürütme hedefi olarak yanlış değerlendirmektedir. Bu durum, saldırgan tarafından kontrol edilen çağrı verisiyle düşük düzeyli bir çağrının gerçekleştirilmesiyle sonuçlanmaktadır.

Sonuç olarak, kurban sözleşme şu biçimde çağrılar gerçekleştirmektedir: approvedAsset.transferFrom(victim, attacker, amount); bu durum saldırganın onaylanmış tüm varlıkları ele geçirmesine olanak tanımaktadır.

Saldırı Akışı

SwapNet'e yönelik birden fazla saldırı gözlemlenmiştir. Burada örnek olarak Base işlemi 0xc15df1d131e98d24aa0f107a67e33e66cf2ea27903338cc437a3665b6404dd57 kullanılmaktadır.

Saldırgan, kurban sözleşmenin 0x87395540() fonksiyonunu kötü amaçlı girdilerle doğrudan çağırdı. Bu çağrı iki ana adımdan oluşmaktadır.

  1. Kilit bir iç değişken (örn. v51) USDC olarak ayarlandı ve böylece amaçlanan yönlendirme mantığı devre dışı bırakıldı.
  1. Saldırgan tarafından kontrol edilen çağrı verisi kullanılarak düşük düzeyli bir çağrı gerçekleştirildi; bu işlem USDC.transferFrom() fonksiyonunun çağrılmasına ve onaylanmış tüm USDC'nin boşaltılmasına yol açtı.

Kayıp Özeti, İşlemler ve Etkilenen Sözleşmeler

SwapNet olayı, birden fazla zincirde tahminen ~13,41 milyon dolar kayba yol açmıştır. Aşağıdaki tablolar, önemli istismar işlemlerini ve ilgili kurban sözleşme adreslerini özetlemektedir.


Aperture Finance Olayı

Arka Plan

Aperture Finance [6], kullanıcılar adına Uniswap V3 LP'leri gibi yoğunlaştırılmış likidite pozisyonlarını yöneten bir DeFi protokolüdür. Kapalı kaynaklı sözleşmeleri (örn. 0xD83d960deBEC397fB149b51F8F37DD3B5CFA8913), kullanıcıların yerel token'lar kullanarak Uniswap V3 pozisyonları oluşturmasına ve yönetmesine olanak tanımaktadır.

UniswapV3 Pozisyonları Oluşturmak için Amaçlanan İş Akışı

0x67b34120() fonksiyonu aracılığıyla Uniswap V3 pozisyonları oluşturulurken, sözleşme üç adımlı bir iş akışı izlemektedir:

  1. Yerel token'ları sarmalama

  2. Dahili 0x1d33() fonksiyonu aracılığıyla yerel token'ları takas etme

  3. UniswapV3 pozisyonları oluşturma

Sorun 2. Adımda ortaya çıkmaktadır: 0x1d33(), düşük düzeyli bir çağrı üzerinden özelleştirilmiş bir takas gerçekleştirmektedir; burada kritik parametreler (örn. çağrı hedefi ve çağrı verisi) kullanıcı tarafından kontrol edilebildiği ve yetersiz biçimde doğrulandığından, istem dışı harici çağrılara zemin hazırlamaktadır. Ayrıntılı bilgi aşağıdaki bölümlerde sunulmaktadır.

Temel Neden Analizi

SwapNet olayına benzer şekilde, Aperture Finance olayı da düşük düzeyli çağrılarda yetersiz girdi doğrulamasından kaynaklanmaktadır. 0x67b34120() çağrıldığında, dahili 0x1d33() fonksiyonu çağrı hedefi veya fonksiyon seçici üzerinde katı kısıtlamalar uygulamaksızın kullanıcı tarafından sağlanan çağrı verisini kullanarak düşük düzeyli bir çağrı gerçekleştirmektedir.

Aşağıdaki şekilde görüldüğü üzere, düşük düzeyli çağrıyı tetiklemek için kullanılan çağrı verisi tamamen saldırganın girdilerine dayanmaktadır.

Bu durum, saldırganların kurban sözleşmenin bağlamında approvedToken.transferFrom(victim, attacker, amount) çağrısının yürütülmesiyle sonuçlanan kötü amaçlı çağrı verileri oluşturmasına olanak tanımaktadır. Sonuç olarak, yalnızca ERC20 token'ları değil, onaylanmış Uniswap V3 pozisyon NFT'leri de ele geçirilebilmektedir.

Saldırı Akışı

Aperture Finance'e yönelik birden fazla saldırı gözlemlenmiştir. Bu bölümde, temsili bir örnek olarak Ethereum işlemi 0x8f28a7f604f1b3890c2275eec54cd7deb40935183a856074c0a06e4b5f72f25a kullanılmaktadır.

  1. Saldırgan, 0x5c92884dFE0795db5ee095E68414d6aaBf398130 adresinde bir saldırı sözleşmesi oluşturdu.

  2. Saldırı sözleşmesi, kötü amaçlı girdiler ve 100 wei ETH (yani msg.value == 100) ile 0x67b34120() fonksiyonunu çağırdı.

  • a) Yerel ETH'ler, WETH.deposit() fonksiyonu aracılığıyla WETH'e dönüştürüldü.
  • b) Düşük düzeyli bir çağrı gerçekleştirmek için dahili 0x1d33() fonksiyonu çağrıldı. Bu adımda, kurban sözleşmenin bağlamında WBTC.transferFrom(victim, attacker, amount) çağrısı tetiklenerek saldırganın onaylanmış token'ları ele geçirmesi sağlandı. Dikkat çekici bir husus olarak, 0x1d33() fonksiyonunun sonunda bir bakiye kontrolünün geçildiği belirtilmelidir. Daha ayrıntılı belirtmek gerekirse, 0x1d33() fonksiyonu bakiye değişikliklerini, saldırgan tarafından da belirlenen bir takas çıkış değeriyle (yani varg2.word2) karşılaştırdı. Sonuç olarak, hiçbir şey alınmaksızın başarıyla yürütüldüler.
  1. Son olarak, saldırgan için 100 wei WETH kullanılarak bir pozisyon oluşturmak amacıyla NonfungiblePositionManager.mint() fonksiyonu çağrıldı.

İlginç Bulgular

Normal ve anormal pozisyon oluşturma işlemleri karşılaştırıldığında, her ikisinin de aynı harcayıcıya (örn. OKX DEX: TokenApprove) onay verdiği ancak farklı yönlendirici adresleri (yani DexRouter ve WBTC) belirlediği gözlemlendi. Bu durum, sözleşmenin onay harcayıcısı üzerinde doğrulama uygularken gerçek yürütme hedefini doğrulamayı ihmal ettiğine işaret etmekte ve keyfi çağrılar yoluyla istismar edilebilecek kritik bir açık bırakmaktadır.

Normal işlem: https://app.blocksec.com/phalcon/explorer/tx/eth/0xc823b703c716fa9078e1d71714b734557bd540ddd1e41590dd73da7c5aba0200

Anormal işlem: https://app.blocksec.com/phalcon/explorer/tx/eth/0x8f28a7f604f1b3890c2275eec54cd7deb40935183a856074c0a06e4b5f72f25a

Kayıp Özeti, İşlemler ve Etkilenen Sözleşmeler

Aperture Finance olayı, birden fazla zincirde tahminen ~3,67 milyon dolar toplam kayba yol açmıştır. Aşağıdaki tablolar, önemli istismar işlemlerini ve ilgili kurban sözleşme adreslerini özetlemektedir.


Sonuç

SwapNet ve Aperture Finance olayları farklı protokolleri ve zincirleri etkilemiş olsa da her iki durumun temelinde yatan sorun karmaşık değildir: token onaylarına sahip sözleşmelerde kullanıcı tarafından kontrol edilen düşük düzeyli çağrılar ile yetersiz girdi doğrulaması. Bu olaylar, sözleşme tasarımındaki esnekliğin —özellikle harici incelemenin sınırlı olduğu kapalı kaynaklı sistemlerde— katı çağrı kısıtlamalarıyla dikkatli bir biçimde dengelenmesi gerektiğinin hatırlatıcısı niteliğindedir.

Referanslar

[1] https://x.com/Phalcon_xyz/status/2015614087443697738

[2] https://x.com/Phalcon_xyz/status/2015624519898234997

[3] https://meta.matcha.xyz/SwapNet-Incident-Post-Mortem

[4] https://x.com/ApertureFinance/status/2015938720453820752

[5] https://x.com/0xswapnet

[6] https://x.com/ApertureFinance

BlockSec Hakkında

BlockSec, tam kapsamlı bir blok zinciri güvenliği ve kripto uyumluluk sağlayıcısıdır. Müşterilerin kod denetimi gerçekleştirmesine (akıllı sözleşmeler, blok zinciri ve cüzdanlar dahil), saldırıları gerçek zamanlı olarak engellemesine, olayları analiz etmesine, yasadışı fonları takip etmesine ve protokollerin ile platformların tam yaşam döngüsü boyunca AML/CFT yükümlülüklerini yerine getirmesine yardımcı olan ürün ve hizmetler geliştiriyoruz.

BlockSec, prestijli konferanslarda birden fazla blok zinciri güvenliği makalesi yayımlamış, DeFi uygulamalarında çeşitli sıfır gün saldırıları raporlamış, birden fazla saldırıyı engelleyerek 20 milyonun üzerinde dolar kurtarmış ve milyarlarca dolarlık kripto para birimini güvence altına almıştır.

Best Security Auditor for Web3

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

BlockSec Audit