כאשר פרוטוקולי DeFi ממשיכים להתחמם בתוך המערכת האקולוגית של Ethereum, CipherTrace רואה יותר ויותר מעללים וקטורי תקיפה באים לאור. בשבוע האחרון, ב- 28 בדצמבר 2020, נוצל חוזה כריית המגן של פרוטוקול כיסוי, נפח. האקרים השתמשו בבאג בחוזה הכרייה כדי להטמיע כמות אינסופית של אסימונים של COVER ולנקז יותר מ -4.4 מיליון דולר מהפרויקט.
פרוטוקול כיסוי שוחרר אתמול לאחר המוות, וקבעו כי, לא ידוע ל- Devs, הבאג היה קיים מאז הפריסה הראשונית של חוזה הנפח, והדגיש את החשיבות של ביקורת אבטחה יסודית ופנטסינג של חוזים חכמיםמהם חוזים חכמים? חוזה חכם הוא מקצוען למחשבים ... עוד.
ציר זמן של מנטה אינסופי
ציר הזמן של התוקף הראשוני
- מאגר הנזילות של ניו איזון היה הוסיף לחוזה Blacksmith.sol.
- תוֹקֵף פיקדונות 1,326,879.99 אסימונים של BPT לחוזה Blacksmith.sol.
- אותו תוקף אז מבצע את הניצול, על ידי משיכת כספים מהחוזה.
- התוקף הצליח להמשיך הטבת תגמולים ומשיכת כספים בהיקף של כ -4.4 מיליון דולר.
במהלך אירועים מעניינים, "האקרים לבנים" כביכול, המקושרים ל- Grap Finance, ניצלו גם את הבאג כדי להטביע אסימונים של COVER בשווי של כ -4 מיליון דולר. בסופו של דבר החזיר Grap Finance את הכספים לפרוטוקול כיסוי.
ציר זמן של Grap Finance Deployer External Account (EOA)
- מאגר נזילות חדש היה מאושר לכריית נזילות.
- פריסת כספים של Grap EOA שהופקדו 15,255.55 BPT (DAI / Basis) לבריכה בכיסוי באמצעות חוזה Blacksmith.sol.
- כעבור כארבע דקות, הכספים היו כאלה נסוג בכריכה מותיר 1 ווי במאזן ה- EOA של פריסת האוצר.
- משתמש חיצוני נוסף נסוגה מרבית היתרה שלהם מחוזה Blacksmith.sol בערך באותה תקופה שהובילה את Grap Finance עם כל הנזילות לבריכת DAI / Basis בחוזה Blacksmith.sol.
- פריסת כספים של כספים שהופקדו חזרה 15,255.55 BPT (DAI / Basis) לבריכה.
- ואז Grap Finance Deployer טענות התגמולים ובגלל הניצול מטבעות 40,796,131,214,802,500,000.21 כיסוי.
- לאחר צריבה של האסימונים המוטבעים, Grap Finance Deployer שולח בחזרה אתר לכריכה "בפעם הבאה, דאג לחרא שלך."
כיצד מטבעים אסימונים אינסופיים - ניתוח טכני
רקע
ניצול זה מחזיר אותנו לבסיסי שפת התכנות Solidity, המשמשת ליישום חוזים חכמים בתוך Ethereum. לאחר שחוזים אלה נערכו, המחשב הווירטואלי של Ethereum (EVM) יוכל להבין את ההוראות (כלומר אופקודים) המשמשות לביצוע פונקציות שונות ולתפעל זיכרון ואחסון. ל- EVM שלושה אזורים שונים שבהם הוא יכול לאחסן נתונים: זיכרון, אחסון, והערימה. הבנת תחומים אלה חשובה להבנת האופן בו נוצל הבאג.
בדומה לזיכרון גישה אקראית (RAM) במכשיר מחשוב, "זיכרוןמילת המפתח בתוך סולידיטי מקצה זיכרון למשתנה ספציפי. במקרה זה, משתנה זה מוגדר לפונקציה מסוימת. הזיכרון מנוקה לאחר ביצוע הפונקציה, אך יכול להישאר אם תוכן הזיכרון יידחק לאחסון לפני שהפונקציה תחזור.
"אחסון"מילת המפתח בתוך Solidity מאפשרת למשתנים לשמש כמצביע לאחסון הנתונים במיפויים או במבני נתונים. נתוני האחסון נמשכים בין שיחות פונקציות לעסקאות. מתחת למכסה המנוע, אחסון הוא למעשה חנות עם ערך מפתח הממפה מילים של 256 סיביות למילים של 256 סיביות.
שים לב שה- EVM אינו מכונת רישום אלא מכונת מחסנית - ולכן כל החישובים מתבצעים באזור נתונים שנקרא הערימה. הערימה קיבולת מקסימלית של 1024 פריטים, אך רק את 16 הראשונים נגישים בקלות, בעזרתם ניתן להחליף את האלמנט העליון ביותר עם אחד מ -16 האלמנטים שמתחתיו ועוד.
הבאג
האקרים ניצלו את Blacksmith.sol של Cover Protocol - חוזה כריית מגן המאפשר לתגמל את הסטייקים באסימונים של הפרויקט או הבריכה הספציפיים, כמו אסימוני CLAIM ו- NOCLAIM, במסגרת פרוטוקול Cover.
כדי להבין טוב יותר את הבאג, ראשית, בואו נסתכל על הציבור ברכות משתנה שהוא מיפוי (כלומר אחסון נתונים):
At קו 118אנו רואים כי החוזה שומר את נתוני המאגר בזיכרון באמצעות מילת המפתח "זיכרון".
ואילך קו 121, החוזה מעדכן את הבריכה המאוחסנת כ- updatePool (כתובת _lpToken) פונקציה משתמש בריכת אחסון לבריכה משתנה
עם זאת, אם אתה מסתכל רחוק יותר למטה ב הפקדה (כתובת _lpToken, uint256 _amount) פונקציה, היא משתמשת באותה מידה בריכה משתנה מקו 118 שנשמר בזיכרון בתוך הפונקציה לחישובים עבור pool.accRewardsPerToken. בשלב זה, ה בריכה משתנה הועתק מה- ברכות מיפוי ונשמר בזיכרון.
כתוצאה מכך, כל שינוי שנעשה ב- בריכה משתנה בתוך הפקדה (כתובת _lpToken, uint256 _amount) הפונקציה לא תשנה את ברכות מיפוי באחסון הרשת של החוזה בשל העובדה שמשתנים המשתמשים במילת המפתח "זיכרון" נמצאים רק בפונקציה עצמה. משם, החוזה מעדכן את pool.accRewardsPerToken בתוך updatePool (כתובת _lpToken) פונקציה, המשתמשת באחסון. אז עכשיו, בתוך updatePool (כתובת _lpToken) לתפקד את pool.accRewardsPerToken המתעדכן גדל במידה ניכרת מכיוון שהוא מבחינה טכנית היה בריכה חדשה ולא קשורה ל בריכה לזכר.
בעקבות פגיעות זו ושימוש לרעה בין זיכרון לאחסון, כורה בתוך הפקדה (כתובת _lpToken, uint256 _amount) הפונקציה מחושבת בצורה שגויה וכן משתמשת בשגוי pool.accRewardsPerToken, כיוון שאנחנו עדיין נמצאים בפונקציית ההפקדה המטפלת במופע שמור בזיכרון בריכה.
בנוסף לפונקציית ההפקדה, כל אחד, כמו Grap Finance, יכול להשיג כמות מטורפת של אסימונים שהוטבעו כאשר הם מבצעים את claimRewards (כתובת _lpToken) פוּנקצִיָה. פונקציה זו, המשמשת לתפוס את תגמולם, בסופו של דבר מתקשרת _claimCoverRewards (מאגר זיכרון בריכה, כורה לזכר כורה) המתייחס ל כורה שהדגשנו לעיל. כיוון שמשתנה זה קטן בהרבה מהפועל pool.accRewardsPerToken, החוזה מביא לטביעת שפע של אסימונים.
המנות העיקריות
CipherTrace מקווה שרקע זה בבאג המנוצל יביא לאור את החשיבות של ביקורת אבטחה יסודית ופנטסינג של חוזים חכמים לפי blockchainבלוקצ'יין - הטכנולוגיה העומדת בבסיס הביטקוין ועוד ... עוד אחד בוחר לפרוס ל. בעוד ש- Grap Finance החזירו את הכספים שקיבלו באמצעות הנצל, ההאקר המקורי עדיין הצליח להרוויח מעל 4 מיליון דולר מפרוטוקול DeFi, ושווי ה- COVER צנח מאז בכמעט 99%.
מקור: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/