Back to Blog

Cashio Uygulaması Güvenlik Olayının Yeniden İncelenmesi

Code Auditing
May 16, 2022
5 min read

23 Mart 2022 16:20:08 UTC+8'de başlayan saldırıda CashioApp, yaklaşık 52 milyon dolar kayıpla teminat token hesabını boşaltmak amacıyla istismar edildi. Saldırı, saldırganın herhangi bir yatırım yapmadan 20 milyar $CASH token basmasına olanak tanıyan yetersiz girdi hesabı doğrulaması nedeniyle mümkün oldu. Aşağıda teknik ayrıntıları aktarıyoruz.

Özet

Olay, Saber LP Arrows teminatıyla $CASH tokenlarının basılması ve yakılmasını yönetmek üzere tasarlanmış Brrr programındaki bir hatadan kaynaklandı. Özellikle kullanıcılar, Arrow LP tokenları yatırarak $CASH basabilmektedir. Arrow LP token'ın, temel token olarak Saber LP token aldığını belirtmek gerekir. $CASH basabilen print_cash talimatı, Bank hesabı ve Collateral hesabı dahil bir hesap listesi alır. Bu hesaplar, $CASH basımında kullanılmasına izin verilen teminatı (yani Arrow LP tokenlarını) kaydetmek ve takip etmek için kullanılır. Tasarım gereği bu iki hesabın yalnızca yönetici tarafından başlatılması ve yetkilendirilmesi gerekir. Ancak program, Bank hesabının geçerliliğini kontrol etmekte başarısız olur. Sonuç olarak, saldırgan print_cash talimatına beslemek için bir dizi sahte hesap (Bank hesabı dahil) oluşturabilir ve neredeyse bedavaya $CASH basabilir (tek maliyet işlem ücretleridir).

Ayrıntılar

Analize aşağıdaki print_cash talimatının kullanılan hesaplarından başlayalım.

common özniteliği (satır 75), programdaki türü BrrrCommon olan bir yapıdır. BrrrCommon'da bank hesabı ve collateral hesabı yönetici tarafından başlatılır ve yetkilendirilir. crate_token, crate_mint'in genel anahtarı (satır 107), yönetici rollerinin genel anahtarları ve daha fazlası gibi $CASH hakkındaki bilgileri depolayan $CASH token hesabıdır. crate_collateral_tokens, kullanıcılardan aktarılan teminat tokenlarını tutan bir kasa hesabıdır. Teminat, Saber'ın LP tokenlarını alan Arrow LP tokenları olması gerektiğinden, kullanıcıların saber_swap'ın ilgili hesaplarını girmesi gerekir. BrrrCommon yapısındaki son iki öznitelik, talimatta kullanılan hedef programların program kimlikleridir. PrintCash yapısındaki son dört özniteliğin sırasıyla kullanıcının sistem hesabı (aynı zamanda işlemin imzacısı), kullanıcının teminat hesabı, basılan $CASH'i alan kullanıcının $CASH token hesabı ve $CASH basma yetkisine sahip hesabın genel anahtarı olduğunu belirtmek gerekir.

Saldırı İşlemi

Yukarıdaki hesapların işlevselliğini anladıktan sonra saldırı işlemini analiz etmeye başlıyoruz: 0x4fgL…z2K5. Bu saldırı, saldırgan adresinden (0x6D7f adresinde konumlanan) başlatılmıştır ve PrintCash talimatındaki girdi hesaplarının listesi aşağıda gösterilmektedir.

Yukarıdaki Hesap #1 (0x5aha), Bank hesabına karşılık gelir. Bunun CashioApp'in resmi web sitesinde (0xEm1P) sağlanan adresten farklı olduğunu fark ettik; bu da Bank hesabının doğrulamasının yetersiz olduğu anlamına gelir!

Doğrulama

Atlatmanın nasıl çalıştığını anlamak için koddaki BrrrCommon yapısının doğrulamasına daha yakından bakalım.

Girdi Bank hesabının tek kontrolü, girdi Teminat hesabının Bank hesabıyla ilişkili olmasını sağlamaktır (satır 12). Ancak sahte bir Collateral hesabı da sağlanarak bu kolayca atlatılabilir. Bunun yanı sıra gerçek teminat varlıkları ödemekten kaçınmak için saldırgan aynı zamanda sahte saber_swap hesapları da sağladı. Saldırganın değerli $CASH tokenları basmak için değersiz teminat varlıkları yatırmayı hedeflediğini, dolayısıyla saldırgan tarafından sağlanan crate_token ve crate_mint'in gerçek adresler olması gerektiğini unutmayın. Başka bir deyişle, Bank hesabının yetersiz kontrolü, saldırganın değersiz teminatla $CASH basmak için bir dizi sahte hesap oluşturmasına olanak tanır.

Düzeltme

Düzeltme, assert_keys_eq!(self.bank.crate_mint, self.crate_mint) ifadesinin eklenmesidir. Bu ifade, Bank hesabının crate_mint'inin $CASH için doğru crate_mint olmasını sağlar. Peki bu, Bank hesabının geçerli olduğunu nasıl garantiler? Cevabı bulmak için NewBank yapısına (bankman programında) ve NewCrate yapısına (crate_token programında) bakalım.

Aslında Bank hesabı, tohumları crate_token'ın adresini içeren bir PDA'dır. Bu arada crate_token da tohumları crate_mint'in adresini içeren bir PDA'dır. Bu, girdi crate_mint geçerliyse Bank hesabının da geçerli olduğunu garanti eder. Doğru bir crate_mint olmadan, saldırganlar $CASH basamaz ve saldırıları başlatamazlar.

BlockSec Hakkında

BlockSec, 2021 yılında küresel alanda tanınan bir grup güvenlik uzmanı tarafından kurulmuş ö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ırmayı taahhüt etmektedir. Bu doğrultuda BlockSec; akıllı sözleşme ve EVM zinciri güvenlik denetimi hizmetleri, güvenlik geliştirme ve tehditleri proaktif olarak engelleme için Phalcon platformu, fon takibi ve araştırma için MetaSleuth platformu ve kripto dünyasında verimli şekilde gezinen web3 geliştiricileri için MetaSuites uzantısı sunmaktadır.

Şirket bugüne kadar MetaMask, Uniswap Foundation, Compound, Forta ve PancakeSwap gibi 300'den fazla saygın müşteriye hizmet vermiş; Matrix Partners, Vitalbridge Capital ve Fenbushi Capital gibi önde gelen yatırımcılardan iki tur finansmanda on milyonlarca ABD doları almıştır.

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

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

Best Security Auditor for Web3

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

BlockSec Audit