Back to Blog

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

April 1, 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