Back to Blog

#5: Platypus Finance: Üç Saldırıdan Şans Eseri Kurtulmak

Code Auditing
15 Şubat 2024
5 min read

Özet

Platypus Finance, Avalanche blok zincirinde bir AMM protokolüdür. Aşağıdaki şekilde üç kez saldırıya uğramıştır:

  • 17 Şubat 2023'te, yanlış bir ödeme gücü kontrolü nedeniyle bir saldırıya uğradı ve toplamda yaklaşık 9,05 milyon dolar kayba yol açtı. Bunun 2,4 milyon dolarlık kısmı BlockSec'in yardımıyla kurtarıldı. Yaklaşık 380 bin token Aave sözleşmesinde sıkışıp kaldı ve daha sonra iade edildi.
  • 12 Temmuz 2023'te, stabil coinler arasındaki fiyat farkının göz ardı edilmesi nedeniyle yaklaşık 50 bin dolar kayıpla hacklendi.
  • 12 Ekim 2023'te, fiyat manipülasyonu saldırılarına maruz kaldı ve yaklaşık 2,2 milyon dolar kaybedildi. Saldırganla yapılan müzakerenin ardından, çalınan fonların %90'ı iade edildi.

Proje, tüm bu saldırılardan kurtulmayı başardığı için şanslıdır. Bu üç istismara ilişkin analizimiz, dikkatli bir denetim veya daha aktif güvenlik önlemleri kullanılsaydı bu mantıksal kusurların önlenebileceğini göstermektedir.

Birinci Saldırı

Bu güvenlik olayını anlamak için, birkaç akıllı sözleşmenin iş akışını anlamak gerekir. Kabaca süreç şu şekildedir:

  • Bir kullanıcı, LP olmak ve bir LP tokenı almak için bir havuza token yatırabilir.
  • LP tokenı, ödül almak için MasterPlatypus'ta stake edilebilir. Bu süreç boyunca LP tokenı, MasterPlatypus sözleşmesine aktarılacaktır.
  • LP tokenı, varlık verimliliğini artırmak amacıyla diğer varlıkları borç almak için teminat olarak kullanılabilir.

Aşağıdaki şekil, etkileşimleri göstermektedir.

Güvenlik Açığı Analizi

Güvenlik açığı, MasterPlatypus sözleşmesi içindeki emergencyWithdraw adlı bir fonksiyonda mevcuttur. Acil durumlarda, bu fonksiyon MasterPlatypus sözleşmesinde stake edilmiş LP tokenlarını geri çekmek için kullanılmalıdır. Bu fonksiyonda, sözleşme çekme işlemine izin vermek için kullanıcının Solvent (ödeme gücüne sahip) olup olmadığını kontrol eder. Bu mantık, kullanıcıların herhangi bir kötü borcu olup olmadığını (yani teminatın borcu ödemek için kullanılıp kullanılamayacağını) kontrol eder. Eğer kullanıcının kötü borcu yoksa, kullanıcılar stake edilmiş LP tokenlarını geri çekebilir.

Ancak bu mantık hatalıdır. Kullanıcının Solvent olması yalnızca kullanıcının teminatının borcunu ödeyebileceği anlamına gelir. Ancak, kullanıcının stake edilmiş tokenları acil olarak geri çektikten sonra da ödeme gücüne sahip kalıp kalmadığını kontrol etmez. Bir saldırgan, bu kusurdan yararlanarak varlıkları borç alabilir ve ardından borçları geri ödemeden stake edilmiş LP tokenlarını da acil olarak geri çekebilir. Ayrıntılı analiz için Immunefi'nin Blog yazısına bakınız.

Saldırı Analizi

Tüm saldırı sürecini göstermek için örnek olarak bir saldırı işlemini kullanıyoruz.

Adım 1: AAVE'den 44 milyon USDC Flashloan Borç Alma

Adım 2: LP-USDC Almak İçin 44 Milyon USDC'yi Havuza Yatırma

Adım 3: LP-USDC'yi MasterPlatypus'a Yatırma

Adım 4: USP Borç Almak İçin LP-USDC'yi Teminat Olarak Kullanma

Adım 5: Saldırıyı Başlatmak İçin emergencyWithdraw Fonksiyonunu Çalıştırma

Saldırgan, USP borcunu ödemeden LP-USDC'yi elde eder.

Adım 6: USDC Almak İçin LP-USDC'yi Havuzdan Geri Çekme

Adım 7: Kâr Elde Etmek İçin USP'yi Satma

Ancak, kârlar saldırı sözleşmesi içinde kalmıştır. Aslında, saldırgan kâr elde etmek için takas işlemi için yeni bir alıcı adresi belirleyebilir.

BlockSec'in Kurtarma Operasyonu

Saldırganın kârları saldırı sözleşmesi içinde bıraktığını tespit ettik. Ayrıca, saldırı sözleşmesi içinde varlıkları geri çekmek için herhangi bir mantık bulunmamaktadır. Ancak, saldırı sözleşmesinde, sözleşme içindeki varlıkların bir kısmını geri çekmek için sözleşmeye karşı saldırı düzenlemekte kullanılabilecek bir güvenlik açığı bulduk.

Özellikle, flashloan geri çağırma (callback) fonksiyonuna yönelik bir erişim kontrolü bulunmaktadır, bu da herkesin bu geri çağırma fonksiyonunu çağırabileceği anlamına gelir. Bu aynı zamanda birçok MEV botunun saldırıya uğramasının da temel nedenidir.

Ayrıca, geri çağırma fonksiyonu içinde, saldırgan sözleşmesi USDC tokenını Platypus finance havuz sözleşmesine onaylamaktadır. Ve bu havuz sözleşmesi yükseltilebilir (upgradable) bir sözleşmedir!

Önceki iki durumu birleştirerek, saldırı sözleşmesi içindeki USDC'yi şu şekilde kurtarabiliriz:

  • Sözleşme içindeki USDC'yi geri çekme mantığını içerecek şekilde Platypus finance havuz sözleşmesini yükseltmek
  • USDC'yi havuz sözleşmesine onaylamak için saldırı sözleşmesinin geri çağırma fonksiyonunu çağırmak
  • Havuz sözleşmesi, (saldırı sözleşmesi tarafından yürütülecek olan) herhangi bir fonksiyonu, saldırı sözleşmesinden USDC'yi transfer edecek şekilde değiştirebilir (çünkü saldırı sözleşmesi USDC'yi havuz sözleşmesine onaylamıştır).

İşte 2,4 milyon USDC'yi kurtaran işlem.

Diğer İki Saldırı

Diğer iki saldırı hakkında daha fazla ayrıntı için lütfen aşağıdaki bağlantılara bakınız.

Özet

Bu üç saldırı, protokoldeki farklı güvenlik açıklarından yararlanmıştır. Bazı diğer sağlayıcılar protokolü denetlemiş olsa bile, saldırgan yine de açığı bulmuş ve protokolü başarıyla istismar etmiştir. Neyse ki bazı varlıklar kurtarılabilmiştir, ancak her zaman şanslı olmayı bekleyemeyiz. Protokolü ve kullanıcı varlıklarını güvence altına almak için, saldırı izleme ve otomatik müdahale de dahil olmak üzere daha fazla güvenlik önleminin benimsenmesi gerekmektedir.

Bu serideki diğer makaleleri okuyun:

Best Security Auditor for Web3

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

BlockSec Audit