Delegatecall to Untrusted Callee چیست؟

Delegatecall to Untrusted Callee چیست؟
Delegatecall یک نوع ویژه از فراخوانی پیام است. این دستور تقریباً مشابه با فراخوانی پیام عادی است، به جز اینکه آدرس مقصد در زمینه (context) قرارداد فراخوانیکننده اجرا میشود و msg.sender و msg.value همانند قبل باقی میمانند. در اصل، delegatecall به قراردادهای دیگر این امکان را میدهد که ذخیرهسازی قرارداد فراخوانیکننده را تغییر دهند.
از آنجا که delegatecall کنترل زیادی بر روی یک قرارداد میدهد، بسیار مهم است که تنها از آن با قراردادهای مورد اعتماد مانند قراردادهای خودتان استفاده کنید. اگر آدرس مقصد از ورودی کاربر دریافت میشود، حتماً باید بررسی کنید که آن قرارداد مورد اعتماد باشد.
آسیبپذیریهای ناشی از استفاده از Delegatecall:
-
تصادم متغیرهای وضعیت State Variable Collisions: رایجترین آسیبپذیری ناشی از تصادم متغیرهای وضعیت است. از آنجا که
Delegatecall
کد قرارداد مقصد را در بستر قرارداد فراخوانیکننده اجرا میکند، هرگونه دستکاری در متغیرهای وضعیت توسط قرارداد مقصد بر وضعیت قرارداد فراخوانیکننده تأثیر میگذارد. اگر ساختار متغیرهای وضعیت در قرارداد مقصد دقیقاً با قرارداد فراخوانیکننده مطابقت نداشته باشد، ممکن است تغییرات غیرمطلوبی در وضعیت قرارداد فراخوانیکننده ایجاد شود که منجر به رفتار غیرقابل پیشبینی یا بهرهبرداری از آسیبپذیریها گردد. -
اعطای غیرمجاز اختیارات Unintended Authority Granting: کنترل اجرای قرارداد را
Delegatecall
به قرارداد مقصد منتقل میکند که ممکن است به موقعیتهایی منجر شود که قرارداد مقصد به طور غیرمنتظرهای توانایی انجام عملیات حساس به نمایندگی از قرارداد فراخوانیکننده را بدست آورد، مانند انتقال توکنها، تغییر مالکیت یا تغییر دسترسیها. -
خطاهای منطقی و حملات Logic Errors and Attacks: انعطافپذیری
Delegatecall
ممکن است به طور ناخواسته خطاهای منطقی را وارد کند یا قرارداد را در معرض حملات بازگشتی (reentrancy) قرار دهد اگر به درستی مدیریت نشود، به ویژه زمانی که با قراردادهای غیرمعتبر تعامل میکند.
Delegatecall to Untrusted Callee چه تاثیری دارد؟
تابع delegatecall برای فراخوانی توابع از قراردادهای دیگر به گونهای استفاده میشود که گویی متعلق به قرارداد فراخواننده هستند. بنابراین، استفاده از() delegatecall یا () call به یک قرارداد غیرمطمین، همراه با آدرس و فیلد دادهای مخرب در تابع () call در قرارداد منطق، به مهاجم اجازه میدهد تا به عنوان قرارداد پروکسی عمل کند.
چه اقدامی باید انجام شود؟
از delegatecall با احتیاط استفاده کنید و مطمئن شوید که هرگز به قراردادهای غیرمطمئن فراخوانی نکنید. اگر آدرس هدف از ورودی کاربر استخراج میشود، اطمینان حاصل کنید که آن را با فهرست سفید قراردادهای قابل اعتماد بررسی کنید.