কিভাবে রিএন্ট্রান্সি আক্রমণের ছোবল থেকে স্মার্ট কন্ট্রাক্ট এড়ানো যায়? PlatoBlockchain ডেটা ইন্টেলিজেন্স। উল্লম্ব অনুসন্ধান. আ.

কিভাবে রিএন্ট্রান্সি আক্রমণের ছোবল থেকে স্মার্ট কন্ট্রাক্ট এড়ানো যায়?

পড়ার সময়: 6 মিনিট

আমরা যদি সবচেয়ে বড় ক্রিপ্টো হ্যাকগুলি এবং তাদের কাছে হারিয়ে যাওয়া চোখের জলের পরিসংখ্যানগুলিকে ঘনিষ্ঠভাবে বিবেচনা করি, তবে সেগুলি কোডিং ত্রুটিগুলি থেকে গভীরে উপনীত হবে৷

নিরাপত্তা দুর্বলতার এরকম একটি সাধারণ ঘটনা হল রি-এন্ট্রান্সি আক্রমণ। যাইহোক, অব্যবস্থাপিত পুনঃপ্রবেশের কারণে সৃষ্ট ধ্বংসাত্মক প্রভাবটি আক্রমণটি শুরু করার মতো সহজ মনে হতে পারে না।

একটি পরিচিত এবং সু-প্রচারিত সমস্যা হওয়া সত্ত্বেও, স্মার্ট চুক্তিতে রিএন্ট্রান্সি বাগের উপস্থিতি সবসময় অনিবার্য। 

বিগত বছরগুলিতে হ্যাকাররা কতবার রিএন্ট্রান্সি দুর্বলতাকে কাজে লাগিয়েছে? এটা কিভাবে কাজ করে? রিএন্ট্রান্সি বাগগুলির কাছে তহবিল হারানো থেকে স্মার্ট চুক্তিগুলিকে কীভাবে আটকানো যায়? এই ব্লগে এই প্রশ্নের উত্তর খুঁজুন.

সুতরাং, কিছুক্ষণ আগে, আসুন মেমরিতে সবচেয়ে বড় পুনঃপ্রবেশ আক্রমণের উপর ব্রাশ করি। 

সবচেয়ে কুখ্যাত কিছু রিয়েল-টাইম রিএন্ট্রান্সি হ্যাক 

পুনঃপ্রবেশ আক্রমণ যা প্রকল্পগুলির উপর সবচেয়ে বিধ্বংসী প্রভাব সৃষ্টি করেছিল এই দুটি বা এমনকি উভয়ের মধ্যে একটি করে। 

  • স্মার্ট চুক্তি থেকে সম্পূর্ণরূপে ইথার বন্ধ করুন
  • হ্যাকাররা স্মার্ট কন্ট্রাক্ট কোডে ঢুকে পড়ে

আমরা এখন পুনঃপ্রবেশ আক্রমণের কয়েকটি ঘটনা এবং তাদের প্রভাব পর্যবেক্ষণ করতে পারি। 

জুন 2016: DAO আক্রমণ - 3.54M বা $150M ইথার

৯ এপ্রিল: Uniswap/Lendf.Me হ্যাক – $25M

মে 2021: BurgerSwap হ্যাক - $7.2M

2021 আগস্ট: ক্রিম ফাইন্যান্স হ্যাক - $18.8M

মার্চ ৩: ওলা ফাইন্যান্স - $3.6M

জুলাই 2022: OMNI প্রোটোকল – $1.43M

এটা স্পষ্ট যে রি-এন্ট্রান্সি আক্রমণগুলি কখনই স্টাইল থেকে বেরিয়ে আসেনি। আসুন নিম্নলিখিত অনুচ্ছেদে এটি সম্পর্কে গভীর অন্তর্দৃষ্টি লাভ করি। 

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 আক্রমণ কি?

যখন দুর্বল চুক্তির একটি ফাংশন একটি অবিশ্বস্ত চুক্তিতে কল করে তখন একটি পুনঃপ্রবেশ আক্রমণ ঘটে। অবিশ্বস্ত চুক্তিটি আক্রমণকারীর চুক্তি হবে যা তহবিল সম্পূর্ণরূপে নিষ্কাশন না হওয়া পর্যন্ত দুর্বল চুক্তিতে পুনরাবৃত্তিমূলক কল করে। 

একটি reentrant কি?

পুনঃপ্রবেশের কাজটির অর্থ হল কোডের কার্য সম্পাদনে বাধা দেওয়া এবং প্রক্রিয়াটিকে আবার শুরু করা, যা পুনঃপ্রবেশ নামেও পরিচিত।

একটি reentrancy গার্ড কি?

রিএন্ট্রান্সি গার্ড একটি মডিফায়ার ব্যবহার করে যা ফাংশনটিকে বারবার কল করা থেকে বাধা দেয়। রিএনট্রান্সি গার্ডের উদাহরণ খুঁজতে উপরের ব্লগটি পড়ুন।

স্মার্ট চুক্তির কিছু আক্রমণ কি কি?

স্মার্ট চুক্তিগুলি অসংখ্য দুর্বলতার সম্মুখীন হয়, যেমন পুনঃপ্রবেশ, টাইমস্ট্যাম্প নির্ভরতা, গাণিতিক ওভারফ্লো, DoS আক্রমণ ইত্যাদি। অতএব, চুক্তির যুক্তিকে ভেঙ্গে ফেলতে পারে এমন কোন বাগ নেই তা নিশ্চিত করার জন্য অডিট করা আবশ্যক।

69 মতামত

সময় স্ট্যাম্প:

থেকে আরো কুইল্যাশ