دانستن آسیب پذیری های قرارداد هوشمند و محافظت از خود در برابر خطرات ناشی از این آسیب پذیری ها، یکی از چالش های کلیدی بلاک چین است که در این مقاله به تفصیل به آن می پردازیم. قراردادهای هوشمند برنامههای رایانهای هستند که روی بلاک چین اجرا میشوند و میتوانند عملیات مالی و منطقی را بهطور خودکار و قابل اعتماد انجام دهند. این قراردادها طبق شرایط و ضوابط تعریف شده در آیین نامه خود عمل می کنند و نیازی به دخالت و میانجیگری انسانی ندارند. برخی از مزایایی که قراردادهای هوشمند برای کاربران خود به ارمغان می آورد شامل کاهش هزینه ها، افزایش سرعت، افزایش شفافیت و افزایش قابلیت اطمینان است.
با توجه به مزایای قراردادهای هوشمند، می توان گفت که این برنامه های کامپیوتری کاربردهای فراوان و گسترده ای در زمینه های مختلف دارند اما مانند هر فناوری دیگری، یکی از مهم ترین و دشوارترین مشکلات در حوزه بلاک چین و ارزهای دیجیتال است. امنیت قراردادهای هوشمند که به عنوان نوعی پروتکل رایانه ای برای ایجاد و اجرای توافقات بین طرف های مختلف بدون نیاز به واسطه استفاده می شود، همچنین می تواند دارای آسیب پذیری ها و نقص هایی باشد که می تواند منجر به سرقت، کلاهبرداری، سوء استفاده یا از دست دادن دارایی های دیجیتال شود.
بررسی تاریخچه قراردادهای هوشمند
قرارداد هوشمند یک پروتکل کامپیوتری است که شرایط قرارداد را تعریف و آنها را به طور خودکار اجرا می کند. این قراردادها قابل ردیابی نبوده و برگشت ناپذیر هستند و معمولاً روی بلاک چین های قابل برنامه ریزی مانند اتریوم نوشته می شوند. اصطلاح قرارداد هوشمند اولین بار در سال 1994 توسط نیک سابو استفاده شد و این قراردادها شامل کلیه اطلاعات مربوط به مفاد قرارداد بوده و به صورت خودکار کلیه اقدامات هدفمند را انجام می دهد.
البته، ایده اولیه قراردادهای هوشمند به قرن ها قبل برمی گردد، زمانی که مردم از کدهای رمزگذاری شده برای انجام تراکنش های تجاری استفاده می کردند اما این ایده در نهایت در سال 2015 با راه اندازی اتریوم محقق شد. در واقع، توسعه فناوری های جدید مانند بلاک چین، ایده قراردادهای هوشمند را به واقعیت تبدیل کرده است. بلاک چین یک فناوری توزیع شده است که اطلاعات را به صورت ایمن و تغییرناپذیر ذخیره می کند و آن را به یک فناوری ایده آل برای اجرای قراردادهای هوشمند تبدیل می کند.
قراردادهای هوشمند، در امور مالی برای تسهیل پرداخت ها، مدیریت دارایی ها و ارائه خدمات مالی، در کسب و کار، برای خودکارسازی فرآیندهایی مانند خرید و فروش محصولات و خدمات، اجرای فرآیندهای دولتی مانند رای دادن و پرداخت مالیات، در بخش مراقبت های بهداشتی، برای مدیریت سوابق پزشکی، ردیابی داروها و ارائه مراقبت های بهداشتی از راه دور و همچنین برای مدیریت شبکه های انرژی مانند خرید و فروش برق، استفاده می شود. این قراردادها پتانسیل ایجاد انقلاب در بسیاری از صنایع را دارند و می توانند کارها را کارآمدتر کنند، هزینه ها را کاهش دهند و شفافیت را بهبود بخشند. برخی از مزایای قراردادهای هوشمند عبارتند از:
اتوماسیون: قراردادهای هوشمند می توانند فرآیندهای دستی را به فرآیندهای خودکار تبدیل کنند و در زمان و هزینه صرفه جویی کنند.
شفافیت: قراردادهای هوشمند در یک دفتر کل توزیع شده ذخیره می شوند و قابل ردیابی هستند که باعث افزایش شفافیت و اعتماد می شود.
امنیت: قراردادهای هوشمند از فناوری های رمزنگاری برای ایمن سازی اطلاعات استفاده می کنند و به طور کلی در برابر دستکاری و تقلب مقاوم هستند.
قابلیت اطمینان: قراردادهای هوشمند توسط یک شبکه توزیع شده اجرا می شوند و در برابر شکست یک واحد مقاوم هستند.
البته قراردادهای هوشمند با محدودیتهای خاصی مانند پیچیدگی و دشواری توسعه، اشکالات یا ضعفها و همچنین تکامل مقررات آنها مواجه هستند.
انواع آسیب پذیری های قرارداد هوشمند
آسیبپذیری های قرارداد هوشمند، مسائل و نقصهایی هستند که باعث عملکرد ناخواسته، ناقص یا نادرست قراردادهای هوشمند میشوند. این آسیب پذیری ها می تواند به دلایل مختلفی ایجاد شود:
وجود خطا در کدها
وجود خطا در منطق کدها به عنوان یکی از آسیب پذیری های قرارداد هوشمند زمانی رخ می دهد که منطق کدهای قراردادهای هوشمند دارای اشکال، ابهامات، تناقض یا ناهماهنگی باشد. چنین خطایی ممکن است هنگام نوشتن، آزمایش یا ممیزی کد، قابل مشاهده نباشد اما ممکن است باعث عملکرد غیرمنتظره در هنگام اجرای قرارداد هوشمند شود. به عنوان مثال در سال 2016، یک قرارداد هوشمند به نام دائو که برای پشتیبانی از پروژه های بلاک چین نوشته شده بود، دارای یک خطای منطقی بود که به یک هکر اجازه داد تقریباً 50 میلیون دلار اتر(ETH) از شبکه اتریوم را سرقت کرده و به حساب خود انتقال دهد.
عدم هماهنگی با سیستم بلاک چین
عدم هماهنگی با سیستم بلاک چین، یکی از آسیب پذیری های قرارداد هوشمند است و زمانی اتفاق می افتد که قرارداد هوشمند با پروتکل بلاک چینی که روی آن اجرا می شود، سازگار نباشد. این ناسازگاری می تواند در طول تغییرات پروتکل بلاک چین یا هنگام تعامل با سایر بلاک چین ها ایجاد شود. به عنوان مثال، در سال 2017، یک قرارداد هوشمند برای کیف پول Parity Multisig که برای ذخیره و انتقال اتر استفاده می شد، اتر را به ارزش تقریبی 514 میلیون دلار مسدود کرد و به دلیل ناسازگاری با پروتکل اتریوم غیرقابل دسترسی ساخت.
در واقع، Parity Multisig Wallet یک کیف پول چندامضایی است که بر روی بلاک چین اتریوم ساخته شده است که مدیریت دارایی های چندامضایی را برای افزایش امنیت و جلوگیری از دسترسی غیرمجاز به دارایی ها قادر می سازد. پس از هک کیف پول Parity Multisig در سال 2017، نسخه جدیدی از کیف پول منتشر شد که از آسیب پذیری های قرارداد هوشمند نسخه قبلی محافظت می کند.
فراموش کردن تابع Selfdestruct
فراموش کردن تابع Selfdestruct یکی از آسیب پذیری های قرارداد هوشمند است و زمانی رخ می دهد که قرارداد هوشمند عملکرد خود تخریبی را نداشته باشد. تابع Selfdestruct به طور پیش فرض در زبان برنامه نویسی Solidity موجود است و به یک قرارداد هوشمند اجازه می دهد تا خود را حذف کرده و دارایی های خود را به یک آدرس دلخواه منتقل کند.
اگر قرارداد هوشمند ویژگی خود تخریبی را نداشته باشد، ممکن است در صورت بروز خطا یا ناسازگاری با پروتکل بلاک چین، مسدود شده و دارایی های خود را از دست بدهد. به عنوان مثال، در سال 2017، فقدان یک ویژگی خود تخریبی در یک قرارداد هوشمند به نام Rubixi که برای ایجاد یک طرح پرداخت هرمی راه اندازی شد، دسترسی به اتر ( (ETH) به ارزش تقریبی 40,000 دلار را مسدود کرد.
Rubixi بر توسعه پروتکل های مالی باز و غیرمتمرکز با تاکید بر امنیت و شفافیت تمرکز دارد و از یک سیستم چند امضایی برای افزایش امنیت استفاده می کند. علاوه بر این، از یک سیستم شفافیت استفاده میکند که به کاربران اجازه میدهد تمام تراکنشهای روی بلاک چین را ببینند.
استفاده نادرست از Delegatecall
استفاده نادرست از Delegatecall یکی دیگر از آسیب پذیری های قرارداد هوشمند است و زمانی رخ می دهد که قرارداد هوشمند از عملکرد Delegatecall به اشتباه یا بی دقت استفاده کند. در برنامه نویسی قرارداد هوشمند، تابع Delegatecall یک کد عملیاتی است که به یک قرارداد اجازه می دهد تا تابعی از قرارداد دیگر را فراخوانی کند. این بدان معناست که یک قرارداد می تواند کد را از قرارداد دیگر بدون فراخوانی مستقیم آن قرارداد اجرا کند.
این تابع به صورت پیش فرض در زبان برنامه نویسی Solidity موجود است. تابع Delegatecall ابزار قدرتمندی است که می تواند برای بهبود قابلیت همکاری و انعطاف پذیری قراردادهای هوشمند استفاده شود. با این حال، مهم است که از این عملکرد با احتیاط استفاده کنید زیرا ممکن است شما را در معرض آسیبپذیریهای امنیتی قرار دهد. اگر قرارداد هوشمند از عملکرد تماس نمایندگی به اشتباه یا بی دقت استفاده کند، ممکن است تغییرات ناخواسته ای را تجربه کند و امنیت دارایی های خود را به خطر بیندازد. به عنوان مثال، در سال 2017، استفاده نادرست از ویژگی Delegatecall در یک قرارداد هوشمند به نام Parity Multisig Wallet که برای ذخیره و انتقال اتر مورد استفاده قرار گرفت، به کاربر اجازه داد تا ویژگی خود تخریبی را فعال کند و دسترسی به اتر به ارزش تقریباً 150 میلیون دلار را از دست بدهد.
برای کسب اطلاعاتی در زمینه آموزش ارز دیجیتال، بر روی لینک کلیک کنید.
حملات اوراکل
حملات اوراکل، نوع دیگری از آسیبپذیریهای قرارداد هوشمند و نوعی حمله امنیتی است که در آن یک هکر از اوراکل برای دستکاری دادههای ورودی قرارداد استفاده میکند. برای دریافت داده هایی مانند قیمت ارزهای دیجیتال، قراردادهای هوشمند به منبع خارجی یا اوراکل نیاز دارند. این منبع خارجی ممکن است دچار خطا، تقلب، تاخیر یا حملات شود و داده های نادرست یا قدیمی را به قراردادهای هوشمند ارسال کند. به عنوان مثال، در سال 2019، حمله اوراکل به یک قرارداد هوشمند به نام Synthetix به کاربر این امکان را داد که تقریباً 37 میلیون دلار ارز مصنوعی را با قیمت کاذب خریداری کند.
سینتتیکس یک پروتکل غیرمتمرکز است که ایجاد و معامله دارایی های مصنوعی مانند ارزهای فیات، سهام و کالاها را امکان پذیر می کند. این دارایی های مصنوعی که Synth نام دارند با استفاده از یک سیستم وثیقه ایجاد می شوند. Synth ها بر روی شبکه اتریوم ساخته شده و با استفاده از قراردادهای هوشمند مدیریت می شوند. این داراییهای مصنوعی با هدف افزایش نقدینگی در بازارهای مالی، کاهش ریسکها و دسترسی به داراییهای جدید ایجاد میشوند.
حملات Underflow/Overflow
حملات Underflow/Overflow که یکی از آسیبپذیری های قرارداد هوشمند هستند، زمانی رخ میدهند که قرارداد هوشمند در حین انجام عملیات ریاضی با مقادیری خارج از محدوده متغیرهای خود مواجه شود. این موضوع می تواند باعث افزایش یا کاهش ناخواسته پول قرارداد هوشمند شود. به عنوان مثال، در سال 2018، یک قرارداد هوشمند به نام BEC Token که برای ارائه ارز دیجیتال در نظر گرفته شده بود، مورد حمله Underflow/Overflow قرار گرفت و یک هکر توانست تعداد نامحدودی توکن را به حساب خود منتقل کند.
حملات فرانت رانینگ
اجرای اولیه، هشتمین آسیبپذیری های قرارداد هوشمند در لیست ما، زمانی اتفاق میافتد که یک قرارداد هوشمند در تأیید تراکنش ها با تأخیر مواجه شود و در طول تراکنش های مالی، رفتار نامطلوب یا ناعادلانه ای داشته باشد. به عنوان مثال، در سال 2019، یک قرارداد هوشمند به نام Uniswap که قرار بود یک تبادل غیرمتمرکز را فراهم کند، مورد حمله فرانت رانینگ قرار گرفت و یک هکر توانست از اطلاعات داخلی (Prior Knowledge) و پیشسفارش ها (Pre Order) برای تنظیم استفاده و سود زیادی کسب کند.
حملات جانبی
حملات جانبی علیه آسیبپذیری های قرارداد هوشمند، حملاتی هستند که از آسیبپذیری ها در شبکه بلاک چین یا سایر سیستم ها برای آسیب رساندن به قراردادهای هوشمند استفاده میکنند. این حملات عبارتند از حملات DoS، برای از بین بردن شبکه بلاک چین و جلوگیری از دسترسی به قراردادهای هوشمند؛ حملات 51 درصد، کنترل بیش از 51 درصد از قدرت هش شبکه بلاک چین و تأیید تراکنش های نادرست یا اصلاح تاریخچه و حملات شبکه برای دسترسی غیرمجاز.
روش تامین امنیت قراردادهای هوشمند
آسیب پذیری هایی که در بالا ذکر شد برخی از رایج ترین آسیب پذیری های قرارداد هوشمند هستند و ممکن است موارد دیگری نیز وجود داشته باشند. در ادامه راهکارهای موجود و پیشنهادی برای بهبود امنیت قراردادهای هوشمند را ارائه خواهیم داد.
نقش توسعه دهندگان در کاهش خطرات آسیب پذیری قراردادهای هوشمند
توسعه دهندگان قراردادهای هوشمند نقش مهمی در کاهش خطرات ناشی از آسیب پذیری در این قراردادها دارند. توسعه دهندگان با رعایت چند نکته می توانند امنیت و کارایی قراردادهای هوشمند را افزایش دهند. برخی از این نکات عبارتند از:
از زبان های برنامه نویسی مناسب و تایید شده برای نوشتن قراردادهای هوشمند استفاده کنید. برخی از زبان های برنامه نویسی قراردادهای هوشمند مانند Solidity، Vyper و Scilla دارای ویژگی ها و قابلیت هایی هستند که به جلوگیری از خطاها و آسیب پذیری ها کمک می کند.
هنگام نوشتن کدها از الگوریتم ها و روش های منطقی برای جلوگیری از Underflow/Overflow استفاده کنید. به عنوان مثال، استفاده از عبارات شرطی، حلقه ها، توابع و استثناها برای کنترل جریان برنامه و جلوگیری از وارد شدن مقادیر خارج از محدوده.
از منابع خارجی یا اوراکل های معتبر و تایید شده برای دریافت داده های غیرقابل تکرار مانند قیمت ارزهای دیجیتال استفاده کنید یا از روش های مختلف برای تأیید صحت و به موقع بودن داده های دریافتی استفاده کنید. به عنوان مثال، استفاده از چندین منبع خارجی و مقایسه داده های آنها.
از روش های رمزگذاری و تحلیل ریاضی برای اطمینان از صحت داده ها و عملکردهای قرارداد هوشمند استفاده کنید. به عنوان مثال، با استفاده از یک تابع هش، یک تابع رمزگذار، یک تابع رمزگشایی و یک تابع امضا.
از قراردادهای هوشمند میانی و پیشگیرانه برای کاهش ریسک استفاده کنید. این قراردادهای هوشمند می توانند به عنوان لایه های حفاظتی بین قراردادهای هوشمند پایه و کاربران یا ارائه دهندگان خدمات عمل کنند.
بررسی و بازنگری کد قرارداد هوشمند توسط اشخاص ثالث، قبل از اجرا. این بررسی ها میتوانند مشکلات طراحی قرارداد، آسیبپذیری های امنیتی و خطاهای مربوط به کد را شناسایی کنند.
نقش کاربران در کاهش خطرات ناشی از آسیب پذیری های قرارداد هوشمند
کاربران، مانند توسعه دهندگان، می توانند نقش مهمی در کاهش خطرات قرارداد هوشمند داشته باشند. کافی است با رعایت چند نکته، امنیت و کارایی قراردادهای هوشمند را افزایش دهید. برخی از این نکات عبارتند از:
قبل از استفاده از کد قرارداد هوشمند آن را بررسی کنید. کاربران می توانند با استفاده از ابزارهای تحلیل کد، خطاها و آسیب پذیری های احتمالی را شناسایی و رفع کنند و همچنین با مطالعه دقیق کدها، شرایط و کارکردهای قرارداد هوشمند را به طور کامل درک کنند.
قبل از اعتماد به منابع خارجی، آنها را بررسی کنید. کاربران می توانند با استفاده از سرویس های تایید شده صحت و به موقع بودن داده های دریافتی از منابع خارجی را بررسی کرده و با مقایسه داده های دریافتی از منابع خارجی مختلف، تفاوت ها و تغییرات را شناسایی کنند.
مطالعه روش های رمزگذاری و تجزیه و تحلیل ریاضی قبل از استفاده از آنها. کاربران می توانند الگوریتم ها و روش های رمزنگاری و تجزیه و تحلیل ریاضی را با استفاده از منابع قابل اعتماد بیاموزند و عملکرد الگوریتم ها و روش ها را با استفاده از ابزارهای مختلف آزمایش و تأیید کنند.
استفاده از کیف پول سخت افزاری؛ کیف پولهای سختافزاری کلیدهای خصوصی را در دستگاههای سختافزاری امن ذخیره میکنند و از دسترسی غیرمجاز به داراییها محافظت میکنند.
استفاده از قراردادهای هوشمند معتبر؛ کاربران باید از قراردادهای هوشمند ایجاد شده توسط توسعه دهندگان معتبر و با تجربه استفاده کنند.