ہم نے ابھی دیکھا ہے کہ کس طرح ایک چھوٹی سی خامی مالی نقصان کا باعث بنتی ہے (مختلف شدت کے)، اسی طرح سولیڈیٹی پر تیار کردہ سمارٹ معاہدے مختلف معلوم اور نامعلوم حملوں کا شکار ہوتے ہیں۔ استحصال کرنے والے سمارٹ معاہدوں میں جھانکنے کے لیے کیڑے اور خامیوں کا فائدہ اٹھاتے ہیں اور حملے کرنے کے لیے ان سے جوڑ توڑ کرتے ہیں۔ یہاں ہم سولیڈیٹی پروگرامنگ لینگویج میں عام طور پر سامنے آنے والی ٹاپ 5 غلطیوں کی ایک جامع فہرست پیش کرتے ہیں۔
QuillAudits میں ہم ہر ہیک کا خلاصہ حاصل کرنے کے لیے موافقت پذیر طریقہ کار کی پیروی کرتے ہیں اور کسی بھی ممکنہ خطرے سے بچنے کے لیے مستقبل کے سمارٹ معاہدوں پر اس کے سیکھنے کو لاگو کرتے ہیں۔
سولیٹی پروگرامنگ زبان میں غلطیاں
1. غیر چیک شدہ بیرونی کال
ہم اس مسئلے کو پہلے اس لیے کھینچ رہے ہیں کیونکہ یہ سب سے زیادہ دیکھے جانے والے سالیڈیٹی نقصانات میں سے ایک ہے۔ عام طور پر، کسی بھی بیرونی اکاؤنٹ میں ایتھر بھیجنے کے لیے کے ذریعے کیا جاتا ہے منتقلی() فنکشن اس کے علاوہ، بیرونی کال کرنے کے لیے دو سب سے زیادہ استعمال ہونے والے فنکشنز ہیں؛ کال ()، اور بھیجیں()، یہاں بنیادی طور پر کال () فنکشن بڑے پیمانے پر ڈویلپرز کے ذریعے ورسٹائل بیرونی کالز کرنے کے لیے استعمال ہوتا ہے۔
اگرچہ کال () اور بھیجیں() فنکشنز ایک بولین ویلیو واپس کرتے ہیں جس سے یہ بتاتا ہے کہ آیا کال کامیاب تھی یا نہیں۔ اس طرح اس صورت میں، اگر کوئی افعال کال () or بھیجیں() کام انجام دینے میں ناکام رہتے ہیں، وہ a کے ساتھ واپس آجائیں گے۔ جھوٹا لہذا، اگر ڈویلپر واپسی کی قیمت کو کراس چیک نہیں کرتا ہے، تو یہ ایک نقصان بن جائے گا۔
کمزوری
ذیل کی مثال پر غور کریں:
معاہدہ لوٹو{
boolpublic payedOut = غلط؛
عوامی فاتح سے خطاب؛
عوامی جیت کی رقم
// … یہاں اضافی فعالیت
فنکشن sendToWinner()public{
درکار ہے (! ادائیگی شدہ)؛
winner.send(winAmount)؛
payedOut = true;
}
فنکشن واپس لے لیفٹ اوور()عوامی{
درکار (ادائیگی)؛
msg.sender.send(this.balance)؛
}
}
اوپر والے لوٹو جیسے معاہدے میں، ہم مشاہدہ کر سکتے ہیں کہ a فاتح موصول جیت کی رقم کسی بھی بیرونی ایجنٹ سے واپس لینے کے لیے تھوڑا سا بچا ہوا ایتھر۔
یہاں، معاہدے کے لیے نقصان لائن [11] پر موجود ہے، جہاں a بھیجنے جواب کی کراس توثیق کے بغیر استعمال کیا جاتا ہے۔ مندرجہ بالا مثال میں، a فاتح جس کا لین دین ناکام ہو جاتا ہے (یا تو گیس کی کمی سے یا اگر یہ معاہدہ ہے جو جان بوجھ کر فال بیک فنکشن میں ڈالتا ہے) ادا کیا پر مقرر کیا جائے سچ اس بات سے قطع نظر کہ ایتھر کا لین دین کامیاب تھا یا نہیں۔ اس صورت میں، کوئی بھی استحصال کرنے والا واپس لے سکتا ہے۔ فاتح کا کے ذریعے جیت پیچھے ہٹنا باقی تقریب.
QuillAudit کا نقطہ نظر
ڈویلپرز کی ہماری اندرون ملک ٹیم کے استعمال سے اس مسئلے سے نمٹتی ہے۔ [منتقلی] کے بجائے فنکشن [بھیجیں] فنکشن، جیسا کہ [ٹرانسفر] اگر بیرونی لین دین واپس آجاتا ہے تو واپس آجائے گا۔ اور اگر آپ [بھیجیں] استعمال کر رہے ہیں، تو ہمیشہ واپسی کی قیمت کو کراس چیک کریں۔
ایک مضبوط طریقہ جس کی ہم پیروی کرتے ہیں وہ ہے [واپسی کا نمونہ] استعمال کرنا۔ یہاں، ہم بیرونی بھیجنے کی فعالیت کو باقی کوڈبیس سے منطقی طور پر الگ کر دیتے ہیں، اور ممکنہ طور پر ناکام ہونے والے لین دین کا دباؤ اختتامی صارف پر ڈالتے ہیں، کیونکہ وہی ہے جو واپس لینے کے فنکشن کو کال کرتا ہے۔
2. دوبارہ داخلہ
ایتھرئم سمارٹ کنٹریکٹس دوسرے بیرونی معاہدوں کے کوڈز کو کال اور استعمال کرتے ہیں، اور اس کو انجام دینے کے لیے، معاہدوں کو بیرونی کالز جمع کرنے کی ضرورت ہوتی ہے۔ یہ بیرونی کالز خطرناک اور حملوں کا شکار ہیں، ایسا ہی ایک حملہ حال ہی میں DAO ہیک کے معاملے میں ہوا ہے۔
کمزوری
حملہ آور ایسے حملے کرتے ہیں جب کوئی معاہدہ ایتھر کو کسی نامعلوم پتے پر بھیجتا ہے۔ اس صورت میں، حملہ آور ایک بیرونی ایڈریس پر ایک معاہدہ بنا سکتا ہے جس میں فال بیک فنکشن میں نقصان دہ کوڈ موجود ہے، اور یہ نقصان دہ کوڈ اس وقت طلب کیا جائے گا جب معاہدہ اس ایڈریس پر ایتھر بھیجے گا۔
حقیقت: 'Reentrancy' کی اصطلاح اس حقیقت سے وضع کی گئی ہے کہ جب کوئی بیرونی نقصان دہ معاہدہ کمزور کنٹریکٹ پر کسی فنکشن کو کال کرتا ہے اور پھر کوڈ پر عمل درآمد کا راستہ اسے 'دوبارہ داخل کرتا ہے'۔
ذیل میں دی گئی مثال پر غور کریں، یہ ایک Ethereum والٹ ہے جو ڈپازٹرز کو فی ہفتہ صرف 1 ایتھر نکالنے کی اجازت دیتا ہے۔
معاہدہ ایتھر اسٹور {
uint256 عوامی واپسی کی حد = 1 آسمان؛
میپنگ(ایڈریس => uint256) عوامی lastWithdrawTime؛
نقشہ سازی (پتہ => uint256) عوامی بیلنس؛
فنکشن depositFunds() بیرونی قابل ادائیگی {
بیلنس[msg.sender] += msg.value؛
}
فنکشن کی واپسی فنڈز (uint256 _weiToWithdraw) عوامی {
درکار ہے(بیلنس[msg.sender]>= _weiToWithdraw)؛
// واپسی کو محدود کریں۔
درکار ہے(_weiToWithdraw <= واپس لینے کی حد)؛
// واپس لینے کے لئے اجازت دی گئی وقت کو محدود کریں۔
درکار ہے (ابھی >= lastWithdrawTime[msg.sender] + 1 ہفتہ)؛
درکار(msg.sender.call.value(_weiToWithdraw)())؛
بیلنس[msg.sender] -= _weiToWithdraw؛
lastWithdrawTime[msg.sender] = اب؛
}
}
مذکورہ معاہدے میں، ہمارے پاس دو عوامی افعال ہیں، [depositFunds] اور [withdrawFunds]۔ [depositFunds] کا استعمال بھیجنے والے کے بیلنس کو بڑھانے کے لیے کیا جاتا ہے، جب کہ [withdrawFunds] رقم نکالنے کی وضاحت کرتا ہے۔ اس صورت میں، اگر نکالی جانے والی رقم 1 ایتھر سے کم ہو تو یہ کامیابی ہوگی۔
یہاں خرابی لائن [17] میں ہے جہاں ایتھر کی منتقلی ہوتی ہے۔ حملہ آور صرف کنسٹرکٹر پیرامیٹر کے طور پر [EtherStores] کے کنٹریکٹ ایڈریس کے ساتھ ایک بدنیتی پر مبنی معاہدہ بنا سکتا ہے۔ یہ [ایتھر اسٹور] کو ایک عوامی متغیر بنا دے گا، اس لیے اس پر حملے کا زیادہ خطرہ ہے۔
QuilllAudit کا نقطہ نظر
ہم سمارٹ معاہدوں میں دوبارہ داخلے کے ممکنہ خطرات سے بچنے کے لیے مختلف تکنیکوں کی پیروی کرتے ہیں۔ ایتھر کو کسی بیرونی معاہدے میں منتقل کرتے وقت سب سے پہلا اور بہترین ممکنہ طریقہ بلٹ ان [ٹرانسفر] فنکشن کا استعمال ہے۔
دوم، یہ یقینی بنانا ضروری ہے کہ ایتھر کو معاہدے سے باہر بھیجنے سے پہلے ریاستی متغیرات میں تمام منطقی تبدیلیاں کی جائیں۔ [EtherStore] کی مثال میں، لائنوں [18] اور [19] کو لائن [17] سے پہلے رکھنا چاہئے۔
ایک تیسری تکنیک کو دوبارہ آنے والی کالوں کو روکنے کے لیے بھی استعمال کیا جا سکتا ہے۔ ایک mutex کے تعارف کے ذریعے. یہ ریاستی متغیر کا اضافہ ہے جو کوڈ پر عمل درآمد کے دوران معاہدے کو لاک کر دے گا۔
3. پہلے سے طے شدہ مرئیت
ان فنکشنز کے لیے visibility specifiers ہیں جو ہم Solidity میں استعمال کرتے ہیں، اور وہ بتاتے ہیں کہ انہیں کس طرح بلایا جا سکتا ہے۔ یہ مرئیت ہے جو افعال کی کالنگ کا تعین کرتی ہے۔ بیرونی طور پر صارفین کے ذریعے، دوسرے اخذ کردہ معاہدوں کے ذریعے، صرف اندرونی طور پر یا صرف بیرونی طور پر۔ آئیے دیکھتے ہیں کہ کس طرح visibility specifiers کا غلط استعمال سمارٹ معاہدوں میں بڑے خطرے کا باعث بن سکتا ہے۔
کمزوری
پہلے سے طے شدہ طور پر، فنکشن کی مرئیت [عوامی] ہے، اس لیے بیرونی صارفین فنکشن کو بغیر کسی خاص مرئی کے کال کرسکتے ہیں۔ بگ اس وقت پیدا ہوتا ہے جب ڈویلپر ان فنکشنز پر مرئیت کی وضاحت کرنا بھول جاتے ہیں جو پرائیویٹ ہونے چاہئیں (یا کنٹریکٹ کے اندر ہی بلائے جا سکتے ہیں)۔ مثال کے طور پر؛
معاہدہ HashForEther {
فنکشن واپس لینا Winnings() {
// فاتح اگر پتے کے آخری 8 ہیکس حروف 0 ہیں۔
درکار ہے(uint32(msg.sender) == 0)؛
_sendWinnings();
}
فنکشن _sendWinnings() {
msg.sender.transfer(this.balance)؛
}
}
مندرجہ بالا معاہدہ ایک سادہ ایڈریس کا اندازہ لگانے والا باؤنٹی گیم ہے۔ اس میں، ہم دیکھ سکتے ہیں کہ فنکشنز کی مرئیت کی وضاحت نہیں کی گئی ہے، خاص طور پر [ _sendWinnings] فنکشن [پبلک] (بطور ڈیفالٹ) ہے، اس لیے اسے باؤنٹی چوری کرنے کے لیے کسی بھی ایڈریس کے ذریعے بلایا جا سکتا ہے۔
QuillAudit کا نقطہ نظر
ہماری ان ہاؤس ٹیم تجربہ کار ڈویلپرز پر مشتمل ہے جو ہمیشہ بہترین آڈٹ طریقوں کی پیروی کرتے ہیں، یہاں فنکشنز کی مرئیت کو واضح طور پر بیان کیا جانا چاہیے، چاہے انہیں عوامی رکھا جائے، اس کا ذکر کیا جانا چاہیے۔
4. تعمیر کنندگان کے استعمال کی حفاظت کرنا
عام طور پر، کنسٹرکٹرز کو خصوصی فنکشن کہا جاتا ہے جو معاہدوں کو شروع کرتے وقت اہم اور مراعات یافتہ کاموں کو انجام دینے کے لیے استعمال ہوتے ہیں۔ سالیڈیٹی [v0.4.22] سے پہلے، کنسٹرکٹرز وہی نام رکھتے تھے جو کنٹریکٹ کے ذریعے استعمال کیا جاتا تھا جس میں وہ شامل تھے۔ اب، ایک ایسے معاملے پر غور کریں جہاں ڈیولپمنٹ کے مرحلے کے دوران کنٹریکٹ کا نام تبدیل کیا جاتا ہے لیکن کنسٹرکٹر کا نام وہی رہتا ہے، یہ خامی حملہ آوروں کو آپ کے سمارٹ کنٹریکٹ میں آسانی سے داخلہ بھی فراہم کر سکتی ہے۔
کمزوری
اگر معاہدے کے نام میں ترمیم کی جاتی ہے لیکن کنسٹرکٹر کا نام تبدیل نہیں ہوتا ہے تو یہ سنگین نتائج کا باعث بن سکتا ہے۔ مثال کے طور پر:
معاہدہ OwnerWallet {
عوامی مالک کا پتہ؛
// تعمیر کنندہ
فنکشن مالک والیٹ (پتہ _مالک) عوامی {
مالک = مالک؛
}
// فال بیک۔ ایتھر جمع کریں۔
فنکشن () قابل ادائیگی {}
فنکشن واپس لینے () عوامی {
کی ضرورت ہوتی ہے (msg.sender == مالک)؛
msg.sender.transfer(this.balance)؛
}
}
مندرجہ بالا معاہدے میں، ہم دیکھ سکتے ہیں کہ صرف مالک ہی ایتھر کو کال کرنے کے ذریعے واپس لے سکتا ہے۔ یہاں، کمزوری اس وقت ہوتی ہے کیونکہ کنسٹرکٹر کا نام معاہدہ سے مختلف ہے (پہلا حرف مختلف ہے!) اس طرح استحصال کرنے والا [ownerWallet] فنکشن کو کال کر سکتا ہے اور خود کو مالک کے طور پر اختیار دے سکتا ہے، اور پھر کال کر کے معاہدے میں تمام ایتھر کو واپس لے سکتا ہے۔
QuillAudit کا نقطہ نظر
ہم سالیڈٹی کمپائلر کے ورژن [0.4.22] کی تعمیل کرتے ہیں۔ اس ورژن نے ایک کلیدی لفظ متعارف کرایا ہے۔ [constructor] جس کو کنٹریکٹ کے نام سے ملنے کے لیے فنکشن کا نام درکار ہوتا ہے۔
5. Tx.Origin کی توثیق
یہاں، [Tx.Origin] Solidity کا عالمی متغیر ہے، اس میں اکاؤنٹ کا پتہ ہوتا ہے جس نے اصل میں کال یا لین دین کو انجام دیا تھا۔ اس متغیر کو توثیق کے لیے استعمال نہیں کیا جا سکتا، کیونکہ ایسا کرنے سے معاہدہ فشنگ حملوں کا خطرہ بن جاتا ہے۔
کمزوری
[tx.origin] متغیر کے ذریعے صارفین کو اجازت دینے والے معاہدوں کو بیرونی حملوں کا سامنا کرنا پڑتا ہے جس کی وجہ سے صارفین غلط معاہدے پر مستند کارروائیاں کرتے ہیں۔ ذیل کی مثال پر غور کریں:
معاہدہ فش ایبل {
عوامی مالک کا پتہ؛
تعمیر کنندہ (پتہ _مالک) {
مالک = مالک؛
}
فنکشن () بیرونی قابل ادائیگی {} // ایتھر جمع کریں۔
فنکشن واپسی تمام (پتہ _ وصول کنندہ) عوامی {
درکار(tx.origin == مالک)؛
_recipient.transfer(this.balance)؛
}
}
یہاں لائن [11] پر، معاہدہ [tx.origin] کی مدد سے [withdrawAll] فنکشن کی اجازت دیتا ہے۔
QuillAudit کا نقطہ نظر
ہم عام طور پر سمارٹ معاہدوں میں اجازت کے لیے [tx.origin] استعمال کرنے سے گریز کرتے ہیں۔ اگرچہ، [tx.origin] کا استعمال سختی سے ممنوع نہیں ہے، اس کے استعمال کے کچھ مخصوص معاملات ہیں۔ ہم موجودہ معاہدے کو کال کرنے سے بیرونی معاہدوں سے انکار کرنے کے لیے [tx.origin] کا استعمال کر سکتے ہیں، اسے [require] فارم [require(tx.origin == msg.sender)] کے ساتھ عمل میں لایا جا سکتا ہے۔ یہ موجودہ کنٹریکٹ کو کال کرنے کے لیے انٹرمیڈیٹ کنٹریکٹس کو کال کرنے سے بچنے کے لیے کیا جاتا ہے جو کنٹریکٹ کو باقاعدہ کوڈ لیس ایڈریس تک محدود کرتا ہے۔
حتمی لپیٹنا۔
ہم نے سولیڈیٹی زبان میں پانچ عام خامیوں کا جامع طور پر احاطہ کیا ہے۔ سمارٹ معاہدوں کو تیار کرتے وقت، ہمیں یہ نہیں بھولنا چاہیے کہ وہ ڈیزائن کے لحاظ سے ناقابل تغیر ہیں، جس کا مطلب ہے کہ ایک بار جب ہم انہیں بنا لیتے ہیں، تو سورس کوڈ کو پیچ کرنے کا کوئی طریقہ نہیں ہوتا ہے۔
یہ ڈیولپرز کے لیے تعیناتی سے پہلے دستیاب سیکیورٹی ٹیسٹنگ اور آڈیٹنگ ٹولز کا فائدہ اٹھانے کے لیے ایک بہت بڑا چیلنج ہے۔
سمارٹ معاہدوں کے لیے ممکنہ بدنیتی پر مبنی خطرات کا پتہ لگانا، اور وہ خطرات جن میں سے کچھ کا ہم نے اوپر ذکر کیا ہے، ہمارے اندرون ملک آڈیٹنگ ماہرین کی ٹیم کی طرف سے انتہائی منفرد اور مضبوط طریقے سے انجام دیا جاتا ہے۔ QuillAudits میں ہم آپ کے معاہدے کو محفوظ اور محفوظ رکھنے کے لیے آپ کے معاہدے کو تمام سافٹ ویئر سیکیورٹی طریقوں کے ساتھ اپ ڈیٹ رکھنے کے لیے سیکیورٹی ریسرچ میں اپنی بہترین کوششیں کرتے ہیں۔
QuillHash تک پہنچیں۔
سالوں کی صنعت کی موجودگی کے ساتھ، QuillHash نے پوری دنیا میں انٹرپرائز حل فراہم کیے ہیں۔ ماہرین کی ایک ٹیم کے ساتھ QuillHash ایک اہم بلاکچین ڈویلپمنٹ کمپنی ہے جو مختلف صنعتی حل فراہم کرتی ہے جس میں DeFi انٹرپرائز بھی شامل ہے، اگر آپ کو سمارٹ کنٹریکٹس آڈٹ میں کسی مدد کی ضرورت ہو تو بلا جھجھک ہمارے ماہرین سے رابطہ کریں۔ یہاں حاصل کریں!
مزید اپ ڈیٹس کے لیے QuillHash کو فالو کریں۔
ماخذ: https://blog.quillhash.com/2021/06/04/top-5-common-errors-in-solidity-programming-language/
- 11
- اکاؤنٹ
- فائدہ
- تمام
- آڈٹ
- کی توثیق
- اجازت
- BEST
- blockchain
- بگ کی اطلاع دیں
- کیڑوں
- فون
- مقدمات
- کیونکہ
- چیلنج
- کوڈ
- کامن
- کمپنی کے
- کنٹریکٹ
- معاہدے
- موجودہ
- ڈی اے او
- ڈی ایف
- ڈیزائن
- ڈیولپر
- ڈویلپرز
- ترقی
- انٹرپرائز
- آسمان
- ethereum
- واقعہ
- ماہرین
- فیس بک
- مالی
- پہلا
- پر عمل کریں
- فارم
- مفت
- تقریب
- مستقبل
- کھیل ہی کھیل میں
- گیس
- گلوبل
- عظیم
- ہیک
- یہاں
- کس طرح
- HTTPS
- بھاری
- سمیت
- صنعت
- IT
- زبان
- قیادت
- معروف
- لائن
- لنکڈ
- لسٹ
- میچ
- دیگر
- مالک
- پیچ
- پاٹرن
- فشنگ
- فشنگ حملوں
- لکھ
- حال (-)
- نجی
- پروگرامنگ
- عوامی
- ھیںچو
- تحقیق
- جواب
- باقی
- محفوظ
- سیکورٹی
- سروسز
- مقرر
- سادہ
- چھوٹے
- ہوشیار
- سمارٹ معاہدہ
- سمارٹ معاہدہ
- So
- سافٹ ویئر کی
- استحکام
- حل
- حالت
- کامیابی
- ٹیسٹنگ
- ماخذ
- خطرات
- وقت
- سب سے اوپر
- اوپر 5
- ٹرانزیکشن
- معاملات
- us
- صارفین
- قیمت
- والٹ
- کی نمائش
- نقصان دہ
- خطرے کا سامنا
- قابل اطلاق
- ہفتے
- ڈبلیو
- کے اندر
- سال