Back to Blog

Solana Ekosistemini Güvence Altına Alma (4) — Hesap Doğrulama

1 Nisan 2022
5 min read

0. İnceleme

1. Genel Bakış

Önceki blog yazısında, bir programın nasıl yükseltileceğini ele aldık. Bu yazıda, DeFi alanındaki en yaygın ve temel güvenlik konularından biri olan erişim denetimiyle ilgili sorunları tanıtacağız.

2. Talimatlar

Solana'da her program, entrypoint! ile tanımlanan tek bir entrypoint dışa aktarır. Ethereum'dan farklı olarak, istemciler yalnızca genellikle process_instruction olarak adlandırılan entrypoint olarak tanımlanmış tek bir işlevi çağırabilir. Entrypoint işlevi üç parametre alır. Bunlar; akıllı sözleşmenin program kimliği, programın üzerinde işlem yapacağı hesaplar ve talimat verisidir. Talimat verisi, hangi talimatın çağrılacağını belirtir. Aşağıdaki şekil bir örnek göstermektedir. Talimat verisini açarak farklı talimatlar (örn. Lock, Unlock) seçilir. Dolayısıyla, entrypoint'ten erişilebilen talimatlar herkese açıktır ve belirtilen talimat verisiyle çalıştırılabilir.

3. Hesap Doğrulama

Belirtildiği gibi, program okuma veya yazma yapması gereken hesapları alır. Bu tasarım iki soruyu beraberinde getirir. Okunacak hesaplar için, hesaplarda depolanan verilerin güvenilir olduğu nasıl garanti edilir? Yazılacak hesaplar için, yalnızca yetkili kullanıcıların hesaplara yazma talimatlarını çağırabildiği nasıl garanti edilir? Aşağıda erişim denetimi sorununu açıklıyoruz. Tüm test kodları burada bulunabilir.

3.1 Kod İncelemesi (PrivilegeOwner)

İlk olarak iki yapı tanımlıyoruz: Door ve Config. Yalnızca door yapısında belirtilen anahtar hesap (satır 17), oluşturulan door'u açabilir. Ancak, Config yapısında belirtildiği gibi (satır 81), sistem durumu kilitliyken kapı açılamaz.

Belirtildiği gibi, Config hesabı kapının açılıp açılamayacağını belirtir. Bu durumda, programda yalnızca bir Config hesabı olmalıdır. Bunu sağlamak için Config verilerini depolamak üzere PDA kullanıyoruz. Config hesabı başlatıldıktan sonra, saldırganlar tarafından tekrar başlatılamaması için is_initialized özniteliğini true olarak ayarlıyoruz (satır 108 - satır 110).

Open() talimatı kapıları açmak için kullanılır. Talimat; açılacak kapı hesabı, config hesabı ve door'u açmayı hedefleyen owner hesabı dahil olmak üzere birçok hesap alır. Kapının programa ait olduğunu ve yapılandırmanın geçerli olduğunu garanti etmek için door hesabının ve config hesabının sahibini kontrol ediyoruz (satır 204 - satır 205). Bu, kötü niyetli kullanıcıların sahte hesaplar beslemesini önler. Bu, birinci sorumuzu yanıtlar. Okunacak hesabın güvenilir olduğunu garanti etmek için hesabın sahibini kontrol etmemiz gerekir! Yalnızca door hesabının sahibinin kapıyı açabildiğini unutmayın. Bu durumda, sahip hesabının door'un gerçek owner'ı olup olmadığını ve daha da önemlisi talimatın sahip tarafından yetkilendirilip yetkilendirilmediğini kontrol ediyoruz (satır 217 - satır 219).

validate_owner() işlevinde, önce bu iki hesabın ortak anahtarlarının aynı olup olmadığını kontrol ediyoruz, ardından sahibin imzasını doğruluyoruz. Bu, ikinci sorumuzu yanıtlar: yalnızca yetkili kullanıcıların open talimatını çağırabildiğini garanti etmek için hesabın sahibini ve imzalayanı kontrol etmemiz gerekir. close talimatı open talimatına benzerdir ve ayrıntılar kodda bulunabilir.

Programı test ağına dağıttık ve aşağıdaki bağlantıdan erişilebilir.

https://explorer.solana.com/address/2Q7FFMWCthBvc6ubLQRx9TRswvaimmd66VaCAfHwsYuC?cluster=testnet

Tüm test işlemleri aşağıda listelenmiştir. Bu işlemin tüm süreci şöyledir: AllocatePDA()-> InitializeDoor()-> InitializeConfig()-> Unlock() -> Open() -> Close().

https://explorer.solana.com/tx/2X9CyMrHTNEvbzXTE95gem2j8spnvsQsabFeSpV8hiNpYjiQPPzLRqt5KN86ZYRjnQvydvs7y5eUjJK7no8knDhk?cluster=testnet
https://explorer.solana.com/tx/2XfVWiXeQeHbpqAEYm3AH2RU6hunnqtr155EC4EAM5Bq9VVZNP6QocAav9cPjEQdJFcQrbsSSxiKadr4HPMov8pz?cluster=testnet
https://explorer.solana.com/tx/5Em41sg7yFXeNpnEJnhUQJanfLWKwjMqiBeNAqEEzFrSN9P8zKKafcv5F7RKT2pseB171qeoa8Uz4fKgazzayCnW?cluster=testnet
https://explorer.solana.com/tx/2PMtzpSgjnKDLGmRWBdUSFBPimWnudCPekUYbWzPzokENFYa4N4ab4HCtynfGrzswFPTgGYKHU8PccUMHv3mXHkR?cluster=testnet
https://explorer.solana.com/tx/3kviP9MqkWGMV4yA7k7yPQ5BGfXmcYLcctmY1u2D7n56eT1nx8jMtDumkUNJy8yA3KkmzrmfQLjqpigc8ehGZzBN?cluster=testnet
https://explorer.solana.com/tx/38iEaJBzuGMLbfcszdVB8pkniezH8JrA3XGq7JdADZTQ4hNQC82GSTUA2bmcypdVy3t7htWnUzkZ4F8EakmNvqz8?cluster=testnet

3.2 Saldırı İşlemi

Sahip denetimi ve imzalayan denetiminin önemini göstermek için iki saldırı senaryosu örnek olarak kullanıyoruz.

Birinci Senaryo

Birincisi, config kilitliyken door sahibinin kapıyı açmaya çalışmasıdır. Bunu gerçekleştirmek için başka bir programda sahte bir config hesabı oluşturuyor ve is_lock özniteliğine false değerini atıyoruz. Özel programın kodu aşağıda gösterilmektedir.

Sahte config hesabını oluşturmak için işlemi gönderiyoruz; sahte config hesabının ortak anahtarı şudur: 2MtSrbWp24VjPZQcSUkiWrvNro7qqKemVCsh3Yxc8LTy.

https://explorer.solana.com/tx/2qSyrL5gdQXmgGCFzmzMm1StFQRkDgWpss9A9jV11q2fgDGM5C1XRuXvbX1N5Dt3q2pRqnmyXHVtXGF5dqadAzpJ?cluster=testnet

Sahte config hesabı oluşturulduktan sonra onu programa besliyoruz (satır 423).

Sonuç aşağıda gösterilmektedir; günlük incorrect program id for instruction mesajını yazdırır; bu, config hesabının sahibinin program olması gerektiği anlamına gelir. Dolayısıyla saldırgan bu denetimi atlayamaz.

İkinci Senaryo

İkinci senaryo, kötü niyetli bir kullanıcının kapı kilitli değilken kapıyı açmaya çalışmasıdır.

Bu durumda, gerçek sahip hesabını programa besliyoruz (satır 419) ve işlemi gönderiyoruz. Sonuç aşağıda gösterilmektedir.

Signature verification failed mesajı yazdırılır; bu, kapıyı açmak için gerçek sahibin işlemi imzalaması gerektiği anlamına gelir; dolayısıyla ikinci saldırımız da başarısız olur.

4. Özet

Solana'da talimatlar, istemciler veya diğer programlar tarafından beslenen farklı hesaplara dayalı olarak belirli mantığı uygular. Bu nedenle hesaplar üzerinde uygun denetim yapılması son derece önemlidir.

Bu makalede, hesabın nasıl düzgün şekilde kontrol edileceğini tanıtıyoruz ve bu denetimlerin önemini iki saldırı senaryosuyla örneklendiriyoruz. Takipte kalın; daha fazla makale paylaşılacaktır.

Bu serideki diğer makaleleri okuyun:


BlockSec Hakkında

BlockSec, 2021 yılında dünyaca tanınmış bir grup güvenlik uzmanı tarafından kurulan öncü bir blok zinciri güvenlik şirketidir. Şirket, kitlesel benimsenmesini kolaylaştırmak amacıyla gelişmekte olan Web3 dünyasının güvenliğini ve kullanılabilirliğini artırmaya kararlıdır. Bu doğrultuda BlockSec; akıllı sözleşme ve EVM zinciri güvenlik denetimi hizmetleri, tehditleri proaktif olarak geliştirmek ve engellemek için Phalcon platformu, fon takibi ve soruşturma için MetaSleuth platformu ve web3 geliştiricilerinin kripto dünyasında verimli şekilde gezinmesi için MetaSuites eklentisi sunmaktadır.

Bugüne kadar şirket, MetaMask, Uniswap Foundation, Compound, Forta ve PancakeSwap gibi 300'den fazla değerli müşteriye hizmet vermiş; Matrix Partners, Vitalbridge Capital ve Fenbushi Capital dahil olmak üzere önde gelen yatırımcılardan iki finansman turunda on milyonlarca ABD doları almıştır.

Resmi web sitesi: https://blocksec.com/

Resmi Twitter hesabı: https://twitter.com/BlockSecTeam

Sign up for the latest updates
BlockSec'in Ödeme Güvenliği Çözümü, Yapay Zekâ Çağında Kurumların Güvende Kalmasına Nasıl Yardımcı Oluyor?
Security Services

BlockSec'in Ödeme Güvenliği Çözümü, Yapay Zekâ Çağında Kurumların Güvende Kalmasına Nasıl Yardımcı Oluyor?

BlockSec'in güvenlik değerlendirmeleri, testler ve sürekli izleme yoluyla ödeme kuruluşlarının fonları korumasına, verileri güvence altına almasına ve dayanıklılıklarını artırmasına nasıl yardımcı olduğunu keşfedin.

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

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

Bu haftalık rapor, 19.10.2026–25.10.2026 tarihleri arasında Ethereum ve BNB Chain'de yaşanan iki güvenlik olayını ele alıyor. X100 Freezer'ın flaş krediyle finanse edilen yönetişim kontrolünün ele geçirilmesini ve BNB Chain'deki bir NEM tokeninin likidite havuzunu etkileyen vergi hesaplaşması kusurunu inceliyor. Raporun kapsamındaki tahmini kayıplar toplam yaklaşık 5,57 milyon USD: temsili X100 işleminden ~4,75 milyon USD, NEM havuzu olayından ise ~820 bin USD. Bu toplama, ayrıca bildirilen sonraki X100 fon çıkışları dahil değil.

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.