Argent-X StarkNet Cüzdanında bir başka sıfır gün kritik güvenlik açığı – Hikaye

Bu hata, kötü niyetli herhangi bir web sitesinin cüzdanı tamamen kontrol etmesini ve kullanıcının onayı olmadan işlem yapmasını sağlar - Açıkladık.
Hesap Soyutlama
• Ara 7, 2022
6 dk okuma
Argent-X StarkNet Cüzdanında bir başka sıfır gün kritik güvenlik açığı – Hikaye

TL;DR

StarkNet için Argent-X Cüzdanı, bu kez uygulama tarafında bir başka kritik güvenlik açığına sahipti. Cüzdanın kilidi açıldıktan sonra, güvenlik açığı herhangi bir web sitesinin, herhangi bir kullanıcı etkileşimi olmadan, tüm Argent-X hesaplarından tüm kullanıcı fonlarını çalmasına izin verir duruma gelir.
Bu hata, herhangi bir kötü niyetli web sitesinin kullanıcıdan izin almadan cüzdanı tamamen kontrol etmesini, tüm hesap bilgilerini okumasını ve kullanıcının onayı olmadan işlem yapmasını sağlar.

Bu güvenlik açığı en azından Mayıs 2022’den beri var gibi görünüyor ve StarkNet ana ağındaki tüm Argent-X kullanıcıları tüm bu süre boyunca risk altındaydı.

Argent ekibini bu sorun hakkında birkaç hafta önce uyardık ve onlar da 18 saat içinde Chrome mağazasında bir düzeltme yayınladılar. O zamandan bu yana kullanıcıların büyük çoğunluğunun güncellemeyi alması için yeterli zaman geçti.
Bu güvenlik açığı, meşru ve kötü niyetli işlemlerin ayırt edilmesini imkansız hale getiriyor, ancak neyse ki Argent hiçbir fonun kaybolmadığını iddia ediyor.

Bu yazıda bu güvenlik açığını nasıl keşfettiğimizin öyküsünü açıklayacak ve güvenli bir dApp <-> iletişim mekanizmasının önemini göstereceğiz.

Aşağıdaki adımları takip etmek ve hack’i evde tekrar oynamak isteyenler için, 5.0.7’den önceki herhangi bir Argent-X sürümünü (örneğin – bu), indirebilir ve örnekleri kendiniz çalıştırabilirsiniz.

Arka plan

Sadece iki hafta önce Braavos’taki ekibimizden Yoav Gaziel tarafından keşfedilen ve bildirilen bu sıfır tıklama güvenlik açığında gördüğümüz gibi, Argent-X hesap sözleşmesinde kritik bir güvenlik açığı vardı. Ancak bu, hataya sahip olan sözleşme koduydu. Argent-X sözleşmesinin (tekrar) denetleneceğini ve hatasız olacağını varsayalım. Bir cüzdanın güvenli sayılması için bu yeterli mi? Peki ya cüzdan istemci kodu? Geçtiğimiz günlerde Braavos’ta biz de biraz tekmeleyip görmeye karar verdik.

Aşağıda o olaylı öğleden sonra-akşam anlatılmaktadır.

Mesajlar, Mesajlar

Zamanda tam bir yıl geriye gidiyoruz: Starknet’te ilk dApp’ımızı yazarken, o zamanlar mevcut olan tek cüzdan olan Argent-X Cüzdanını kullandık. (Bugün Braavos’u kullanabilirsiniz ve kullanmalısınız).
DApp’ımızın içinde gönderilen bazı mesajları incelerken, bizim göndermediğimiz ve Argent-X Cüzdanının kendisinden kaynaklanmış gibi görünen bir grup mesaj gördük. O zamanlar bunu pek düşünmemiştik.

Ancak bunu hatırlayarak, o öğleden sonra oturup Argent-X mesajlaşma çerçevesine bir göz atmamız gerektiğini düşündük. Cüzdan kodunu indirmek ve derlemek kolaydı – Argent ekibine iyi bir iş çıkardıkları için şapka çıkarıyorum. Hemen fark ettiğimiz bir şey var – hala Manifest V2 kullanıyorlar. Ayrıntılara girmeyeceğiz, ancak Chrome Store’un tüm uzantıları Google tarafından daha güvenli kabul edilen Manifest V3’e geçmeye teşvik ettiğini (ve yakında bunu zorunlu kılacağını) söyleyelim.

Şimdi sıra geldi Argent-X mesajlaşma sisteminin kutu açılımına.

Argent-X cüzdanının nasıl çalıştığını özetlemek gerekirse: izole bir ortamda (gezindiğiniz web sayfasından izole edilmiş) çalışan bir tarayıcı uzantısıdır. DApp ile cüzdan arasındaki iletişim, ziyaret ettiğiniz her web sayfasına enjekte edilen bir kod parçasındaki mesajlar aracılığıyla yapılır. Şimdiye kadar, bu oldukça standart.

Ancak böyle bir planı uygularken güvenlik konusunda çok dikkatli olmanız gerekir.

Kaynağı bilinmeyen kötü niyetli mesajların hatlarınıza sızmasına izin vermek İSTEMEZSİNİZ.

Argent-X cüzdan koduna baktığımızda, kullandığı olay türlerini oldukça hızlı bir şekilde bulduk:

Oradaki en ilgi çekici mesaja daldık:— Çeşitli Mesajlar. Sadece yazım hatası nedeniyle değil (Bu önemli değil, nasıl olsa kimse bu kelimeyi heceleyemez), aynı zamanda deneyimlerimize göre geliştiriciler ‘iyi şeyleri’ bu her şeyi kapsayan sınıflara koyma eğilimindedir.

Arka background/miscellaneousMessaging.ts, aracılığıyla bilgilendirme, Belirli bir mesaj hemen dikkatimizi çekti (hangisi olduğu konusunda sizi birkaç cümle daha bekletecek). Bu yüzden devam ettik ve Argent-X cüzdanını derledik ve bir chrome tarayıcısına yükledik. Hemen cüzdanı kurmanızı isteyen bir tarayıcı sekmesi açtı ve normal şifre dansından sonra cüzdan otomatik olarak testnet üzerinde bir hesap oluşturdu.

Sonra bir konsol açtık ve bu kod parçasını hackledik:

msg = { type: “RESET_ALL” }

extId = document.getElementById(“argent-x-extension”)?.getAttribute(“data-extension-id”)

window.postMessage({ …msg, extensionId: extId }, window.location.origin)

Burada yaptığımız, yetkisiz bir web sayfasından Argent-X cüzdanına RESET_ALL olayı göndermek. Bu tür bir saldırı, cüzdan güvenlik çerçevesi tarafından durdurulmalıdır.

Bu kod parçasını tarayıcı konsolunda çalıştırdık ve araç çubuğundan Argent-X cüzdanını açtık.

Boom 💥

Cüzdan az önce yaptığımız kurulumu unuttu ve kurulum moduna geri döndü, tıpkı kayıt sırasında açtığı gibi yeni bir sekme açtı.

Şimdi olanları özetleyelim: Rastgele bir web sayfasından Argent-X cüzdanına bir RESET_ALL mesajı gönderdik ve bu mesaj sonuna kadar gitti.

Bu noktada, bundan sonra ne denememiz gerektiğini tartışmaya başladık. Mesajlaşma kaynak kodunu incelediğimizde, cüzdan tamamen mesajlar tarafından kontrol edilmesine rağmen hiçbir güvenlik mekanizması olmadığı oldukça açıktı.

Tüm Hesapları Okuma

Araştırmaya karar verdiğimiz bir sonraki şey, yetkisiz bir web sayfasının tüm hesap bilgilerinizi okuyup okuyamayacağıydı.

Bunun için cüzdana mesaj göndermek yeterli değildir. Ayrıca bazı mesajları da geri almanız gerekir. Elbette, iyi güvenlikli bir cüzdan bu tür bilgileri yetkisiz bir web sayfasına göndermemelidir.

background/accountMessaging.ts dosyasındaki koda baktığımızda kullanmayı planladığımız GET_ACCOUNTS mesajını gördük. Dikkatimizi çeken, GET_ACCOUNTS_RES sonucunu içeren sendToTabAndUi() çağrısı oldu. Kullanıcı arayüzünün, hesap bilgilerini alması gereken Argent-X kullanıcı arayüzü olduğunu ve büyük olasılıkla Argent-X açılır penceresine göz atarken kullanıcıya kullanıcı arayüzünü göstermesi gerektiğini fark ettik. Ama bunu neden sekmeye gönderildi? Bu bir güvenlik açığı gibi görünüyor.

Yeni bir Argent-X cüzdanını yeniden yükledik ve ardından konsoldaki bu kod parçasını hackledik:

function print_event(e) {

console.log(e)

}

window.addEventListener(“message”, print_event)

msg = { type: “GET_ACCOUNTS” }

extId = document.getElementById(“argent-x-extension”)?.getAttribute(“data-extension-id”)

window.postMessage({ …msg, extensionId: extId }, window.location.origin)

Bir Boom daha💥:

Bu akışın sonucu olarak herhangi bir web sitesi (haber, hükümet, vb.) tüm Argent-X adreslerinizi okuyabilir. Ama bekleyin, cüzdanın kilidi açıktı. Belki kilitli bir cüzdan bu kusuru önleyebilir? Cüzdanı kullanıcı arayüzünden kilitledik ve tekrar denedik.
Sonuç aynı. Kilitli bir cüzdan bile herhangi bir web sitesine tüm hesaplarınızın listesini gönderiyor.
Argent-X manifestosuna baktığımızda, uzantı kodlarını herhangi bir web sitesine enjekte ettiklerini gördük. http, https., local… Bunlardan herhangi biri bunu yapabilir.

Kutsal Kase – İşlemlerin Yürütülmesi

Burada hikayeyi kısaltacak ve sonraki birkaç saatin nasıl geliştiğini kısaca anlatacağız.

Doğal yere bakmak — dosya background/transactions/transactionMessaging.ts,
ilk mesaj var EXECUTE_TRANSACTION.

İşte bu kutsal kase.
Gerekli işlem formatını anlamamız birkaç dakikamızı aldı, ancak çok geçmeden bunu başardık:

msg = { type: “EXECUTE_TRANSACTION”, data:{transactions:{contractAddress:”0x049D36570D4e46f48e99674bd3fcc84644DdD6b96F7C741B1562B82f9e004dC7″,entrypoint:”transfer”,calldata:[“0x07074236724072a4949b7B170E5D5825b8195Ec278ED45E4BE9975186758EDa7”,”10000000000″,”0″]}} }

Bu mesaj, rastgele bir adrese (bu durumda kendi adresimize) 1e-9 ETH aktarılmasını talep eder. Ucuza kaçtık, o Goerli ETH’leri bulmak zor!).

Bu mesajı her zamanki gibi gönderdik ama tahmin edin ne oldu… cüzdandan EXECUTE_TRANSACTION_RES yanıtı almamıza rağmen hiçbir işlem gerçekleşmemiş gibi görünüyordu.
Cüzdan kullanıcı arayüzünü açtığımızda nedenini hemen anladık.

Görülebileceği gibi, cüzdan mesajı kabul etti ancak yine de kullanıcıdan bu işlemi onaylamasını istiyor. Bu savunma hattı bir bilgisayar korsanının bu işlemi gerçekleştirmesini engelleyecek mi?

Cüzdanın gönderdiği cevaba bakıldığında, orada actionHash adında bir parametre olduğu görülüyor.
Bu actionHash bir şeyi temsil ediyor olmalı.

Doğal olanı yaparak, arka plan/actionMessaging.ts’ye daldık ve orada şu mesajı gördük:

Bu mesajı yukarıdaki actionHash ile çağırdık ve…

💥 BOM BOM BOM 💥

Şu ‘1’ rozetini görüyor musun?
Bu, oluşturduğumuz yetkisiz, talep edilmemiş ETH transfer işlemidir.

Bu akışın, kullanıcı web’de gezinirken ve cüzdanın kilidi açıkken mümkün olduğunu unutmayın. Cüzdanın kilidi açıldıktan sonra uzun bir süre, genellikle kullanıcı tarayıcıyı kapatana kadar açık kalır.

Her şeyi bir araya getirmek

Derin bir nefes aldıktan sonra, cüzdandaki herhangi bir hesaba geçmek için CONNECT_ACCOUNT mesajını kullanarak küçük bir POC (az önce tanımladığımız her şeyi yapan, üstüne serpiştirilmiş bir javascript sayfası) hacklemek için bir saat oturduk ( ana ağ hesapları dahil).

Saat oldukça geç olmuştu ama bunu erteleyemeyeceğimizin farkındaydık. Braavos’taki arkadaşlarımızla temasa geçtik, onları bilgilendirdik ve POC’yi denemelerini istedik. Şok oldular ama devam ettiler. Ve tüm makinelerinde çalıştı.

Birimiz POC’yi hacklerken, diğerimiz Argent-X cüzdanının git geçmişine göz atarak bunun ne kadar süredir devam ettiğini tahmin etmeye çalıştı ve görünüşe göre ilk günden beri devam ediyor. Tüm Argent-X cüzdanları, en azından Argent-X’in StarkNet ana ağ desteğini sunduğu Mayıs ayından beri bu şekilde savunmasızdı.

Bu andan itibaren, sadece bir hafta önce sıfır tıklamalı sözleşme hatasını aynı Argent ekibine bilgilendirme esnasında yaptığımız gibi Sorumlu Ortaya Çıkarma protokolünü izledik.

Her ne kadar bu keşif İspanya ve Kosta-Rika arasındaki muhteşem maçı (7-0!! Ne??) ve Belçika ve Kanada arasındaki maçı (1-0) kaçırmamıza neden olsa da.
StarkNet ekosistemine yardımcı olabildiğimiz ve kullanıcıların fonlarının artık tehlikede olmamasını sağlayabildiğimiz için mutluyuz.

Motty Lavie

Motty Lavie

İlk bilen sen ol

Şimdi abone olun ve Braavos ve Starknet ekosistemi hakkında aylık güncellemeler ve ilginç haberler alın.