জেডকে-রোলাপ দুর্বলতার মাধ্যমে অ্যাজটেক কানেক্টকে $2.19M এর জন্য হ্যাক করা হয়েছে

iconMetaEra
শেয়ার
AI summary iconসারাংশ

প্রেক্ষাপট

২০২৬ সালের ১৪ জুন, প্রত্যাহার করা Aztec Connect RollupProcessor স্মার্ট চুক্তি (0xff1f2b4adb9df6fc8eafecdcbf96a2b351680455) এর দুর্বলতা ব্যবহার করা হয়। আক্রমণকারী একটি একক পরম লেনদেনের মাধ্যমে numRealTxs এবং decoded_slots এর মধ্যে সীমানা ফাঁক তৈরি করে L1 ফান্ড পুল থেকে প্রায় 2.19 মিলিয়ন ডলারের সম্পদ প্রতারণা করে। Aztec Connect ২০২৪ সালের মার্চে প্রত্যাহার করা হয়েছিল, কিন্তু এই অপরিবর্তনশীল স্মার্ট চুক্তিটি পুরনো ব্যবহারকারীর সম্পদ ধারণ করায় ঝুঁকির মধ্যে অবস্থান করে। এই নিবন্ধটি স্মার্ট চুক্তির সোর্স কোড এবং চেইন-অন-ক্যালডাটা উভয়ের দিক থেকে এই আক্রমণের সম্পূর্ণ প্রযুক্তিগত বিবরণটি পুনঃসংগঠিত করে।

আক্রমণের সারাংশ

ভাঙ্গনের মূল কারণ

RollupProcessorV3 এর রোলাপ সেটেলমেন্ট প্রক্রিয়াকরণের সময়, L1 সেটেলমেন্ট লুপের পুনরাবৃত্তি পরিসর এবং ZK পাবলিক ইনপুট হ্যাশের কমিটমেন্ট পরিসরের মধ্যে একটি গঠনগত ফাঁক রয়েছে। আক্রমণকারী এই ফাঁকটি ব্যবহার করে 31/32টি পাবলিক ইনপুট স্লটের বিষয়বস্তুকে ZK প্রমাণ দ্বারা L2 স্টেট রুটে কমিট করে, যা L1 কন্ট্রাক্ট লেয়ারের কোনও সেটেলমেন্ট যাচাইকে বাইপাস করে।

Decoder.sol: numRealTxs সম্পূর্ণরূপে আক্রমণকারী দ্বারা নিয়ন্ত্রিত

numRealTxs কেলাডাটা থেকে 4516 অফসেটে পড়া হয়, এবং কোনও অন-চেইন সীমাবদ্ধতা নেই:

decoded_slots কে numTxsPerRollup এর গুণিতকে পূর্ণসংখ্যায় রূপান্তর করা হয়, যা SHA256 প্রিকম্পাইলের ডেটা বিন্যাসের প্রয়োজনীয়তা। কিন্তু এই রাউন্ডিং অপারেশনটি numRealTxs এবং decoded_slots এর মধ্যে একটি ফাঁক তৈরি করে, যেখানে আক্রমণকারী স্বেচ্ছাচারিভাবে পূরণ করতে পারে।

RollupProcessorV3.sol: সেটেলমেন্ট চক্রটি কেবলমাত্র numRealTxs স্লট কভার করে

সুরক্ষা ধারণার ভাঙ্গন

সাধারণ প্রক্রিয়ার নিরাপত্তা ধারণা হল: প্রতিটি পাবলিক ইনপুট স্লট বা L1 কন্ট্রাক্ট লেয়ার দ্বারা যাচাই করা হয় (জমা দেওয়ার সময় pendingDepositBalance কমিয়ে দেওয়া হয়), অথবা ZK সার্কিটটি publicValue == 0 এর সীমাবদ্ধতা প্রয়োগ করে। কিন্তু এই ভাঙ্গনের পরিস্থিতিতে:

  1. SHA256 প্রি-কম্পাইলড সমস্ত 32টি স্লটকে কভার করে (পরীক্ষায় 8192 বাইট = 32 × 256B ইনপুট দেওয়া হয়েছে), gap স্লটের কনটেন্ট ZK প্রুফ দ্বারা কমিট করা হয়েছে।
  2. L1 সেটেলমেন্ট চক্রটি শুধুমাত্র প্রথম 1 টি স্লট পর্যন্ত পরিচালনা করে, এবং gap স্লট [2..32] কোনো L1 লেভেলের যাচাইকরণের অধীনে নয়।
  3. ZK সার্কিট দ্বারা gap স্লট publicValue-এর জন্য প্রযোজ্য সীমাবদ্ধতা (যা 0 হওয়া উচিত) আক্রমণকারী দ্বারা পারিতোষিক দেওয়া হয়েছে বা প্রয়োগ করা হয়নি।

তিনটি প্রতিরোধ ব্যবস্থা পরস্পরের উপর নির্ভরশীল, কিন্তু কোনোটিই স্বতন্ত্রভাবে gap স্লটের জন্য নিরাপত্তা প্রদান করতে পারে না—যখন ZK সার্কিট সীমাবদ্ধতা অনুপস্থিত থাকে, তখন L1 চুক্তি স্তরও এটি শনাক্ত করতে পারে না।

দ্বিপথ বিভাজন মডেল

একই calldata দুটি পথ দ্বারা ভিন্ন উপরের সীমা দিয়ে ব্যবহার করা হয়:

"কোন স্লটগুলি গণনা করা হবে" সম্পর্কে দুটি পথের মধ্যে অসঙ্গতি (ZK 32টি গণনা করে, L1 শুধুমাত্র 1টি গণনা করে) হল প্রকৃতপক্ষে বাতিল মুদ্রণের মূল কারণ।

আক্রমণ প্রক্রিয়া

আক্রমণ ট্রানজেকশন 0x074ec931…aee1 এ 14টি processRollup() কল রয়েছে, যা "প্রথম 7টি মিন্ট করা + পরবর্তী 7টি উত্তোলন" দুটি পর্যায়ে সংগঠিত, এবং সমস্তটি একক পরম ট্রানজেকশনের মধ্যে সম্পন্ন হয়েছে।

প্রথম পর্যায়: মিন্টিং — L2-এ সম্পদ তৈরি করুন (Rollup #13277–13283, 7 বার)

1. আক্রমণকারী EOA 0x0f18d8b44a740272f0be4d08338d2b165b7edd17 টোটাল কন্ট্রোল এন্ট্রি কন্ট্রাক্ট 0x06f585f74e0da633ae813a0f23fb9900b61d0fcd কে কল করে, 0x6f3ce701 সিলেক্টর ট্রিগার করে।

2. মূল চুক্তিটি ক্রমানুসারে 3টি রিলে চুক্তি সক্রিয় করে, যেখানে প্রতিটি রিলে চুক্তিতে কিছু ক্ষতিকারক rollup calldata হার্ডকোড করা থাকে। প্রতিটি calldata-এর প্রধান প্যারামিটার:

  • numRealTxs = 1, rollupSize = 1024, numInnerRollups = 32
  • প্রথম স্লট (L1 দৃশ্যমান): proofId = 0 (noop), publicValue = 0
  • ২–৩২ নম্বর স্লট (৩১টি গ্যাপ স্লট, L1 অদৃশ্য): proofId = 1 (জমা), publicValue = N, publicOwner = আক্রমণকারীর L2 ঠিকানা
  • সংশ্লিষ্ট ZK প্রমাণ সহ (সার্কিট অনিয়ন্ত্রিত gap স্লট publicValue 0 হিসাবে)

3. রিলে কন্ট্রাক্ট A ক্রমানুসারে RollupProcessor.processRollup() কল করে (Rollup #13277–13281, 5 বার):

  • ভেরিফায়ার ZK প্রমাণ সফলভাবে যাচাই করেছে — SHA256 কমিটমেন্ট সমস্ত 32 স্লটকে কভার করে
  • L1 সেটেলমেন্ট চক্র শেষ = 1 × TX_PUBLIC_INPUT_LENGTH = 1 স্লট, শুধুমাত্র noop প্রক্রিয়া করা হয়
  • gap স্লট [2..32] এর প্রতারণামূলক জমা ZK দ্বারা নতুন Merkle root-এ প্রতিশ্রুতি দেওয়া হয় → আক্রমণকারী L2 ব্যালেন্স 5 × 31N পায়

4. রিলে কন্ট্রাক্ট B একইভাবে রোলআপ #13282–13283 (2 বার) প্রক্রিয়া করে, যার ফলে আক্রমণকারীর L2 ব্যালেন্সে আরও 2 × 31N যোগ হয়। এই পর্যন্ত, আক্রমণকারীর L2 অ্যাকাউন্টে মোট 7 × 31N অসমর্থিত জমা জমা হয়েছে, যখন L1 ফান্ড পুল থেকে একটি পয়সাও কমেনি।

দ্বিতীয় পর্যায়: উত্তোলন — L2 প্রতিকৃতি ব্যালেন্সকে L1 সম্পদে রূপান্তরিত করুন (Rollup #13284–13290, 7 বার)

আক্রমণকারী 7টি উত্তোলন রোলআপের মাধ্যমে মিন্টিং পর্যায়ে অর্জিত সমস্ত L2 ব্যালেন্সকে L1 সম্পদে রূপান্তরিত করেছে:

  1. রোলআপ #13284 (DAI): withdraw() → RollupProcessor সরাসরি 270,513.054 DAI ট্রান্সফার করে → 0x0f18…edd17
  2. Rollup #13285 (wstETH): 167.890 wstETH ট্রান্সফার → আক্রমণকারী
  3. রোলআপ #13286 (yvDAI): 4,873.857 yvDAI ট্রান্সফার → আক্রমণকারী
  4. রোলআপ #13287 (yvWETH, রিলে কন্ট্রাক্ট C দ্বারা গ্রহণ): 16.570 yvWETH ট্রান্সফার → আক্রমণকারী
  5. রোলআপ #13288 (LUSD): 9,273.734 LUSD ট্রান্সফার → আক্রমণকারী
  6. Rollup #13289 (yvLUSD): 359.047 yvLUSD ট্রান্সফার → আক্রমণকারী
  7. রোলআপ #13290 (ETH, শেষ লেনদেন): রোলআপপ্রসেসর অভ্যন্তরীণ CALL এর মাধ্যমে 908.987 ETH প্রেরণ করেছে → আক্রমণকারী।

একক পরম লেনদেন সফলভাবে সম্পন্ন হয়েছে (gasUsed = 4,513,539), স্মার্ট চুক্তি স্তরে আংশিক রোলব্যাক সম্ভব নয়। আক্রমণকারী প্রায় $2.19M শুদ্ধ লাভ করেছে, যা সম্পূর্ণরূপে RollupProcessor-এর বৈধ ব্যবহারকারীর সম্পদ পুল থেকে আসে।

ফান্ড ট্র্যাকিং

লেনদেনের বিশ্লেষণের মাধ্যমে ট্র্যাকিং করা হয়েছে (2026-06-15 পর্যন্ত, ঘটনার প্রায় 1 দিন পরে), চুরি করা অর্থের অবস্থা নিম্নরূপ:

সমস্ত সম্পদ একক লেনদেনের মাধ্যমে RollupProcessor থেকে মধ্যবর্তী আক্রমণ চুক্তি 0x06f585…d0fcD এর মাধ্যমে আক্রমণকারী EOA 0x0F18D8b44a740272f0be4d08338d2b165b7EdD17-এ সরাসরি স্থানান্তরিত হয়। মধ্যবর্তী চুক্তিটিতে কোনো অবশিষ্ট ফান্ড নেই।

বর্তমানে চুরি করা অর্থ ১০০% অপরাধী EOA-এ অখণ্ড অবস্থায় রয়েছে, এখনও পয়সা ধোয়ার শুরু হয়নি।

সারাংশ

এই আক্রমণের মূল শিক্ষা হল: ZK-Rollup চুক্তির সেটেলমেন্ট চক্রের উপরের সীমা অবশ্যই ZK পাবলিক ইনপুট হ্যাশের কমিটমেন্ট পরিসরের সাথে কঠোরভাবে সামঞ্জস্যপূর্ণ হতে হবে। L1 চুক্তি স্তরে numRealTxs লুপ বোর্ডার এবং SHA256 কমিটমেন্টের decoded_slots এর মধ্যে যদি ফাঁক থাকে, তবে ZK সার্কিটের মাধ্যমে gap স্লটগুলিতে সীমাবদ্ধতা আরোপের উপর ভিত্তি করে গঠিত যেকোনো নিরাপত্তা ধারণা হামলাকারীদ্বারা পারিপার্শ্বিকভাবে পারদর্শিতা পাবে—L1-এর অবশ্যই ZK প্রমাণ দ্বারা কমিট করা প্রতিটি পাবলিক ইনপুট স্লটের জন্য স্বতন্ত্রভাবে যাচাইকরণ করতে হবে, এবং এই যাচাইকরণের দায়িত্বকে সার্কিট স্তরের উপরে স্থানান্তরিত করা যাবে না।

ম্যান ওয়ু সিকিউরিটি টিম প্রস্তাব করে যে রোলআপ সিস্টেম ডিপ্লয় করার আগে পূর্ণাঙ্গ বাহ্যিক সিকিউরিটি অডিট করা উচিত, যার মধ্যে রয়েছে L1/L2 স্টেট বর্ডারের লজিক্যাল কনসিসটেন্সি, calldata ডিকোডিংয়ের ট্রাস্টেড বাউন্ডারি এবং ZK পাবলিক ইনপুটের on-chain সেকেন্ডারি ভেরিফিকেশন। পুরনো কিন্তু পুরনো সম্পদ ধারণকারী কনট্রাক্টগুলির জন্য, স্থায়ী প্রকাশের ঝুঁকি দূর করতে ক্রমবর্ধমান সম্পদ মাইগ্রেশন বা ধ্বংসের পরিকল্পনা করা উচিত।

এই প্রতিবেদনটি SlowMist হুমকি সংবাদ দল দ্বারা MistEye হুমকি সংবাদ সিস্টেম, MistTrack ট্র্যাকিং প্ল্যাটফর্ম এবং SlowMist Agent AI-এর মাধ্যমে বিশ্লেষণ করে তৈরি করা হয়েছে। যেকোনো প্রশ্নের জন্য অনুগ্রহ করে ফিডব্যাক দিন।

দাবিত্যাগ: এই পৃষ্ঠার তথ্য তৃতীয় পক্ষের কাছ থেকে প্রাপ্ত হতে পারে এবং অগত্যা KuCoin এর মতামত বা মতামত প্রতিফলিত করে না। এই বিষয়বস্তু শুধুমাত্র সাধারণ তথ্যগত উদ্দেশ্যে প্রদান করা হয়, কোন ধরনের প্রতিনিধিত্ব বা ওয়ারেন্টি ছাড়াই, বা এটিকে আর্থিক বা বিনিয়োগ পরামর্শ হিসাবে বোঝানো হবে না। KuCoin কোনো ত্রুটি বা বাদ পড়ার জন্য বা এই তথ্য ব্যবহারের ফলে যে কোনো ফলাফলের জন্য দায়ী থাকবে না। ডিজিটাল সম্পদে বিনিয়োগ ঝুঁকিপূর্ণ হতে পারে। আপনার নিজের আর্থিক পরিস্থিতির উপর ভিত্তি করে একটি পণ্যের ঝুঁকি এবং আপনার ঝুঁকি সহনশীলতা সাবধানে মূল্যায়ন করুন। আরও তথ্যের জন্য, অনুগ্রহ করে আমাদের ব্যবহারের শর্তাবলী এবং ঝুঁকি প্রকাশ পড়ুন।