🌐 دانشکدهٔ ۱۱ · فناوری پیشرفته
امنیت قرارداد هوشمند
Smart contract security
پیشنیازها: تأییدیهٔ توکن، قراردادهای مخرب و امضای کورکورانهپلهای بینزنجیرهای و درس هکهای بزرگ
📚 آموزش در سه سطح
از سطح ساده شروع کنید؛ اگر روشن بود، سطح بعد را بخوانید. سطح مناسب شما ذخیره میشود.
🌱 توضیح ساده
قرارداد هوشمند برنامهای است که پس از استقرار روی بلاکچین بهطور خودکار و برای همه اجرا میشود و اغلب میلیونها دلار دارایی را مستقیم نگه میدارد. سه ویژگی آن امنیت را دشوار میکند: کد عمومی است و همه میتوانند دنبال باگ بگردند؛ تراکنشها برگشتپذیر نیستند؛ و پاداش یافتن باگ برای مهاجم کل دارایی قرارداد است. به همین دلیل یک خطای کوچک میتواند در چند دقیقه به زیانی بزرگ تبدیل شود.
چند خانوادهٔ رایج آسیبپذیری: «بازورود» که در آن قرارداد پیش از بهروز کردن موجودی پول میفرستد و گیرنده دوباره همان تابع را صدا میزند؛ «کنترل دسترسی نادرست» که تابعی حساس را برای همه باز میگذارد؛ «دستکاری اوراکل» که قیمت را از منبعی کمعمق میگیرد؛ و خطاهای منطقی در محاسبه، گرد کردن یا مقداردهی اولیه.
ابزارهای دفاعی هم چند لایه دارند: کد ساده و آزموده، کتابخانههای استاندارد، آزمونهای خودکار گسترده، «ممیزی» مستقل، «برنامهٔ پاداش باگ» برای تشویق گزارش مسئولانه، و سقف تدریجی سپرده در ماههای اول. هیچکدام بهتنهایی کافی نیست؛ ممیزی شدن یعنی کاهش احتمال باگ، نه حذف آن.
📘 توضیح متوسط
الگوی «بررسیها، اثرها، تعاملها» پایهٔ دفاع در برابر بازورود است: اول شرایط را بررسی کنید (مثلاً موجودی کافی)، سپس وضعیت داخلی را بهروز کنید (کم کردن موجودی) و فقط در آخر با قرارداد یا آدرس بیرونی تعامل کنید (ارسال پول). اگر ترتیب برعکس باشد، گیرندهٔ مخرب میتواند پیش از کم شدن موجودی، تابع برداشت را دوباره صدا بزند. «قفل بازورود» لایهٔ دفاعی دوم است.
«قراردادهای قابل ارتقا» مبادلهٔ مهمی دارند: امکان رفع باگ پس از استقرار، اما در ازای آن کسی که کلید ارتقا را دارد میتواند منطق قرارداد را کاملاً عوض کند. پس تحلیل امنیت باید بپرسد کلید ارتقا دست کیست، یک کیفپول، کیفپول چندامضایی با امضاکنندگان مستقل یا حاکمیت با تایملاک، و آیا تغییرات پیش از اجرا قابل مشاهدهاند.
«تأییدیهٔ نامحدود توکن» نقطهٔ ضعف دیگری است که کاربر را به امنیت قرارداد دیگران گره میزند. وقتی به قراردادی اجازهٔ خرج نامحدود توکن میدهید و آن قرارداد بعدها هک یا بهشکل مخرب ارتقا داده شود، داراییهای کیفپول شما هم در خطر است. بازبینی و لغو دورهای تأییدیهها بخشی از امنیت شخصی در تعامل با قراردادهاست.
🔬 توضیح تخصصی
امنیت یک سیستم دیفای فقط امنیت کد قرارداد نیست؛ زنجیرهای از وابستگیهاست: کامپایلر، کتابخانهها، اوراکلها، پلها، کلیدهای مدیریتی، رابط کاربری وب، و رایانهٔ توسعهدهندگان و امضاکنندگان. بسیاری از بزرگترین زیانهای اخیر از همین لایههای بیرونی آمدهاند، نه از منطق قرارداد. «امضای کورکورانه»، یعنی تأیید تراکنشی که امضاکننده محتوای واقعیاش را نمیبیند، حلقهٔ ضعیف مشترک بسیاری از آنهاست.
روشهای پیشرفتهتر عبارتاند از «فازینگ» (آزمودن با ورودیهای تصادفی گسترده برای یافتن حالتهای شکست)، «تأیید صوری» (اثبات ریاضی اینکه کد ویژگی مشخصی را همیشه حفظ میکند)، پایش روی زنجیره برای شناسایی تراکنشهای مشکوک و توقف خودکار، و «دفاع در عمق» با سقف برداشت در بازههای زمانی. هر کدام دستهٔ متفاوتی از خطا را پیدا میکنند و ترکیبشان مؤثرتر از تکیه بر یک ممیزی است.
چارچوب ارزیابی امنیتی یک پروتکل برای سرمایهگذار: تعداد و کیفیت ممیزیها و اینکه یافتهها رفع شدهاند یا نه؛ اندازهٔ پاداش باگ نسبت به ارزش قفلشده؛ عمر قرارداد بدون حادثه، چون کدی که سالها با ارزش بالا زیر حمله دوام آورده شاهد قویتری از یک ممیزی است؛ ساختار کلیدها و تایملاک؛ وابستگی به اوراکل و پل؛ و سابقهٔ واکنش تیم به حوادث گذشته.
🌍 مثال واقعی: از The DAO (۲۰۱۶) تا Bybit (۲۰۲۵) — دو چهرهٔ شکست امنیتی
The DAO در ۲۰۱۶ حدود ۱۲٫۷ میلیون ETH (حدود ۱۵۰ میلیون دلار آن زمان) از حدود ۱۱ هزار مشارکتکننده جمع کرده بود. در ۱۷ ژوئن ۲۰۱۶ مهاجم از خطای بازورود در تابع splitDAO استفاده کرد: قرارداد پیش از بهروز کردن موجودی ETH میفرستاد و مهاجم بارها همان تابع را صدا زد. حدود ۳٫۶ میلیون ETH، نزدیک به یکسوم صندوق، به یک DAO فرزند با قفل ۲۸ روزه منتقل شد. جامعهٔ اتریوم در ۲۰ ژوئیهٔ ۲۰۱۶ در بلاک ۱٬۹۲۰٬۰۰۰ با هاردفورک وجوه را بازگرداند و زنجیرهٔ بدون تغییر با نام اتریوم کلاسیک ادامه یافت.
نزدیک به نه سال بعد، در ۲۱ فوریهٔ ۲۰۲۵، صرافی Bybit داراییهایی به ارزش حدود ۱٫۵ میلیارد دلار، عمدتاً ETH، را در بزرگترین سرقت تاریخ کریپتو از دست داد بیآنکه قرارداد هوشمند باگی داشته باشد. به گزارش FBI و تحقیقات قانونی، گروه Lazarus (TraderTraitor) کره شمالی رایانهٔ یکی از توسعهدهندگان Safe{Wallet} را آلوده کرده و کد جاوااسکریپت مخربی در رابط وب آن گذاشته بود. وقتی امضاکنندگان Bybit یک انتقال عادی از کیف سرد به کیف گرم را تأیید کردند، رابط تراکنشی ظاهراً سالم نشان داد اما در واقع منطق کیفپول را تغییر داد و داراییها را در اختیار مهاجم گذاشت. درس: الگوی بررسیها-اثرها-تعاملها جلوی The DAO را میگرفت، اما در Bybit ضعف در زنجیرهٔ تأمین نرمافزار و امضای کورکورانه بود.
🔤 واژگان تخصصی
فراخوانی دوبارهٔ یک تابع توسط قرارداد بیرونی پیش از کامل شدن بهروزرسانی وضعیت.
مثال: برداشت مکرر پیش از کم شدن موجودی در The DAO.
ترتیب امن کد: بررسی شرایط، بهروزرسانی وضعیت، سپس تعامل بیرونی.
مثال: کم کردن موجودی پیش از ارسال ETH.
بازبینی مستقل کد برای یافتن آسیبپذیریها پیش از استقرار.
مثال: گزارش ممیزی با یافتههای بحرانی و وضعیت رفع آنها.
اثبات ریاضی اینکه کد ویژگی مشخصی را در همهٔ حالتها حفظ میکند.
مثال: اثبات اینکه مجموع موجودیها هرگز از ذخیره بیشتر نمیشود.
تأیید تراکنشی که امضاکننده محتوای واقعی آن را نمیبیند یا نمیفهمد.
مثال: تأیید تراکنش چندامضایی فقط بر اساس نمایش رابط وب.
🔑 نکات کلیدی
- کد عمومی، تراکنش برگشتناپذیر و پاداش بزرگ، امنیت قرارداد را دشوار میکند.
- الگوی بررسیها-اثرها-تعاملها و قفل بازورود دفاع اصلی در برابر بازورود است.
- ممیزی احتمال باگ را کم میکند، حذف نمیکند.
- The DAO (ژوئن ۲۰۱۶) با بازورود حدود ۳٫۶ میلیون ETH از دست داد و به هاردفورک انجامید.
- Bybit (فوریهٔ ۲۰۲۵) نشان داد امنیت شامل رابط کاربری، رایانهٔ توسعهدهنده و امضاکنندگان هم میشود.
⚠️ اشتباهات رایج
- برابر دانستن «ممیزیشده» با «امن»؛ اشتباه است چون ممیزی فقط بخشی از خطاها را در زمانی مشخص مییابد.
- ارسال پول پیش از بهروز کردن وضعیت؛ اشتباه است چون در را برای بازورود باز میکند.
- نادیده گرفتن کلید ارتقا؛ اشتباه است چون دارندهٔ آن میتواند منطق قرارداد را کاملاً عوض کند.
- امضای تراکنش فقط بر اساس نمایش رابط وب؛ اشتباه است چون رابط آلوده میتواند محتوای واقعی تراکنش را پنهان کند.
🛠 تمرین عملی: بازبینی امنیتی یک تابع برداشت
- تابع برداشت سادهای را در نظر بگیرید که ابتدا ETH میفرستد و سپس موجودی کاربر را صفر میکند؛ مسیر حملهٔ بازورود را گامبهگام بنویسید.
- ترتیب کد را بر اساس بررسیها-اثرها-تعاملها بازنویسی کنید و توضیح دهید قفل بازورود چه لایهٔ اضافهای میدهد.
- برای یک پروتکل واقعی، ممیزیها، پاداش باگ، دارندهٔ کلید ارتقا و تایملاک را از مستندات پیدا کنید و در یک جدول بنویسید.
✅ معیار درستی: مسیر حمله درست توضیح داده شده، ترتیب امن (بررسی، بهروزرسانی، ارسال) رعایت شده و چهار محور امنیتی پروتکل با منبع ثبت شده است.
🔒 در هیچ تمرینی از سرمایهٔ واقعی، عبارت بازیابی (Seed Phrase)، کلید خصوصی یا اتصال کیف پول اصلی استفاده نکنید.
📝 آزمون تطبیقی
هر بار ۵ سؤال از بانک ۹ سؤالی این درس انتخاب میشود؛ سؤالهایی که قبلاً اشتباه زدهاید زودتر برمیگردند. حدنصاب قبولی ۸۰٪ (۴ از ۵) است و درس بعد با قبولی باز میشود.
✍️ پرسش تشریحی
شما مسئول امنیت یک پروتکل وامدهی تازه با هدف ۱۰۰ میلیون دلار سپرده هستید. یک برنامهٔ امنیتی چندلایه پیشنهاد کنید که هم کد قرارداد و هم لایههای بیرونی (کلیدها، رابط و اوراکل) را پوشش دهد.
بعد از نوشتن، پاسخ خود را با این معیارها بسنجید
خودارزیابی: هر نکتهای را که پاسخ شما بهروشنی پوشش داده علامت بزنید.
🤖 دستیار آموزشی
دستیار آفلاین آکادمی: پاسخها فقط از متن درسها و واژگان همین آکادمی پیدا میشوند و منبع هر پاسخ نشان داده میشود. هوش مصنوعی مولد نیست، حدس نمیزند و هیچ سیگنال خرید و فروشی نمیدهد.
📎 منابع مطالعاتی
- The Block — ده سال پس از هک The DAO
- Ethereum Foundation Blog — Hard fork completed (۲۰ ژوئیهٔ ۲۰۱۶)
- BleepingComputer — Lazarus hacked Bybit via breached Safe{Wallet} developer machine
🏁 معیار تسلط بر این درس: میتوانید آسیبپذیری بازورود را تشخیص دهید و با الگوی بررسیها-اثرها-تعاملها رفع کنید و امنیت یک پروتکل را فراتر از کد، در کلیدها، رابط و وابستگیها ارزیابی کنید.