ممیزی قرارداد هوشمند و آسیبپذیریهای رایج
قرارداد هوشمند کدی است که میتواند دارایی را جابهجا کند؛ خطای برنامهنویسی یا طراحی اقتصادی آن ممکن است پیامد مالی مستقیم داشته باشد.

فهرست مطالب
- ممیزی قرارداد هوشمند و آسیبپذیریهای رایج؛ از شناسایی خطا تا مدیریت امنیت پروتکلهای بلاکچینی
- مقدمه
- بخش اول: ممیزی قرارداد هوشمند چیست؟
- ۱. تعریف Smart Contract Audit
- ۲. تفاوت ممیزی با تست نرمافزار
- ۳. تفاوت ممیزی با تأیید رسمی
- ۴. چرا قرارداد هوشمند به ممیزی نیاز دارد؟
- ۵. آیا ممیزی اجباری است؟
- ۶. آیا ممیزی امنیت را تضمین میکند؟
- ۷. چه زمانی ممیزی انجام شود؟
- ۸. چه کسانی ممیزی را انجام میدهند؟
- بخش دوم: مراحل حرفهای ممیزی قرارداد هوشمند
- ۹. تعیین محدوده ممیزی
- ۱۰. بررسی مستندات
- ۱۱. شناسایی داراییهای حساس
- ۱۲. شناسایی نقشها
- ۱۳. مدلسازی تهدید
- ۱۴. تحلیل ایستای کد
- ۱۵. تحلیل دستی
- ۱۶. آزمون واحد
- ۱۷. آزمون یکپارچگی
- ۱۸. آزمون مبتنی بر ورودی تصادفی
- ۱۹. آزمون ویژگیهای پایدار
- ۲۰. تحلیل اقتصادی
- ۲۱. ارزیابی شدت یافتهها
- ۲۲. ارائه پیشنهاد اصلاح
- ۲۳. بازآزمایی
- ۲۴. انتشار گزارش
- بخش سوم: آسیبپذیری بازورود یا Reentrancy
- ۲۵. Reentrancy چیست؟
- ۲۶. چرا خطرناک است؟
- ۲۷. نمونه مفهومی
- ۲۸. انواع Reentrancy
- ۲۹. راهکار کاهش ریسک
- ۳۰. آیا محافظ بازورود کافی است؟
- بخش چهارم: ضعف کنترل دسترسی
- ۳۱. Access Control چیست؟
- ۳۲. دسترسی مدیریتی نامناسب
- ۳۳. مالکیت قرارداد
- ۳۴. خطر کلید مدیریتی
- ۳۵. خطای مقداردهی اولیه
- ۳۶. اصل حداقل اختیار
- ۳۷. نقش چندامضایی
- ۳۸. محدودیت چندامضایی
- ۳۹. Timelock چیست؟
- ۴۰. مزیت Timelock
- بخش پنجم: خطاهای محاسباتی
- ۴۱. Integer Overflow چیست؟
- ۴۲. Integer Underflow چیست؟
- ۴۳. رفتار Solidity جدید
- ۴۴. خطر unchecked
- ۴۵. خطای گردکردن
- ۴۶. اختلاف تعداد اعشار
- ۴۷. خطای تقسیم
- ۴۸. راهکار کاهش ریسک
- بخش ششم: آسیبپذیریهای مرتبط با اوراکل
- ۴۹. وابستگی به داده بیرونی
- ۵۰. دستکاری قیمت
- ۵۱. داده قدیمی
- ۵۲. خطای مقیاس قیمت
- ۵۳. اختلال اوراکل
- ۵۴. راهکارهای کاهش ریسک
- بخش هفتم: حملات اقتصادی و وام آنی
- ۵۵. Flash Loan چیست؟
- ۵۶. آیا Flash Loan آسیبپذیری است؟
- ۵۷. دستکاری بازار
- ۵۸. ضعف محاسبه وثیقه
- ۵۹. ضعف منطق نقدینگی
- ۶۰. ریسک طراحی توکنومیکس
- ۶۱. ضرورت ممیزی اقتصادی
- بخش هشتم: آسیبپذیریهای فراخوانی خارجی
- ۶۲. External Call چیست؟
- ۶۳. خطر اعتماد به قرارداد خارجی
- ۶۴. بررسینکردن نتیجه فراخوانی
- ۶۵. خطر Delegatecall
- ۶۶. تعامل با توکنهای غیراستاندارد
- ۶۷. راهکار کاهش ریسک
- بخش نهم: آسیبپذیریهای منطقی
- ۶۸. Business Logic Vulnerability چیست؟
- ۶۹. برداشت بیش از موجودی
- ۷۰. ایجاد غیرمجاز توکن
- ۷۱. سوزاندن نادرست توکن
- ۷۲. دورزدن محدودیتها
- ۷۳. خطای ترتیب عملیات
- ۷۴. خطای حسابداری چندقراردادی
- ۷۵. اهمیت مستندات کسبوکار
- بخش دهم: MEV و ترتیب تراکنشها
- ۷۶. MEV چیست؟
- ۷۷. Front-Running
- ۷۸. Sandwich Attack
- ۷۹. وابستگی به ترتیب
- ۸۰. استفاده از Slippage
- ۸۱. Commit-Reveal
- ۸۲. محدودیت راهکارها
- بخش یازدهم: آسیبپذیریهای امضا و احراز مجوز
- ۸۳. امضای دیجیتال
- ۸۴. Replay Attack
- ۸۵. Domain Separation
- ۸۶. Nonce
- ۸۷. انقضای امضا
- ۸۸. امضاهای ساختاریافته
- ۸۹. خطر امضای نامفهوم
- ۹۰. راهکار کاهش ریسک
- بخش دوازدهم: قراردادهای قابل ارتقا و Proxy
- ۹۱. قرارداد قابل ارتقا چیست؟
- ۹۲. مزیت ارتقا
- ۹۳. ریسک ارتقا
- ۹۴. Storage Collision
- ۹۵. خطای Initialize
- ۹۶. کنترل نسخه
- ۹۷. مدیریت اختیار ارتقا
- ۹۸. ممیزی پس از ارتقا
- بخش سیزدهم: Denial of Service و محدودیت گس
- ۹۹. حمله منع خدمت چیست؟
- ۱۰۰. حلقههای بدون محدودیت
- ۱۰۱. وابستگی به گیرنده
- ۱۰۲. قفلشدن منابع
- ۱۰۳. راهکار کاهش ریسک
- بخش چهاردهم: ابزارهای ممیزی قرارداد هوشمند
- ۱۰۴. Slither
- ۱۰۵. Foundry
- ۱۰۶. Echidna
- ۱۰۷. Mythril
- ۱۰۸. Hardhat
- ۱۰۹. OpenZeppelin Contracts
- ۱۱۰. ابزارهای بررسی صوری
- ۱۱۱. محدودیت ابزارهای خودکار
- ۱۱۲. ترکیب روشها
- بخش پانزدهم: نمونههای تاریخی آسیبپذیری
- ۱۱۳. رخداد The DAO
- ۱۱۴. رخداد Parity Wallet
- ۱۱۵. حملات به پروتکلهای DeFi
- ۱۱۶. حملات به پلهای بینزنجیرهای
- ۱۱۷. درسهای مشترک
- بخش شانزدهم: گزارش ممیزی حرفهای چه اجزایی دارد؟
- ۱۱۸. مشخصات پروژه
- ۱۱۹. محدوده بررسی
- ۱۲۰. روششناسی
- ۱۲۱. خلاصه مدیریتی
- ۱۲۲. دستهبندی شدت
- ۱۲۳. شرح فنی یافته
- ۱۲۴. شواهد
- ۱۲۵. پیشنهاد اصلاح
- ۱۲۶. پاسخ تیم توسعه
- ۱۲۷. بازآزمایی
- ۱۲۸. محدودیت گزارش
- بخش هفدهم: چکلیست امنیتی پیش از استقرار
- ۱۲۹. کنترل دسترسی
- ۱۳۰. بررسی بازورود
- ۱۳۱. بررسی محاسبات
- ۱۳۲. بررسی اوراکل
- ۱۳۳. بررسی امضا
- ۱۳۴. بررسی ارتقا
- ۱۳۵. بررسی وابستگیها
- ۱۳۶. آزمون شرایط مرزی
- ۱۳۷. آزمون ویژگیهای اقتصادی
- ۱۳۸. بررسی توقف اضطراری
- ۱۳۹. بررسی مستندات
- ۱۴۰. بررسی نسخه نهایی
- بخش هجدهم: امنیت قرارداد هوشمند پس از ممیزی
- ۱۴۱. پایش تراکنشها
- ۱۴۲. نظارت بر اختیارات مدیریتی
- ۱۴۳. پایش اوراکل
- ۱۴۴. برنامه واکنش به حادثه
- ۱۴۵. برنامه افشای مسئولانه
- ۱۴۶. برنامه پاداش کشف باگ
- ۱۴۷. ممیزی تغییرات
- ۱۴۸. مدیریت کلیدها
- ۱۴۹. آموزش تیم توسعه
- ۱۵۰. امنیت بهعنوان فرایند مستمر
- بخش نوزدهم: پرسشهای متداول
- ۱۵۱. ممیزی قرارداد هوشمند چیست؟
- ۱۵۲. آیا هر قرارداد هوشمند به ممیزی نیاز دارد؟
- ۱۵۳. آیا ممیزی امنیت کامل را تضمین میکند؟
- ۱۵۴. مهمترین آسیبپذیری قرارداد هوشمند چیست؟
- ۱۵۵. Reentrancy چیست؟
- ۱۵۶. آیا Solidity جدید مشکل سرریز را حل کرده است؟
- ۱۵۷. آیا استفاده از OpenZeppelin کافی است؟
- ۱۵۸. آیا ابزار خودکار جایگزین ممیز انسانی میشود؟
- ۱۵۹. آیا قرارداد قابل ارتقا امنتر است؟
- ۱۶۰. آیا ممیزی باید عمومی منتشر شود؟
- ۱۶۱. آیا Bug Bounty جایگزین ممیزی است؟
- ۱۶۲. آیا قرارداد بدون نگهداری دارایی نیز ریسک دارد؟
- ۱۶۳. ممیزی اقتصادی چیست؟
- ۱۶۴. آیا قرارداد ممیزیشده ممکن است هک شود؟
- ۱۶۵. مهمترین اصل امنیت قرارداد هوشمند چیست؟
- جمعبندی نهایی
- منابع و مراجع تخصصی
ممیزی قرارداد هوشمند و آسیبپذیریهای رایج؛ از شناسایی خطا تا مدیریت امنیت پروتکلهای بلاکچینی
مقدمه
قراردادهای هوشمند یکی از مهمترین قابلیتهای فناوری بلاکچین هستند. این برنامهها میتوانند انتقال دارایی، مدیریت وثیقه، اجرای توافقها و ارائه خدمات غیرمتمرکز را بر اساس قواعد از پیش تعیینشده انجام دهند.
با گسترش کاربرد قراردادهای هوشمند در امور مالی غیرمتمرکز، توکنسازی دارایی، بیمه، بازیهای بلاکچینی و خدمات سازمانی، امنیت آنها به مسئلهای اساسی تبدیل شده است.
برخلاف بسیاری از نرمافزارهای متعارف، قراردادهای هوشمند ممکن است مستقیماً کنترل داراییهای ارزشمند را در اختیار داشته باشند. از سوی دیگر، تراکنشهای نهاییشده بلاکچینی معمولاً بهسادگی قابل بازگشت نیستند.
بنابراین یک آسیبپذیری در قرارداد میتواند پیامدهایی فراتر از اختلال نرمافزاری ایجاد کند.
ممیزی امنیتی قرارداد هوشمند با هدف شناسایی ضعفهای فنی، منطقی و اقتصادی انجام میشود؛ اما امنیت پایدار به یک گزارش حسابرسی محدود نیست.
در این مقاله، مفهوم ممیزی قرارداد هوشمند، مراحل اجرای آن، مهمترین آسیبپذیریها، ابزارهای تحلیل، روشهای آزمون، نمونههای تاریخی و الزامات امنیتی پروژههای بلاکچینی بررسی میشود.
بخش اول: ممیزی قرارداد هوشمند چیست؟
۱. تعریف Smart Contract Audit
ممیزی قرارداد هوشمند فرایندی ساختاریافته برای بررسی کد، معماری، منطق اجرایی و فرضهای امنیتی یک قرارداد یا مجموعهای از قراردادهاست.
هدف آن شناسایی ضعفهایی است که ممکن است به دسترسی غیرمجاز، اختلال در عملکرد، دستکاری محاسبات یا از دست رفتن دارایی منجر شوند.
۲. تفاوت ممیزی با تست نرمافزار
آزمون نرمافزار معمولاً بررسی میکند که برنامه در شرایط مشخص مطابق انتظار کار کند.
ممیزی امنیتی علاوه بر عملکرد عادی، رفتار برنامه در شرایط غیرمنتظره، ورودیهای مخرب و سناریوهای سوءاستفاده را بررسی میکند.
۳. تفاوت ممیزی با تأیید رسمی
Formal Verification از روشهای ریاضی برای بررسی انطباق یک سامانه با ویژگیهای مشخص استفاده میکند.
این روش میتواند مکمل ممیزی باشد، اما درستی مشخصات تعریفشده و کاملبودن مدل همچنان اهمیت دارد.
۴. چرا قرارداد هوشمند به ممیزی نیاز دارد؟
زیرا قرارداد ممکن است دارایی واقعی را مدیریت کند و خطاهای آن در محیطی عمومی و قابل تعامل توسط مهاجمان قابل سوءاستفاده باشند.
۵. آیا ممیزی اجباری است؟
الزام قانونی عمومی و یکسانی برای تمام قراردادهای هوشمند در همه کشورها وجود ندارد.
بااینحال، ممیزی مستقل برای پروژههای حساس مالی و سازمانی یک اقدام مهم مدیریت ریسک است.
۶. آیا ممیزی امنیت را تضمین میکند؟
خیر.
ممیزی میتواند احتمال کشف ضعفها را افزایش دهد، اما نبود تمام آسیبپذیریها را اثبات نمیکند.
۷. چه زمانی ممیزی انجام شود؟
بهتر است ممیزی پیش از استقرار عملیاتی و پس از تثبیت نسخه کد انجام شود.
تغییرات مهم بعدی نیز ممکن است به ممیزی مجدد نیاز داشته باشند.
۸. چه کسانی ممیزی را انجام میدهند؟
متخصصان امنیت قرارداد هوشمند، مهندسان پروتکل، پژوهشگران امنیت و تیمهای مستقل حسابرسی میتوانند در این فرایند مشارکت کنند.
بخش دوم: مراحل حرفهای ممیزی قرارداد هوشمند
۹. تعیین محدوده ممیزی
در ابتدا باید قراردادها، نسخه کد، وابستگیها، شبکه هدف و اجزای خارج از محدوده مشخص شوند.
۱۰. بررسی مستندات
ممیز باید مستندات فنی، معماری، قواعد کسبوکار و نحوه استفاده از قراردادها را مطالعه کند.
۱۱. شناسایی داراییهای حساس
داراییهای تحت کنترل قرارداد، کلیدهای مدیریتی، توکنها و منابع نقدینگی باید شناسایی شوند.
۱۲. شناسایی نقشها
نقشهایی مانند مالک، مدیر، اپراتور، اعتبارسنج و کاربر عادی باید بررسی شوند.
۱۳. مدلسازی تهدید
در Threat Modeling، سناریوهای سوءاستفاده و فرضهای اعتماد سامانه شناسایی میشوند.
۱۴. تحلیل ایستای کد
Static Analysis کد را بدون اجرای معمول برنامه برای شناسایی الگوهای خطرناک و خطاهای احتمالی بررسی میکند.
۱۵. تحلیل دستی
بررسی دستی برای کشف ضعفهای منطق کسبوکار و تعاملات پیچیده میان قراردادها اهمیت ویژهای دارد.
۱۶. آزمون واحد
Unit Testing رفتار توابع و اجزای مستقل را بررسی میکند.
۱۷. آزمون یکپارچگی
Integration Testing تعامل میان قراردادها و اجزای مرتبط را بررسی میکند.
۱۸. آزمون مبتنی بر ورودی تصادفی
Fuzz Testing با تولید ورودیهای متنوع و غیرمنتظره به شناسایی رفتارهای ناخواسته کمک میکند.
۱۹. آزمون ویژگیهای پایدار
Invariant Testing بررسی میکند که ویژگیهای حیاتی سامانه در توالیهای مختلف عملیات حفظ شوند.
۲۰. تحلیل اقتصادی
در پروتکلهای مالی، منطق وثیقه، نقدینگی، قیمتگذاری و انگیزههای اقتصادی باید بررسی شود.
۲۱. ارزیابی شدت یافتهها
آسیبپذیریها بر اساس احتمال سوءاستفاده و پیامد احتمالی دستهبندی میشوند.
۲۲. ارائه پیشنهاد اصلاح
برای هر یافته باید راهکار فنی و توضیح پیامد امنیتی ارائه شود.
۲۳. بازآزمایی
پس از اصلاح کد، ممیز باید بررسی کند که مشکل رفع شده و ضعف جدیدی ایجاد نشده باشد.
۲۴. انتشار گزارش
گزارش نهایی باید محدوده، روش بررسی، یافتهها، وضعیت اصلاح و محدودیتهای ممیزی را مشخص کند.
بخش سوم: آسیبپذیری بازورود یا Reentrancy
۲۵. Reentrancy چیست؟
بازورود زمانی رخ میدهد که یک قرارداد در جریان اجرای تابع، کنترل را به قرارداد دیگری واگذار کند و آن قرارداد بتواند پیش از تکمیل عملیات اولیه، دوباره به مسیر اجرایی حساس وارد شود.
۲۶. چرا خطرناک است؟
اگر وضعیت داخلی پیش از تعامل خارجی بهروزرسانی نشده باشد، ممکن است عملیات تکراری یا ناسازگار انجام شود.
۲۷. نمونه مفهومی
فرض کنید قرارداد برداشت، ابتدا دارایی را ارسال کند و سپس موجودی کاربر را کاهش دهد.
اگر قرارداد دریافتکننده بتواند پیش از کاهش موجودی، مسیر برداشت را دوباره فعال کند، ممکن است منطق برداشت آسیبپذیر شود.
۲۸. انواع Reentrancy
این ضعف میتواند در یک تابع، میان چند تابع یا در تعامل چند قرارداد ظاهر شود.
۲۹. راهکار کاهش ریسک
استفاده از الگوی Checks-Effects-Interactions، محافظ بازورود و طراحی دقیق تغییر وضعیت میتواند خطر را کاهش دهد.
۳۰. آیا محافظ بازورود کافی است؟
خیر.
ممکن است آسیبپذیری از طریق مسیرهای دیگر یا قراردادهای مرتبط ایجاد شود.
بخش چهارم: ضعف کنترل دسترسی
۳۱. Access Control چیست؟
کنترل دسترسی مشخص میکند چه حسابها یا نقشهایی مجاز به اجرای عملیات حساس هستند.
۳۲. دسترسی مدیریتی نامناسب
اگر تابعی حساس بدون محدودیت مناسب در دسترس باشد، مهاجم ممکن است تنظیمات یا داراییها را تغییر دهد.
۳۳. مالکیت قرارداد
در بعضی قراردادها، مالک اختیار تغییر تنظیمات، توقف عملیات یا مدیریت منابع را دارد.
۳۴. خطر کلید مدیریتی
افشای کلید مالک یا مدیر میتواند امنیت قرارداد را تهدید کند، حتی اگر کد اصلی آسیبپذیری آشکاری نداشته باشد.
۳۵. خطای مقداردهی اولیه
در قراردادهای قابل ارتقا، پیکربندی نادرست تابع Initialize ممکن است امکان تصاحب نقشهای حساس را ایجاد کند.
۳۶. اصل حداقل اختیار
هر نقش باید فقط به مجوزهای موردنیاز خود دسترسی داشته باشد.
۳۷. نقش چندامضایی
کیف پول چندامضایی میتواند اختیار اجرای بعضی عملیات را میان چند امضاکننده تقسیم کند.
۳۸. محدودیت چندامضایی
اگر امضاکنندگان مستقل نباشند یا کلیدها بهدرستی مدیریت نشوند، چندامضایی نیز ممکن است شکست بخورد.
۳۹. Timelock چیست؟
Timelock سازوکاری است که اجرای برخی تغییرات حساس را با تأخیر مشخص انجام میدهد.
۴۰. مزیت Timelock
تأخیر میتواند فرصت شناسایی و واکنش به تغییرات غیرمنتظره را افزایش دهد، اما جایگزین کنترل دسترسی صحیح نیست.
بخش پنجم: خطاهای محاسباتی
۴۱. Integer Overflow چیست؟
سرریز عدد صحیح زمانی رخ میدهد که نتیجه محاسبه از محدوده قابل نمایش نوع داده خارج شود.
۴۲. Integer Underflow چیست؟
کمریزی زمانی رخ میدهد که مقدار محاسبهشده از حد پایین نوع داده عبور کند.
۴۳. رفتار Solidity جدید
در نسخههای Solidity از 0.8 به بعد، عملیات حسابی معمولی بهصورت پیشفرض دارای بررسی سرریز و کمریزی است.
۴۴. خطر unchecked
استفاده از بلوک unchecked بررسی خودکار سرریز را برای عملیات مربوط غیرفعال میکند و نیازمند دقت بیشتر است.
۴۵. خطای گردکردن
در محاسبات مالی، ترتیب تقسیم و ضرب یا گردکردن میتواند بر مقدار دارایی اثر بگذارد.
۴۶. اختلاف تعداد اعشار
توکنها ممکن است تعداد اعشار متفاوتی داشته باشند.
اشتباه در تبدیل مقیاس میتواند قیمتگذاری یا محاسبات موجودی را مختل کند.
۴۷. خطای تقسیم
تقسیم بر صفر یا استفاده از مخرج نامعتبر میتواند اجرای عملیات را متوقف کند.
۴۸. راهکار کاهش ریسک
استفاده از محاسبات دقیق، آزمون مقادیر مرزی و بررسی ویژگیهای حسابداری ضروری است.
بخش ششم: آسیبپذیریهای مرتبط با اوراکل
۴۹. وابستگی به داده بیرونی
قراردادهای هوشمند ممکن است برای تصمیمهای حساس به داده قیمت یا رویدادهای خارجی وابسته باشند.
۵۰. دستکاری قیمت
اگر داده قیمت از بازاری کمعمق یا منبعی قابل دستکاری دریافت شود، ممکن است مهاجم بتواند نتیجه عملیات مالی را منحرف کند.
۵۱. داده قدیمی
استفاده از قیمت یا گزارشی که بیش از حد قدیمی است، میتواند به تصمیم نادرست منجر شود.
۵۲. خطای مقیاس قیمت
اشتباه در اعشار یا واحد داده ممکن است ارزش دارایی را بهصورت نادرست محاسبه کند.
۵۳. اختلال اوراکل
در صورت توقف انتشار داده، برخی عملیات وابسته ممکن است مختل شوند.
۵۴. راهکارهای کاهش ریسک
بررسی تازگی داده، محدودیت انحراف، انتخاب منابع معتبر و طراحی حالت توقف امن از اقدامات مهم هستند.
بخش هفتم: حملات اقتصادی و وام آنی
۵۵. Flash Loan چیست؟
وام آنی نوعی وام در بعضی پروتکلهای DeFi است که دریافت و بازپرداخت آن باید در یک تراکنش اتمی انجام شود.
۵۶. آیا Flash Loan آسیبپذیری است؟
خیر.
وام آنی یک قابلیت مالی است، اما ممکن است برای تأمین سرمایه لازم جهت سوءاستفاده از ضعفهای دیگر استفاده شود.
۵۷. دستکاری بازار
مهاجم ممکن است با ایجاد تغییر موقت در قیمت یک دارایی، سامانهای را که به آن قیمت وابسته است تحت تأثیر قرار دهد.
۵۸. ضعف محاسبه وثیقه
اشتباه در محاسبه ارزش وثیقه میتواند امکان دریافت وام بیش از حد مجاز یا تسویه نادرست را فراهم کند.
۵۹. ضعف منطق نقدینگی
در استخرهای نقدینگی، خطا در محاسبه سهم کاربران یا نسبت داراییها ممکن است پیامد مالی داشته باشد.
۶۰. ریسک طراحی توکنومیکس
مدل اقتصادی ناپایدار یا انگیزههای ناسازگار میتوانند حتی بدون وجود خطای برنامهنویسی آشکار، به شکست پروتکل منجر شوند.
۶۱. ضرورت ممیزی اقتصادی
ممیزی پروتکل مالی باید فراتر از بررسی کد، سناریوهای اقتصادی و رفتار بازیگران را نیز بررسی کند.
بخش هشتم: آسیبپذیریهای فراخوانی خارجی
۶۲. External Call چیست؟
فراخوانی خارجی زمانی رخ میدهد که قرارداد با قرارداد یا آدرس دیگری تعامل میکند.
۶۳. خطر اعتماد به قرارداد خارجی
قرارداد دریافتکننده ممکن است رفتاری متفاوت از انتظار توسعهدهنده داشته باشد.
۶۴. بررسینکردن نتیجه فراخوانی
در برخی روشهای فراخوانی سطح پایین، نتیجه عملیات باید بهصورت صریح بررسی شود.
۶۵. خطر Delegatecall
Delegatecall امکان اجرای کد قرارداد دیگر در زمینه ذخیرهسازی و اجرای قرارداد فراخواننده را فراهم میکند.
استفاده نادرست از آن میتواند بسیار خطرناک باشد.
۶۶. تعامل با توکنهای غیراستاندارد
برخی توکنها ممکن است رفتارهایی متفاوت از فرضهای سادهشده توسعهدهنده داشته باشند.
۶۷. راهکار کاهش ریسک
تعریف رابطهای مشخص، بررسی نتیجه فراخوانی، محدودسازی اعتماد و استفاده از کتابخانههای معتبر اهمیت دارد.
بخش نهم: آسیبپذیریهای منطقی
۶۸. Business Logic Vulnerability چیست؟
آسیبپذیری منطقی زمانی رخ میدهد که برنامه مطابق کد اجرا شود، اما خود قواعد پیادهسازیشده امکان رفتار ناخواسته یا سوءاستفاده را فراهم کنند.
۶۹. برداشت بیش از موجودی
خطای حسابداری ممکن است باعث شود کاربر بیش از حق واقعی خود دارایی دریافت کند.
۷۰. ایجاد غیرمجاز توکن
اگر محدودیتهای ایجاد توکن بهدرستی اعمال نشوند، عرضه دارایی ممکن است از مقدار مجاز فراتر رود.
۷۱. سوزاندن نادرست توکن
اشتباه در منطق Burn میتواند موجودی یا عرضه را بهصورت نامعتبر تغییر دهد.
۷۲. دورزدن محدودیتها
شرایطی مانند سقف برداشت، زمان انتظار یا محدودیت نقش ممکن است بهدلیل طراحی ناقص قابل دورزدن باشند.
۷۳. خطای ترتیب عملیات
ترتیب اجرای چند عملیات میتواند بر نتیجه مالی قرارداد اثر بگذارد.
۷۴. خطای حسابداری چندقراردادی
اگر چند قرارداد وضعیت مالی مشترکی را مدیریت کنند، ناسازگاری میان آنها میتواند خطرآفرین شود.
۷۵. اهمیت مستندات کسبوکار
بدون تعریف دقیق قواعد اقتصادی و عملیاتی، تشخیص خطای منطقی دشوار است.
بخش دهم: MEV و ترتیب تراکنشها
۷۶. MEV چیست؟
Maximal Extractable Value به ارزشی اشاره دارد که از طریق انتخاب، ترتیبدهی یا حذف تراکنشها در تولید بلاک قابل استخراج است.
۷۷. Front-Running
در برخی شرایط، بازیگری میتواند با مشاهده تراکنش در انتظار، تراکنش خود را زودتر اجرا کند.
۷۸. Sandwich Attack
این حمله معمولاً شامل قرارگرفتن تراکنشهای مهاجم پیش و پس از تراکنش هدف برای بهرهبرداری از تغییر قیمت است.
۷۹. وابستگی به ترتیب
اگر نتیجه قرارداد به ترتیب تراکنشها حساس باشد، ممکن است فرصت سوءاستفاده ایجاد شود.
۸۰. استفاده از Slippage
در سامانههای مبادله، تعیین محدودیت مناسب لغزش قیمت میتواند بخشی از ریسک اجرای نامطلوب را کاهش دهد.
۸۱. Commit-Reveal
در بعضی کاربردها، الگوی ثبت تعهد و افشای بعدی میتواند بخشی از اطلاعات حساس را تا زمان مشخص پنهان کند.
۸۲. محدودیت راهکارها
هیچ روش واحدی تمام ریسکهای ناشی از ترتیب تراکنش و MEV را حذف نمیکند.
بخش یازدهم: آسیبپذیریهای امضا و احراز مجوز
۸۳. امضای دیجیتال
قرارداد ممکن است برای تأیید مجوز عملیات از امضاهای رمزنگاری استفاده کند.
۸۴. Replay Attack
اگر امضا به زمینه مناسب مانند شبکه، قرارداد یا شماره ترتیب وابسته نباشد، ممکن است در شرایط ناخواسته دوباره استفاده شود.
۸۵. Domain Separation
جداسازی دامنه به محدودکردن اعتبار امضا به زمینه مشخص کمک میکند.
۸۶. Nonce
Nonce میتواند برای جلوگیری از استفاده مجدد از یک مجوز امضاشده استفاده شود.
۸۷. انقضای امضا
در بعضی کاربردها، تعیین زمان اعتبار مجوز میتواند خطر استفاده دیرهنگام را کاهش دهد.
۸۸. امضاهای ساختاریافته
استانداردهایی مانند EIP-712 برای امضای داده ساختاریافته در اکوسیستم اتریوم کاربرد دارند.
۸۹. خطر امضای نامفهوم
اگر کاربر نتواند مفاد مجوز را تشخیص دهد، احتمال تأیید عملیات ناخواسته افزایش مییابد.
۹۰. راهکار کاهش ریسک
استفاده از ساختار استاندارد امضا، بررسی Nonce، محدودیت زمانی و کنترل زمینه امضا اهمیت دارد.
بخش دوازدهم: قراردادهای قابل ارتقا و Proxy
۹۱. قرارداد قابل ارتقا چیست؟
در بعضی معماریها، قرارداد از طریق الگوی Proxy امکان تغییر منطق اجرایی را بدون تغییر آدرس اصلی فراهم میکند.
۹۲. مزیت ارتقا
امکان اصلاح خطا و توسعه قابلیتها از مزایای بالقوه این معماری است.
۹۳. ریسک ارتقا
اگر اختیار تغییر پیادهسازی بهدرستی محافظت نشود، ممکن است منطق قرارداد بهصورت مخرب تغییر کند.
۹۴. Storage Collision
ناسازگاری ساختار ذخیرهسازی میان نسخههای قرارداد میتواند باعث تخریب یا تفسیر نادرست دادهها شود.
۹۵. خطای Initialize
مقداردهی اولیه نادرست میتواند زمینه دسترسی غیرمجاز را ایجاد کند.
۹۶. کنترل نسخه
تغییرات پیادهسازی باید با مستندات و آزمون سازگاری همراه باشند.
۹۷. مدیریت اختیار ارتقا
چندامضایی، محدودیت نقش و تأخیر زمانی میتوانند در کنترل ریسک تغییرات حساس مؤثر باشند.
۹۸. ممیزی پس از ارتقا
تغییرات مهم باید دوباره بررسی شوند، زیرا ممیزی نسخه قبلی الزاماً نسخه جدید را پوشش نمیدهد.
بخش سیزدهم: Denial of Service و محدودیت گس
۹۹. حمله منع خدمت چیست؟
Denial of Service به وضعیتی اشاره دارد که اجرای عملیات موردنیاز سامانه مختل یا غیرممکن میشود.
۱۰۰. حلقههای بدون محدودیت
پردازش مجموعههای بسیار بزرگ در یک تراکنش ممکن است به محدودیت گس برخورد کند.
۱۰۱. وابستگی به گیرنده
اگر اجرای عملیات به موفقیت تعامل با یک قرارداد خارجی وابسته باشد، رفتار آن قرارداد ممکن است کل فرایند را مختل کند.
۱۰۲. قفلشدن منابع
خطاهای طراحی ممکن است باعث شوند دارایی یا عملیات در وضعیتی غیرقابل پیشرفت قرار گیرد.
۱۰۳. راهکار کاهش ریسک
طراحی پردازش مرحلهای، محدودکردن حلقهها و تفکیک عملیات حساس میتواند مفید باشد.
بخش چهاردهم: ابزارهای ممیزی قرارداد هوشمند
۱۰۴. Slither
Slither یک چارچوب تحلیل ایستای قراردادهای Solidity است که برای شناسایی الگوهای خطرناک و تحلیل ساختار کد استفاده میشود.
۱۰۵. Foundry
Foundry مجموعه ابزار توسعه و آزمون قراردادهای هوشمند است و برای آزمون واحد، Fuzzing و Invariant Testing کاربرد دارد.
۱۰۶. Echidna
Echidna ابزاری برای آزمون مبتنی بر ویژگی و تولید ورودیهای متنوع در قراردادهای هوشمند است.
۱۰۷. Mythril
Mythril از روشهای تحلیل امنیتی و اجرای نمادین برای بررسی بعضی ضعفهای قراردادهای مبتنی بر ماشین مجازی اتریوم استفاده میکند.
۱۰۸. Hardhat
Hardhat محیطی برای توسعه، آزمون و مدیریت پروژههای قرارداد هوشمند فراهم میکند.
۱۰۹. OpenZeppelin Contracts
کتابخانههای OpenZeppelin شامل پیادهسازیهای شناختهشده برای استانداردهای توکن، کنترل دسترسی و اجزای امنیتی هستند.
۱۱۰. ابزارهای بررسی صوری
ابزارهای Formal Verification میتوانند برخی ویژگیهای مشخصشده را با روشهای ریاضی بررسی کنند.
۱۱۱. محدودیت ابزارهای خودکار
ابزارها ممکن است هشدار اشتباه ایجاد کنند یا ضعفهای پیچیده منطق اقتصادی را شناسایی نکنند.
۱۱۲. ترکیب روشها
ممیزی مؤثر معمولاً از تحلیل دستی، آزمون خودکار، بررسی اقتصادی و بازآزمایی استفاده میکند.
بخش پانزدهم: نمونههای تاریخی آسیبپذیری
۱۱۳. رخداد The DAO
در سال ۲۰۱۶، ضعف مرتبط با بازورود در قرارداد The DAO به یکی از شناختهشدهترین رخدادهای امنیتی تاریخ اتریوم تبدیل شد.
۱۱۴. رخداد Parity Wallet
در سال ۲۰۱۷، ضعفهای مرتبط با کنترل دسترسی و مدیریت کتابخانه قراردادهای کیف پول Parity به رخدادهای امنیتی مهمی منجر شدند.
۱۱۵. حملات به پروتکلهای DeFi
در سالهای مختلف، پروتکلهای مالی غیرمتمرکز با حملاتی مرتبط با منطق اقتصادی، قیمتگذاری و کنترل دسترسی مواجه شدهاند.
۱۱۶. حملات به پلهای بینزنجیرهای
رخدادهایی مانند Wormhole و Nomad نشان دادهاند که اعتبارسنجی پیام و امنیت قراردادهای مرتبط با انتقال میان شبکهها اهمیت زیادی دارد.
۱۱۷. درسهای مشترک
رخدادهای تاریخی نشان میدهند که امنیت قرارداد هوشمند فقط به یک تابع یا یک ابزار وابسته نیست.
کنترل دسترسی، منطق اقتصادی، وابستگیهای خارجی و مدیریت تغییرات همگی باید بررسی شوند.
بخش شانزدهم: گزارش ممیزی حرفهای چه اجزایی دارد؟
۱۱۸. مشخصات پروژه
نام پروژه، نسخه قراردادها و شبکه هدف باید مشخص شود.
۱۱۹. محدوده بررسی
فهرست فایلها، قراردادها، شناسه نسخه کد و وابستگیهای بررسیشده باید ثبت شود.
۱۲۰. روششناسی
ابزارها، روشهای آزمون و فرایند تحلیل باید توضیح داده شوند.
۱۲۱. خلاصه مدیریتی
مهمترین ریسکها و وضعیت کلی یافتهها باید برای تصمیمگیران غیرتخصصی قابل فهم باشند.
۱۲۲. دستهبندی شدت
یافتهها میتوانند بر اساس شدت بحرانی، بالا، متوسط، پایین و اطلاعاتی دستهبندی شوند.
۱۲۳. شرح فنی یافته
هر یافته باید شامل محل مشکل، شرایط وقوع و پیامد احتمالی باشد.
۱۲۴. شواهد
نمونه آزمون، مسیر اجرایی یا استدلال فنی باید یافته را پشتیبانی کند.
۱۲۵. پیشنهاد اصلاح
راهکار پیشنهادی باید روشن و قابل اجرا باشد.
۱۲۶. پاسخ تیم توسعه
تیم پروژه باید وضعیت پذیرش، اصلاح یا عدم اصلاح یافته را مشخص کند.
۱۲۷. بازآزمایی
نتیجه بررسی نسخه اصلاحشده باید ثبت شود.
۱۲۸. محدودیت گزارش
گزارش باید توضیح دهد که ممیزی تضمین نبود تمام آسیبپذیریها نیست.
بخش هفدهم: چکلیست امنیتی پیش از استقرار
۱۲۹. کنترل دسترسی
تمام توابع حساس باید دارای محدودیت مجوز مناسب باشند.
۱۳۰. بررسی بازورود
تعاملات خارجی و ترتیب تغییر وضعیت باید بررسی شوند.
۱۳۱. بررسی محاسبات
سرریز، گردکردن، اعشار و حسابداری دارایی باید آزمون شوند.
۱۳۲. بررسی اوراکل
تازگی، مقیاس و اعتبار دادههای بیرونی باید کنترل شود.
۱۳۳. بررسی امضا
Nonce، دامنه اعتبار و انقضای مجوزها باید در صورت نیاز بررسی شوند.
۱۳۴. بررسی ارتقا
اختیار تغییر پیادهسازی و سازگاری ذخیرهسازی باید کنترل شود.
۱۳۵. بررسی وابستگیها
کتابخانهها و قراردادهای خارجی باید شناسایی و ارزیابی شوند.
۱۳۶. آزمون شرایط مرزی
مقادیر صفر، حداکثری، ورودیهای نامعتبر و توالیهای غیرعادی باید آزمون شوند.
۱۳۷. آزمون ویژگیهای اقتصادی
ویژگیهایی مانند حفظ دارایی، سقف بدهی و محدودیت برداشت باید بررسی شوند.
۱۳۸. بررسی توقف اضطراری
برای سامانههای حساس، سازوکارهای مدیریت بحران باید طراحی و آزمون شوند.
۱۳۹. بررسی مستندات
مستندات باید با رفتار واقعی قرارداد سازگار باشند.
۱۴۰. بررسی نسخه نهایی
کد مستقرشده باید با نسخه بررسیشده و تأییدشده مطابقت داشته باشد.
بخش هجدهم: امنیت قرارداد هوشمند پس از ممیزی
۱۴۱. پایش تراکنشها
رفتار غیرعادی قرارداد و تغییرات حساس باید پایش شود.
۱۴۲. نظارت بر اختیارات مدیریتی
تغییر مالکیت، ارتقا و تغییر تنظیمات مهم باید قابل مشاهده و بررسی باشد.
۱۴۳. پایش اوراکل
اختلال، تأخیر یا تغییر غیرعادی داده باید شناسایی شود.
۱۴۴. برنامه واکنش به حادثه
مسئولیتها، مسیر اطلاعرسانی و اقدامات اضطراری باید از پیش تعریف شوند.
۱۴۵. برنامه افشای مسئولانه
پروژه میتواند سازوکاری برای دریافت گزارش محرمانه آسیبپذیریها فراهم کند.
۱۴۶. برنامه پاداش کشف باگ
Bug Bounty میتواند پژوهشگران امنیت را به گزارش مسئولانه ضعفها تشویق کند.
۱۴۷. ممیزی تغییرات
تغییرات مهم کد، تنظیمات یا وابستگیها باید دوباره ارزیابی شوند.
۱۴۸. مدیریت کلیدها
امنیت کلیدهای مدیریتی و عملیاتی باید بهصورت مستمر حفظ شود.
۱۴۹. آموزش تیم توسعه
آشنایی توسعهدهندگان با الگوهای امن و رخدادهای امنیتی جدید اهمیت دارد.
۱۵۰. امنیت بهعنوان فرایند مستمر
ممیزی باید بخشی از چرخه عمر توسعه امن باشد، نه اقدامی صرفاً تبلیغاتی پیش از عرضه محصول.
بخش نوزدهم: پرسشهای متداول
۱۵۱. ممیزی قرارداد هوشمند چیست؟
فرایند بررسی امنیت کد، معماری و منطق اجرایی قرارداد برای شناسایی ضعفها و ریسکهای احتمالی است.
۱۵۲. آیا هر قرارداد هوشمند به ممیزی نیاز دارد؟
سطح بررسی باید متناسب با ارزش دارایی، پیچیدگی و پیامد احتمالی خطا تعیین شود. برای قراردادهای حساس، ممیزی مستقل اهمیت بیشتری دارد.
۱۵۳. آیا ممیزی امنیت کامل را تضمین میکند؟
خیر. هیچ ممیزی معمولی نمیتواند نبود تمام آسیبپذیریها را تضمین کند.
۱۵۴. مهمترین آسیبپذیری قرارداد هوشمند چیست؟
پاسخ واحدی وجود ندارد. بازورود، کنترل دسترسی ضعیف، خطاهای منطقی و وابستگی به داده قابل دستکاری از دستههای مهم هستند.
۱۵۵. Reentrancy چیست؟
نوعی ضعف در تعامل قراردادها که میتواند امکان ورود مجدد به مسیر اجرایی حساس را پیش از تکمیل عملیات فراهم کند.
۱۵۶. آیا Solidity جدید مشکل سرریز را حل کرده است؟
نسخههای جدید بسیاری از عملیات حسابی را بهصورت پیشفرض بررسی میکنند، اما خطاهای محاسباتی و استفاده نادرست از unchecked همچنان ممکن است مشکل ایجاد کنند.
۱۵۷. آیا استفاده از OpenZeppelin کافی است؟
خیر. استفاده از کتابخانه معتبر مفید است، اما نحوه ترکیب و پیکربندی قراردادها نیز باید بررسی شود.
۱۵۸. آیا ابزار خودکار جایگزین ممیز انسانی میشود؟
خیر. تحلیل دستی برای شناسایی ضعفهای پیچیده منطقی و اقتصادی همچنان مهم است.
۱۵۹. آیا قرارداد قابل ارتقا امنتر است؟
قابلیت ارتقا امکان اصلاح را فراهم میکند، اما ریسکهای مدیریتی و سازگاری جدیدی نیز ایجاد میکند.
۱۶۰. آیا ممیزی باید عمومی منتشر شود؟
انتشار گزارش میتواند شفافیت ایجاد کند، اما زمان و شیوه انتشار باید با ملاحظات امنیتی و سیاست افشای مسئولانه هماهنگ باشد.
۱۶۱. آیا Bug Bounty جایگزین ممیزی است؟
خیر. برنامه پاداش کشف باگ مکمل ممیزی و آزمون امنیتی است.
۱۶۲. آیا قرارداد بدون نگهداری دارایی نیز ریسک دارد؟
بله. قرارداد ممکن است مجوز، داده یا فرایند مهمی را کنترل کند.
۱۶۳. ممیزی اقتصادی چیست؟
بررسی سازوکارهای مالی، انگیزهها، قیمتگذاری و سناریوهای سوءاستفاده اقتصادی از پروتکل است.
۱۶۴. آیا قرارداد ممیزیشده ممکن است هک شود؟
بله. ممیزی احتمال کشف ضعفها را افزایش میدهد، اما تضمین مطلق نیست.
۱۶۵. مهمترین اصل امنیت قرارداد هوشمند چیست؟
طراحی امن از ابتدا، تعریف دقیق فرضهای اعتماد، آزمون مستمر و مدیریت ریسک در تمام چرخه عمر قرارداد.
جمعبندی نهایی
ممیزی قرارداد هوشمند یکی از ارکان مهم امنیت زیرساختهای بلاکچینی است.
قراردادهای هوشمند ممکن است مستقیماً داراییهای دیجیتال، مجوزهای حساس و فرایندهای مالی یا سازمانی را کنترل کنند. بنابراین خطا در طراحی یا پیادهسازی آنها میتواند پیامدهای قابل توجهی داشته باشد.
آسیبپذیریهایی مانند Reentrancy، ضعف کنترل دسترسی، خطاهای محاسباتی، دستکاری اوراکل، مشکلات امضا و خطاهای منطق اقتصادی از مهمترین حوزههای بررسی هستند.
بااینحال، ممیزی نباید به اجرای چند ابزار خودکار یا تهیه یک گزارش محدود شود.
یک فرایند حرفهای باید شناخت معماری، مدلسازی تهدید، تحلیل دستی، آزمون امنیتی، بررسی اقتصادی، اصلاح یافتهها و بازآزمایی را شامل شود.
همچنین امنیت پس از استقرار پایان نمییابد.
پایش تراکنشها، مدیریت کلیدهای مدیریتی، کنترل تغییرات، برنامه واکنش به حادثه و ارزیابی مجدد نسخههای جدید برای حفظ امنیت ضروری هستند.
نتیجه راهبردی: امنیت قرارداد هوشمند یک ویژگی ثابت و دائمی نیست؛ حاصل فرایندی مستمر از طراحی امن، آزمون، ممیزی مستقل، کنترل تغییرات و مدیریت ریسک است.
منابع و مراجع تخصصی
۱. Ethereum — Smart Contracts
https://ethereum.org/en/developers/docs/smart-contracts/
۲. Solidity — Security Considerations
https://docs.soliditylang.org/en/latest/security-considerations.html
۳. OWASP — Smart Contract Security
https://scs.owasp.org/
۴. OWASP — Smart Contract Top 10
https://scs.owasp.org/sctop10/
۵. OpenZeppelin — Contracts Documentation
https://docs.openzeppelin.com/contracts/
۶. OpenZeppelin — Upgrades Documentation
https://docs.openzeppelin.com/upgrades-plugins/
۷. Slither — GitHub
https://github.com/crytic/slither
۸. Echidna — GitHub
https://github.com/crytic/echidna
۹. Foundry — Documentation
https://getfoundry.sh/
۱۰. Mythril — GitHub
https://github.com/ConsenSysDiligence/mythril
۱۱. Hardhat — Documentation
https://hardhat.org/docs
۱۲. Ethereum Improvement Proposals — EIP-712
https://eips.ethereum.org/EIPS/eip-712
۱۳. NIST — Blockchain Technology Overview
https://doi.org/10.6028/NIST.IR.8202
۱۴. Trail of Bits — Publications and Security Research
https://www.trailofbits.com/
۱۵. ConsenSys Diligence — Smart Contract Security
https://diligence.consensys.io/
یادداشت تحریریه: این مقاله برای آموزش مفاهیم ممیزی و امنیت قراردادهای هوشمند تهیه شده است. ابزارها و الگوهای امنیتی معرفیشده جایگزین بررسی تخصصی کد، آزمون مستقل یا ارزیابی ریسک متناسب با پروژه نیستند.
نظرها
هنوز نظری منتشر نشده؛ اولین نفر باشید.
نظر شما
نظرها پس از تأیید مدیر منتشر میشوند. ایمیل شما نمایش داده نمیشود.