פוסט זה בבלוג חושף איום נגד רשת Ethereum שהיה נוכח מהמיזוג ועד למזלג הקשה של דנקון.
רֶקַע
לפני המיזוג, נקבעו מגבלות שונות של גודל הודעות עבור תקשורת RPC כדי להגן על לקוחות מפני התקפות מניעת שירות (DOS). מגבלות אלו, שהוחלו על הודעות שהתקבלו באמצעות נקודות קצה HTTP, הועברו לממשק API של המנוע, אשר ממלא תפקיד מכריע בחיבור לקוחות ביצוע ושכבת קונצנזוס במהלך ייצור בלוק. בשל מעורבות ה-API של המנוע בייצור בלוקים, התאפשר לייצר בלוקים שחרגו ממגבלות גודל ה-RPC של חלק מהלקוחות אך נשארו בטווח המקובל עבור אחרים.
אם תוקף יוצר הודעה החורגת ממגבלת הגודל של הלקוח עם ההגדרה הנמוכה ביותר, תוך עמידה בדרישות מגבלת הגז, ולאחר מכן ממתין להפקת בלוק, זה עלול לגרום למצב שבו חלק מהלקוחות מתייחסים לחסימה כתקף, בעוד שאחרים דוחים אותו, מוציאים קוד שגיאה HTTP "413: Content Too Large".
פְּגִיעָה
תוקף שיוכל ליצור הודעות אלו יוכל לאלץ את רוב הצמתים (=geth) לדחות בלוקים שמיעוט יקבל. הבלוקים הללו יסולקו והמציע יחמיץ תגמולים.
בהתחלה חשבנו שאפשר ליצור בלוקים אלה רק באמצעות בונים או גרסה שונה של לקוח. ל-Geth יש מגבלה מובנית של 128KB עבור עסקאות, מה שאומר שעסקה גדולה כמו זו הנדונה לא תגיע למאגר העסקאות של שום צומת get. עם זאת, ניתן היה עדיין להפעיל את המגבלה על ידי כך שלקוח עם מגבלה גבוהה יותר יציע את החסימה וה-CL המבקש אימות של הבלוק הגדול יותר המוצע.
הצענו פתרון בהורדה זמנית של מגבלת ה-RPC על כל הלקוחות לערך הנמוך ביותר (5MB). זה יהפוך את החסימה לבלתי חוקית ותוקף יהיה מוגבל מאוד בכאוס שהם יכולים לגרום ברשת מכיוון שרוב הצמתים ידחו את החסימות שלהם.
עם זאת, ב-7 בפברואר גילינו שאפשר ליצור בלוק שיגיע למגבלה של 5MB עם חבורה של עסקאות מתחת לגבול ה-128KB ולא יעלה על 30 מיליון גז.
זו בעיה גדולה יותר מכיוון שהבנו שתוקף יכול ליצור חבורה של עסקאות בתשלום גבוה ולשלוח אותן לרשת. מכיוון שהוא משלם על כל השאר ב-mempool, כל צומת (אפילו צמתים משולבים) יכלול את עסקאות ההתקפה בבלוק שלהם ובכך יוצר חסימה שלא תתקבל על ידי רוב הרשת, וכתוצאה מכך יש הרבה מזלגות (כולם נחשבים תקף על ידי צמתי המיעוט) והשרשרת ממשיכה להתארגן שוב ושוב.
מאוחר יותר ב-7 בפברואר, הגענו למסקנה שכל מי שיעלה את גבולות ה-RPC שלו תהיה החלופה הבטוחה יותר.
ציר זמן
- 2024-02-06 13:00: טוני (EF), פארי (EF) וג'סטין (Besu) מנסים להגיש לרשת עסקה מושחתת במיוחד. העסקה תורמת לחסימות של עד 2.7 מגה-בייט כאשר היא דחוסה במהירות.
- 2024-02-06 13:25: פארי מקבל שגיאות מצומת ה-Geth המקומי שלו למרות שהעסקה צריכה להיות תקפה.
- 2024-02-06 15:14: ג'סטין הצליח לשים את העסקה בבלוק והגיש אותה דרך לקוח Besu.
- 2024-02-06 20:46: סם (EF) מתריע בפני פארי (תודה מיוחדת ל mysticryuujin ב-X), טוני ואלכס על צמתים מסוימים של ספוליה שמתקשים.
- 2024-02-06 21:05: הצוות בודק פעמיים עם מריוס מגת' ומאשר את הבאג.
- 2024-02-06 21:10: החבורה מתכנסת כדי לנפות באגים
- 2024-02-07 23:40: החלטנו עבור כל הלקוחות להגביל את מגבלת בקשת ה-RPC שלהם ל-5MB
- 2024-02-07 6:40: גילינו שאולי יש בעיה גדולה יותר וניתן לבצע את ההתקפה עם עסקאות בגודל של פחות מ-128KB.
- 2024-02-07 10:00: החלטנו עבור כל הלקוחות להגדיל את מגבלת בקשות ה-RPC.
- 2024-02-07 21:00: התיקון מוזג ב-geth.
- 2024-02-09: Geth שוחרר
בעוד Geth היה הלקוח היחיד שהושפע מהבאג הזה, לקוחות אחרים עדכנו גם את ברירת המחדל שלהם כדי להיות בטוחים מהתקפה זו גם אם מגבלות הגז יוגדלו. צוותי הלקוחות ציינו שלעדכונים הבאים יש את מגבלות ה-rpc הבטוחות:
Geth: v1.13.12
Nethermind: v1.25.4
בסו: 24.1.2
אריגון: v2.58.0
Reth: v0.1.0-alpha.18