Blockchain Güvenliği: Front Running & Sandwich Attack
Zafiyeti açıklamadan önce işlemlerin(transactions) blockchaine nasıl gönderildiğine değinmek istiyorum.
Bir kullanıcı düğüme(node) bir işlem gönderdiğinde bu işlem direkt olarak bloğa eklenmez. İşlem doğrulanmadan önce, bu doğrulanmamış işlemler Mempool olarak adlandırılan bir tür bekleme odasına gönderilirler ve burada tutulurlar.
Mempool olarak adlandırılmasının nedeni memory(hafıza) ve pool(havuz) kelimelerinin kısaltmalarının birleşiminden oluşmasıdır.
Mempool’u bir düğümdeki doğrulanmış fakat daha blokzincirine eklenmemiş olan işlemlerin bulunduğu depolama alanı olarak tanımlayabiliriz.
Yeni oluşturulacak olan bloğa eklenecek işlemleri madenciler seçer. Gönderilen işlemlerin hangi sırayla bloğa ekleneceğinin bir garantisi yoktur.
Madenciler işlemleri fee(işlem ücreti) bazında yürüttükleri için mempooldan bloğa dahil edilecek işlemleri seçebilirler. Daha yüksek işlem ücretini ödeyen kullanıcının işleminin daha erken bloğa eklenmesi olasıdır. Ödenen işlem ücretleri ne kadar yüksek olursa işlemin gerçekleşme hızı o kadar yüksek olur.
Front Running
Front Running saldırıları, işlemlerin blockchainin dağıtılmış defterine eklendiği süreçten yararlanılan bir saldırı türüdür.
Front Running saldırısının gerçekleşme şekli:
- Bir kullanıcı işleminin gerçekleştirilmesi için düğüme bir istek gönderir.
- Gönderilen bu işlem Mempool’da bekletilir.
- Kötü niyetli bir kullanıcı Mempool’da bekletilen bu işlem bilgisini görür ve kullanıcıdan daha hızlı bir şekilde işlemi gerçekleştirmek için daha yüksek işlem ücreti öder.
- Daha yüksek işlem ücreti ödeyen kötü niyetli kullanıcı ilk kullanıcının bilgisinden yararlanmış olur ve işlemi daha önce gerçekleştirir.
Daha açıklayıcı olmak için bir örnek üzerinden anlatacağım:
İki kişilik bir bilgi yarışması olduğunu varsayalım. Bu bilgi yarışmasına katılan iki kullanıcı yarışmaya katılmak için 500TL ödemiş olsunlar. Doğru cevabı ilk ileten kullanıcı 1000TL değerindeki ödülün sahibi olsun.
Yarışma formatını anladıysanız başlıyoruz. Yarışmacılarımız Ali ve Ayşe:
1- Ayşe verilen sorunun cevabını biliyor fakat Ali bilmiyor.
2- Ayşe doğru cevabı 5TL işlem ücreti vererek sistemden gönderiyor.
3- Bu sırada Ali sisteme gönderilen işlemlerin bulunduğu veri tabanını izliyor. Ayşe’nin cevabı gönderdiğini gören Ali Ayşe’nin cevabını kopyalıyor ve 20TL işlem ücreti ödeyerek(daha yüksek işlem ücreti) cevabı sistemden gönderiyor.
4- Ali daha yüksek işlem ücreti ödediği için gönderdiği işlem Ayşe’nin işleminden daha hızlı ulaşıyor.
5- Böylece Ali cevabı bilmediği halde sistemdeki açığı kullanarak ödülün sahibi oluyor.
Sandwich Attack
Bu saldırı front running saldırısının bir çeşididir. Bu saldırıda hedef merkeziyetsiz finans(DeFi) protokolleri ve servisleridir.
Sandwich Attack, bir kullanıcının işlemlerini iki işlem arasında “sandviç” yapmayı içerir. Bu iki işlem, kullanıcının işleminden önce ve sonradır. Bu süreç kullanıcı için bir kayıp ve saldırgan için bir kazanç oluşturur.
Bir sandwich attack senaryosunda, bir saldırgan önce mempool’da bekleyen işlemleri izleyecektir. Ardından, kullanıcının işlemini bulacak ve kurbanın beklemedeki işleminden önce (ön işlem) ve hemen ardından başka bir işlem emri (geri işlem) olmak üzere iki işlem yapacaktır. Kurbanın bekleyen işlemi, saldırgan tarafından oluşturulan iki yeni ticaret emri arasında sıkıştırılacaktır. Bu iki emri vermenin ve bekleyen işlemlerin amacı, varlık fiyatlarını manipüle etmektir.
Daha açıklayıcı olması açısından bir örnekle anlatacağım:
- Ali Uniswaptan Ethereum-BNB paritesinde alım yapmak istesin ve bir işlem emri versin.
- Kötü niyetli kullanıcı(Ayşe) bu işlem emrinin verildiğini gördüğü anda daha yüksek işlem ücreti ödeyerek aynı paritede alım yapsın. Daha yüksek ücret ödediği için Ayşe’nin işlemi daha önce gerçekleştirilecektir.
- Ayşe Ali’den daha önce alım yaptığı için mevcut paritenin fiyatı artacaktır.
- Ayşe Ali’den önce alım yaptığı için fiyat artar ve Ali daha yüksek fiyata Ethereum-BNB alımı yapar.
- Fiyat artışından sonra Ayşe satış yapar ve kar elde eder.
Sandwich Attack ve Korunma Yöntemleri
Kullanıcılar için →İşlemleri gerçekleştirirken slippage oranınızı en minimal seviyede tutarak bu saldırıdan korunabilirsiniz.
Projeler için →Akıllı kontratlarda işlem ücretleri için ödenen fee miktarını kısıtlayan bir kod hazırlayabilirsiniz.
Kaynak: Protecting Against Front-Running and Transaction Reordering — OpenZeppelin