מדיניות אבטחת תוכן
מדיניות אבטחת תוכן היא כותרת ה-HTTP המאפשרת לדפי אינטרנט להצהיר מה מותר לטעון ולהפעיל. CSP קפדני הופך את XSS לסיכון קטן בהרבה: גם אם תוקף מחדיר סקריפט, הדפדפן מסרב להפעיל אותו. הפשרה היא מורכבות הפריסה, וזו הסיבה ש-CSP מאומץ פחות מכפי שהוא אמור להיות.
גוף המאמר המלא מסופק באנגלית להלן.
Content Security Policy (CSP) היא כותרת תגובת HTTP (ומקבילה למטא תג) שאומרת לדפדפן אילו מקורות מותר לטעון משאבים, אילו סקריפטים מוטבעים יכולים להפעיל ולאן יש לשלוח דיווחים על הפרות. CSP מוגדר היטב מפחית באופן דרמטי את ההשפעה של פגיעויות הזרקה; תצורה גרועה מספקת ביטחון כוזב עם מעט הגנה אמיתית.
במה שולטת ה-CSP
המדיניות מורכבת מהנחיות, שכל אחת מהן מציינת מקורות מותרים עבור סוג משאב:
- script-src — מקורות לטעינת JavaScript ו-JavaScript. execute
- style-src — מקורות CSS
- img-src — מקורות תמונה
- connect-src, — XHRock, אחזור, — XHRock targets
- font-src — מקורות גופנים
- media-src — מקורות שמע ווידאו
- frame-src במה שניתן לטעון — iframes
- frame-ancestors — מה יכול למסגר דף זה (מחליף X-Frame-Options)
- form-action — היכן ניתן לשלוח טפסים base
- upgrade-insecure-requests — שדרוג אוטומטי של HTTP ל-HTTPS
- default-src — נפילה להנחיות שלא פורטו XZPLZ57AXXPL החל סביר policy
Content-Security-Policy:
default-src 'עצמי';
script-src 'self' 'nonce-randomBase64Value';
style-src 'self' 'לא בטוח-inline';
img-src 'עצמי' נתונים: https:;
connect-src 'self' https://api.example.com;
מסגרת-אבות 'אין';
base-uri 'עצמי';
צורה-פעולה 'עצמי';
report-uri https://example.com/csp-reportsמדיניות זו אומרת: כברירת מחדל טען רק מאותו מקור, סקריפטים חייבים להיות זהים במקור או לשאת את ה-nonce התואם, אין הטמעה ב-iframes מאתרים אחרים וכו'. הגישה הלא-מבוססת מונעת את רוב הסקריפטים המוטבעים עם הסקריפט ה-XSS הלגיטימי של השרת תוך הטמעת ה-XSS nonce.
Nonces לעומת hashes לעומת רשימות הלבנות
Tשלוש דרכים לאפשר סקריפטים מוטבעים ספציפיים:
- Nonce-based. שרת יוצר שרת אקראי חדש בכל בקשה שאינה מקוונת ב-CSP פלוס וכולל כל בקשה לא-שורה. קפדני ודינמי, מומלץ לפריסות חדשות.
- Hash-based. CSP מציין גיבוב SHA של סקריפטים מוטבעים מותרים. הדפדפן מבצע גיבוב של סקריפטים מוטבעים ומשווה. עובד עבור סקריפטים סטטיים שהתוכן שלהם לא משתנה.
- Whitelist of origins. אפשר סקריפטים מתחומים חיצוניים ספציפיים. קל אבל יוצר משטחי התקפה גדולים - אם תחום כלשהו ברשימת ההיתרים נפגע או שיש לו הפניות פתוחות, המדיניות עוקפת.
מילת המפתח הדינמית הקפדנית (נוספה ב-CSP 3) מגבילה עוד יותר סקריפטים: רק סקריפטים שאינם מורשים יכולים לטעון בעצמם סקריפטים אחרים, ומפרקים XXL88 סקריפטים נפוצים. cargo-cult anti-pattern
אתרים רבים פורסים CSP עם unsafe-inline ו-unsafe-eval ב-script-src כדי למנוע שבירת קוד קיים. זה בעצם לא CSP בכלל - כל העניין הוא למנוע סקריפטים מוטבעים לפעול, ו-unsafe-inline מסיר את ההגנה הזו. לאתרים עם תצורה זו יש כותרות CSP ללא יתרונות CSP.
הנתיב לערך CSP בפועל: הסר לא בטוח-inline, החלף קוד לשימוש ב-nonces או hashes, והתמודד עם הפרות אחת אחת. כואב אבל אמיתי.
מצב דיווח בלבד
CSP ניתן לפרוס במצב דיווח בלבד - הדפדפן מדווח על הפרות ל-URI מוגדר אך אינו אוכף אותן. שימושי לבדיקת מדיניות חדשה נגד תנועה אמיתית מבלי לשבור את האתר:
Content-Security-Policy-Report-Only: ...ההשקה הסטנדרטית: פריסה במצב דיווח בלבד, איסוף הפרות למצב לגיטימי למשך מספר שבועות, מעבר למצב לגיטימי למשך מספר שבועות. לאתרים גדולים רבים יש פריסות CSP ארוכות חודשים במהלך מחזור האיטרציה הזה.
CSP ו-XSS
היתרון של הכותרת: גם כאשר הזרקת XSS מצליחה, הסקריפט המוזרק לא יכול לפעול אם אין לו ביטול חוקי. המטען של התוקף מגיע לדף; הדפדפן מסרב לבצע את זה. הפגיעות עדיין קיימת - אבל ההשפעה מצטמצמת באופן דרמטי.
זה לא תחליף לתיקון XSS - זה הגנה לעומק. שתי השכבות צריכות להיות נוכחות.
תמיכה בדפדפן CSP
כל הדפדפנים הגדולים מאז 2016+. לתכונות CSP 3 (nonces, strict-dynamic, hashes) יש תמיכה רחבה. הפערים הנותרים הם בטיפול במקרים של קצה - אינטראקציה של מסגרת-אבות עם X-Frame-Options, התנהגות משתנה של דוח-uri לעומת דיווח-אל, מוזרויות ספציפיות לדפדפן בדיווח שגיאות. (ניתוח, מודעות, ניטור) צריכים להיות במדיניות או להיכשל
onclick="...") מפרים את ה-CSP אלא אם כן מותר במפורש CSP, יוצר רעשאתרים רבים שצריכים לכלול CSP אינם עושים זאת, מכיוון שהעלות התפעולית מרגישה גבוהה מהתועלת האבטחה הנתפסת. העלות היא אמיתית; היתרון הוא גם אמיתי אך בלתי נראה (אתה לא רואה את ההתקפות שלא קרו).
שאלות נפוצות
- האם CSP מהווה תחליף לניקוי קלט?
- לא - הגנה לעומק. חיטוי קלט מונע את ההזרקה; CSP מונע מההזרקה לפעול אם החיטוי נכשל. שניהם צריכים להיות במקום. הסתמכות על CSP בלבד היא שבירה; ההסתמכות על חיטוי בלבד נכשלת כבר שני עשורים.
- האם עלי להשתמש ב-nonces או hashes?
- ננסות לתוכן דינמי (המקרה הנפוץ); hashes עבור סקריפטים מוטבעים קבועים שהתוכן שלהם לא משתנה לעולם. רוב המסגרות המודרניות כוללות תמיכה בלתי רגילה. Hash פשוטים יותר מבחינה רעיונית אך הופכים לנטל תחזוקה אם תוכן הסקריפט משתנה.
- מדוע לא בטוח-inline עדיין נפוץ?
- קוד מדור קודם שדורש זאת (ספריות עם מטפלי אירועים מוטבעים, מסגרות ישנות יותר). ריפקטור גוזל זמן. התיקון הישר הוא הרפקטור; קיצור הדרך הנפוץ הוא לשמור על 'לא בטוח' בתוך הרשת ולהסתמך על הגנות אחרות.
- כיצד אוכל לעקוב אחר הפרות של CSP?
- הגדר דיווח אל או דיווח-uri לנקודת קצה של אספן. פלטפורמות אבטחה רבות (Cloudflare, Sucuri, Custom) מקבלות ומנתחות דוחות CSP. תנועה בעולם האמיתי מייצרת הרבה רעש (תוספי דפדפן, חוסמי פרסומות); הפרדת התקפות אמיתיות לרעש היא חלק מעומס העבודה התפעולי.
- האם יש מחוללי שיטות עבודה מומלצות של CSP?
- כלים כמו מעריך ה-CSP של גוגל מנתחים מדיניות מוצעת ומסמנים חולשות. מצפה הכוכבים של מוזילה מדרג דפים כולל איכות CSP. השתמש באלה לביקורת; הם עוזרים להדגיש טעויות נפוצות אך אינם מחליפים את הבנת המדיניות.