
23.03.2022 16:20:08 UTC+8 tarihinde başlayan saldırıda, CashioApp istismar edilerek teminat token hesabı boşaltıldı ve yaklaşık 52 milyon tutarında kayba yol açıldı. Saldırı, girdi hesaplarının yetersiz kontrol edilmesi nedeniyle mümkün oldu; bu durum saldırganın hiçbir varlık yatırmadan 20 milyar $CASH tokeni mint etmesine olanak tanıdı. Aşağıda teknik ayrıntıları sunuyoruz.
Özet
Olay, Saber LP Arrows teminatıyla $CASH tokenlerinin mint ve burn işlemlerini yürütmek üzere tasarlanmış Brrr programındaki bir hatadan kaynaklandı. Kullanıcılar, Arrow LP tokenlerini yatırarak $CASH basabilir; bu da $CASH mint etmek anlamına gelir. Arrow LP tokeninin, dayanak token olarak Saber LP tokenini aldığını unutmayın. $CASH mint edebilen print_cash talimatı, Bank hesabı ve Collateral hesabı dahil olmak üzere bir hesap listesi alır. Bu hesaplar, $CASH mint etmek için kullanılmasına izin verilen teminatı (yani Arrow LP tokenlerini) kaydetmek ve izlemek için kullanılır. Tasarım gereği bu iki hesap yalnızca yönetici tarafından başlatılmalı ve yetkilendirilmelidir. Ancak program, Bank hesabının geçerliliğini kontrol etmez. Sonuç olarak saldırgan, Bank hesabı da dahil olmak üzere bir dizi sahte hesap oluşturup bunları print_cash talimatına girdi olarak verebilir ve neredeyse hiçbir maliyet olmadan (tek maliyet işlem ücretleridir) $CASH basabilir.
Ayrıntılar
Analize, aşağıdaki print_cash talimatında kullanılan hesaplardan başlayalım.


common niteliği (75. satır), programda türü BrrrCommon olan bir yapıdır. BrrrCommon içinde bank hesabı ve collateral hesabı yönetici tarafından başlatılır ve yetkilendirilir. crate_token, $CASH tokeninin hesabıdır; crate_mint hesabının açık anahtarı (107. satır), yönetici rollerinin açık anahtarları ve diğer bilgiler gibi $CASH hakkındaki bilgileri saklar. crate_collateral_tokens, kullanıcılardan aktarılan teminat tokenlerini tutan bir kasa hesabıdır. Teminatın, Saber LP tokenlerini alan Arrow LP tokenleri olması gerektiğinden, kullanıcıların saber_swap ile ilgili hesapları girmesi gerekir. BrrrCommon yapısındaki son iki nitelik, talimatta kullanılan hedef programların program kimlikleridir. PrintCash yapısındaki son dört niteliğin sırasıyla kullanıcının sistem hesabı (aynı zamanda işlemi imzalayan hesap), kullanıcının teminat hesabı, kullanıcının mint edilen $CASH tokenlerini alan $CASH token hesabı ve $CASH mint etme yetkisine sahip hesabın açık anahtarı olduğunu unutmayın.
Saldırı İşlemi
Yukarıdaki hesapların işlevini anladıktan sonra saldırı işlemini incelemeye geçelim: 0x4fgL…z2K5. Bu saldırı, 0x6D7f konumundaki saldırgan adresinden başlatılmıştır. PrintCash talimatındaki girdi hesaplarının listesi aşağıda gösterilmektedir.

Yukarıdaki Account #1 (0x5aha), Bank hesabına karşılık gelir. Bunun, CashioApp'in resmî web sitesinde verilen adresten (0xEm1P) farklı olduğunu fark ettik. Bu da Bank hesabının doğrulamasının yetersiz olduğu anlamına gelir!
Doğrulama
Bu kontrolün nasıl aşılabildiğini anlamak için koddaki BrrrCommon yapısının doğrulamasına daha yakından bakalım.

Girdi olarak verilen Bank hesabına yönelik tek kontrol, girdi olarak verilen Collateral hesabının Bank hesabıyla ilişkili olmasını sağlamaktır (12. satır). Ancak sahte bir Collateral hesabı da verilerek bu kontrol kolayca aşılabilir. Ayrıca saldırgan, gerçek teminat varlıklarını yatırmamak için sahte saber_swap hesapları da verdi. Saldırganın amacının, değerli $CASH tokenlerini basmak için değersiz teminat varlıkları yatırmak olduğunu unutmayın; bu nedenle saldırganın verdiği crate_token ve crate_mint gerçek adresler olmalıdır. Başka bir deyişle, Bank hesabının yetersiz kontrol edilmesi, saldırganın değersiz teminatla $CASH basmak üzere bir dizi sahte hesap oluşturmasını mümkün kılar.
Düzeltme

Düzeltme, assert_keys_eq!(self.bank.crate_mint, self.crate_mint) ifadesini eklemektir. Bu ifade, Bank hesabındaki crate_mint değerinin $CASH için doğru crate_mint olmasını sağlar. Peki bu, Bank hesabının geçerli olmasını nasıl sağlar? Yanıtı bulmak için bankman programındaki NewBank yapısına ve crate_token programındaki NewCrate yapısına bakalım.


Aslında Bank hesabı, tohumları crate_token adresini içeren bir PDA'dır. Aynı şekilde crate_token da tohumları crate_mint adresini içeren bir PDA'dır. Bu, girdi olarak verilen crate_mint geçerliyse Bank hesabının da geçerli olmasını sağlar. Saldırganlar, doğru bir crate_mint olmadan $CASH mint edemez ve saldırıları gerçekleştiremez.
BlockSec Hakkında
BlockSec, dünya çapında öne çıkan bir grup güvenlik uzmanı tarafından 2021 yılında kurulmuş, blokzincir güvenliği alanında öncü bir şirkettir. Şirket, gelişmekte olan Web3 dünyasının kitlesel olarak benimsenmesini kolaylaştırmak amacıyla bu dünyanın güvenliğini ve kullanılabilirliğini artırmaya kararlıdır. Bu doğrultuda BlockSec, akıllı sözleşmeler ve EVM zincirleri için güvenlik denetimi hizmetleri, güvenlik geliştirme ve tehditleri proaktif olarak engelleme amacıyla Phalcon Security platformunu, fon takibi ve araştırması için MetaSleuth platformunu ve kripto dünyasında verimli biçimde gezinmek isteyen web3 geliştiricileri için MetaSuites uzantısını sunmaktadır.
Şirket bugüne kadar MetaMask, Uniswap Foundation, Compound, Forta ve PancakeSwap gibi 300'den fazla saygın müşteriye hizmet vermiş ve Matrix Partners, Vitalbridge Capital ve Fenbushi Capital dahil olmak üzere önde gelen yatırımcılardan iki finansman turunda on milyonlarca ABD doları tutarında yatırım almıştır.
Resmî web sitesi: https://blocksec.com/
Resmî Twitter hesabı: https://twitter.com/BlockSecTeam



