İçeriğe geç

MSQ Snap ve Consensys Diligence'dan 5 Güvenlik Denetimi İpucu

Bu makale, Consensys Diligence ile MSQ projesi arasındaki iş birliğinin ürünüdür; DFinity Foundation ve MetaMask Snaps DAO'nun desteğiyle hazırlanmıştır.

18 dk okuma
MSQ Snap ve Consensys Diligence'dan 5 Güvenlik Denetimi İpucu

Consensys Diligence, Consensys Software Inc. bünyesindeki bir denetim birimidir ve Solidity, Cairo ile çeşitli ZK kütüphanelerini kapsayan bir yelpazede titiz denetimler yürütme konusundaki eşsiz uzmanlığıyla tanınmaktadır. Diligence ekibi, MetaMask Snaps için denetim ve güvenlik standartlarının öncülüğünü yapmakta ve cüzdan özelliğinin güvenliğini sağlamak amacıyla MetaMask ekibiyle yakın iş birliği içinde çalışmaktadır. Bunun yanı sıra Diligence ekibi, güvenlik araçlarının geliştirilmesinde ve en zorlu üretim ortamlarında doğrulanmış son teknoloji sürekli fuzzing çözümlerinde de öncü rol üstlenmektedir.

MSQ projesi kısa süre önce MetaMask Snaps Store'da yayına girdi. MSQ, kullanıcıların Internet Computer ağıyla etkileşime girmesine, IC tabanlı token'ları yönetmesine, IC tabanlı dapp'lerde güvenli şekilde yetkilendirme yapmasına ve dijital mal ile hizmetler için ödeme gerçekleştirmesine olanak tanıyan bir Snap'tir. Özünde, yetkilendirme ve ödemeler için özel özellikler barındıran, Internet Computer'a yönelik tasarlanmış ve MetaMask ile entegre edilmiş bir kripto cüzdanıdır.

Diligence ve MSQ ekipleri birlikte bu makalede ele alınacak beş temel alan belirledi: Dokümantasyon, Yazılım Tasarımı, Kod, Tedarik Zinciri ve Düzeltmeler. Bu alanlar kapsamında MSQ ekibinin geliştirme sürecinde uyguladığı pratiklerin bir listesi sunulmakta; Diligence ekibinin bu pratiklerin güvenlik açısından sağladığı faydaları açıklayan yorumlarıyla birleştirilmektedir. Böylece MetaMask Wallet veya olası bir güvenlik denetimine tabi olabilecek güvenlik açısından kritik herhangi bir sistem için Snap geliştiren herkes için faydalı bir kaynak oluşturulmaktadır. Başlayalım!

1. Çok katmanlı dokümantasyon oluşturun

Dokümantasyon, zihninizdeki kavramları başkalarının görebileceği bir biçime dönüştürür. Katmanlı dokümantasyon, okuyucunun bu kavramları sizin kastettiğiniz şekilde anlamasına yardımcı olur; bağlamı kademeli olarak aktararak okuyucuyu konuya yavaş yavaş dahil eder. Açıkçası, dokümantasyon ne kadar temiz olursa projenize o kadar geniş bir perspektif sunabilir ve başkalarının sizi daha iyi anlamasını sağlar.

Dokümantasyon katmanlarını, bir okuyucunun bunlara genellikle erişeceği sıranın tersine göre tanımlıyoruz; her katman daha yüksek bir soyutlama düzeyi sunuyor. Bu sayede büyük resimden başlayan okuyucular, ayrıntılara kademeli olarak dalabilir.

1.1 Kod

Yazılımınız hakkındaki nihai bilgi kaynağı kodun kendisidir ve bu kod, dokümantasyonunuzun temel katmanını oluşturur. Tüm gerekli bilgileri içermesine karşın bu bilgileri işlemek oldukça güçtür. Kod ne kadar temiz olursa, üst düzey soyutlamaları koddan çıkarmak o kadar kolaylaşır. Ancak gerçek sistemlerde bu soyutlamalar, sistemin bileşenlerinin karmaşık etkileşimlerinin, haftalarca biriken teknik borcun ve hızlı, özensiz çözümlerin ardında gizli kalır.

Bu nedenle her şeyden önce, kodunuzu okuyan kişileri sisteminizdeki karmaşık bölümler tarafından yanıltılmaktan korumak istersiniz. Bunun en iyi yolu, kodunuzu okumak için gereken bilişsel yükü azaltmaktır. Bu amaçla kullanılabilecek bazı stratejiler şunlardır:

  • Kodunuzu IDE'lerde kolay gezinime olanak tanıyacak şekilde düzenlemek.

  • Kod öğelerinin amacını ve işlevselliğini netleştirmek için açıklayıcı isimlendirme kullanmak.

  • Net veri formatları tanımlamak için güçlü tipli diller kullanmak.

MSQ Snap ve dapp ön yüzleri TypeScript ile geliştirilmiştir; bu yaklaşım, düz JavaScript'in tuzaklarının aksine pek çok olası hatanın önüne geçmiştir. Benzer şekilde, arka ucumuz sağlam tip sistemiyle bilinen Rust'ı kullanmaktadır. Ayrıca MSQ Snap, üçüncü taraf uygulamalar tarafından çalıştırılabilen bir dizi metot dışa aktarmaktadır. Ancak bu metotları tanımlamak için string kullanmıyor, bunun yerine sabitler kullanıyoruz. Şuna benzer bir sabit nesnemiz var:

export const SNAP_METHODS = {
  protected: {
    identity: {
      login: "protected_identity_login",
      ...
    },
    icrc1: {      
	    ...
    },
    ...
  },
  public: {
    identity: {
      sign: "public_identity_sign",			
      ...
    },
    ...
  },
};
Kopyala

Kodda bu sabit nesne, doğru metoda erişmek için bir rehber olarak kullanılabilir; okuyucular bu metot hakkında nesne içindeki tanımlayıcısından çok şey anlayabilir. Örneğin SNAP_METHODS.protected.identity.login metodu yalnızca MSQ'nun eşlik eden dapp'i tarafından çalıştırılabilir ve kullanıcının oturum açmasına olanak tanır. Bu yaklaşım, kod netliğini artırır ve yeniden yapılandırmayı kolaylaştırır; çünkü metot adlarındaki değişiklikler birden fazla yerde güncellenmek yerine merkezi olarak yönetilir.

Metot adlarını eşleştirmek için şuna benzer dalları olan büyük bir switch ifadesi kullanıyoruz:

case SNAP_METHODS.protected.identity.login: {
  result = protected_handleIdentityLogin(req.params.body);
  break;
  }
Kopyala

Gördüğünüz gibi, burada bir şeyi yanlış yorumlamak son derece güçtür; her şey tam olarak adlandırılmış, hayal gücüne yer bırakılmamıştır.

Diligence yorumu Zaman kritik bir faktördür. Geliştiricilerin bir kod tabanını anlamak için haftaları varken, güvenlik mühendislerinin riskleri tespit etmek için genellikle yalnızca birkaç günü vardır. Bu kısıt, hem geliştirici verimliliğine hem de güvenliğe katkı sağlayan bir pratik olan koddaki bilişsel yükü azaltmanın önemini gözler önüne sermektedir.

MSQ'nun kod tabanından öğrenebileceğimiz şey şudur: Açıklayıcı isimlendirme ve güçlü tipleme (TypeScript gibi) ile gezinmesi kolay, net bir kod; güvenlik açıklarının yaygın bir kaynağı olan yanlış anlamaları azaltır.

Ancak unutmayın, TypeScript tip açıklamaları yalnızca derleme zamanında kontrol edilir! Çalışma zamanında işlenen veya ayrıştırılan veriler (RPC, JSON vb.) için ek tip zorunlulukları, veri formatı ve sınır kontrolleri gereklidir! Bu amaçla MSQ, statik tip çıkarımına sahip TypeScript öncelikli bir şema doğrulama kütüphanesi olan zod'u zarif bir şekilde kullanmaktadır ve ekiplerin bu yaklaşımı benimsemesini öneririz.

MSQ, doğru miktarda yorum aracılığıyla kod niyetlerini net kılarak tam isabetli bir denge yakaladı. Bu netlik, güvenlik araştırmacılarının kod tabanının "kırmızı çizgisini" ve temel kavramlarını hızla kavramasına yardımcı olur. Anlaşılması kolay kod yazarak geliştiriciler, hızlı güvenlik incelemelerinin etkinliğini önemli ölçüde artırır.

1.2 Kod yorumları

Yorum yapmanın kodunuzun %100'ünü kapsamak anlamına gelmediğine inanıyoruz. Karmaşık veya kötü yazılmış bölümleri açıklamak kritik önem taşır. Düzenli ifadeler, kriptografi ve string manipülasyonları gibi alanlar özellikle net yorumlardan fayda sağlar.

Örneğin MSQ'da, bir string içindeki olası Markdown kontrol karakterlerini escape eden bir fonksiyon bulunmaktadır. Gövdesi tek satırlık bir koddan oluşmakla birlikte düzenli ifade eşleşmesi içerdiğinden, işlevselliğini bir yorumla açıklıyoruz:

/**
 * Escapes Markdown control characters, newline characters, and backticks in a string.
 * This function takes a string and returns a new string with all Markdown control characters, newline characters, and backticks escaped.
 * Escaping is done by prefixing each control character and backtick with a backslash (`\\`), and newline characters are replaced with `\\\\n`.
 *
 * Control characters include: `{`, `}`, `[`, `]`, `(`, `)`, `#`, `!`, `|`, `\\`, and `` ` ``.
 * Newline characters are replaced with a visible escape sequence (`\\\\n`) for demonstration or specific formatting needs.
 * Since all newlines are escaped, list creating characters `-`, `+` and `.` are allowed.
 * Text styling characters `*`, `_` are also allowed
 *
 * @param {string} text The string to be escaped.
 * @return {string} The escaped string, safe to be used in Markdown without triggering formatting, with newline characters visually represented and backticks escaped.
 */
export function escapeMarkdown(text: string) {
  return text.replace(/([{}\\[\\]()#!|\\\\`])|\\n/g, (match) => (match === "\\n" ? "\\\\n" : "\\\\" + match));
}
Kopyala

İş akışınızda yapay zekaya karşı bir itirazınız yoksa, ChatGPT bu tür yardımcı fonksiyonlar için hızlıca iyi yorumlar üretmede oldukça başarılıdır (yalnızca sağladığı çıktıyı iki kez kontrol ettiğinizden emin olun).

Diligence yorumu Güvenlik incelemecileri olarak fonksiyon yorumlarını, tanıdık olmayan kodlarda yol haritası olarak kullanıyoruz. Unutmayın, kodu incelemek için sınırlı zamanımız var ve yorumlar uygulamayla örtüşmediğinde bu yalnızca kafa karıştırıcı olmakla kalmaz; aynı zamanda bir uyarı işaretidir.

Bu durum çoğunlukla ya fonksiyonun ya da açıklamasının spesifikasyondan saptığını ortaya koyar ve potansiyel güvenlik açıklarına işaret eder. Bir fonksiyon vaat edilen kontrolleri atlıyor ya da verileri beklenmedik şekilde işliyor olabilir; bu da ciddi sonuçlara yol açabilir.

Bu nedenle yorumlarınızı MSQ'nun kod tabanında yaptığı gibi özlü ve doğru tutun. Satır içi yorumlar yalnızca notlar değildir; kodunuzda bize rehberlik eden işaret fenerleridirler ve uyumsuzluklar bir şeylerin yanlış olabileceğine dair ipuçlarıdır.

1.3 Sistem düzeyinde dokümantasyon

Kodunuzun ve karmaşıklıklarının iyi belgelendiğinden emin olduktan sonra, bir sonraki adım sistemin mimarisini ana hatlarıyla ortaya koymaktır. Bu, bileşenler arasındaki etkileşimlerin, yazılımınızın kullandığı protokollerin, algoritmaların ve veri yapılarının ayrıntılı biçimde açıklanmasını içerir. Bu katman, koddan ziyade metin ve diyagramlar gibi insan tarafından okunabilir formatları kullanır.

MSQ'nun sistem dokümantasyonu, bir mimari genel bakış ve bir entegrasyon kılavuzu içermektedir. Metinsel açıklamalar, örnekler ve diyagramlarla zenginleştirilmiş bu belgeler, farklı sistem parçalarının nasıl etkileşime girdiğini netleştirmektedir.

Sıralı diyagramlar, bileşen etkileşimlerini görselleştirmek için son derece değerlidir. Çeşitli projelerde çok yönlülüğünü kanıtlamış ücretsiz bir araç olan diagrams.net (draw.io) kullanmanızı öneririz.

Diligence yorumu Fonksiyonları ayrıntılandıran satır içi yorumların aksine, sistem dokümanları 10.000 fit yükseklikten bir bakış açısı sunarak bir uygulamanın tüm manzarasını ortaya koyar. Bu perspektif, kod düzeyinde çoğunlukla görünmez olan bileşenler arası sorunları veya kullanıcı akışı güvenlik açıklarını tespit etmek için kritik öneme sahiptir.

Bir güvenlik incelemesini Command & Conquer oyunu gibi düşünün. Büyük ölçüde gizlenmiş bir haritayla başlarsınız. Keşfettikçe sistem dokümanları keşif birimi gibi işlev görerek tam mimariyi açığa çıkarır: izinler, Snap-dApp etkileşimleri, kullanıcı etkileşimleri. Bu açılım genel bakış, incelemecilerin güvenliği atlayan yolları tespit etmek için oyun birimi hareketlerini izler gibi kullanıcı yolculuklarını takip etmesine olanak tanır.

Üstelik kapsamlı sistem dokümanları, güvenlikle ilgili notlar ve ideal olarak bir tehdit modelleme çalışmasının çıktısını içermelidir. Ana bileşenler, etkileşimler, riskler, aktörler ve tipik kullanıcı akışlarına dair net bir genel bakış sunmalıdır. Bu, incelemecilerin öncelikli alanlara odaklanmasına ve spesifikasyondan sapmaları fark etmesine yardımcı olur.

Geliştiriciler için iyi sistem dokümantasyonu yalnızca bürokratik bir formalite değildir; saldırı ve savunma stratejilerine rehberlik eden ortak bir haritadır ve güvenlik incelemelerini kör aramalardan stratejik operasyonlara dönüştürür.

1.4 Büyük resim dokümantasyonu

Bu katman; makaleler, açılış sayfaları, blog yazıları, demo videolar ve daha fazlası gibi çok çeşitli materyalleri kapsar.

Bu bilgiler büyük ölçüde iş konularıyla ilgilidir, ancak "Ne?" sorusunu yanıtlamada büyük rol oynar; oysa önceki tüm katmanlar "Nasıl?" sorusunu farklı ayrıntı düzeylerinde yanıtlıyordu.

Yeni bir kullanıcı projenizle büyük olasılıkla bu tür materyaller aracılığıyla tanışacaktır; bu nedenle bu katmanı mümkün olduğunca sade ve görsel tutmak iyi bir fikirdir. Ayrıca bu tür materyaller genellikle yazılımı eylem halinde gösteren tek içerik türüdür; bir kullanıcının yazılımınızı kullanarak A durumundan B durumuna nasıl geçebileceğini ortaya koyar. Yazılımı eylem halinde gören insanlar, yazılımın temel fikriyle tanışır ve bunun arka planda nasıl çalıştığına dair tahminler yürütebilir.

Örneğin MSQ'nun açılış sayfası hero ekranı büyük harflerle şunu söylüyor: "USE THE INTERNET COMPUTER WITH METAMASK". Bu basit cümleyi okuyan bir okuyucu muhtemelen şöyle düşünecektir: "Ah, demek bu, Internet Computer blok zincirinden token'ları saklayabilen bir cüzdan Snap'i. Yani büyük olasılıkla diğer blok zincirleri için tasarlanmış diğer Snap'lerle aynı şekilde çalışıyor, yalnızca IC'nin geliştirici ekosisteminden teknolojiler kullanıyor" — ki bu %100 doğru bir tahmindir.

Diligence yorumu MSQ ve diğer pek çok blok zinciri projesiyle edindiğimiz deneyim, net ve üst düzey dokümantasyonun yalnızca faydalı olmakla kalmayıp hem kullanıcı benimsemesi hem de güvenlik açısından kritik önem taşıdığını tutarlı biçimde ortaya koymuştur. MSQ'nun Snap'ini incelememiz sırasında çok katmanlı dokümantasyon yaklaşımları bizi olumlu yönde şaşırttı. Geliştiricilerinden gelen bir video incelemesi, bizi hızla konuya dahil etti. Koda bakmadan önce bile Snap'in özelliklerini hızla kavrayabildik. Bu üst düzey genel bakış, beklenen davranışlar ve tipik kullanıcı akışları hakkında yorumlarla birlikte kullanıcı arayüzünü sergiliyordu. Bu tür görsel yardımcılar son derece değerlidir; güvenlik uzmanlarının uygulamaya kodlanmış "mutlu yolları" çok daha hızlı kavramasına ve çoğunlukla bu yolların dışında gizlenen güvenlik açıklarını aramasına olanak tanır. Bu yaklaşım, Snap'in ve kodun canlı bir incelemesiyle birleştirildiğinde, bir güvenlik incelemesi için ideal bir başlangıç noktası oluşturur.

2 Tasarımı mümkün olduğunca kısıtlayın

Bu bölüm muhtemelen projenizin güvenliği açısından en önemli olandır. Kodunuz hatalardan %100 güvenli olabilir ve altyapınız milyonlarca dolarlık çeşitli önlemlerle korunabilir. Ancak tasarımınız kötü niyetli aktörler tarafından istismar edilebilecek temel bir kusur içeriyorsa tüm bu çabalar anlamsız kalır.

Kullanım durumuna göre değişen spesifik örnekler olsa da birkaç evrensel ipucu sunuyoruz.

2.1 Güvenlik yönergeleri geliştirin ve bunlara uyun

MSQ'nun başlangıcında, vizyonumuzla örtüşen temel güvenlik ilkelerini belirledik:

  • MSQ ekibi hiçbir şey bilmez: Anahtar materyaller, yetkilendirme oturumu verileri veya hesap bilgileri dahil olmak üzere kullanıcıya duyarlı hiçbir bilgi toplamıyoruz.

  • Kriptografik materyal asla Snap'ten çıkmaz: Korunan kullanıcı MetaMask entropisi yalnızca Snap içinde işlenir, talep üzerine üretilir ve kullanımdan hemen sonra silinir.

  • MSQ deterministiktir: Kullanıcılar, ek bilgiye ihtiyaç duymadan kök seed phrase'lerini kullanarak tüm fonlarını, kimliklerini ve anahtar çiftlerini deterministik olarak kurtarabilir.

  • MSQ gizlilik önceliklidir: Çabalarımız her şeyden önce kullanıcı gizliliğini ön planda tutar.

Bu ilkeler MSQ'nun özel ihtiyaçlarına göre şekillendirilmiştir. Bununla birlikte MetaMask ekibi, MSQ'nun da uyduğu Snap geliştiricileri için bir dizi güvenlik yönergesi sunmaktadır; bu yönergelere buradan ulaşabilirsiniz.

Örneğin, Minimum izinler ilkesi bulunmaktadır; bu ilke temel olarak Snap'inizin bir kullanıcıdan ne kadar az izin talep ederse güvenliğinin o kadar iyi olduğu anlamına gelir. MSQ yalnızca 4 izin talep eder:

  • endowment:rpc

  • snap_dialog

  • snap_manageState

  • snap_getEntropy

endowment: network access iznine ihtiyaç duymuyoruz çünkü MSQ yalnızca işlemleri imzalamaktan sorumludur, bunları IC'ye iletmekten değil; bu sorumluluk entegre edilen dapp'e aittir.

Snap'inizde de aynı şeyi yapmalısınız: MetaMask'tan varsayılan yönergeyi alın, kendi özel kurallarınızla genişletin ve bunlara uyun.

Diligence yorumu Müşterilerimize şunu söylüyoruz: "Güvenlik eklediğiniz bir özellik değil, etrafında tasarım yaptığınız bir ilkedir." MSQ'nun projenin başından itibaren temel güvenlik ilkelerini belirlemesi, bizim aradığımız şeydir. Çok sık karşılaştığımız üzere projeler güvenliği sonradan düşünülen bir şey olarak ele alır; temel mimari kurulduktan sonra önlemleri eklemeye çalışır. Bu sonradan ekleme yaklaşımı kaçınılmaz olarak kod düzeyindeki düzeltmelerin gerçek anlamda çözemeyeceği temel kusurlar bırakır.

Consensys Diligence olarak güvenlik uzmanı hizmetleri ve araçlar sunuyor, son kullanıcıların haklarını savunuyoruz. Bu, kullanıcıların anahtar materyallerinin cüzdan güven sınırları içinde güvende kalmasını, bu bölgenin dışına istemeden sızdırılmamasını sağlamayı kapsar. Ayrıca kullanıcı gizliliğini korumaya odaklanıyoruz; ideal olarak üçüncü taraflara meta veri veya yan kanal bilgisi sızıntısını bile önlüyoruz. Bunlara ek olarak, snap'lerin işlevsellik için gereken minimum izinleri talep etmesi gerektiğini savunuyoruz; bu en az ayrıcalık ilkesidir.

MSQ'nun proaktif tutumu bu ilkelerle örtüşmektedir. Güvenliği en baştan önceliklendirerek güvenlik açıklarına karşı doğası gereği daha dirençli, daha sağlam bir temel inşa ediyorlar.

2.2 Kullanıcıyı her koşulda koruyun

Bu daha çok bir meta-yönerge niteliğindedir; çevrimiçi oyunlardan bankacılık sistemlerine kadar her yazılımda uygulanması gereken bir ilkedir.

MSQ'daki en dikkat çekici örnek, kimlik yönetimine yaklaşımımızdır. Bildiğiniz üzere, mevcut cüzdanların büyük çoğunluğu kullanıcıya bir dizi kimlik (adres, hesap vb.) sağlar. Bu kümeye, kullanıcının onayıyla herhangi bir dapp tarafından erişilebilir. Örneğin bazı işlemleri imzalamak için.

Bu durum, dapp'ler arasındaki entegrasyonlar açısından son derece kullanışlıdır; çünkü herhangi bir dapp, kullanıcı adına diğer dapp'lerin akıllı sözleşme metotlarını çağırabilir ve bu sayede birbirlerinin yeteneklerini genişletebilir. Örneğin bir kripto ödeme platformu, alıcının token'larını satıcının belirli bir mal veya hizmet için almayı beklediği token'larla eşleşecek şekilde otomatik olarak takas etmek için Uniswap'ın akıllı sözleşmelerini çağırabilir.

Ancak bu durum güvenlik açısından zararlıdır; çünkü dolandırıcılık siteleri insanları kötü niyetli işlemleri imzalamaya kandırabilir ve cüzdanlarını boşaltabilir.

Bunun aksine MSQ, kimlik kapsam belirleme tekniğini benimser; her dapp'in (her ayrı URL kaynağının) etkileşime girebileceği kendi ayrı kullanıcı kimlikleri kümesi vardır ve diğer dapp'lerdeki kullanıcı kimlikleriyle etkileşime girme imkânı yoktur. Bu yaklaşım yalnızca dolandırıcılık sitesi sorununu çözmekle kalmaz, aynı zamanda gizliliğe de büyük katkı sağlar; çünkü dapp'ler artık kullanıcıyı takip edemez ve IC'de canister olarak adlandırılan hangi akıllı sözleşmelerle etkileşime girdiklerini göremez. Internet Identity ve WebAuthn spesifikasyonundan ilham alan bu yöntem, güvenlik risklerini önemli ölçüde azaltır.

Örneğin, tanınmış bir dapp ele geçirilirse geleneksel cüzdanlar tüm dapp'lerde savunmasız kalır. Buna karşın MSQ'nun kimlik kapsamı belirleme yaklaşımı, tehdidi yalnızca ele geçirilen dapp ile sınırlandırarak daha geniş çaplı hasarı önler.

Bununla birlikte bu yöntem, kullanıcıların her dapp'te farklı kimliklere sahip olması nedeniyle dapp'ler arasındaki doğrudan entegrasyonu kısıtlar. MSQ, alan adı değişiklikleri gibi durumlarda çift onaylı kimlik paylaşımına izin vermek gibi belirli senaryolar için çözümler sunmaktadır.

Bunlara ek olarak MSQ, bir dapp'in erişebildiği verilerin ilgili kimlikle sıkı biçimde bağlantılı olmasını sağlayarak kullanıcı bilgilerini daha da güvence altına alır ve farklı uygulamalar genelinde gizliliği korur.

Diligence yorumu Sınırlı doğrudan dApp entegrasyonu konusundaki bu ödünleşim düşündürücüdür. Risk değerlendirmelerimizde sıklıkla "güvenlik bütçesini" tartışırız; mükemmel güvenliğin işlevselliği kısıtlayabileceğini kabul ederiz. MSQ bu bütçeyi akıllıca harcadı. Dapp'ler arası etkileşimleri kısıtlayarak en ciddi risklerden birini (yaygın kimlik kötüye kullanımı) büyük ölçüde azaltırken temel cüzdan işlevlerini korudu.

3 Sağlam kod yazın

Dokümantasyonu tartışırken koddan biraz bahsetmiştik. Burada, okunabilirlikten çok teknikle ilgili olan kodun birkaç farklı yönünü vurgulamak istiyoruz.

3.1 Kendi kodunuz

Burada "sağlam" ifadesi, kodun tüm beklenen ve beklenmedik girdileri kapsayarak öngörülebilir biçimde davranması anlamına gelir. Örneğin Snap'iniz hex beklerken base64 string verildiğinde nasıl tepki vermelidir? Ya da metotlar istenmeyen bir sırayla çağrılırsa veya tanımsız bir RPC metodu çağrılırsa?

Bu belirsizlikleri gidermek için şunlar gereklidir:

  1. Net hata yönetimi: Kodunuzdaki her dal ve durumun kontrol edildiğinden ve uygun şekilde ele alındığından emin olun. MSQ'nun Snap'inde, beklenmedik metot çağrılarını yakalamak için switch-case ifadelerinde TypeScript'in kapsamlı kontrollerini kullanıyoruz:

default: {
  err(ErrorCode.INVALID_RPC_METHOD, request.method);
}
Kopyala

Bu yapı, bilinmeyen bir RPC metot tanımlayıcısının kullanıldığı durumları yakalar.

  1. Girdi temizleme: Girdi verilerini beklenen tip ve formatlara göre doğrulamak karmaşık olabilir, ancak güvenlik açısından zorunludur. Bunun için TypeScript'te zod kütüphanesini kullanıyoruz; bu kütüphane TypeScript'in tip sistemini çalışma zamanı kontrollerine genişletir. Zod, yalnızca geçerli verilerin işlenmesini sağlayan ayrıntılı şema tanımlarına olanak tanır.

Örneğin SNAP_METHODS.protected.identity.login metodumuz, girdiyi titizlikle doğrulamak için bir zod şeması kullanır:

export const ZIdentityLoginRequest = z.object({
  toOrigin: ZOrigin,
  withIdentityId: ZIdentityId,
  withLinkedOrigin: z.optional(ZOrigin),
});

export const ZOrigin = z.string().url();
export const ZIdentityId = z.number().int().nonnegative();
Kopyala

Burada ZOrigin ve ZIdentityId sıradan string veya sayılar değil, özellikle doğrulanmış alt tiplerdir; bu sayede girdilerin yalnızca tip açısından değil, bağlamsal olarak da uygun olduğu güvence altına alınır.

Zod şemalarını mümkün olduğunca kesin biçimde tanımlayarak pek çok potansiyel sorunu önceden çözebilirsiniz. Denetçiler MSQ'da katı doğrulama uygulanmasını önerdi; bu öneri hayata geçirildiğinde birçok güvenlik riski tespit edilip giderildi.

Diligence yorumu Müşterilerimizden belirli bir saldırı senaryosuna yönelik önerilerimize dayalı olarak daha katı doğrulama uygulandığında başka güvenlik risklerinin de ortaya çıktığını duymak bu ilk sefer değil. Bu durum deneyimimizi tam olarak yansıtıyor ve bu nedenle saldırı yüzeyini azaltmak için her zaman katı girdi doğrulamasını savunuyoruz. Pek çok güvenlik incelemesinde girdi doğrulamasını inceleyerek başlıyoruz. Bunu sıkılaştırmak çoğunlukla gizli sorunları gün yüzüne çıkarır; bir güvenlik açığını düzeltmek bir diğerini ortaya çıkaran domino etkisi yaratır. Bu, projenin geri bildirimlerimizi ciddiye aldığının ve sistemini kademeli olarak güçlendirdiğinin açık bir göstergesidir. Azalan saldırı yüzeyiyle saldırganların zayıflıkları başarıyla istismar etmesi giderek zorlaşır.

3.2 Üçüncü taraf kodu

MSQ'da, dapp geliştiricilerine Snap'imizle doğru ve verimli etkileşimi kolaylaştıran sezgisel bir kütüphane sunmayı görevimiz olarak görüyoruz. Bu yaklaşım, yalnızca MSQ'nun değil, üçüncü taraf geliştiricilerin de temiz ve sağlam kod tabanlarını sürdürmesine olanak tanır.

Böyle bir kütüphane birçok açıdan faydalıdır:

  • API karmaşıklığını basitleştirir: Snap'in karmaşıklıklarını kullanıcı dostu bir API'ye soyutlarız. Örneğin MSQ'nun istemci kütüphanesi, JSON-RPC kısıtlamalarını aşmak ve geliştiricileri manuel veri kodlama ve çözme zahmetinden kurtarmak için veri kodlamasında CBOR kullanır.

  • Güvenli ve doğrudan etkileşimleri sağlar: Belirli Snap işlevleri yalnızca eşlik eden dapp'imize özeldir. Bunu kolaylaştırmak için yönlendirme ve veri aktarım süreçlerini yönetiyor, postMessage aracılığıyla sorunsuz bir akış sağlıyoruz. Bu dahili yönetim, üçüncü taraf geliştiricilerin Snap'imizle net ve basit bir API üzerinden etkileşime girmesini güvence altına alır.

  • Anlamsal netliği artırır: Temiz bir API yalnızca bir araç değil; aynı zamanda bir iletişim aracıdır; kodu karmaşık kodlama/çözme süreçlerinin ve ek operasyonel katmanların karmaşasından arındırarak daha okunabilir ve anlaşılır kılar.

Bu yönleri önceliklendirerek MSQ, hem Snap'imizin hem de entegre edilen dapp'lerin verimli ve güvenli şekilde çalışabileceği bir ekosistem oluşturmayı hedeflemektedir.

Diligence yorumu MSQ'nun kütüphaneleri aracılığıyla üçüncü taraf kod entegrasyonuna yaklaşımı, güvenliği korurken geliştirmeyi basitleştirme taahhüdünü ortaya koymaktadır. Özünde güvenlik Snap bağlamında kesinlikle uygulanmalıdır; ancak dapp'e yönelik bir kütüphane, Snap ile iletişim için kullanışlı bir yol sağlayabilir. Bununla birlikte, dapp geliştiricisinin dapp bağlamında kullanıldığında Snap ile güvenli etkileşimi ve verilerin güvenli kodlamasını sağlaması gerektiği her zaman göz önünde bulundurulmalıdır.

4 Tedarik zincirinizi koruyun

Son XZ arka kapı olayı, kötü niyetli kodun bağımlılıklarınızdan birine sızmasına karşı çalışmanın ne denli önemli olduğunu bir kez daha vurguladı. MSQ'da bağımlılıkları yönetmek için pnpm kullanıyoruz, ancak hangi paket yöneticisini tercih ettiğinizin aslında bir önemi yok. Bu tür saldırı vektörlerine karşı MSQ'da uyguladığımız iki temel pratik şunlardır:

4.1 Paketleri belirli sürümlere bağlayın

pnpm install --save kullanmak genellikle semver spesifikasyonuna uyarak paketin en son sürümünü yükler; bu da kırılmayan daha yeni sürümlere otomatik güncellemelere izin verir. Bu durum, package.json dosyasında kabul edilebilir sürüm aralığını belirten şapka (^) sembolüyle gösterilir:

"zod": "^3.22.4" // Installs version 3.22.4 or newer up to 4.0.0

Ancak kötü niyetli güncellemelerden kaynaklanan riskleri önlemek için bağımlılıkları belirli sürümlere kilitlemek daha güvenlidir:

  1. Her bağımlılık sürümünü sabitlemek için package.json dosyasından şapka (^) sembolünü kaldırın. Mevcut kilit dosyalarını ve node_modules klasörünü silin, ardından tanımlanan sürümlere tam olarak uymak için pnpm install komutunu çalıştırın.

  2. Otomatik güncellemeleri önlemek için gelecekteki kurulumlar için --save-exact bayrağını kullanın (pnpm install --save-exact ).

Bu kararı etkileyen bir faktör de güvendir. Örneğin MSQ'da @metamask ve @dfinity bağımlılık ad alanlarını güvenli kabul ediyor ve semver aralıkları içinde güncellemelere izin veriyoruz. Ancak bunu yaparken geçişli bağımlılıklardan kaynaklanabilecek olası güvenlik açıklarına karşı dikkatli olun.

Diligence yorumu Projeleri tam bağımlılık sürümlerine geçirmek sayısız sorunu önledi:

  • Sessiz güncellemelerin yamalanmış güvenlik açıklarını yeniden ortaya çıkarmasının önüne geçti.

  • Farklı modüllerin farklı kütüphane davranışlarıyla karşılaştığı "sürüm kayması" sorununu engelledi.

  • Olay sonrası araştırmalarda tam ortamı yeniden oluşturmamıza olanak tanıyarak kritik bir rol oynadı. Her yeni güncelleme kötü niyetli olabilir; herhangi bir ad alanında, herhangi bir pakette. Kullanılan paketleri inceleyerek ve yalnızca bilinen güvenli sürümlere bağlanarak kazara güncellemeyi önlemek, tedarik zinciri saldırıları için saldırı yüzeyini daha da azaltır. Belirli satıcılara güvenmek sorun değildir; yeni sürümlerin kullanılmadan önce kötü niyetli kod içermediği manuel olarak doğrulandığı sürece. Özellikle pek çok proje tarafından kullanılan iyi bilinen paketlerin kötü niyetli aktörler için birincil hedef olduğunu ve geçmişin gösterdiği üzere bu tür temel kütüphanelerin gelişmiş tedarik zinciri saldırılarına kurban gidebileceğini unutmayın (bkz. XZ arka kapı saldırısı).

4.2 Kilit dosyalarını deponuza kaydedin

Ekibiniz genelinde tutarlılığı sağlamak ve tekrarlanabilir derlemeler elde etmek için kilit dosyalarınızı sürüm kontrol sistemine kaydedin. MSQ'da pnpm workspaces ve turborepo kullanıyoruz; bu yapı tek bir kök kilit dosyası olan pnpm-lock.yaml'ı zorunlu kılıyor. Ancak kurulumunuz birden fazla kilit dosyasının tutulmasını gerektirebilir; ortam tutarlılığını sağlamak için tümü sürüm kontrolüne alınmalıdır.

Diligence yorumu Bu pratik, zaman zaman yalnızca bir geliştirme kolaylığı olarak göz ardı edilse de aslında güvenli ve kararlı bir kod tabanını sürdürmenin kritik bir bileşenidir. Akıllı sözleşmeleri, blok zinciri bileşenlerini ve artık MetaMask Snaps'i denetlediğimiz yıllar boyunca tekrarlanabilir derlemelerin yalnızca iyi olsa güzel olan bir şey değil, temel bir güvenlik gereksinimi olduğunu defalarca gördük. Kilit dosyalarını kaydetmek, tedarik zinciri saldırıları için saldırı yüzeyini azaltmanın bir parçasıdır. npm install artık bir piyango olmaktan çıktığında, somut sürümler ve sağlama toplamları depoda bir denetim izi bırakır, derlemeler daha deterministik hale gelir ve "Benim makinemde çalışıyor" tartışmaları sona erer.

5 Hızlı ve temiz düzeltin

Bu bölüm doğrudan Snap'imizle ilgili olmasa da denetim bulgularını verimli biçimde ele almanın nasıl yapılacağını anlamak hayati önem taşır.

Denetçi ekibi bir bulguyu bildirdiği anda düzeltme üzerinde çalışmaya başlamalısınız. Düzeltmenin boyutu ve karmaşıklığı açıkça bulguya bağlıdır, ancak onu daha küçük ve temiz yapmak için bir tavsiye var: mümkün olan yerlerde semptomu değil, nedeni düzeltin.

Örneğin MSQ'da denetçiler, MetaMask onay mesajlarımıza Markdown kontrol karakterleri enjekte etmenin mümkün olduğunu keşfetti. Kodun farklı bölümlerinde birden fazla değişiklik yaparak her ayrı onay mesajını düzeltmek yerine, text() ve heading() öğelerini (@metamask/snaps-sdk'dan) yeniden tanımladık; böylece bu öğeler içeriklerini önce escapeMarkdown() fonksiyonundan geçiriyor, ardından render ediyor. Bu sayede her text() ve heading() çağrısını ayrı ayrı düzeltmek yerine, onay mesajları içeren tüm dosyalardaki import ifadelerini özel öğelerimizle değiştirebildik; bu çok daha temiz bir düzeltmeydi.

Etkili çözüm yalnızca belirli sorunu iyileştirmekle kalmaz, aynı zamanda görünmeyen güvenlik açıklarına karşı da önceden koruma sağlar.

Diligence yorumu Projelerin güvenliğe çok sık olarak, altta yatan güvenlik açığı sınıfını göz önünde bulundurmadan her sorunu tek tek yamalar gibi yaklaştığını görüyoruz. Sorunların kök nedenini ele alarak ve güvenlik açığı sınıflarını küresel ölçekte ortadan kaldırmaktan kaçınmayarak MSQ, güvenliği bir dizi yama olarak değil, bütünsel bir disiplin olarak anladığını gösteriyor. Güvenlik uzmanları olarak müşterilerimize düzeltmelere acele etmemelerini ve bir güvenlik bulgusunu projenin güvenliği üzerinde olumlu bir etki yaratan bir olaya dönüştürmek için yeterli zaman ayırmalarını öneririz.

Sonuç

MetaMask Snaps güvenlik denetiminde başarıyla ilerlemeye ilişkin içgörülerimiz burada sona eriyor. Bu yönergeleri takip etmek, MSQ ekibinin Diligence ekibinden olumlu bir rapor almasına yardımcı oldu. MSQ deneyimini paylaşmanın, güvenlik denetimi hazırlıklarınızda size yardımcı olacağını ve kapsamlı, etkili bir süreç sağlayacağını umuyoruz.

Consensys Diligence, blok zinciri ekosistemindeki geniş bir proje yelpazesinin protokollerinin lansmanına hazır olduğundan ve kullanıcıları koruyacak şekilde inşa edildiğinden emin olmasına yardımcı oldu. Snap'inizi bu ve daha fazla güvenlik açığı açısından özel bir denetimle incelememekten mutluluk duyarız. Bize ulaşın ve fiyat teklifi alın!

Yapay zeka tarafından çevrildi. Hatalar içerebilir. Lütfen her zaman bilgileri doğrulayın.

Çeviriyi değerlendir

Bu makalenin yazarı: