הסבר על מתקפת CBC Bit Flipping

הצפנה אינה אומרת שהנתונים שלך מוגנים מפני שינוי (tampering).

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

מתקפת ה-CBC Bit Flipping מוכיחה זאת. תוקף יכול לשנות את הנתונים שלך מבלי לדעת את המפתח הסודי שלך.

כך זה עובד:

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

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

תוקף יכול לנצל זאת:

התוקף לא צריך לקרוא את ההודעה. הוא פשוט הופך ביטים כדי לשנות את התוצאה הסופית.

שקלו אפליקציית ווב ישנה המשתמשת בעוגיות (cookies) מוצפנות עבור ניהול סשנים (sessions). עוגייה עשויה להכיל: userid=994;role=user;

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

לתוקף יש כעת גישת מנהל (admin). הוא מעולם לא קרא את המפתח או את העוגייה המקורית.

הטעות היא להניח שהצפנה מבטיחה שלמות (integrity).

כדי לתקן זאת, השתמשו בהצפנה מאומתת (Authenticated Encryption) כמו AES-GCM. היא יוצרת תג קריפטוגרפי (cryptographic tag). התג הזה פועל כמו חותמת. אם תוקף משנה אפילו ביט אחד, החותמת נשברת. השרת דוחה את הנתונים באופן מיידי.

אם עליכם להשתמש ב-CBC, השתמשו בארכיטקטורת Encrypt-then-MAC. צרו קוד אימות (authentication code) עבור הטקסט המוצפן ואמתו אותו לפני שתתחילו בפענוח.

נתונים סודיים הם לא תמיד נתונים מהימנים. תמיד הוכיחו שהנתונים שלכם לא השתנו לפני שתשתמשו בהם כדי לקבל החלטות.

הסבר על מתקפת Bit-Flipping ב-CBC: מדוע הצפנה לבדה אינה מבטיחה שלמות

מבוא

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

איך עובד מצב CBC?

CBC (Cipher Block Chaining) הוא מצב פעולה עבור צפנת בלוקים (block ciphers). במצב זה, כל בלוק של טקסט גלוי (plaintext) עובר פעולת XOR עם הבלוק המוצפן (ciphertext) הקודם לפני שהוא מוצפן.

הנוסחה להצפנה היא: $C_i = E_k(P_i \oplus C_{i-1})$

והנוסחה לפענוח היא: $P_i = D_k(C_i) \oplus C_{i-1}$

כאשר:

הפגיעות: מתקפת Bit-Flipping

הבעיה נובעת מהעובדה שבלוק הטקסט הגלוי $P_i$ תלוי ישירות בבלוק המוצפן הקודם $C_{i-1}$ באמצעות פעולת XOR.

אם תוקף משנה ביט מסוים ב-$C_{i-1}$, הביט המקביל ב-$P_i$ ישתנה באותו אופן בדיוק לאחר הפענוח. למרות שהשינוי ב-$C_{i-1}$ יהרוס את הבלוק $C_{i-1}$ עצמו (הוא יהפוך לטקסט גלוי לא קריא), הבלוק $P_i$ ישתנה בצורה צפויה לחלוטין.

דוגמה מעשית

נניח שיש לנו הודעה מוצפנת ב-CBC שבה הבלוק הראשון ($P_1$) מכיל את הטקסט: admin=false.

אם התוקף יודע את מבנה ההודעה, הוא יכול לשנות ביטים ב-IV (שהוא $C_0$) כדי להפוך את הטקסט ב-$P_1$ ל-admin=true.

התהליך הוא כזה:

  1. התוקף מזהה את המיקום של הביט שצריך לשנות.
  2. התוקף מבצע XOR על ה-IV עם הערך הנו