Reentrancy حملوں کے چنگل سے اسمارٹ کنٹریکٹس سے کیسے بچیں؟ پلیٹو بلاکچین ڈیٹا انٹیلی جنس۔ عمودی تلاش۔ عی

Reentrancy حملوں کے چنگل سے اسمارٹ کنٹریکٹس سے کیسے بچیں؟

پڑھنے کا وقت: 6 منٹ

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

سیکورٹی کے خطرے کا ایسا ہی ایک عام واقعہ ری اینٹرینسی حملہ ہے۔ تاہم، غلط طریقے سے دوبارہ داخل ہونے کی وجہ سے پیدا ہونے والا تباہ کن اثر اتنا آسان نہیں لگ سکتا جتنا کہ خود حملہ کرنا۔

ایک واقف اور اچھی طرح سے عام شدہ مسئلہ ہونے کے باوجود، سمارٹ معاہدوں میں Reentrancy بگ کا ظاہر ہونا ہمیشہ ناگزیر ہوتا ہے۔ 

پچھلے سالوں میں ہیکرز کے ذریعہ ری اینٹرینسی کے خطرے کا کتنی بار فائدہ اٹھایا گیا؟ یہ کیسے کام کرتا ہے؟ سمارٹ معاہدوں کو ری اینٹرینسی کیڑے سے فنڈز کھونے سے کیسے روکا جائے؟ ان سوالات کے جوابات اس بلاگ میں تلاش کریں۔

لہذا، بہت پہلے، آئیے یادداشت میں دوبارہ داخلے کے سب سے بڑے حملوں پر غور کریں۔ 

ریئل ٹائم ری اینٹرینسی ہیکس میں سے کچھ سب سے زیادہ بدنام 

ری اینٹرینسی کے حملے جنہوں نے پراجیکٹس پر سب سے زیادہ تباہ کن اثرات مرتب کیے، ان دو میں سے ایک یا دونوں میں سے ایک کرنا ختم ہوا۔ 

  • ہوشیار معاہدوں سے ایتھر کو مکمل طور پر نکال دیں۔
  • ہیکرز سمارٹ کنٹریکٹ کوڈ میں داخل ہو رہے ہیں۔

اب ہم Reentrancy حملوں کے چند واقعات اور ان کے اثرات کا مشاہدہ کر سکتے ہیں۔ 

2016 جون: ڈی اے او حملہ - 3.54M یا $150M ایتھر

2020 اپریل: Uniswap/Lendf.Me ہیک – $25M

2021 فرمائے: برگر سویپ ہیک – $7.2M

یکم اگست: کریم فنانس ہیک - $18.8M

2022 مارچ: Ola Finance - $3.6M

2022 جولائی: OMNI پروٹوکول – $1.43M

یہ بالکل واضح ہے کہ Reentrancy حملے کبھی بھی غیر معیاری نہیں ہوئے۔ آئیے مندرجہ ذیل اقتباسات میں اس کے بارے میں گہری بصیرت حاصل کرتے ہیں۔ 

Reentrancy حملے کا جائزہ

جیسا کہ "دوبارہ داخلہ" نام سے ہے، جس کا مطلب ہے "بار بار داخل ہونا۔" Reentrancy حملے میں دو معاہدے شامل ہیں: شکار کا معاہدہ اور حملہ آور کا معاہدہ۔ 

حملہ آور کا معاہدہ شکار کنٹریکٹ میں دوبارہ داخلے کے خطرے کا فائدہ اٹھاتا ہے۔ یہ اسے حاصل کرنے کے لئے واپس لینے کی تقریب کا استعمال کرتا ہے. 

حملہ آور کنٹریکٹ شکار کنٹریکٹ میں بیلنس اپ ڈیٹ ہونے سے پہلے بار بار کال کرکے متاثرہ کنٹریکٹ سے فنڈز نکالنے کے لیے واپسی کے فنکشن کو کال کرتا ہے۔ متاثر کنٹریکٹ بیلنس چیک کرے گا، فنڈز بھیجے گا اور بیلنس کو اپ ڈیٹ کرے گا۔ 

لیکن فنڈز بھیجنے اور معاہدے میں بیلنس کو اپ ڈیٹ کرنے کے وقت کے اندر، حملہ آور کنٹریکٹ فنڈز نکالنے کے لیے مسلسل کال کرتا ہے۔ نتیجے کے طور پر، شکار کے معاہدے میں بیلنس کو اپ ڈیٹ نہیں کیا جاتا ہے جب تک کہ حملہ آور کنٹریکٹ تمام فنڈز ختم نہ کر دے۔

دوبارہ داخلے کے استحصال کی شدت اور لاگت پرفارم کرنے کی اشد ضرورت کو خطرے کی گھنٹی بجاتی ہے۔ سمارٹ معاہدہ آڈٹ اس طرح کی غلطیوں کو نظر انداز کرنے کے امکان کو مسترد کرنا۔ 

Reentrancy حملے کا مثالی نظارہ

آئیے ذیل میں دی گئی آسان مثال سے دوبارہ داخلے کے حملے کے تصور کو سمجھیں۔ 

یہاں دو معاہدے ہیں: کمزور معاہدہ اور ہیکر معاہدہ

ہیکر کا معاہدہ کمزور کنٹریکٹ سے دستبردار ہونے کا مطالبہ کرتا ہے۔ کال موصول ہونے پر، کمزور کنٹریکٹ ہیکر کنٹریکٹ میں فنڈز کی جانچ پڑتال کرتا ہے اور پھر فنڈز ہیکر کو منتقل کرتا ہے۔ 

ہیکر فنڈز وصول کرتا ہے اور فال بیک فنکشن کو لاگو کرتا ہے، جو کمزور کنٹریکٹ میں بیلنس اپ ڈیٹ ہونے سے پہلے ہی دوبارہ کمزور کنٹریکٹ میں کال کرتا ہے۔ اس طرح اسی آپریشن کو دہراتے ہوئے، ہیکر کمزور کنٹریکٹ سے فنڈز مکمل طور پر واپس لے لیتا ہے۔ 

Reentrancy حملوں کے چنگل سے اسمارٹ کنٹریکٹس سے کیسے بچیں؟

حملہ آور کے استعمال کردہ فال بیک فنکشن کی خصوصیات 

  • وہ بیرونی طور پر قابل کال ہیں۔ یعنی جو معاہدہ لکھا گیا ہے اس کے اندر سے انہیں نہیں بلایا جا سکتا
  • بے نام فنکشن
  • فال بیک فنکشن میں صوابدیدی منطق شامل نہیں ہے۔
  • فال بیک اس وقت متحرک ہوتا ہے جب ETH کو اس کے منسلک سمارٹ کنٹریکٹ پر بھیجا جاتا ہے، اور کوئی وصول () فنکشن کا اعلان نہیں کیا جاتا ہے۔

تکنیکی نقطہ نظر سے دوبارہ داخل ہونے والے حملے کا تجزیہ کرنا 

آئیے ایک نمونہ کنٹریکٹ لیتے ہیں اور سمجھتے ہیں کہ ری اینٹرینسی حملہ کیسے ہوتا ہے۔

بدنیتی پر مبنی معاہدہ

contract Attack {
    DepositFunds public depositFunds;

    constructor(address _depositFundsAddress) {
        depositFunds = DepositFunds(_depositFundsAddress);
    }

    // Fallback is called when DepositFunds sends Ether to this contract.
    fallback() external payable {
        if (address(depositFunds).balance >= 1 ether) {
            depositFunds.withdraw();
        }
    }

    function attack() external payable {
        require(msg.value >= 1 ether);
        depositFunds.deposit{value: 1 ether}();
        depositFunds.withdraw();
    }


}

یہ حملہ آور کا معاہدہ ہے جس میں حملہ آور 2ETH جمع کرتا ہے۔ حملہ آور کمزور کنٹریکٹ میں واپس لینے کے فنکشن کو کہتے ہیں۔ کمزور کنٹریکٹ سے فنڈز موصول ہونے کے بعد، فال بیک فنکشن شروع ہو جاتا ہے۔ 

فال بیک پھر واپسی کے فنکشن کو انجام دیتا ہے اور کمزور کنٹریکٹ سے فنڈ نکال دیتا ہے۔ یہ سلسلہ اس وقت تک جاری رہتا ہے جب تک کہ کمزور کنٹریکٹ سے فنڈز مکمل طور پر ختم نہ ہو جائیں۔

کمزور معاہدہ

contract DepositFunds {
    mapping(address => uint) public balances;

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw() public {
        uint bal = balances[msg.sender];
        require(bal > 0);

        (bool sent, ) = msg.sender.call{value: bal}("");
        require(sent, "Failed to send Ether");

        balances[msg.sender] = 0;
    }


}

کمزور کنٹریکٹ میں 30ETH ہے۔ یہاں واپسی() فنکشن حملہ آور کو مطلوبہ رقم بھیجتا ہے۔ چونکہ بیلنس اپ ڈیٹ نہیں ہوتا ہے، اس لیے ٹوکنز حملہ آور کو بار بار منتقل کیے جاتے ہیں۔ 

ری اینٹرینسی حملوں کی اقسام

  • سنگل فنکشن ری اینٹرینسی 
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

msg.sender.call.value(amount)() فنڈز کو منتقل کرتا ہے جس کے بعد حملہ آور کنٹریکٹ فال بیک فنکشن بیلنس[msg.sender] = 0 اپ ڈیٹ ہونے سے پہلے واپس لینے ()کو دوبارہ کال کرتا ہے۔

  • کراس فنکشن ری اینٹرینسی
function transfer(address to, uint amount) external {
   if (balances[msg.sender] >= amount) {
       balances[to] += amount;
       balances[msg.sender] -= amount;
   }
}
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

کراس فنکشن ری اینٹرینسی شناخت کے لیے زیادہ پیچیدہ ہے۔ یہاں فرق یہ ہے کہ فال بیک فنکشن ٹرانسفر کو کال کرتا ہے، سنگل فنکشن ری اینٹرینسی کے برعکس، جہاں یہ واپسی کو کال کرتا ہے۔

دوبارہ داخلہ کے حملوں کے خلاف روک تھام

چیک-اثرات- تعاملات کا نمونہ: چیک-اثرات- تعاملات کا نمونہ افعال کی ساخت میں مدد کرتا ہے۔ 

پروگرام کو اس طرح سے کوڈ کیا جانا چاہئے جو پہلے حالات کی جانچ کرے۔ چیک پاس کرنے کے بعد، معاہدوں کی حالت پر اثرات کو حل کیا جانا چاہئے، جس کے بعد بیرونی افعال کو بلایا جا سکتا ہے. 

function withdraw() external {
   uint256 amount = balances[msg.sender];
   balances[msg.sender] = 0;
   require(msg.sender.call.value(amount)());
}

یہاں دوبارہ لکھا ہوا کوڈ چیک اثرات کے تعاملات کے پیٹرن کی پیروی کرتا ہے۔ یہاں ایکسٹرنل کال کرنے سے پہلے بیلنس صفر کر دیا جاتا ہے۔ 

موڈیفائر کا استعمال

فنکشن پر لاگو کیا جانے والا ترمیم کنندہ noRentrant یقینی بناتا ہے کہ دوبارہ داخل ہونے والی کالیں نہیں ہیں۔ 

contract ReEntrancyGuard {
    bool internal locked;

    modifier noReentrant() {
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
    }
}

آخر میں

سب سے مؤثر قدم QuillAudits جیسی معروف سیکیورٹی فرم سے سمارٹ کنٹریکٹ آڈٹ کروانا ہے، جس میں آڈیٹرز کوڈ کے ڈھانچے پر گہری نظر رکھتے ہیں اور چیک کرتے ہیں کہ فال بیک فنکشن کس طرح انجام دیتا ہے۔ مطالعہ شدہ نمونوں کی بنیاد پر، کوڈ کی تشکیل نو کے لیے سفارشات دی جاتی ہیں اگر کوئی نظر آتا ہے۔ کمزور رویے

کسی بھی نقصان کا شکار ہونے سے پہلے فنڈز کی حفاظت کو یقینی بنایا جاتا ہے۔ 

اکثر پوچھے گئے سوالات

ری اینٹرینسی حملہ کیا ہے؟

دوبارہ داخلے کا حملہ اس وقت ہوتا ہے جب کمزور کنٹریکٹ میں کوئی فنکشن غیر بھروسہ مند معاہدے کو کال کرتا ہے۔ غیر بھروسہ مند معاہدہ حملہ آور کا معاہدہ ہو گا جب تک کہ فنڈز مکمل طور پر ختم نہیں ہو جاتے۔ 

دوبارہ داخلہ لینے والا کیا ہے؟

دوبارہ داخل ہونے کے عمل کا مطلب ہے کوڈ پر عمل درآمد میں رکاوٹ ڈالنا اور اس عمل کو دوبارہ شروع کرنا، جسے دوبارہ داخل ہونا بھی کہا جاتا ہے۔

ری اینٹرینسی گارڈ کیا ہے؟

Reentrancy گارڈ ایک ترمیم کار کا استعمال کرتا ہے جو فنکشن کو بار بار کال کرنے سے روکتا ہے۔ ری اینٹرینسی گارڈ کی مثال تلاش کرنے کے لیے اوپر کا بلاگ پڑھیں۔

سمارٹ معاہدوں پر کچھ حملے کیا ہیں؟

سمارٹ معاہدوں میں متعدد کمزوریوں کا سامنا کرنا پڑتا ہے، جیسے کہ دوبارہ داخلہ، ٹائم اسٹیمپ پر انحصار، ریاضی کے زیادہ بہاؤ، DoS حملے، وغیرہ۔ لہذا، اس بات کو یقینی بنانے کے لیے آڈیٹنگ ضروری ہے کہ معاہدے کی منطق کو ختم کرنے والے کوئی کیڑے نہ ہوں۔

69 مناظر

ٹائم اسٹیمپ:

سے زیادہ Quillhash