جستجو برای:
سبد خرید 0
  • آخرین دوره های آموزشی
  • درخواست پروژه
  • مقالات بلاکچین
  • تماس با ما

ورود

گذرواژه خود را فراموش کرده اید؟

ثبت نام

داده های شخصی شما برای پشتیبانی از تجربه شما در این وب سایت، برای مدیریت دسترسی به حساب کاربری شما و برای اهداف دیگری که در سیاست حفظ حریم خصوصی ما شرح داده می شود مورد استفاده قرار می گیرد.

  • 09395149363
  • info@fara-zaman.ir
  • لیست علاقه مندی ها
0
فرازمان | آکادمی بلاکچین
  • آخرین دوره های آموزشیداغ
  • درخواست پروژه
  • مقالات بلاکچینجدید
  • تماس با ما
آخرین اطلاعیه ها
جهت نمایش اطلاعیه باید وارد سایت شوید
شروع کنید

وبلاگ

فرازمان | آکادمی بلاکچیناخبارقرارداد هوشمندبه خطر افتادن امنیت‌ قرارداد هوشمند با reentrancy attack

به خطر افتادن امنیت‌ قرارداد هوشمند با reentrancy attack

22 فروردین 1401
ارسال شده توسط مریم طاهری
قرارداد هوشمند
Reentrancy Attack

reentrancy attack یکی از مخرب ترین حملات در قرارداد هوشمند Solidity است. حمله ورود مجدد یا reentrancy attack زمانی اتفاق می‌افتد که یک تابع یک تماس خارجی با قرارداد غیرقابل اعتماد دیگری برقرار می‌کند. سپس قرارداد نامطمئن در تلاش برای تخلیه وجوه، یک فراخوان بازگشتی به تابع اصلی ایجاد می کند. 

زمانی که قرارداد نتواند وضعیت خود را قبل از ارسال وجوه به روز کند، مهاجم می تواند به طور مداوم تابع برداشت را برای تخلیه وجوه قرارداد فراخوانی کند. یک حمله Reentrancy معروف در دنیای واقعی، حمله DAO است که باعث ضرر 60 میلیون دلاری آمریکا شد.

آیا reentrance attack همچنان یک مشکل مهم است؟

اگرچه حمله به ورود مجدد در دو سال گذشته بسیار قدیمی در نظر گرفته شده است، مواردی مانند موارد زیر وجود داشته است:

هک های Uniswap/Lendf.Me (آوریل 2020) – 25 میلیون دلار، مورد حمله یک هکر با استفاده از ورود مجدد.

هک BurgerSwap (مه 2021) – 7.2 میلیون دلار به دلیل یک قرارداد توکن جعلی و سوء استفاده از ورود مجدد.

هک SURGEBNB (اوت 2021) – به نظر می رسد 4 میلیون دلار یک حمله دستکاری قیمت مبتنی بر ورود مجدد باشد.

هک CREAM FINANCE (اوت 2021) – 18.8 میلیون دلار، آسیب پذیری ورود مجدد به بهره بردار اجازه وام دوم را داد.

هک پروتکل Siren (سپتامبر 2021) – 3.5 میلیون دلار، استخرهای AMM از طریق حمله به ورود مجدد مورد سوء استفاده قرار گرفتند.

Reentrancy Attack چگونه کار می کند؟

Reentrancy Attack شامل دو قرارداد هوشمند است. یک قرارداد آسیب پذیر و یک قرارداد مهاجم غیرقابل اعتماد.

Reentrancy Attack

سناریوی Reentrancy Attack

 قرارداد هوشمند آسیب پذیر دارای 10 eth است.

یک مهاجم با استفاده از تابع سپرده، 1 eth را ذخیره می کند.

یک مهاجم تابع برداشت را فراخوانی می کند و به یک قرارداد مخرب به عنوان گیرنده اشاره می کند.

اکنون تابع برداشت بررسی می کند که آیا می توان آن را اجرا کرد:

آیا مهاجم 1 ثانویه در تعادل خود دارد؟

بله – به دلیل سپرده آنها.

انتقال 1 eth به یک قرارداد مخرب.

(توجه: موجودی مهاجم هنوز به روز نشده است)

 تابع بازگشتی در تماس های دریافتی مجدداً عملکرد را لغو می کند.

1. اکنون تابع برداشت بررسی می کند که آیا می توان آن را اجرا کرد:

آیا مهاجم 1 ثانویه در تعادل خود دارد؟بله – زیرا موجودی به روز نشده است.

انتقال 1 eth به یک قرارداد مخرب.

و دوباره تا زمانی که مهاجم تمام وجوه ذخیره شده در قرارداد را تخلیه کند.

 در زیر قرارداد وجود دارد که حاوی آسیب‌پذیری مجدد است.

}contract DepositFunds 

   ;mapping(address => uint) public balances

   } function deposit() public payable

       ; balances[msg.sender] += msg.value

   {

    }function withdraw() public

      ;  uint bal = balances[msg.sender]

      ;  require(bal > 0)

        ;(bool sent, ) = msg.sender.call{value: bal}(“”)

        ;require(sent, “Failed to send Ether”)

     ;   balances[msg.sender] = 0

    {

{

این آسیب‌پذیری زمانی ایجاد می‌شود که مقدار اتر درخواستی کاربر را ارسال می‌کنیم.در این حالت، مهاجم تابع ()retract را فراخوانی می کند. از آنجایی که موجودی او هنوز روی 0 تنظیم نشده است، او می تواند توکن ها را منتقل کند، حتی اگر قبلا توکن ها را دریافت کرده باشد.

حال، بیایید یک مهاجم بدخواه را در نظر بگیریم که قرارداد زیر را ایجاد کرده است.

}contract Attack 

   ; DepositFunds public depositFunds

   } constructor(address _depositFundsAddress)

      ;  depositFunds = DepositFunds(_depositFundsAddress)

    {

    // .Fallback is called when DepositFunds sends Ether to this contract

   }  fallback() external payable

        } if (address(depositFunds).balance >= 1 ether) 

          ; ()depositFunds.withdraw

        {

    {

   } function attack() external payable

     ;   require(msg.value >= 1 ether)

     ;  () depositFunds.deposit{value: 1 ether}

     ;  () depositFunds.withdraw

{

{

تابع حمله تابع برداشت در قرارداد قربانی را فراخوانی می کند. هنگامی که نشانه دریافت می شود، تابع بازگشتی تابع برداشت را فراخوانی می کند. از آنجایی که چک تایید می‌شود، قرارداد توکن را برای مهاجم ارسال می‌کند که تابع بازگشتی را فعال می‌کند.

چگونه از قرارداد هوشمند در برابر حمله مجدد محافظت کنیم؟

اطمینان حاصل کنید که همه تغییرات حالت قبل از فراخوانی قراردادهای خارجی رخ می دهد، به عنوان مثال، قبل از فراخوانی کد خارجی، موجودی یا کد را به صورت داخلی به روز کنید.

از اصلاح کننده های عملکردی استفاده کنید که از ورود مجدد جلوگیری می کند.

اصلاح کننده برای جلوگیری از حمله مجدد ورود

  } contract ReEntrancyGuard

 ;   bool internal locked

   } () modifier noReentrant 

      ;  require(!locked, “No re-entrancy”)

         ;locked = true

        ;_

       ; locked = false

    {

{

دوره ها و آموزش های فرازمان

در صورتی‌ که تجربه خاصی در خصوص برنامه‌نویسی ندارید می‌توانید از دوره‌های رایگان سایت ما “فرازمان“، استفاده کنید. همچنین اگر به دوره‌های پیشرفته‌تری در این خصوص نیاز داشته باشید، ما با آموزش های حرفه ای که در سایتمان قرار دادیم می توانید به سطح دلخواهتان با تلاش و پشتکار برسید.

نقشه راه

راهنما آکادمی فرازمان

برای یادگیری برنامه نویسی بلاکچین…

دوره مفاهیم پایه برنامه نویسی
دوره جامع جاوا اسکریپت و جی کوئری
آموزش برنامه نویسی سالیدیتی
دوره جامع html/css/bootstap
آموزش پیشرفته برنامه نویسی بلاکچین
آموزش Whitepaper نویسی برای پروژه های بلاکچینی

در این باره بیشتر بخوانید

proof of work یا الگوریتم اثبات کار در بلاکچین چیست؟

ماینینگ یا استخراج ارز دیجیتال چیست؟

لیکوئیدیتی (Liquidity) چیست و چه کاربردی دارد؟

DAO چیست؟

ایردراپ کریپتو چیست؟

برچسب ها: Reentrancy AttackHack Solidityامنیت قرارداد هوشمندهک سالیدیتی
جدیدتر proof of work یا الگوریتم اثبات کار در بلاکچین چیست؟
قبلی نود (node) در بلاکچین چیست و چه کاربردی دارد؟

دیدگاهتان را بنویسید لغو پاسخ

جستجو برای:
برچسب‌ها
function nft آموزش برنامه نویسی سالیدیتی آموزش بلاکچین آموزش سالیدیتی اتریوم اخبار بازی اخبار رمز ارز اخبار کریپتو امنیت قرارداد هوشمند ان اف تی اکتیویژن ایلان ماسک بازی بلاکچین برنامه نویسی بلاک چین برنامه نویسی سالیدیتی بلاک چین بیتکوین بیت کوین تحلیل بیت کوین تسلا توابع توابع در سالیدیتی جاوا اسکریپت حسابرسی در قرارداد هوشمند خبر بلاکچین دسنترالند دوج کوین رمزارز سالیدیتی سرمایه گذاری سندباکس قرارداد هوشمند مایکروسافت متاورس مقاله بلاکچین مقاله کریپتویی موزیلا نمونه قرارداد هوشمند سالیدیتی وب3 پی پال کریپتو کسب درامد کیف پول اتریوم کیف پول بلاکچین
  • محبوب
  • جدید
  • دیدگاه ها
دسته‌ها
  • آموزش برنامه نویسی سالیدیتی
  • اتریوم
  • اخبار NFT
  • اخبار متاورس
  • امور مالی غیرمتمرکز
  • برنامه نویسی سالیدیتی
  • بیت کوین
  • سولانا
  • صرافی غیرمتمرکز
  • قرارداد هوشمند
  • کریپتو
  • کیف پول ارز دیجیتال
  • مقالات بلاکچین
  • مقاله
  • نمونه قراردادهای هوشمند سالیدیتی
 فـرا زمان با بهره گیری از دانش روز دنیا و توانایی در آموزش، مشاوره و پیاده سازی انواع پروژه های بلاکچینی پا به عرصه ی رقابت گذاشته و هر روز به گروه و تخصص خود می افزاید.
دسترسی سریع
  • خانه
  • دوره ها
  • اخبار
  • تماس با ما
  • ساری، ابتدای خیابان 15 خرداد،مجتمع بهار،طبقه اول
  • 09395149363
  • info@fara-zaman.ir
خبرنامه

چیزی را از دست ندهید، ثبت نام کنید و در مورد شرکت ما مطلع باشید.

نماد ها

logo-samandehi
© 1400. آکادمی فرازمان - طراحی فرازمان
اشتراک گذاری در شبکه های اجتماعی
ارسال به ایمیل
https://fara-zaman.ir/?p=9638
دسته بندی دوره ها
دوره های من
دسته بندی دوره ها

طراحی وب

  • 1 دوره

WhitePaper

  • 1 محصول

برنامه نویسی اتریوم (سالیدیتی)

  • 4 محصول

کلاس مجازی

  • 1 دوره
دوره های من
برای مشاهده خریدهای خود باید وارد حساب کاربری خود شوید
Twitter Youtube Instagram
مرورگر شما از HTML5 پشتیبانی نمی کند.

سوالی دارید؟ از ما بپرسید، کارشناسان ما در اسرع وقت با شما تماس می گیرند.

گروه تخصصی برنامه نویسی
  • 09395149363
  • پشتیبانی آنلاین
  • 09395149363