Sonsuz Mint Saldırısı Nedir ve Nasıl Çalışır?
Sonsuz mint saldırısı, bir token sözleşmesinin saldırgana geçerli yetki olmadan token oluşturmasına izin verdiği durumlarda, maksimum arzı zorlamadığı veya her ikisi de gerçekleştiğinde meydana gelir. Saldırgan rastgele bir bakiye mint eder, ardından yeni oluşturulan tokenları piyasalar ve entegrasyonlar tepki vermeden önce satar, takas eder, yatırır veya teminat altına alır.
Sonuç sadece enflasyon değildir. Sonsuz minting, bir tokenin borsa değerini yok edebilir, likidite havuzlarını boşaltabilir ve lending ya da treasury sistemlerinde teminatsız teminatlar oluşturabilir. Elrond, 2022-06-05 tarihinde Infinite Mint olarak sınıflandırılan bir olayda 113.0 milyon dolar kayıp yaşadığını kaydetmiş olup, kırık bir ihraç sınırının nasıl ekosistem seviyesinde kayıplara yol açabileceğini göstermektedir.
Sonsuz Mint Saldırısı Nedir ve Nasıl Çalışır?
Sonsuz mint saldırısı, güvenilir bir şekilde kimlerin ve ne kadar token mint edebileceğini kanıtlamayan bir token ihraç yolunu istismar eder. Bir kamuya açık veya yanlış korunmuş mint fonksiyonu, saldırgana protokol tarafından meşru kabul edilen ERC-20 tokenları gibi yaratılan bakiye oluşturma imkânı sağlar.
Bir mint fonksiyonu, yalnızca çağıranın yetkilendirilmesi, ihraç koşulları ve arz muhasebesi protokolün ekonomik tasarımıyla uyumluysa güvenlidir. Eğer herhangi bir çağırıcı _mint-benzeri mantığa ulaşabiliyorsa veya ayrıcalıklı bir çağırıcı arz sınırını aşabiliyorsa, tokenin kıtlığı sadece bir varsayımdır.
Tipik bir sonsuz mint saldırısı şu adımları izler:
- Saldırgan, dışardan çağrılabilir bir mint yolu veya aşılabilir erişim kontrolü tespit eder.
- Saldırgan, kendi kontrolündeki bir alıcı ve miktar ile fonksiyonu çağırır.
- Sözleşme, saldırganın bakiyesini ve genellikle
totalSupply‘yu artırır. - Saldırgan, mint edilen tokenları DEX havuzuna, lending piyasasına, köprüye veya vault’a aktarır.
- Yapay tokenleri gerçek varlıklarla takas eder veya bunları teminat olarak kullanır.
- Likidite sağlayıcılar, borç verenler ve token sahipleri ekonomik kayıpları üstlenir.
Sonsuz mint açıkları, özellikle başka sözleşmelerin, bu bakiyelerin nasıl oluşturulduğunu bağımsız olarak kontrol etmeden, token bakiyelerini kabul ettiği durumlarda son derece tehlikelidir. Bir lending protokolü, mint edilen tokenların amacına uygun ihraçlardan mı yoksa erişim kontrolü eksikliği nedeniyle mi mint edildiğini ayırt edemez.
Hangi Solidity Desenleri Sonsuz Mint Açıkları Yaratır?
Sonsuz mint açıkları genellikle eksik yetkilendirme, sınırlandırılmamış arz limitleri veya görünüşte doğru ama istenmedik bir yönetim yolu ile erişilebilir yetkilendirmeden kaynaklanır. Herhangi bir bakiyeyi artırabilecek fonksiyonları dikkatle inceleyin, doğrudan veya dolaylı olarak.
En bariz desen, çağırıcı sınırlaması olmayan bir kamu mint fonksiyonudur:
function mint(address to, uint256 amount) external {
balanceOf[to] += amount;
totalSupply += amount;
}
Aynı risk, yanlış kimlik kontrolü yapıldığında de oluşur. Örneğin, tx.origin kullanmak, mint yetkisini belirlemek için uygun değildir çünkü saldırgan, ayrıcalıklı bir cüzdanı kötü niyetli bir ara sözleşmeye çağırmaya ikna edebilir. Benzer şekilde, alıcının ayrıcalıklı olup olmadığını kontrol etmek, çağıranın token ihraç etmeye izinli olduğunu kanıtlamaz.
Diğer yaygın sebepler şunları içerir:
- Herhangi bir hesaptan çağrılabilen bir
setMinterfonksiyonu, saldırganların kendilerine ihraç hakları kazandırmasına olanak tanır. - Yükseltilebilir proxy’lerde, yükseltme yetkisi mint kısıtlamalarını değiştirebilir.
- Arbitrary mesajlara güvenen köprüler veya cross-chain işlemleri, yanlış veya kötü niyetli komutlar ile mint talimatlarını kabul eder.
- Bir mint fonksiyonunda uygulanan üst sınır, ödül talepleri veya göç işlemleri gibi diğer ihraç yollarında uygulanmaz.
- Nominal sınırı etkisiz hale getiren aritmetik veya birim dönüşüm hataları.
- Burn ve mint muhasebesinde, yanan tokenların gerçekten doğrulanmadığı durumlar.
Yalnızca totalSupply değişkeni arz kontrolü sağlamaz. Sözleşme, totalSupply + amount’un öngörülen maksimum arzı aşmasına izin vermeyen her mint işlemini reddetmelidir. Bu invariant, idari kurtarma, köprü mint, ödüller ve göçler gibi tüm ihraç yollarını kapsamalıdır.
Zafiyetli ve Düzeltildiği Solidity Kod Örnekleri Nedir?
Zafiyetli bir sonsuz mint sözleşmesi, sınırsız ihraç fonksiyonunu ortaya koyar. Herhangi bir dış hesap, istediği miktarda token mint edebilir ve maksimum arz sınırını aşmaz.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract ZafiyetliSonsuzMintToken {
string public constant name = "Zafiyetli Token";
string public constant symbol = "ZAF";
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
event Transfer(address indexed from, address indexed to, uint256 amount);
function mint(address to, uint256 amount) external {
// ZAFİYET: herhangi bir çağırıcı rastgele token oluşturabilir.
totalSupply += amount;
balanceOf[to] += amount;
emit Transfer(address(0), to, amount);
}
function transfer(address to, uint256 amount) external returns (bool) {
require(balanceOf[msg.sender] >= amount, "Yetersiz bakiye");
unchecked {
balanceOf[msg.sender] -= amount;
}
balanceOf[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}
}
Düzeltilmiş örnekte, yöneticiyi yetkili mintçilerden ayırır ve her bakiye artırımı öncesinde maksimum arz sınırı uygular. Sınır, yetkilendirme yerine geçmez ve yetkilendirme de sınır yerine geçmez. Her iki kontrol de farklı hataları önler:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract SınırliRolMintToken {
string public constant name = "Sınırlı Token";
string public constant symbol = "SNR";
address public immutable admin;
uint256 public immutable maxSupply;
uint256 public totalSupply;
mapping(address => bool) public isMinter;
mapping(address => uint256) public balanceOf;
event Transfer(address indexed from, address indexed to, uint256 amount);
event MinterGuncelle(address indexed minter, bool allowed);
modifier onlyAdmin() {
require(msg.sender == admin, "Yetki yok");
_;
}
modifier onlyMinter() {
require(isMinter[msg.sender], "Yetkili değil");
_;
}
constructor(uint256 maxSupply_) {
require(maxSupply_ > 0, "Sıfır sınır");
admin = msg.sender;
maxSupply = maxSupply_;
isMinter[msg.sender] = true;
}
function setMinter(address minter, bool allowed) external onlyAdmin {
isMinter[minter] = allowed;
emit MinterGuncelle(minter, allowed);
}
function mint(address to, uint256 amount) external onlyMinter {
// DÜZELTME: Yetkili ihraç, değiştirilemez sınırı aşamaz.
require(totalSupply + amount <= maxSupply, "Sınır aşıldı");
totalSupply += amount;
balanceOf[to] += amount;
emit Transfer(address(0), to, amount);
}
function transfer(address to, uint256 amount) external returns (bool) {
require(balanceOf[msg.sender] >= amount, "Yetersiz bakiye");
unchecked {
balanceOf[msg.sender] -= amount;
}
balanceOf[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}
}
Eğer protokolünüzde ödüller, köprüler, vault payları veya göçler yoluyla mint işlemi varsa, akıllı sözleşme denetimi ve güvenlik incelemesi her ihraç yolunun yetkilendirmesine ve arz invariantine geri dönerek giriş yapabilir.
Solidity’de Sonsuz Mint Saldırısını Nasıl Önlersiniz?
Sonsuz mint saldırılarını engellemek, katmanlı bir ihraç tasarımı gerektirir: açık yetki, zorunlu arz sınırları, dar yönetim yetkileri ve başka yolun token bakiyesi oluşturamayacağını kanıtlayan testler. Uygun tasarım, arzın sabit, sınırlandırılmış, emisyon bazlı, teminatlı veya köprü destekli olup olmamasına bağlıdır.
| Teknik | Neyi engeller | Gas veya karmaşıklık maliyeti | Sınırlama |
|---|---|---|---|
Rol kontrollü mint |
Rastgele dış çağrıcıların token mint etmesi | Rol kontrolü için depolama okuma | Bir yetkili mint, kendi yetkisinde kalabilir |
| Değiştirilemez maksimum arz | Tokenin öngörülen arzını aşmak | Her mintte bir aritmetik kontrol | Yetkili, sınırı erken aşabilir |
| Ayrı yönetici ve mint yetkileri | Bir mint yetkilisinin sessizce daha fazla yetki kazanması | Ek role yönetim kodu | Yönetici, en kritik güven sınırıdır |
| Çok imzalı veya zaman ayarlı yönetim | Tek anahtar ile mint veya ihraç yapılandırmasını değiştirme | Operasyonel gecikme ve yönetim maliyeti | Zaten dağıtılmış mint mantığını düzeltmez |
Merkezi iç _mint yolu |
Koşullu arz sınırlarının ihlal edilmesi | Yeniden yapılandırma çabası | Dış yolun her _mint’e ulaşması gerekir |
| Mint etkinliği izleme | Anormal ihraçların geç tespiti | Off-chain izleme altyapısı | İzleme, zaten oluşmuş kötü niyetli minti geri çeviremez |
Sabit arzlı tokenlar için en güçlü desen, genellikle dağıtımdan sonra tüm tahsisi mint etmek ve sonraki mintleri tamamen kaldırmaktır. Emisyon bazlı tokenlar için, ölçülebilir bir zaman çizelgesi belirleyin, toplam sınırı iç ihraç fonksiyonunda zorunlu kılın ve her dış fonksiyonun belirli bir yetkilendirme amacı olmasını sağlayın.
Soken metodolojisi, minting’i bir varlık yaratma sınırı olarak görür; kolaylık fonksiyonu değil. Her yol, token bakiyesini artırmak için yetki modeli, açıklıkla belirlenmiş ekonomik sınır ve test edilebilir invariant içermelidir.
Gerçekleşen Hangi Olaylar Sonsuz Mint Saldırısı Olarak Sınıflandırılmıştır?
Kayıtlı sonsuz mint olayları, token ihraç açıklarının, çeşitli zincirlerdeki hem yerleşik varlıkları hem de yeni protokolleri etkilediğini göstermektedir. Aşağıdaki olaylar, DefiLlama hack veritabanında Infinite Mint olarak sınıflandırılmıştır.
| Protokol | Tarih | Kayıp Miktar | Zincir |
|---|---|---|---|
| Elrond | 2022-06-05 | 113.0 milyon USD | Elrond |
| Paid Network | 2021-03-05 | 27.0 milyon USD | Ethereum |
| Gala | 2024-05-20 | 22.3 milyon USD | Ethereum |
| Haven Protocol | 2021-07-03 | 8.2 milyon USD | Haven |
| OcelotDex | 2024-09-20 | 4.9 milyon USD | Ethereum |
| TSR | 2026-06-01 | 2.5 milyon USD | BSC |
| Raydium AMM | 2026-06-10 | 1.3 milyon USD | Solana |
| Flooring Protocol | 2026-06-08 | 500 bin USD | Ethereum |
Bu olaylar, temel ekonomik bir özelliği paylaşır: desteklenmeyen tokenlar entegre bir piyasaya girdiğinde, saldırı token sözleşmesinin ötesine geçer. Likidite havuzları yapay arzı satın alır, lending piyasaları teminat olarak kabul edebilir ve köprüler veya vaultlar bakiyeyi daha fazla sisteme yayabilir.
Dolayısıyla, ilgili inceleme sorusu, “Bir saldırgan mint fonksiyonunu çağırabilir mi?” sorusundan daha geniştir. Asıl soru şudur: “Güvenilmeyen veya aşırı güvenilen herhangi bir yol, protokolün desteklenmeyen tokenları geçerli varlıklar olarak tanımalarına neden olabilir mi?”
Yayımlamadan Önce Sonsuz Mint Açığını Nasıl Tespit Edersiniz?
Sonsuz mint açıklarını tespit etmek, tüm bakiye artıran durum geçişlerini haritalandırmayı ve her geçişin yetkilendirilmiş ve öngörülen arz invariantini koruduğunu kanıtlamayı gerektirir. Manuel inceleme, başlangıçta token sözleşmelerinden başlamalı, ardından köprüler, vaultlar, ödül dağıtıcılar, yükseltme modülleri ve yönetici yardımcılarına devam edilmelidir.
İşte kontrol listesi:
- Bakiyelere, paylara, arz sayaçlarına ve iç mint fonksiyonlarına yapılan her yazmayı bulun.
- Her dış ihraç yolunun uygun çağırıcı yetkilendirmesine sahip olup olmadığını doğrulayın.
- Her yolun aynı sınır veya emisyon kısıtlamasını uyguladığından emin olun.
- Mintçileri ve yöneticileri ekleyen, kaldıran veya değiştiren fonksiyonları inceleyin.
- Yükseltme, köprü, göç ve geri çağırma yollarını izleyerek mint mantığına ulaşabilenleri takip edin.
- Yetkili hesapların beklenmedik şekilde sınırları, ihraçcıları veya muhasebe birimini değiştirebildiğinden emin olun.
- Mint olaylarının ve
totalSupply‘nun gerçek bakiye oluşturmayla uyumlu olup olmadığını doğrulayın. - Tokenı teminat, likidite veya vault varlıkları olarak kabul eden entegrasyonları test edin.
Slither, dışardan çağrılabilir fonksiyonları, ayrıcalıklı durum değişikliklerini ve şüpheli erişim kontrol desenlerini listelemek için faydalı olsa da, bir protokolün arz modelinin ekonomik olarak doğru olduğunu kanıtlayamaz. Dolaylı mint yolları ve çapraz sözleşme yetkisinde manuel akıl yürütme şarttır.
Foundry fuzzing, herhangi bir çağırıcının mint edemediğini ve arzın sınırı aşmadığını test edebilir. Invariant testleri özellikle etkilidir çünkü güvenlik özelliğini doğrudan ifade eder:
function invariant_supplyNeverExceedsCap() public view {
require(token.totalSupply() <= token.maxSupply(), "arz sınırı aşıldı");
}
İkinci bir invariant, yalnızca onaylı aktörlerin arzı artırabileceğini doğrular. Soken inceleme metodolojisinde, bu özellik tüm genel fonksiyonlar üzerinde test edilir, yalnızca mint isimli fonksiyonla sınırlı değildir. Erişim kontrolü ve sözleşme riskleri hakkında daha fazla araştırma için Soken Hub sitesini ziyaret edebilirsiniz.
Güvenlik ipucu: Soken metodolojisi, her yeni token birimini, protokol tarafından oluşturulan bir yükümlülük olarak kabul eder. Sözleşme, bu yükümlülüğü kim onayladı ve neden ihraç modelinde kaldığını kanıtlayamazsa, mint yolü güvenlik sınırını aşan ve yeniden tasarımı gerektiren bir alan olur.
Rol kontrolü ve arz sınırı, sınırsız ihraçı sınırlandırılmış, sorumlu bir işleve dönüştürür, ama yalnızca tüm mint route’ları bunları kullanıyorsa. Kritik mühendislik görevi, bakiye oluşturmayı merkezi hale getirmek ve bypass’leri mühendislik yapısıyla imkânsız hale getirmektir.
Yayın veya yükseltmeden önce, tasarlanan arz invariantini basit bir dille yazın, ortak mint yolunda uygulayın ve Foundry invariant testleri ile zorunlu kılın.