اسمارٹ کانٹریکٹ سیکیورٹی ٹولز کے لیے ایک گائیڈ
ہم تین مختلف ٹیسٹنگ اور پروگرام کے تجزیے کی تکنیکیں استعمال کرنے جا رہے ہیں:
- Slither کے ساتھ اسٹیٹک تجزیہ۔ پروگرام کے تمام راستوں کا ایک ہی وقت میں تخمینہ لگایا جاتا ہے اور تجزیہ کیا جاتا ہے، مختلف پروگرام پریزنٹیشنز کے ذریعے (جیسے، کنٹرول-فلو-گراف)
- Echidna کے ساتھ فزنگ (Fuzzing)۔ کوڈ کو ٹرانزیکشنز کی سیڈو-رینڈم (pseudo-random) جنریشن کے ساتھ چلایا جاتا ہے۔ فزر (fuzzer) کسی دی گئی پراپرٹی کی خلاف ورزی کرنے کے لیے ٹرانزیکشنز کی ترتیب تلاش کرنے کی کوشش کرے گا۔
- Manticore کے ساتھ سمبولک ایگزیکیوشن (Symbolic execution)۔ ایک رسمی تصدیق کی تکنیک، جو ہر ایگزیکیوشن پاتھ کو ایک ریاضیاتی فارمولے میں تبدیل کرتی ہے، جس پر رکاوٹوں (constraints) کو چیک کیا جا سکتا ہے۔
ہر تکنیک کے اپنے فوائد اور نقصانات ہیں، اور یہ مخصوص صورتوں میں مفید ثابت ہوں گی:
| تکنیک | ٹول | استعمال | رفتار | مس ہونے والے بگز | غلط الارم |
|---|---|---|---|---|---|
| اسٹیٹک تجزیہ | Slither | CLI اور اسکرپٹس | سیکنڈز | درمیانے | کم |
| فزنگ | Echidna | Solidity پراپرٹیز | منٹس | کم | کوئی نہیں |
| سمبولک ایگزیکیوشن | Manticore | Solidity پراپرٹیز اور اسکرپٹس | گھنٹے | کوئی نہیں* | کوئی نہیں |
* اگر ٹائم آؤٹ کے بغیر تمام راستوں کو دریافت کر لیا جائے
Slither سیکنڈوں میں کانٹریکٹس کا تجزیہ کرتا ہے، تاہم، اسٹیٹک تجزیہ غلط الارم کا سبب بن سکتا ہے اور پیچیدہ چیکس (جیسے، ریاضیاتی چیکس) کے لیے کم موزوں ہوگا۔ بلٹ ان ڈیٹیکٹرز تک پش-بٹن رسائی کے لیے API کے ذریعے یا صارف کے متعین کردہ چیکس کے لیے API کے ذریعے Slither چلائیں۔
Echidna کو کئی منٹ تک چلنے کی ضرورت ہوتی ہے اور یہ صرف درست پازیٹوز (true positives) پیدا کرے گا۔ Echidna صارف کی فراہم کردہ سیکیورٹی پراپرٹیز کو چیک کرتا ہے، جو Solidity میں لکھی گئی ہیں۔ یہ بگز کو مس کر سکتا ہے کیونکہ یہ رینڈم ایکسپلوریشن پر مبنی ہے۔
Manticore "سب سے بھاری" تجزیہ کرتا ہے۔ Echidna کی طرح، Manticore صارف کی فراہم کردہ پراپرٹیز کی تصدیق کرتا ہے۔ اسے چلنے کے لیے زیادہ وقت درکار ہوگا، لیکن یہ کسی پراپرٹی کی درستگی کو ثابت کر سکتا ہے اور غلط الارم کی اطلاع نہیں دے گا۔
تجویز کردہ ورک فلو
Slither کے بلٹ ان ڈیٹیکٹرز کے ساتھ شروعات کریں تاکہ یہ یقینی بنایا جا سکے کہ کوئی سادہ بگز ابھی موجود نہیں ہیں یا بعد میں متعارف نہیں کرائے جائیں گے۔ وراثت (inheritance)، متغیر انحصار (variable dependencies)، اور ساختی مسائل سے متعلق پراپرٹیز کو چیک کرنے کے لیے Slither کا استعمال کریں۔ جیسے جیسے کوڈ بیس بڑھتا ہے، اسٹیٹ مشین کی زیادہ پیچیدہ پراپرٹیز کو ٹیسٹ کرنے کے لیے Echidna کا استعمال کریں۔ Solidity سے دستیاب نہ ہونے والے تحفظات کے لیے کسٹم چیکس تیار کرنے کے لیے Slither پر دوبارہ جائیں، جیسے کسی فنکشن کے اوور رائیڈ ہونے سے بچانا۔ آخر میں، اہم سیکیورٹی پراپرٹیز، جیسے ریاضیاتی آپریشنز کی ٹارگٹڈ تصدیق کرنے کے لیے Manticore کا استعمال کریں۔
- عام مسائل کو پکڑنے کے لیے Slither کا CLI استعمال کریں
- اپنے کانٹریکٹ کی اعلیٰ سطحی سیکیورٹی پراپرٹیز کو ٹیسٹ کرنے کے لیے Echidna کا استعمال کریں
- کسٹم اسٹیٹک چیکس لکھنے کے لیے Slither کا استعمال کریں
- جب آپ اہم سیکیورٹی پراپرٹیز کی گہرائی سے یقین دہانی چاہتے ہوں تو Manticore کا استعمال کریں
یونٹ ٹیسٹس پر ایک نوٹ۔ اعلیٰ معیار کا سافٹ ویئر بنانے کے لیے یونٹ ٹیسٹس ضروری ہیں۔ تاہم، یہ تکنیکیں سیکیورٹی کی خامیوں کو تلاش کرنے کے لیے بہترین نہیں ہیں۔ یہ عام طور پر کوڈ کے مثبت رویوں کو جانچنے کے لیے استعمال ہوتی ہیں (یعنی، کوڈ عام سیاق و سباق میں توقع کے مطابق کام کرتا ہے)، جبکہ سیکیورٹی کی خامیاں ان ایج کیسز (edge cases) میں ہوتی ہیں جن پر ڈیولپرز نے غور نہیں کیا ہوتا۔ درجنوں اسمارٹ کانٹریکٹ سیکیورٹی جائزوں کے ہمارے مطالعے میں، یونٹ ٹیسٹ کوریج کا سیکیورٹی خامیوں کی تعداد یا شدت پر کوئی اثر نہیں پڑا (opens in a new tab) جو ہمیں اپنے کلائنٹ کے کوڈ میں ملیں۔
سیکیورٹی پراپرٹیز کا تعین کرنا
اپنے کوڈ کو مؤثر طریقے سے ٹیسٹ اور تصدیق کرنے کے لیے، آپ کو ان شعبوں کی نشاندہی کرنی چاہیے جن پر توجہ دینے کی ضرورت ہے۔ چونکہ سیکیورٹی پر خرچ ہونے والے آپ کے وسائل محدود ہیں، اس لیے اپنی کوششوں کو بہتر بنانے کے لیے اپنے کوڈ بیس کے کمزور یا اعلیٰ قیمت والے حصوں کا دائرہ کار طے کرنا اہم ہے۔ تھریٹ ماڈلنگ (Threat modeling) اس میں مدد کر سکتی ہے۔ ان کا جائزہ لینے پر غور کریں:
- ریپڈ رسک اسیسمنٹس (Rapid Risk Assessments) (opens in a new tab) (وقت کم ہونے پر ہماری ترجیحی اپروچ)
- ڈیٹا سینٹرک سسٹم تھریٹ ماڈلنگ کی گائیڈ (opens in a new tab) (عرف NIST 800-154)
- Shostack تھریٹ ماڈلنگ (opens in a new tab)
- STRIDE (opens in a new tab) / DREAD (opens in a new tab)
- PASTA (opens in a new tab)
- Assertions کا استعمال (opens in a new tab)
اجزاء
یہ جاننا کہ آپ کیا چیک کرنا چاہتے ہیں، آپ کو صحیح ٹول منتخب کرنے میں بھی مدد دے گا۔
وہ وسیع شعبے جو اکثر اسمارٹ کانٹریکٹس کے لیے متعلقہ ہوتے ہیں ان میں شامل ہیں:
-
اسٹیٹ مشین۔ زیادہ تر کانٹریکٹس کو اسٹیٹ مشین کے طور پر پیش کیا جا سکتا ہے۔ یہ چیک کرنے پر غور کریں کہ (1) کسی غلط اسٹیٹ تک نہیں پہنچا جا سکتا، (2) اگر کوئی اسٹیٹ درست ہے تو اس تک پہنچا جا سکتا ہے، اور (3) کوئی اسٹیٹ کانٹریکٹ کو ٹریپ (trap) نہیں کرتی۔
- اسٹیٹ مشین کی خصوصیات کو ٹیسٹ کرنے کے لیے Echidna اور Manticore پسندیدہ ٹولز ہیں۔
-
ایکسیس کنٹرولز۔ اگر آپ کے سسٹم میں مراعات یافتہ صارفین (جیسے، ایک مالک، کنٹرولرز، ...) ہیں تو آپ کو یہ یقینی بنانا چاہیے کہ (1) ہر صارف صرف مجاز کارروائیاں کر سکتا ہے اور (2) کوئی صارف زیادہ مراعات یافتہ صارف کی کارروائیوں کو بلاک نہیں کر سکتا۔
- Slither، Echidna اور Manticore درست ایکسیس کنٹرولز کی جانچ کر سکتے ہیں۔ مثال کے طور پر، Slither یہ چیک کر سکتا ہے کہ صرف وائٹ لسٹڈ فنکشنز میں onlyOwner موڈیفائر کی کمی ہے۔ Echidna اور Manticore زیادہ پیچیدہ ایکسیس کنٹرول کے لیے مفید ہیں، جیسے کہ اجازت صرف اس صورت میں دی جاتی ہے جب کانٹریکٹ کسی دی گئی اسٹیٹ تک پہنچ جائے۔
-
ریاضیاتی آپریشنز۔ ریاضیاتی آپریشنز کی درستگی کی جانچ کرنا انتہائی اہم ہے۔ اوور فلو/انڈر فلو کو روکنے کے لیے ہر جگہ
SafeMathکا استعمال ایک اچھا قدم ہے، تاہم، آپ کو اب بھی دیگر ریاضیاتی خامیوں پر غور کرنا چاہیے، بشمول راؤنڈنگ کے مسائل اور وہ خامیاں جو کانٹریکٹ کو ٹریپ کرتی ہیں۔- Manticore یہاں بہترین انتخاب ہے۔ Echidna کا استعمال کیا جا سکتا ہے اگر ریاضی SMT سالور (solver) کے دائرہ کار سے باہر ہو۔
-
وراثت کی درستگی۔ Solidity کانٹریکٹس زیادہ تر ملٹیپل انہیریٹنس (multiple inheritance) پر انحصار کرتے ہیں۔ غلطیاں جیسے کہ شیڈونگ فنکشن میں
superکال کا غائب ہونا اور غلط تشریح شدہ c3 لینیئرائزیشن آرڈر آسانی سے متعارف کرائے جا سکتے ہیں۔- ان مسائل کی نشاندہی کو یقینی بنانے کے لیے Slither ایک بہترین ٹول ہے۔
-
بیرونی تعاملات۔ کانٹریکٹس ایک دوسرے کے ساتھ تعامل کرتے ہیں، اور کچھ بیرونی کانٹریکٹس پر بھروسہ نہیں کیا جانا چاہیے۔ مثال کے طور پر، اگر آپ کا کانٹریکٹ بیرونی اوریکلز (oracles) پر انحصار کرتا ہے، تو کیا یہ محفوظ رہے گا اگر دستیاب اوریکلز میں سے آدھے کمپرومائز ہو جائیں؟
- آپ کے کانٹریکٹس کے ساتھ بیرونی تعاملات کو ٹیسٹ کرنے کے لیے Manticore اور Echidna بہترین انتخاب ہیں۔ Manticore میں بیرونی کانٹریکٹس کو اسٹب (stub) کرنے کا ایک بلٹ ان میکانزم ہے۔
-
معیار کی مطابقت۔ Ethereum کے معیارات (جیسے، ERC20) کے ڈیزائن میں خامیوں کی ایک تاریخ ہے۔ اس معیار کی حدود سے آگاہ رہیں جس پر آپ تعمیر کر رہے ہیں۔
- Slither، Echidna، اور Manticore آپ کو کسی دیے گئے معیار سے انحراف کا پتہ لگانے میں مدد کریں گے۔
ٹول کے انتخاب کی چیٹ شیٹ
| جزو | ٹولز | مثالیں |
|---|---|---|
| اسٹیٹ مشین | Echidna, Manticore | |
| ایکسیس کنٹرول | Slither, Echidna, Manticore | Slither exercise 2 (opens in a new tab), Echidna exercise 2 (opens in a new tab) |
| ریاضیاتی آپریشنز | Manticore, Echidna | Echidna exercise 1 (opens in a new tab), Manticore exercises 1 - 3 (opens in a new tab) |
| وراثت کی درستگی | Slither | Slither exercise 1 (opens in a new tab) |
| بیرونی تعاملات | Manticore, Echidna | |
| معیار کی مطابقت | Slither, Echidna, Manticore | slither-erc (opens in a new tab) |
آپ کے اہداف کے لحاظ سے دیگر شعبوں کو چیک کرنے کی ضرورت ہوگی، لیکن توجہ کے یہ وسیع شعبے کسی بھی اسمارٹ کانٹریکٹ سسٹم کے لیے ایک اچھی شروعات ہیں۔
ہمارے عوامی آڈٹس میں تصدیق شدہ یا ٹیسٹ شدہ پراپرٹیز کی مثالیں شامل ہیں۔ حقیقی دنیا کی سیکیورٹی پراپرٹیز کا جائزہ لینے کے لیے درج ذیل رپورٹس کے Automated Testing and Verification سیکشنز کو پڑھنے پر غور کریں:
صفحہ کی آخری اپ ڈیٹ: ۳ مارچ، ۲۰۲۶