মূল কন্টেন্টে যান

স্মার্ট কন্ট্রাক্ট সিকিউরিটি টুলের একটি গাইড

Solidity
স্মার্ট কন্ট্রাক্ট
সিকিউরিটি
মধ্যবর্তী
ট্রেইলঅফবিটস
7 সেপ্টেম্বর, 2020
6 মিনিট পড়ার সময়

আমরা তিনটি স্বতন্ত্র টেস্টিং এবং প্রোগ্রাম অ্যানালাইসিস কৌশল ব্যবহার করতে যাচ্ছি:

  • স্লিদার-এর সাহায্যে স্ট্যাটিক অ্যানালাইসিস। প্রোগ্রামের সমস্ত পাথ একই সাথে অনুমান এবং বিশ্লেষণ করা হয়, বিভিন্ন প্রোগ্রাম প্রেজেন্টেশনের মাধ্যমে (যেমন, কন্ট্রোল-ফ্লো-গ্রাফ)।
  • একিডনা-এর সাহায্যে ফাজিং। ট্রানজ্যাকশনের একটি সিউডো-র‍্যান্ডম জেনারেশনের মাধ্যমে কোডটি এক্সিকিউট করা হয়। ফাজার একটি নির্দিষ্ট প্রপার্টি লঙ্ঘন করার জন্য ট্রানজ্যাকশনের একটি সিকোয়েন্স খুঁজে বের করার চেষ্টা করবে।
  • ম্যান্টিকোর-এর সাহায্যে সিম্বলিক এক্সিকিউশন। এটি একটি বিধিবদ্ধ যাচাইকরণ কৌশল, যা প্রতিটি এক্সিকিউশন পাথকে একটি গাণিতিক সূত্রে অনুবাদ করে, যার উপর ভিত্তি করে কনস্ট্রেইন্ট বা সীমাবদ্ধতাগুলো চেক করা যায়।

প্রতিটি কৌশলেরই সুবিধা এবং অসুবিধা রয়েছে এবং এগুলো নির্দিষ্ট ক্ষেত্রে কার্যকর হবে:

কৌশলটুলব্যবহারগতিমিস হওয়া বাগফলস অ্যালার্ম
স্ট্যাটিক অ্যানালাইসিসস্লিদারCLI এবং স্ক্রিপ্টসেকেন্ডমাঝারিকম
ফাজিংএকিডনাSolidity প্রপার্টিমিনিটকমনেই
সিম্বলিক এক্সিকিউশনম্যান্টিকোরSolidity প্রপার্টি এবং স্ক্রিপ্টঘণ্টানেই*নেই

* যদি টাইমআউট ছাড়াই সমস্ত পাথ এক্সপ্লোর করা হয়

স্লিদার কয়েক সেকেন্ডের মধ্যে কন্ট্রাক্ট বিশ্লেষণ করে, তবে স্ট্যাটিক অ্যানালাইসিসের কারণে ফলস অ্যালার্ম তৈরি হতে পারে এবং এটি জটিল চেকের (যেমন, গাণিতিক চেক) জন্য কম উপযুক্ত। বিল্ট-ইন ডিটেক্টরগুলোতে পুশ-বাটন অ্যাক্সেসের জন্য API-এর মাধ্যমে স্লিদার চালান অথবা ব্যবহারকারী-নির্ধারিত চেকের জন্য API-এর মাধ্যমে চালান।

একিডনা কয়েক মিনিট ধরে চালানোর প্রয়োজন হয় এবং এটি শুধুমাত্র ট্রু পজিটিভ তৈরি করবে। একিডনা ব্যবহারকারীর দেওয়া সিকিউরিটি প্রপার্টি চেক করে, যা Solidity-তে লেখা থাকে। এটি বাগ মিস করতে পারে কারণ এটি র‍্যান্ডম এক্সপ্লোরেশনের উপর ভিত্তি করে কাজ করে।

ম্যান্টিকোর সবচেয়ে "ভারী" বিশ্লেষণ করে। একিডনার মতো, ম্যান্টিকোর ব্যবহারকারীর দেওয়া প্রপার্টি যাচাই করে। এটি চালানোর জন্য আরও বেশি সময়ের প্রয়োজন হবে, তবে এটি একটি প্রপার্টির বৈধতা প্রমাণ করতে পারে এবং কোনো ফলস অ্যালার্ম রিপোর্ট করবে না।

প্রস্তাবিত ওয়ার্কফ্লো

স্লিদার-এর বিল্ট-ইন ডিটেক্টরগুলো দিয়ে শুরু করুন যাতে নিশ্চিত হওয়া যায় যে বর্তমানে কোনো সাধারণ বাগ নেই বা ভবিষ্যতেও তৈরি হবে না। ইনহেরিট্যান্স, ভেরিয়েবল ডিপেন্ডেন্সি এবং স্ট্রাকচারাল সমস্যা সম্পর্কিত প্রপার্টি চেক করতে স্লিদার ব্যবহার করুন। কোডবেস বড় হওয়ার সাথে সাথে, স্টেট মেশিনের আরও জটিল প্রপার্টি পরীক্ষা করতে একিডনা ব্যবহার করুন। Solidity থেকে পাওয়া যায় না এমন সুরক্ষাগুলোর জন্য কাস্টম চেক তৈরি করতে স্লিদারে ফিরে যান, যেমন কোনো ফাংশন ওভাররাইড হওয়া থেকে রক্ষা করা। সবশেষে, গুরুত্বপূর্ণ সিকিউরিটি প্রপার্টিগুলোর (যেমন, গাণিতিক অপারেশন) টার্গেটেড যাচাইকরণ করতে ম্যান্টিকোর ব্যবহার করুন।

  • সাধারণ সমস্যাগুলো ধরতে স্লিদার-এর CLI ব্যবহার করুন
  • আপনার কন্ট্রাক্টের হাই-লেভেল সিকিউরিটি প্রপার্টি পরীক্ষা করতে একিডনা ব্যবহার করুন
  • কাস্টম স্ট্যাটিক চেক লিখতে স্লিদার ব্যবহার করুন
  • যখন আপনি গুরুত্বপূর্ণ সিকিউরিটি প্রপার্টিগুলোর গভীর নিশ্চয়তা চান তখন ম্যান্টিকোর ব্যবহার করুন

ইউনিট টেস্ট সম্পর্কে একটি নোট। উচ্চ-মানের সফটওয়্যার তৈরি করতে ইউনিট টেস্ট প্রয়োজনীয়। তবে, সিকিউরিটি ত্রুটি খুঁজে বের করার জন্য এই কৌশলগুলো সবচেয়ে উপযুক্ত নয়। এগুলো সাধারণত কোডের পজিটিভ আচরণ পরীক্ষা করতে ব্যবহৃত হয় (অর্থাৎ, কোডটি সাধারণ প্রেক্ষাপটে প্রত্যাশা অনুযায়ী কাজ করে), যেখানে সিকিউরিটি ত্রুটিগুলো সাধারণত এমন এজ কেসগুলোতে থাকে যা ডেভেলপাররা বিবেচনা করেননি। কয়েক ডজন স্মার্ট কন্ট্রাক্ট সিকিউরিটি রিভিউ নিয়ে আমাদের গবেষণায়, আমাদের ক্লায়েন্টের কোডে পাওয়া সিকিউরিটি ত্রুটির সংখ্যা বা তীব্রতার উপর ইউনিট টেস্ট কভারেজের কোনো প্রভাব ছিল না (opens in a new tab)

সিকিউরিটি প্রপার্টি নির্ধারণ করা

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

কম্পোনেন্ট

আপনি কী চেক করতে চান তা জানা থাকলে সঠিক টুল নির্বাচন করতেও সুবিধা হবে।

স্মার্ট কন্ট্রাক্টের জন্য প্রায়শই প্রাসঙ্গিক বিস্তৃত ক্ষেত্রগুলোর মধ্যে রয়েছে:

  • স্টেট মেশিন। বেশিরভাগ কন্ট্রাক্টকে একটি স্টেট মেশিন হিসেবে উপস্থাপন করা যেতে পারে। চেক করার কথা বিবেচনা করুন যে (1) কোনো অবৈধ স্টেটে পৌঁছানো যাবে না, (2) যদি কোনো স্টেট বৈধ হয় তবে সেখানে পৌঁছানো যাবে, এবং (3) কোনো স্টেট কন্ট্রাক্টকে আটকে রাখবে না।

    • স্টেট-মেশিন স্পেসিফিকেশন পরীক্ষা করার জন্য একিডনা এবং ম্যান্টিকোর হলো পছন্দের টুল।
  • অ্যাক্সেস কন্ট্রোল। যদি আপনার সিস্টেমে প্রিভিলেজড ব্যবহারকারী (যেমন, একজন মালিক, কন্ট্রোলার, ...) থাকে, তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে (1) প্রতিটি ব্যবহারকারী কেবল অনুমোদিত কাজগুলোই করতে পারে এবং (2) কোনো ব্যবহারকারী তার চেয়ে বেশি প্রিভিলেজড ব্যবহারকারীর কাজ ব্লক করতে পারবে না।

    • স্লিদার, একিডনা এবং ম্যান্টিকোর সঠিক অ্যাক্সেস কন্ট্রোল চেক করতে পারে। উদাহরণস্বরূপ, স্লিদার চেক করতে পারে যে শুধুমাত্র হোয়াইটলিস্ট করা ফাংশনগুলোতে onlyOwner মডিফায়ার নেই। একিডনা এবং ম্যান্টিকোর আরও জটিল অ্যাক্সেস কন্ট্রোলের জন্য কার্যকর, যেমন কোনো কন্ট্রাক্ট একটি নির্দিষ্ট স্টেটে পৌঁছালেই কেবল অনুমতি দেওয়া হয়।
  • গাণিতিক অপারেশন। গাণিতিক অপারেশনগুলোর সঠিকতা চেক করা অত্যন্ত গুরুত্বপূর্ণ। ওভারফ্লো/আন্ডারফ্লো প্রতিরোধ করার জন্য সব জায়গায় SafeMath ব্যবহার করা একটি ভালো পদক্ষেপ, তবে আপনাকে এখনও রাউন্ডিং সমস্যা এবং কন্ট্রাক্টকে আটকে রাখে এমন ত্রুটিসহ অন্যান্য গাণিতিক ত্রুটিগুলো বিবেচনা করতে হবে।

    • এখানে ম্যান্টিকোর হলো সেরা পছন্দ। যদি গাণিতিক হিসাব SMT সমাধানকারীর আওতার বাইরে থাকে তবে একিডনা ব্যবহার করা যেতে পারে।
  • ইনহেরিট্যান্সের সঠিকতা। Solidity কন্ট্রাক্টগুলো মাল্টিপল ইনহেরিট্যান্সের উপর ব্যাপকভাবে নির্ভর করে। শ্যাডোয়িং ফাংশনে super কল মিস করা এবং c3 লিনিয়ারাইজেশন অর্ডার ভুলভাবে ব্যাখ্যা করার মতো ভুলগুলো সহজেই হতে পারে।

    • এই সমস্যাগুলো শনাক্তকরণ নিশ্চিত করার জন্য স্লিদার হলো উপযুক্ত টুল।
  • এক্সটার্নাল ইন্টারঅ্যাকশন। কন্ট্রাক্টগুলো একে অপরের সাথে ইন্টারঅ্যাক্ট করে এবং কিছু এক্সটার্নাল কন্ট্রাক্টকে বিশ্বাস করা উচিত নয়। উদাহরণস্বরূপ, যদি আপনার কন্ট্রাক্ট এক্সটার্নাল ওরাকলের উপর নির্ভর করে, তবে উপলব্ধ ওরাকলগুলোর অর্ধেক আপস করা হলেও কি এটি সুরক্ষিত থাকবে?

    • আপনার কন্ট্রাক্টের সাথে এক্সটার্নাল ইন্টারঅ্যাকশন পরীক্ষা করার জন্য ম্যান্টিকোর এবং একিডনা হলো সেরা পছন্দ। এক্সটার্নাল কন্ট্রাক্টগুলোকে স্টাব করার জন্য ম্যান্টিকোরের একটি বিল্ট-ইন মেকানিজম রয়েছে।
  • স্ট্যান্ডার্ড কনফরম্যান্স। ইথেরিয়াম স্ট্যান্ডার্ডগুলোর (যেমন, ERC-20) ডিজাইনে ত্রুটির ইতিহাস রয়েছে। আপনি যে স্ট্যান্ডার্ডের উপর ভিত্তি করে তৈরি করছেন তার সীমাবদ্ধতা সম্পর্কে সচেতন থাকুন।

    • স্লিদার, একিডনা এবং ম্যান্টিকোর আপনাকে একটি নির্দিষ্ট স্ট্যান্ডার্ড থেকে বিচ্যুতি শনাক্ত করতে সাহায্য করবে।

টুল নির্বাচনের চিটশিট

কম্পোনেন্টটুলউদাহরণ
স্টেট মেশিনএকিডনা, ম্যান্টিকোর
অ্যাক্সেস কন্ট্রোলস্লিদার, একিডনা, ম্যান্টিকোরস্লিদার অনুশীলন 2 (opens in a new tab), একিডনা অনুশীলন 2 (opens in a new tab)
গাণিতিক অপারেশনম্যান্টিকোর, একিডনাএকিডনা অনুশীলন 1 (opens in a new tab), ম্যান্টিকোর অনুশীলন 1 - 3 (opens in a new tab)
ইনহেরিট্যান্সের সঠিকতাস্লিদারস্লিদার অনুশীলন 1 (opens in a new tab)
এক্সটার্নাল ইন্টারঅ্যাকশনম্যান্টিকোর, একিডনা
স্ট্যান্ডার্ড কনফরম্যান্সস্লিদার, একিডনা, ম্যান্টিকোরslither-erc (opens in a new tab)

আপনার লক্ষ্যের উপর নির্ভর করে অন্যান্য ক্ষেত্রগুলোও চেক করার প্রয়োজন হবে, তবে ফোকাস করার জন্য এই বিস্তৃত ক্ষেত্রগুলো যেকোনো স্মার্ট কন্ট্রাক্ট সিস্টেমের জন্য একটি ভালো শুরু।

আমাদের পাবলিক অডিটগুলোতে যাচাইকৃত বা পরীক্ষিত প্রপার্টির উদাহরণ রয়েছে। বাস্তব-বিশ্বের সিকিউরিটি প্রপার্টিগুলো পর্যালোচনা করতে নিচের রিপোর্টগুলোর Automated Testing and Verification সেকশনগুলো পড়ার কথা বিবেচনা করুন: