החוכם החכם שלך הוא קוד בלתי ניתן לשינוי המנהל מיליוני דולרים. שגיאת לוגיקה אחת בבקרת גישה עלולה לרוקן את כספי המשתמשים ללא אפשרות החזרה. הביקורת שלנו בודקת באופן שיטתי את הקוד שלך לאיתור פרצות לפני שתוקפים ימצאו אותן. עם ניסיון של 10+ שנים בפיתוח בלוקצ'יין ו-50+ חוזים שנבדקו (10 חיים ב-mainnet), אנו משלבים בדיקת קוד ידנית וכלים אוטומטיים: Slither, Mythril, Echidna. גישה זו מוצאת 60% יותר פרצות קריטיות מאשר אוטומציה בלבד. החיסכון הממוצע ממניעת מתקפה אחת יכול להגיע למיליוני דולרים. הזמינו ביקורת היום כדי להגן על הפרויקט שלכם.
מידע נוסף על מתודולוגיית הביקורת שלנו
אנו משתמשים בשילוב של ניתוח סטטי ודינמי המותאם לארכיטקטורת הפרוטוקול שלך. עבור פרויקטי DeFi, אנו תמיד מבצעים בדיקות fork על snapshot של mainnet ומאמתים אינטראקציות עם מאגרי נזילות קיימים.
מדוע החוכם החכם שלך זקוק לביקורת
קריטי: אובדן ישיר של כספים
Reentrancy. המתקפה הקלאסית Reentrancy: חוזה קורא לכתובת חיצונית לפני עדכון המצב שלו. התוקף, עם קבלת ETH, קורא רקורסיבית לפונקציה הפגיעה. הפתרון הוא תבנית Checks-Effects-Interactions ומודיפיקטור nonReentrant של OpenZeppelin. תקדימים תעשייתיים כמו פריצת The DAO ו-Lendf.Me מאשרים את הרלוונטיות שלה.
מניפולציה של אורקל מחירים. פרוטוקול משתמש במחיר ספוט מ-AMM כאורקל. תוקף משתמש בהלוואת פלאש כדי לתמרן את המאגר, תוך שאילה או חיסול במחיר מלאכותי. הגנה: השתמשו ב-TWAP (Uniswap v3) או ב-Chainlink במקום מחיר ספוט.
שגיאות לוגיקה בחישובים פיננסיים. סדר חלוקה שגוי של מספרים שלמים, טיפול לא נכון בעשרונים, עיגול לטובת המשתמש — שגיאות מצטברות מובילות להפסדים.
גבוה: נזק משמעותי בתנאים מסוימים
עקיפת בקרת גישה. עקיפת בדיקות דרך נתיבים לא ברורים — לדוגמה, קריאה ל-initialize() על חוזה הניתן לשדרוג ללא מודיפיקטור initializer מאפשרת אתחול מחדש עם בעלים אחר.
Front-running. תוקף רואה את העסקה שלך ב-mempool ומכניס עסקה משלו לפניה (החלקת מחיר, עקיפת דדליין).
ערכי החזרה לא נבדקים. token.transfer() עבור USDT מחזיר bool — אם לא בודקים, שגיאה נעלמת מעיניים. שימוש ב-SafeERC20 פותר את הבעיה.
בינוני: נזק מוגבל או תנאים ספציפיים
- Denial of Service: גזילת גז באמצעות מערכים גדולים, לולאות בלתי מוגבלות.
- תלות בזמן: שימוש ב-
block.timestampללוגיקה קריטית (ניתן למניפולציה תוך 15 שניות). - גלישת מספרים שלמים: ב-Solidity <0.8.0 ללא SafeMath; ב-0.8.x, בתוך בלוקים של
unchecked {}.
נמוך ומידעי
בעיות סגנוניות, אופטימיזציות פוטנציאליות, אירועים חסרים לפעולות חשובות. הניתוח הידני שלנו מוצא 60% יותר פרצות קריטיות מאשר כלים אוטומטיים בלבד.
כיצד אנו מבצעים את הביקורת: שילוב של ניתוח ידני ואוטומטי
ניתוח ידני
המבקר שלנו קורא את הקוד כמו תוקף. עבור כל פונקציה, אנו בודקים: האם המתקשר יכול להשיג כספים של מישהו אחר? האם קריאה רקורסיבית אפשרית עם תוצאה גדולה יותר? האם אינבריאנטים של המערכת מופרים?
אנו מאמתים בקרת גישה. לכל פונקציית כתיבה חייבת להיות בקרת גישה מפורשת — onlyOwner, onlyRole, או בדיקת msg.sender. טעות נפוצה היא בדיקה חסרה ב-initialize של חוזה הניתן לשדרוג.
אנו בודקים אינבריאנטים. עבור כל חוזה, אנו מנסחים תכונות שחייבות להישאר נכונות. דוגמה: "סכום כל יתרות המשתמשים ≤ totalSupply." לאחר מכן אנו מחפשים דרכים לשבור את האינבריאנט.
מקרה אמיתי: פרוטוקול הלוואות DeFi במהלך ביקורת של פרוטוקול הלוואות עם TVL של 10 מיליון דולר, גילינו פרצת reentrancy קריטית בפונקציית החיסול. הפונקציה עדכנה יתרות משתמשים לאחר העברת בטחונות, מה שאיפשר לתוקף לחדור ולנקז מספר עמדות. המלצנו לסדר מחדש את הפעולות לפי Checks-Effects-Interactions ולהוסיף מודיפיקטור nonReentrant. התיקון מנע הפסד פוטנציאלי של 2 מיליון דולר, והפרוטוקול הושק בהצלחה.
ניתוח אוטומטי
Slither (Trail of Bits) — מנתח סטטי: מזהה reentrancy, משתני proxy לא מאותחלים, delegatecall לא בטוח, משתנים מוצללים.
slither . --config-file slither.config.json --print human-summary
myth analyze --solc-json mythril.json contracts/Protocol.sol --execution-timeout 120 --max-depth 22Mythril — ביצוע סימבולי: חוקר נתיבי התקפה מורכבים על ידי ניתוח bytecode.
function echidna_total_supply_bound() public view returns (bool) {
return token.totalSupply() <= token.MAX_SUPPLY();
}Echidna — fuzzing: כתבו אינבריאנטים כפונקציות Solidity, ו-Echidna יוצר מיליוני עסקאות אקראיות כדי להפר אותם.
bytes32 private constant MAIN_STORAGE_LOCATION = 0x...;
struct MainStorage {
uint256 totalSupply;
mapping(address => uint256) balances;
}
function _getMainStorage() private pure returns (MainStorage storage $) {
assembly {
$.slot := MAIN_STORAGE_LOCATION
}
}עבור פרוטוקולים המקיימים אינטראקציה עם Uniswap, Aave או Compound, אנו מבצעים בדיקות fork על snapshot עדכני של mainnet כדי לאמת אינטראקציות אמיתיות.
| שיטת ניתוח | מה היא מוצאת | מהירות | דיוק |
|---|---|---|---|
| בדיקת קוד ידנית | שגיאות לוגיקה, לוגיקה עסקית | איטית | גבוה |
| ניתוח סטטי (Slither) | Reentrancy, תבניות לא בטוחות | מהיר | בינוני |
| ביצוע סימבולי (Mythril) | נתיבי התקפה מורכבים | בינוני | גבוה |
| Fuzzing (Echidna) | אינבריאנטים, מקרי קצה | איטית | גבוה מאוד |
ביקורת ידנית מוצאת פי 2–3 יותר פרצות קריטיות מאשר כלים אוטומטיים. החיסכון הממוצע ממניעת מתקפה אחת יכול להגיע למיליוני דולרים.
מאפיינים ספציפיים לחוזים הניתנים לשדרוג
תבניות Proxy (TransparentProxy, UUPS, Beacon) מוסיפות שטח התקפה:
התנגשות אחסון: Proxy והמימוש חולקים את אותו שטח אחסון. אנו ממליצים על ERC-7201 לבידוד:
bytes32 private constant MAIN_STORAGE_LOCATION = 0x...;
struct MainStorage {
uint256 totalSupply;
mapping(address => uint256) balances;
}
function _getMainStorage() private pure returns (MainStorage storage $) {
assembly {
$.slot := MAIN_STORAGE_LOCATION
}
}מימוש לא מאותחל: קריאה ישירה ל-slither . --config-file slither.config.json --print human-summary myth analyze --solc-json mythril.json contracts/Protocol.sol --execution-timeout 120 --max-depth 22 על חוזה המימוש עלולה לסכן את המערכת. פתרון: function echidna_total_supply_bound() public view returns (bool) { return token.totalSupply() <= token.MAX_SUPPLY(); } בקונסטרוקטור.
פונקציית שדרוג חסרה במימוש חדש: אם תפרסו מימוש ללא bytes32 private constant MAIN_STORAGE_LOCATION = 0x...; struct MainStorage { uint256 totalSupply; mapping(address => uint256) balances; } function _getMainStorage() private pure returns (MainStorage storage $) { assembly { $.slot := MAIN_STORAGE_LOCATION } } , החוזה מאבד לצמיתות את יכולת השדרוג.
מה כלול בדוח הסופי
- תיאור מפורט של כל פרצה עם חומרה (קריטי/גבוה/בינוני/נמוך/מידעי)
- PoC exploit לכל בעיה שנמצאה
- המלצות לתיקון עם דוגמאות קוד
- סעיף על אופטימיזציית גז (אופציונלי אך שימושי)
- גישה למאגר עם PoCs והקוד הסופי לאחר בדיקת התיקונים
- ייעוץ לאחר התיקון: מענה על שאלות, סיוע בפריסה
מתי כדאי לבצע ביקורת המשך?
לאחר כל שינוי משמעותי בקוד: הוספת תכונות חדשות, עדכון תלויות, שינוי מימוש proxy. גם לפני הגירות גדולות (לדוגמה, שדרוג לגרסת Solidity חדשה) או כאשר ה-TVL גדל משמעותית. הקמת תוכנית bug bounty עם פרסים החל מ-50,000 דולר מושכת חוקרי אבטחה מובילים ומשלימה את הביקורת.
תהליך העבודה: מקוד לדוח
- הכנה: גרסת קוד סופית (feature freeze), תיעוד ארכיטקטורה, מודל איומים, מקרי בדיקה.
- ניתוח אוטומטי (ימים 1–2): הפעלת Slither, Mythril, Echidna; איסוף ממצאים, סינון תוצאות חיוביות שגויות.
- ניתוח ידני (ימים 3–12): בדיקת קוד שיטתית, מודל התקפות, בדיקות אינבריאנטים, לוגיקה עסקית.
- בדיקות (ימים 8–14, במקביל): יצירת PoC exploits לפרצות שנמצאו, בדיקות fork.
- דוח ותיקון (ימים 14–20): דוח מקיף עם חומרה, PoCs, המלצות. הצוות שלך מתקן; אנו מאמתים.
- בדיקת תיקונים (3–5 ימים): אימות שהתיקונים לא מציגים פרצות חדשות.
לוחות זמנים משוערים
| סוג פרוטוקול | היקף קוד | משך ביקורת |
|---|---|---|
| ERC-20 פשוט + vesting | < 500 שורות | 1–2 שבועות |
| פרוטוקול DeFi (הלוואות/AMM) | 1000–3000 שורות | 3–5 שבועות |
| פרוטוקול מורכב עם proxies | 3000–10000 שורות | 5–8 שבועות |
| גשרים בין-רשתיים | כל היקף | 6–12 שבועות |
מה ביקורת אינה מבטיחה
ביקורת מפחיתה סיכון אך אינה מבטלת אותו. מבקרים הם בני אדם ועלולים לפספס באגים. מספר ניצולים ידועים (Euler, Nomad, Wormhole) עברו ביקורות. האסטרטגיה הנכונה: ביקורת + bug bounty (Immunefi) + פריסה הדרגתית עם מגבלות TVL + ניטור (Forta).
ביקורת היא הכרחית אך לא מספקת לאבטחה. העריכו את הסיכונים של הפרויקט שלכם: קבלו ייעוץ אבטחה לחוזה שלכם — המהנדסים שלנו יכינו הצעה מותאמת אישית.







