آیا میدانستید که امضای تراکنش در متامسک (Metamask) هم میتواند منجر به خالی شدن کیف پول شما شود؟ در چند روز گذشته یکی از کاربران باتجربه Metamask تقریبا ۵۰۰ هزار USDC را به همین دلیل از دست داد. اگر موضوع امضای پیام در کیف پول متامسک را ساده بگیرید، ممکن است نفر بعدی شما باشید! اما چطور باید از سوء استفاده از تایید تراکنش در متامسک جلوگیری کرد؟ با میهن بلاکچین همراه باشید تا ضمن شرح داستان این کاربر قربانی، ببینیم چرا این اتفاق افتاده و راه حل آن چیست؟
چرا باید به امضای تراکنش در متامسک اهمیت دهیم؟
در یک بعد از ظهر آرام، کاربری به نام جو (Joe) متوجه شده که ۴۶۹ هزار توکن USDC از اکانت کیف پولمتامسک او خارج شده است. این یک انتقال ساده نبود و ظاهرا مهاجم به کیف پول جو دسترسی نداشت. یک قرارداد مخرب تمام توکنهای USDC را از آدرس او خالی کرده بود.
قبل از ادامه ماجرا، بد نیست برخی نکات فنی موضوع را بررسی کنیم. توکن USDC یک قرارداد هوشمند روی شبکه اتریوم است و توابع این قرارداد نحوه تعامل با USDC و کارکردهای مختلف آن را مشخص میکند. فعلا دو تابع این قرارداد موضوع بحث ما هستند:
- انتقال = (transfer <)
- انتقال از (transferFrom <)
تابع انتقال (transfer <)
وقتی کاربر توکن USDC یا سایر توکنهای مبتنی بر استاندارد ERC-20 را بین کیف پولها جابهجا میکند، در حقیقت با استفاده از تابع Transfer انتقال را انجام میدهد. این تابع توکنهای مورد نظر را از آدرس کاربری که تابع را صدا کرده است، به آدرس دیگری منتقل میکند. برای آنکه مهاجم بتواند به طور مخرب از تابع انتقال از جانب شما استفاده کند، باید کنترل کیف پول شما را در دست بگیرد.
تابع انتقال از (transferFrom <)
وقتی کاربر با قراردادهای هوشمند تعامل دارد، قرارداد از تابع TransferFrom برای جابهجایی توکن استفاده میکند. کانترکت میتواند مقداری را که شما در تابع تایید (Approve Function) مشخص کردهاید، بردارد؛ بنابراین اگر به قرارداد اجازه دهید که تعداد نامحدودی از USDC را خرج کند، قرارداد میتواند همه USDCها را بردارد.
توییت کاربری با نام Korpi
شما تایید میکنید که قرارداد به تعداد X توکن شما (مثلا USDC) دسترسی داشته باشد.
قرارداد تایید، میتواند تعداد X توکن USDC را در هر زمانی از کیف پول شما بردارد.
فرقی ندارد کیف پول شما سخت افزاری باشد یا نه.
تا زمانی که این تعداد توسط قرارداد خرج شود، تایید شما به قوت خود باقی است؛ مگر اینکه تایید را لغو کنید.
حالا به ادامه ماجرای جو برگردیم. در حقیقت آنچه که باعث خالی شدن کیف پول جو شد، تابع TransferFrom بود. اما این تابع تنها در صورتی عمل میکند، که جو قرارداد را برای خرج کردن توکنهای USDC تایید کرده باشد؛ اما جو مطمئن بود که چیزی را تایید نکرده است!
تاریخچه تراکنش جو در پلتفرم DeBank به وضوح نشان میدهد که جو ۱۰ دقیقه قبل از هک شدن، تعداد بینهایت را تایید کرده است (Infinite Approval). اما آیا واقعا خود جو آن را تایید کرده است؟ هم بله و هم خیر. در حقیقت او مستقیما این کار را نکرده است.
استفاده از تابع Permit و خالی شدن کیف پول
سایت اتراسکن (Etherscan) نشان میدهد که تایید نامحدود، توسط تابعی که جو صدا کرده، انجام نشده است؛ در واقع این تابع، یک تابع اجازه (Permit Function) بوده که توسط آدرس دیگری فراخوان شده و به قرارداد مخرب اجازه داده که همه توکنهای USDC جو را خرج کند. اما دیگران چطور میتوانند از طرف شما قراردادها را تایید کنند؟
تابع Permit با هدف بهبود تجربه کاربر در شبکه اتریوم معرفی شد. با استفاده از این تابع، کاربر میتواند مبالغ تابع تایید را بدون ارسال تراکنش اصلاح کند. در این مرحله فقط امضای کاربر کافی است. اگر کسی امضای شما را داشته باشد، میتواند تابع Permit را صدا کند و مقدار مشخص شده توسط شما را برای یک خرجکننده بهروزرسانی کند (میتواند حتی دسترسی بینهایت به توکنهای شما بدهد).
اگر از برنامه غیرمتمرکز وان اینچ (1Inch) استفاده میکنید، میتوانید تابع Permit را ببنید. در صورتی که میخواهید توکن USDC خود را بفروشید، نیازی به تایید نیست؛ فقط باید یک پیام را امضا کنید. این امضا به 1Inch اجازه میدهد همه USDCهای شما را خرج کند. قطعا وان اینچ این کار را نمیکند، اما یک قرارداد مخرب چرا!
احتمالا جو به طور تصادفی پیامی شبیه به تصویر بالا را در یک سایت مخرب امضا کرده است. متاسفانه او در یک کیف پول آنلاین (Hot Wallet) پیام ارسالی را امضا کرده و مقصر این اشتباه بزرگ فقط یک کلیک بوده است. از آنجایی که در کیفپولهای سخت افزاری امضا در یک دستگاه اکسترنال انجام میشود، فرصت کوتاهی برای یک تلنگر فکری و امضا وجود دارد. به هر حال بعد از امضای جو، یک هکر تراکنشی با تابع Permit را ارسال کرده است. این تابع به قرارداد مخرب اجازه میدهد تا تمام توکنهای USDC جو را خرج کند. سپس تابع Transfer From فراخوان شده است و تمام توکنها را از کیف پول جو خارج کرده است.
چگونه از سوءاستفاده از امضای دیجیتال جلوگیری کنیم؟
برای جلوگیری از سوء استفادههای احتمالی هنگام امضای تراکنش در کیف پول Metamask حتما با این نکات توجه کنید.
- هر پیامی را در متامسک امضا نکنید.
- حتما برای درک پیام ارسالی زمان بگذارید تا متن پیام را دقیقا بفهمید.
- مراقب تاییدیههای سنتی باشید.
جمعبندی
ظاهرا امضاهای دیجیتال میتوانند فاجعه درست کنند. کیف پول Metamask گاهی در مورد عواقب خطرناک امضای پیام به کاربران هشدار میدهد؛ اما برای تاییدیههای امضا شده که مطابق طراحیهای فنی متامسک هستند، هشداری صادر نمیشود. به هر حال تاییدیههای امضا شده در صورت استفاده نادرست خسارات سنگینی را به بار میآورند. بنابراین مراقب امضای تراکنش در متامسک