Skip to content
KitploitKITPLOIT
أدواتالمدونة
Log in
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

الخلاصاتاتصالالخصوصية© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
SoliditySecurity — أمان Solidity | Kitploit
أدوات/GitHubGitHub/al1ex/soliditysecurity
تحليل الثغرات الأمنيةتحليل الكودالتعلم والتعليمموارد منسقة
GitHubal1ex/soliditysecurity

SoliditySecurity

أمان Solidity

عرض المستودع
3512منذ 5 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

ما هذا؟

تهدف هذه التدوينة إلى أن تكون مقدمة شاملة وحديثة نسبيًا، وتفصّل الأخطاء السابقة التي ارتكبها مطورو Solidity في محاولة لمنع المطورين المستقبليين من تكرار التاريخ.

جدول المحتويات

1. إعادة الدخول

  • الثغرة
  • التقنيات الوقائية
  • مثال من العالم الحقيقي: DAO

2. الفيضان الحسابي الزائد/الناقص

  • الثغرة
  • التقنيات الوقائية
  • أمثلة من العالم الحقيقي: PoWHC وتجاوز سعة النقل المجمّع (CVE-2018-10299)

3. إيثر غير متوقع

  • الثغرة
  • التقنيات الوقائية
  • أمثلة من العالم الحقيقي: غير معروف

4. Delegatecall

  • الثغرة
  • التقنيات الوقائية
  • أمثلة من العالم الحقيقي: محفظة Parity متعددة التوقيع (الاختراق الثاني)

5. الرؤى الافتراضية

  • الثغرة
  • التقنيات الوقائية
  • مثال من العالم الحقيقي: محفظة Parity متعددة التوقيع (الاختراق الأول)

6. وهم الإنتروبيا

  • الثغرة
  • التقنيات الوقائية
  • مثال من العالم الحقيقي: عقود PRNG

7. الإشارة إلى العقود الخارجية

  • الثغرة
  • التقنيات الوقائية
  • مثال من العالم الحقيقي: مصيدة إعادة الدخول

8. هجوم العنوان/المعامل القصير

  • الثغرة
  • التقنيات الوقائية
  • مثال من العالم الحقيقي: غير معروف

9. قيم إرجاع CALL غير المفحوصة

  • الثغرة
  • التقنيات الوقائية
  • أمثلة من العالم الحقيقي: Etherpot وKing of the Ether

10. حالة السباق / الجري الأمامي

  • الثغرة
  • التقنيات الوقائية
  • أمثلة من العالم الحقيقي: ERC20 وBancor

11. حجب الخدمة (DOS)

  • الثغرة
  • التقنيات الوقائية
  • مثال من العالم الحقيقي: GovernMental

12. التلاعب بالطابع الزمني للكتلة

  • الثغرة
  • التقنيات الوقائية
  • مثال من العالم الحقيقي: GovernMental

13. المُنشئات بحذر

  • الثغرة
  • التقنيات الوقائية
  • مثال من العالم الحقيقي: Rubixi

14. مؤشرات التخزين غير المهيأة

  • الثغرة
  • التقنيات الوقائية
  • أمثلة من العالم الحقيقي: مصائد العسل: OpenAddressLottery وCryptoRoulette

15. النقاط العائمة والدقة العددية

  • الثغرة
  • التقنيات الوقائية
  • مثال من العالم الحقيقي: Ethstick

16. مصادقة tx.origin

  • الثغرة
  • التقنيات الوقائية
  • مثال من العالم الحقيقي: غير معروف

غرائب إيثيريوم

  • إيثيريوم بدون مفتاح
  • عناوين لمرة واحدة
  • إنزال جوي بمعاملة واحدة

قائمة بالاختراقات/الأخطاء المثيرة للاهتمام المتعلقة بالعملات المشفرة

المراجع / قائمة القراءة الإضافية

  • ويكي إيثيريوم - السلامة
  • توثيق Solidity - اعتبارات الأمان
  • Consensus - أفضل ممارسات العقود الذكية في إيثيريوم
  • تاريخ الثغرات الأمنية والاختراقات في إيثيريوم وإصلاحاتها
  • مشروع أمان التطبيقات اللامركزية (DASP) - أفضل 10 لعام 2018
  • مسح للهجمات على العقود الذكية في إيثيريوم
  • أمان العقود الذكية في إيثيريوم
  • الدروس المستفادة من مسابقة Underhanded Solidity

1. إعادة الدخول

من ميزات العقود الذكية في إيثيريوم القدرة على استدعاء واستخدام كود عقود خارجية أخرى. كما تتعامل العقود عادةً مع الإيثر، ولهذا غالبًا ما ترسل الإيثر إلى عناوين مستخدمين خارجية متنوعة. تتطلب عملية استدعاء العقود الخارجية، أو إرسال الإيثر إلى عنوان ما، أن يقدّم العقد استدعاءً خارجيًا. ويمكن للمهاجمين اختطاف هذه الاستدعاءات الخارجية، حيث يُجبرون العقد على تنفيذ كود إضافي (أي عبر دالة fallback)، بما في ذلك استدعاءات تعود إلى العقد نفسه. وبذلك يعيد الدخول تنفيذ الكود إلى العقد. استُخدمت هجمات من هذا النوع في اختراق DAO سيئ السمعة.

لمزيد من القراءة حول هجمات إعادة الدخول، انظر هجوم إعادة الدخول على العقود الذكية وConsensus - أفضل ممارسات العقود الذكية في إيثيريوم.

الثغرة

يمكن أن يحدث هذا الهجوم عندما يرسل عقد ما إيثرًا إلى عنوان غير معروف. يمكن للمهاجم بناء عقد بعناية على عنوان خارجي يحتوي على كود خبيث في دالة fallback. وبالتالي، عندما يرسل العقد إيثرًا إلى هذا العنوان، سيتم استدعاء الكود الخبيث. عادةً ما ينفّذ الكود الخبيث دالةً على العقد الضعيف، ويقوم بعمليات لا يتوقعها المطور. يأتي اسم "re-entrancy" من حقيقة أن العقد الخارجي الخبيث يستدعي دالة على العقد الضعيف ويعيد الدخول إلى تنفيذ الكود في موقع عشوائي على العقد الضعيف.

لتوضيح ذلك، فكّر في العقد الضعيف البسيط، الذي يعمل كخزنة إيثيريوم تسمح للمودعين بسحب إيثر واحد فقط في الأسبوع.

EtherStore.sol:```solidity contract EtherStore {

uint256 public withdrawalLimit = 1 ether;
mapping(address => uint256) public lastWithdrawTime;
mapping(address => uint256) public balances;

function depositFunds() public payable {
    balances[msg.sender] += msg.value;
}

function withdrawFunds (uint256 _weiToWithdraw) public {
    require(balances[msg.sender] >= _weiToWithdraw);
    // limit the withdrawal
    require(_weiToWithdraw <= withdrawalLimit);
    // limit the time allowed to withdraw
    require(now >= lastWithdrawTime[msg.sender] + 1 weeks);
    require(msg.sender.call.value(_weiToWithdraw)());
    balances[msg.sender] -= _weiToWithdraw;
    lastWithdrawTime[msg.sender] = now;
}

}

هذا العقد يحتوي على دالتين عامتين: `depositFunds()` و `withdrawFunds()`. الدالة `depositFunds()` ببساطة تزيد أرصدة المُرسِلين. أما الدالة `withdrawFunds()` فتتيح للمُرسِل تحديد مقدار الـ wei الذي يريد سحبه. ولن تنجح إلا إذا كان المبلغ المطلوب سحبه أقل من 1 إيثر ولم يحدث أي سحب خلال الأسبوع الماضي. أم أنها كذلك؟...

تكمن الثغرة في السطر \[17\] حيث نرسل إلى المستخدم المبلغ المطلوب من الإيثر. لنفترض أن مهاجمًا خبيثًا ينشئ العقد التالي،

Attack.sol:```solidity
import "EtherStore.sol";

contract Attack {
  EtherStore public etherStore;

  // initialise the etherStore variable with the contract address
  constructor(address _etherStoreAddress) {
      etherStore = EtherStore(_etherStoreAddress);
  }

  function pwnEtherStore() public payable {
      // attack to the nearest ether
      require(msg.value >= 1 ether);
      // send eth to the depositFunds() function
      etherStore.depositFunds.value(1 ether)();
      // start the magic
      etherStore.withdrawFunds(1 ether);
  }

  function collectEther() public {
      msg.sender.transfer(this.balance);
  }
تنزيل الأداة