مرکزی مواد پر جائیں

سمارٹ کنٹریکٹ سیکیورٹی ٹولز کے لیے ایک گائیڈ

Solidity
سمارٹ کنٹریکٹس
سیکیورٹی
درمیانی
Trailofbits
۷ ستمبر، ۲۰۲۰
8 منٹ کا مطالعہ

ہم تین مخصوص ٹیسٹنگ اور پروگرام کے تجزیے کی تکنیکیں استعمال کرنے جا رہے ہیں:

  • سلدر کے ساتھ جامد تجزیہ (Static analysis)۔ پروگرام کے تمام راستوں کا ایک ہی وقت میں تخمینہ لگایا جاتا ہے اور مختلف پروگرام پیشکشوں (جیسے، کنٹرول-فلو-گراف) کے ذریعے تجزیہ کیا جاتا ہے۔
  • ایکڈنا کے ساتھ فزنگ (Fuzzing)۔ کوڈ کو ٹرانزیکشنز کی سیڈو-رینڈم (pseudo-random) جنریشن کے ساتھ چلایا جاتا ہے۔ فزر (fuzzer) کسی دی گئی خاصیت کی خلاف ورزی کرنے کے لیے ٹرانزیکشنز کی ترتیب تلاش کرنے کی کوشش کرے گا۔
  • مینٹیکور کے ساتھ علامتی عمل درآمد (Symbolic execution)۔ ایک رسمی تصدیق کی تکنیک، جو ہر عمل درآمد کے راستے کو ایک ریاضیاتی فارمولے میں تبدیل کرتی ہے، جس پر رکاوٹوں (constraints) کو چیک کیا جا سکتا ہے۔

ہر تکنیک کے اپنے فوائد اور نقصانات ہیں، اور یہ مخصوص صورتوں میں مفید ثابت ہوں گی:

تکنیکٹولاستعمالرفتارمس ہونے والے بگزغلط الارم
جامد تجزیہ (Static Analysis)سلدرCLI اور اسکرپٹسسیکنڈزدرمیانےکم
فزنگ (Fuzzing)ایکڈناSolidity کی خصوصیاتمنٹسکمکوئی نہیں
علامتی عمل درآمد (Symbolic Execution)مینٹیکورSolidity کی خصوصیات اور اسکرپٹسگھنٹےکوئی نہیں*کوئی نہیں

* اگر تمام راستوں کو ٹائم آؤٹ کے بغیر دریافت کیا جائے

سلدر سیکنڈوں میں کنٹریکٹس کا تجزیہ کرتا ہے، تاہم، جامد تجزیہ غلط الارم کا سبب بن سکتا ہے اور پیچیدہ چیکس (جیسے، ریاضیاتی چیکس) کے لیے کم موزوں ہوگا۔ بلٹ ان ڈیٹیکٹرز تک پش-بٹن رسائی کے لیے API کے ذریعے سلدر چلائیں یا صارف کے متعین کردہ چیکس کے لیے API کے ذریعے چلائیں۔

ایکڈنا کو کئی منٹ تک چلنے کی ضرورت ہوتی ہے اور یہ صرف درست مثبت (true positives) نتائج دے گا۔ ایکڈنا صارف کی فراہم کردہ سیکیورٹی خصوصیات کو چیک کرتا ہے، جو Solidity میں لکھی گئی ہیں۔ یہ بگز کو مس کر سکتا ہے کیونکہ یہ بے ترتیب (random) دریافت پر مبنی ہے۔

مینٹیکور سب سے "بھاری" تجزیہ کرتا ہے۔ ایکڈنا کی طرح، مینٹیکور صارف کی فراہم کردہ خصوصیات کی تصدیق کرتا ہے۔ اسے چلنے کے لیے زیادہ وقت درکار ہوگا، لیکن یہ کسی خاصیت کی درستگی کو ثابت کر سکتا ہے اور غلط الارم کی اطلاع نہیں دے گا۔

تجویز کردہ ورک فلو

سلدر کے بلٹ ان ڈیٹیکٹرز کے ساتھ شروعات کریں تاکہ یہ یقینی بنایا جا سکے کہ کوئی سادہ بگز ابھی موجود نہیں ہیں یا بعد میں متعارف نہیں ہوں گے۔ وراثت (inheritance)، متغیر انحصار (variable dependencies)، اور ساختی مسائل سے متعلق خصوصیات کو چیک کرنے کے لیے سلدر کا استعمال کریں۔ جیسے جیسے کوڈ بیس بڑھتا ہے، حالت کی مشین (state machine) کی مزید پیچیدہ خصوصیات کو جانچنے کے لیے ایکڈنا کا استعمال کریں۔ Solidity سے دستیاب نہ ہونے والے تحفظات کے لیے کسٹم چیکس تیار کرنے کے لیے سلدر پر دوبارہ جائیں، جیسے کسی فنکشن کو اوور رائیڈ ہونے سے بچانا۔ آخر میں، اہم سیکیورٹی خصوصیات، جیسے ریاضیاتی کارروائیوں کی ہدفی تصدیق کرنے کے لیے مینٹیکور کا استعمال کریں۔

  • عام مسائل کو پکڑنے کے لیے سلدر کے CLI کا استعمال کریں
  • اپنے کنٹریکٹ کی اعلیٰ سطحی سیکیورٹی خصوصیات کو جانچنے کے لیے ایکڈنا کا استعمال کریں
  • کسٹم جامد چیکس لکھنے کے لیے سلدر کا استعمال کریں
  • جب آپ اہم سیکیورٹی خصوصیات کی گہرائی سے یقین دہانی چاہتے ہوں تو مینٹیکور کا استعمال کریں

یونٹ ٹیسٹس پر ایک نوٹ۔ اعلیٰ معیار کا سافٹ ویئر بنانے کے لیے یونٹ ٹیسٹس ضروری ہیں۔ تاہم، یہ تکنیکیں سیکیورٹی کی خامیوں کو تلاش کرنے کے لیے بہترین نہیں ہیں۔ یہ عام طور پر کوڈ کے مثبت رویوں کو جانچنے کے لیے استعمال ہوتی ہیں (یعنی، کوڈ عام سیاق و سباق میں توقع کے مطابق کام کرتا ہے)، جبکہ سیکیورٹی کی خامیاں ان ایج کیسز (edge cases) میں ہوتی ہیں جن پر ڈیولپرز نے غور نہیں کیا ہوتا۔ درجنوں سمارٹ کنٹریکٹ سیکیورٹی جائزوں کے ہمارے مطالعے میں، یونٹ ٹیسٹ کوریج کا سیکیورٹی خامیوں کی تعداد یا شدت پر کوئی اثر نہیں پڑا (opens in a new tab) جو ہمیں اپنے کلائنٹ کے کوڈ میں ملیں۔

سیکیورٹی خصوصیات کا تعین کرنا

اپنے کوڈ کو مؤثر طریقے سے جانچنے اور تصدیق کرنے کے لیے، آپ کو ان شعبوں کی نشاندہی کرنی چاہیے جن پر توجہ دینے کی ضرورت ہے۔ چونکہ سیکیورٹی پر خرچ ہونے والے آپ کے وسائل محدود ہیں، اس لیے اپنی کوششوں کو بہتر بنانے کے لیے اپنے کوڈ بیس کے کمزور یا اعلیٰ قدر والے حصوں کا دائرہ کار طے کرنا اہم ہے۔ تھریٹ ماڈلنگ (Threat modeling) اس میں مدد کر سکتی ہے۔ درج ذیل کا جائزہ لینے پر غور کریں:

اجزاء

یہ جاننا کہ آپ کیا چیک کرنا چاہتے ہیں، آپ کو صحیح ٹول منتخب کرنے میں بھی مدد دے گا۔

وہ وسیع شعبے جو اکثر سمارٹ کنٹریکٹس کے لیے متعلقہ ہوتے ہیں ان میں شامل ہیں:

  • حالت کی مشین (State machine)۔ زیادہ تر کنٹریکٹس کو حالت کی مشین کے طور پر پیش کیا جا سکتا ہے۔ یہ چیک کرنے پر غور کریں کہ (1) کسی بھی غلط حالت تک نہیں پہنچا جا سکتا، (2) اگر کوئی حالت درست ہے تو اس تک پہنچا جا سکتا ہے، اور (3) کوئی بھی حالت کنٹریکٹ کو پھنساتی (trap) نہیں ہے۔

    • حالت کی مشین کی خصوصیات کو جانچنے کے لیے ایکڈنا اور مینٹیکور بہترین ٹولز ہیں۔
  • رسائی کے کنٹرولز (Access controls)۔ اگر آپ کے سسٹم میں مراعات یافتہ صارفین (جیسے، ایک مالک، کنٹرولرز، ...) ہیں تو آپ کو یہ یقینی بنانا چاہیے کہ (1) ہر صارف صرف مجاز کارروائیاں کر سکتا ہے اور (2) کوئی بھی صارف زیادہ مراعات یافتہ صارف کی کارروائیوں کو روک نہیں سکتا۔

    • سلدر، ایکڈنا اور مینٹیکور درست رسائی کے کنٹرولز کی جانچ کر سکتے ہیں۔ مثال کے طور پر، سلدر یہ چیک کر سکتا ہے کہ صرف وائٹ لسٹ شدہ فنکشنز میں onlyOwner موڈیفائر کی کمی ہے۔ ایکڈنا اور مینٹیکور زیادہ پیچیدہ رسائی کے کنٹرول کے لیے مفید ہیں، جیسے کہ اجازت صرف اس صورت میں دی جاتی ہے جب کنٹریکٹ کسی دی گئی حالت تک پہنچ جائے۔
  • ریاضیاتی کارروائیاں۔ ریاضیاتی کارروائیوں کی درستگی کی جانچ کرنا انتہائی اہم ہے۔ اوور فلو/انڈر فلو کو روکنے کے لیے ہر جگہ SafeMath کا استعمال ایک اچھا قدم ہے، تاہم، آپ کو اب بھی دیگر ریاضیاتی خامیوں پر غور کرنا چاہیے، بشمول راؤنڈنگ کے مسائل اور وہ خامیاں جو کنٹریکٹ کو پھنسا دیتی ہیں۔

    • مینٹیکور یہاں بہترین انتخاب ہے۔ اگر ریاضی SMT حل کنندہ کے دائرہ کار سے باہر ہے تو ایکڈنا کا استعمال کیا جا سکتا ہے۔
  • وراثت کی درستگی۔ Solidity کنٹریکٹس زیادہ تر متعدد وراثت (multiple inheritance) پر انحصار کرتے ہیں۔ غلطیاں جیسے کہ شیڈونگ فنکشن میں super کال کا غائب ہونا اور غلط تشریح شدہ c3 لینیئرائزیشن آرڈر آسانی سے متعارف ہو سکتے ہیں۔

    • سلدر ان مسائل کی نشاندہی کو یقینی بنانے کا ٹول ہے۔
  • بیرونی تعاملات۔ کنٹریکٹس ایک دوسرے کے ساتھ تعامل کرتے ہیں، اور کچھ بیرونی کنٹریکٹس پر بھروسہ نہیں کیا جانا چاہیے۔ مثال کے طور پر، اگر آپ کا کنٹریکٹ بیرونی اوریکلز (oracles) پر انحصار کرتا ہے، تو کیا یہ محفوظ رہے گا اگر دستیاب اوریکلز میں سے آدھے سمجھوتے (compromised) کا شکار ہو جائیں؟

    • آپ کے کنٹریکٹس کے ساتھ بیرونی تعاملات کو جانچنے کے لیے مینٹیکور اور ایکڈنا بہترین انتخاب ہیں۔ مینٹیکور میں بیرونی کنٹریکٹس کو اسٹب (stub) کرنے کا ایک بلٹ ان طریقہ کار موجود ہے۔
  • معیار کی مطابقت۔ ایتھیریم کے معیارات (جیسے، ERC-20) کے ڈیزائن میں خامیوں کی ایک تاریخ ہے۔ آپ جس معیار پر تعمیر کر رہے ہیں اس کی حدود سے آگاہ رہیں۔

    • سلدر، ایکڈنا، اور مینٹیکور آپ کو کسی دیے گئے معیار سے انحراف کا پتہ لگانے میں مدد کریں گے۔

ٹول کے انتخاب کی چیٹ شیٹ

جزوٹولزمثالیں
حالت کی مشینایکڈنا، مینٹیکور
رسائی کا کنٹرولسلدر، ایکڈنا، مینٹیکورسلدر کی مشق 2 (opens in a new tab)، ایکڈنا کی مشق 2 (opens in a new tab)
ریاضیاتی کارروائیاںمینٹیکور، ایکڈناایکڈنا کی مشق 1 (opens in a new tab)، مینٹیکور کی مشقیں 1 - 3 (opens in a new tab)
وراثت کی درستگیسلدرسلدر کی مشق 1 (opens in a new tab)
بیرونی تعاملاتمینٹیکور، ایکڈنا
معیار کی مطابقتسلدر، ایکڈنا، مینٹیکورslither-erc (opens in a new tab)

آپ کے اہداف کے لحاظ سے دیگر شعبوں کو بھی چیک کرنے کی ضرورت ہوگی، لیکن توجہ کے یہ وسیع شعبے کسی بھی سمارٹ کنٹریکٹ سسٹم کے لیے ایک اچھی شروعات ہیں۔

ہمارے عوامی آڈٹس میں تصدیق شدہ یا جانچی گئی خصوصیات کی مثالیں موجود ہیں۔ حقیقی دنیا کی سیکیورٹی خصوصیات کا جائزہ لینے کے لیے درج ذیل رپورٹس کے Automated Testing and Verification سیکشنز کو پڑھنے پر غور کریں: