תקיפת Reentrancy (חוזים חכמים)

אם יצא לך לשמוע או לעבוד עם מטבעות דיגיטליים כמו ביטקוין, אתריום או אחרים, אז ככל הנראה בלוקציין היה חלק מאותו שיח ואף אולי חוזים חכמים. בבלוקציין, כל עסקת מטבע דיגיטלי נרשמת בלדגר (מעין פנקס ציבורי) ובעסקאות כאלה נכנסות לתמונה חוזים חכמים, כמנגנון השולט בצורה המבוזרת והחדשנית של העברות ברמת המטבע.

חוזה חכם (Smart Contract) הוא פרוטוקול המיועד לאפשר, לאמת ולאכוף באופן דיגיטלי את ביצוע החוזה. חוזה חכם הוא סט פקודות והתניות, ולכן כתוב בשפות תוכנה מגוונות ומתבסס על גבי טכנולוגיית בלוקציין. החוזים החכמים מאפשרים לנו להעביר כספים, מניות וכל סוג נכס, או ערך בצורה שקופה ומבוזרת, ללא צד שלישי וללא מתווך, ולבצע עסקאות אמינות, ניתנות למעקב ובלתי הפיכות.

חוזה חכם עובד בצורה אוטומטית בהתאם לתנאים והמגבלות שהוגדרו בפרוטוקול הספציפי שלו, וכאשר תנאי העסקה מתקיים, למשל, תאריך מסוים או מחיר קבוע מראש, החוזה יוצא לפועל באופן מידי ואוטומטי. בנוסף, ישנו מנגנון מותנה (אם ואז) שאינו דורש מעורבות חיצונית. שני הצדדים בחוזה נשארים אנונימיים, אולם החוזה עצמו יושב על הרשת הציבורית של בלוקציין והוא שקוף לחלוטין. למעשה, כל אחד יכול לבדוק את החוזה ולקבל עליו את כל המידע הקיים. החוזים החכמים כתובים בשפת קוד, למשל, Solidity ועל כן נדרש ידע טכני לקריאת החוזה בפועל, ויחד עם זאת המידע נגיש לכל.

החוזים החכמים מאפשרים להפחית את עלויות העסקה השונות הכרוכות בהתקשרות בין הצדדים כמו עמלות בנקאיות, וכן לספק אבטחה גבוהה בהרבה מזו שמציע החוק לחוזים המסורתיים. כאנשי אבטחה, שאנו מדברים על בלוקציין, מטבעות וחוזים חכמים מעניין אותנו להבין איך המערכת בנויה, או איך מתבצע העברות בין שני צדדים ואינספור שאלות שגם מעלות תהיות רבות לאופן שבו הבלוקציין עובד ויתרה מכך, פערי האבטחה העצומים הקיימים בו.

היכן אפשר להשתמש בחוזים חכמים? היקף החוזים החכמים רחב כמו היקף הבלוקציין עצמו, ולכן הוא ממש עצום. הדוגמה הברורה ביותר עשויה להתייחס למטבעות דיגיטליים, אך חוזים חכמים יכולים לשמש אפילו למכירת מוצרים פיזיים, כאשר העסקה מועברת באמצעות מטבע דיגיטלי.

דוגמה פשוטה לחוזה חכם פיזי יכולה להיות מכירת רכב. נניח שאני רוצה לקנות מכונית חדשה מהיצרן, אז אוכל לעשות הסכם באמצעות ביטקוין וחוזה חכם. למשל, החוזה החכם הוא בין אלי ליצרן, וכתוב בו 'כאשר אלי ישלם ליצרן 50 ביטקוין, היצרן יעביר את הבעלות על המכונית לאלי', ולכן, החל מרגע שההסכם קיים, הוא קבוע ולא ניתן לשנותו. אלי יכול לשלם ליצרן בבטחה את מחיר המוסכם ללא בעיות אמון. אין צורך בצד שלישי, כמו, בנקים, ברוקרים או יועצים משפטיים. לא משלמים עמלות, אין עיכובים וכתוצאה מכך אין בעיות ניהול של צד שלישי. לאחר שהתנאי של החוזה מתקיים – למשל, ביצוע תשלום יזום, החוזה מבוצע באופן אוטומטי.

כבר עכשיו, חוזים חכמים משמשים למכירות ביטוח, פיננסיים, תהליכים משפטיים, אישור אשראי, הסדרי מימון המונים וניהול שרשרת אספקה. בנוסף לכך, עסקים יכולים לנהל את השכר שלהם באמצעות חוזים חכמים של בלוקציין וממשלות יכולות לנהל את תהליכי ההצבעה בצורה הוגנת ומדויקת. אלה הן רק חלק מאינספור הדוגמאות המראות את ההיקף והיישום העצומים של חוזים חכמים.

כיצד יוזמים חוזים חכמים? ניתן לבנות חוזים חכמים במגוון פלטפורמות בלוקציין, כגון NEO או Ethereum, והם מפותחים בשפת הקידוד של הפלטפורמה. זו רק סיבה אחת לכך שהביקוש למקודדים עולה כאשר העולם ננעל על הפוטנציאל העצום של מטבעות דיגיטליים, בלוקציין וחוזים חכמים.

חוזים ואבטחה

לעתים קרובות אנו שומעים על מתקפות גדולות שבוצעו נגד פרויקטים שלא הצליחו לקבל ביקורת על חוזים חכמים. כמו כל אירוע אבטחה אחר: כותרות חזקות עם מספרים עצומים, פרויקט שבעבר היה מבטיח ועכשיו נדחק להיסטוריה, הנרטיבים הרגילים של 'המערב הפרוע' בעולם הקריפטו ועוד. יחד עם זאת, ישנו דיון טכני כללי וצדדי לגבי מה השתבש, וכיצד ניתן למנוע זאת בעתיד.

כטכנולוגיה חדשה וצומחת במהירות, פגיעויות הן כמובן בלתי נמנעות, ובאופן פרדוקסלי הן גם חיוניות לאבטחת בלוקציין מוגברת כאשר הן דוחפות פרויקטים להבין חולשות פוטנציאליות ולהימנע מהתקפה עתידית, הן באמצעות הכנה טובה יותר, והן באמצעות אמצעי אבטחה כמו ביקורת על חוזים חכמים של צד שלישי.

אבטחת מידע בחוזים חכמים זה בערך כמו…

17b8e eselschreck

תקיפת Reentrancy

תקיפת Reentrancy (כניסה חוזרת) היא אחת ההתקפות ההרסניות ביותר בחוזה החכם של Solidity. התקפת כניסה חוזרת מתרחשת כאשר פונקציה מבצעת קריאה חיצונית לחוזה אחר שאינו מהימן. לאחר מכן החוזה הלא מהימן מבצע קריאה רקורסיבית חזרה לפונקציה המקורית בניסיון לרוקן כספים.

כאשר החוזה אינו מצליח לעדכן את מצבו לפני שליחת הכספים, התוקף יכול להתקשר באופן רציף לפונקציית הנסיגה כדי לרוקן את כספי החוזה. מתקפת כניסה חוזרת יודעה היא מתקפת DAO שגרמה להפסדים של מיליוני דולרים.

במילים פשוטות, מתקפת כניסה חוזרת מתרחשת בין שני חוזים חכמים, שבהם חוזה חכם תוקף מנצל את הקוד בחוזה פגיע כדי לרוקן אותו מהנכסים והכספים הקיימים בו. הניצול בתקיפה זאת עובד על ידי כך שהחוזה החכם התוקף קורא שוב ושוב לפונקציה לפני שהחוזה החכם הפגיע הספיק לעדכן את היתרה.

זה אפשרי רק בגלל הסדר שבו החוזה החכם מוגדר לטיפול בעסקאות, כאשר החוזה החכם הפגיע בודק תחילה את היתרה, אחר כך שולח את הכספים, ולבסוף מעדכן את היתרה שלו. הזמן שבין שליחת הכספים לעדכון היתרה יוצר חלון שבו החוזה החכם התוקף יכול לבצע קריאה נוספת למשיכת הכספים שלו, וכך המחזור נמשך עד שכל הכספים מתרוקנים.

אומנם זה נראה פשוט, ובכל זאת ההיקף והעלות של התקפות Reentrancy כאלה צריכים להיות תזכורת לכך שאי אפשרת להיות בטוח כשמדובר בקוד, ושביקורת חוזים חכמים של צד שלישי צריכה להיות מצרך בסיסי בכל פרויקט רציני לגבי אבטחת חוזה חכם.

תרחיש Reentrancy

בואו נקרא לחוזה הפגיע – חוזה א, ולחוזה התוקף – חוזה ב.

תוקף עושה קריאה על חוזה א של העברת כספים לחוזה ב, חוזה א' בודק תחילה כדי לראות שלתוקף יש את הכספים, ואז הוא מעביר את הכספים לחוזה ב'. עם קבלת הכספים, חוזה ב' מבצע פונקציית נסיגה אשר חוזרת לחוזה א' לפני שהוא מסוגל לעדכן את יתרתו, ובכך להפעיל מחדש את התהליך.

7e612 contract a contract b

פונקציית ההתקפה קוראת לפונקציית הנסיגה בחוזה של הקורבן. כאשר בטוקן מתקבל, פונקציית החזרה קוראת בחזרה לפונקציית הנסיגה. מכיוון שהבדיקה מועברת החוזה שולח את הטוקן לתוקף, מה שמפעיל את פונקציית החזרה. מסקנה, הפגיעות מגיעה למקום שבו אנו שולחים למשתמש את כמות המבוקשת שלו. במקרה זה, התוקף קורא לפונקציית נסיגה (). מכיוון שהיתרה שלו עדיין לא נקבעה, הוא מסוגל להעביר את הטוקנים למרות שהוא כבר קיבל אותם.

הערה: פונקציית נסיגה – במתמטיקה, נוסחת נסיגה היא נוסחה שמגדירה סדרת איברים באופן רקורסיבי.

מקרה DAO

אולי האירוע המוכר ביותר של מתקפת Reentrancy התרחש בשנת 2016, כאשר DAO (ארגון אוטונומי מבוזר) של אתריום נפרץ תמורת סכום שווה ערך של 60 מיליון דולר באתר. באופן כללי, DAO של אתריום היה פרויקט שנועד לפעול כקרן הון סיכון מוכוונת משקיעים שבה חברים ברשת יכלו להצביע על יוזמות להשקיע בהן.

הפרויקט של DAO גייס סכום מדהים של 150 מיליון דולר באחד מפרויקטי מימון ההמונים המוצלחים ביותר בהיסטוריה. עם זאת, מתחילת הדרך, רבים הביעו חששות שהחוזה החכם שבו ננעלו הכספים היה פגיע להתקפת כניסה חוזרת עקב באג שיחה רקורסיבי בקוד. כמו כל פרויקט טוב בתגובה לבעיות שסומנו על ידי חוות דעת של צד שלישי צוות הפיתוח החליט לעבוד על תיקון הבעיה. אבל לא לפני שתוקפים הצליחו לנהל את המתקפה בעצמה ולרוקן את החוזה החכם של אתר עם לא פחות מאשר 3.6 מיליון.

הפריצה אל DAO הפכה מאז לרגע ציון דרך בהיסטוריה של הבלוקציין, וזאת משום שהיא זירזה את הפורקינג (פיצול) של אתריום כדי להחזיר את הכספים, והולידה את אתריום קלאסיק בתהליך. זה גם מחיר למידה עבור אבטחת בלוקצ'יין, כאשר פגיעויות כניסה חוזרת הן בדיקה בסיסית בכל ביקורת חוזים חכמים מקצועית.

382a4 reentrancy

מי אתה Lendf

ובכן, התקפות הכניסה מחדש לא נעצרו שם, ולמרות שאבטחת הקריפטו התאימה את עצמה בתגובה לפריצה של DAO, כאשר ביקורות על חוזים חכמים ומודעות טובה יותר למפתחים הן כעת מרכיבים עיקריים בכל פרויקט בלוקציין, למרבה הצער, גם תוקפים התאימו את ההתנהגות והתקיפות שלהם בהתאם.

בשנת 2020, תוקף השתמש במתקפת כניסה חוזרת כדי לגנוב 25 מיליון דולר מפרוטוקול Lendf.me, פרוטוקול מימון מבוזר שנועד לתמוך בפעולות ההלוואות בפלטפורמת אתריום. תוקפים ניצלו באג שהתרחש דרך פרוטוקל Lendf.me על גבי תקן ERC777. במקרה הזה המפתחים התעלמו מכך שטוקנים אלה מכילים פונקציית התקשרות חוזרת המודיעה למשתמשים כאשר כסף נשלח או התקבל. על ידי כך שהמקבל הוא חוזה חכם. תוקפים הצליחו לנצל את התקן המאובטח באמצעות מתקפת כניסה חוזרת מתוחכמת, תוך שהם מרוקנים את פלטפורמה מבוססת Lendf.me עם לא פחות מאשר 99% מהכספים שלה.

הערה: תקן ERC777 הוא תקן אתריום המאפשר אינטראקציות מורכבות בעת מסחר לשמש כבטוחה

באופן אירוני, נראה שהתוקפים השתמשו בניצול שהודגש לראשונה בביקורת חוזים חכמים על ידי פלטפורמת ביקורת חוזים חכמים של צד שלישי, מה שרק מראה את החשיבות של תשומת לב רבה לחששות של המומחים באבטחת DEFI.

מלבד הצעד היעיל ביותר של ביקורת על חוזה חכם של צד שלישי בפרויקט, מפתחים המעוניינים להתגונן מפני התקפות כניסה חוזרת צריכים לפקוח מקרוב על מבנה הקוד שלהם, במיוחד סביב כל חוזה חכם המכיל פונקציות התקשרות חוזרת. אם ביקורת על חוזים חכמים הייתה מדגישה פרויקט כפגיע להתקפת כניסה חוזרת, סביר להניח שהם ימליצו על ארגון מחדש של הקוד כך שהיתרות יעודכנו לפני שליחת הכספים, או ישתמשו בפונקציה אחרת כדי להעביר את הכספים.

לסיכום

כפי שקורה לעתים קרובות בטכנולוגיית הבלוקציין, הבעיות סביב כניסה חוזרת בחוזים חכמים אינן דווקא מקורן בבלוקציין עצמו, אלא מספקות דוגמה חדשנית ומורכבת להן. כניסה חוזרת היא מונח שנמצא בטכנלוגיה במשך שנים רבות, ופשוט מתייחס לתהליך לפיו ניתן ליירט/לעצור תהליך באמצע הדרך באמצעות ביצוע, להתחיל מופע שונה של אותה פונקציה, ואז לסיים את שני התהליכים עד להשלמתם. אנו משתמשים בפונקציות נכנסות חוזרות במחשוב בבטחה מדי יום. דוגמה פשוטה היא שליחת דואר.

הבעיות מתחילות להתעורר כאשר אנו מעבירים את הדוגמה הזו מאדם ששולח מייל, לחוזה חכם ששולח כסף. זוהי דוגמה קלאסית לאופן שבו מטבעות קריפטוגרפיים וטכנולוגיית בלוקציין העלו את ההימור של המחשוב, וסיפקו כמה מהיישומים המתוחכמים ביותר שלה, תוך שהם גם הופכים את המלכודות שלה להרבה יותר כואבות.

המשך הפיתוח של טכנולוגיית הבלוקציין ואבטחת DEFI הוא בלתי נתפס מבלי להיתקל בפגיעויות חדשות, כשלים ואפילו פריצות. בעוד שנקודות החלשות האלה הן חלק טבעי וחיוני בכל חידוש, הן גם צריכות לדחוף מפתחים ופרויקטים רציניים של בלוקציין להעמיד את הקוד שלהם למבחן עם ביקורת חוזים חכמים לפני ההשקה.

רפרנסים

Hackers steal $25 million from Lendf.me platform

The DAO: What Was the DAO Hack? | Gemini

Reentrant Function – GeeksforGeeks

Dexfolio’s Re-Entrancy Loophole Explained | by Amber Group | Amber Group | Medium

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *