אפשר להשתמש בשרשורים?
כן, יש תמיכה בשרשורים ב-Sandbox2.
כל השרשורים צריכים להיות בארגז חול
בגלל האופן שבו Linux פועלת, מדיניות seccomp-bpf מוחלת רק על התהליכון הנוכחי. כלומר, המדיניות לא מוחלת על תהליכונים קיימים אחרים, אבל תהליכונים עתידיים יירשו את המדיניות:
- אם אתם משתמשים ב-Sandbox2 במצב הראשון שבו ארגז החול מופעל לפני
execve()
, כל השרשורים יקבלו בירושה את המדיניות ולא תהיה בעיה. זו שיטת הסנדבוק המועדפת. - אם אתם משתמשים במצב השני שבו ל-executor יש
set_enable_sandbox_before_exec(false)
ו-Sandboxee אומר ל-executor מתי הוא רוצה להיות ב-sandbox עםSandboxMeHere()
, צריך לוודא שהמסנן מוחל על כל השרשורים. אחרת, יש סיכון לפרצה בארגז החול: קוד זדוני עלול לעבור משרשור בארגז חול לשרשור שלא בארגז חול.
איך כדאי לקמפל את Sandboxee?
בהשוואה לקובץ הפעלה עם קישור סטטי, קומפילציה של sandboxee לקובץ הפעלה עם קישור דינמי תגרום לעלייה משמעותית במספר קריאות המערכת (לדוגמה, open
/openat
, mmap
וכו') שצריך להוסיף לרשימת ההיתרים. כל קריאות המערכת הנוספות האלה נדרשות בגלל הפעלת המקשר הדינמי בזמן הריצה כדי לטעון את הספריות המשותפות.
עם זאת, כשמסתכלים על sandboxees שמקושרים באופן סטטי: אמנם יש פחות קריאות מערכת שצריך להוסיף לרשימת ההיתרים, אבל יש גם השלכות על האבטחה. האנטרופיה של הערימה ב-ASLR מצטמצמת (מ-30 ביט ל-8 ביט), מה שמקל על ניצול פרצות.
זו דילמה שאפשר לצמצם אותה לשאלה הבאה:
- דינמי: טוב ל-ASLR של הערימה, יכול להיות שיהיה קשה יותר להשיג ביצוע קוד ראשוני, אבל על חשבון מדיניות ארגז חול פחות יעילה, ויכול להיות שיהיה קל יותר לצאת ממנו.
- סטטי: ASLR של ערימה גרועה, יכול להיות שיהיה קל יותר להשיג הרצה ראשונית של קוד, אבל מדיניות ארגז חול יעילה יותר, ולכן יכול להיות שיהיה קשה יותר לצאת ממנו.
בעבר, קבצים בינאריים שמקושרים באופן סטטי לא תמכו בקוד בלתי תלוי במיקום (pie
). בנוסף, Bazel הוסיף pie
כברירת מחדל. כדי להגדיר מסנן הדוק של קריאות למערכת, צריך לשנות את ערך ברירת המחדל של Bazel.
הקומפיילרים השתפרו במהלך השנים, ועכשיו הם תומכים באפשרות static-pie
.
באמצעות האפשרות הזו, מהדר מקבל הוראה ליצור קוד בלתי תלוי במיקום, אבל בהשוואה ל-pie
, האפשרות הזו כוללת עכשיו גם את כל הספריות המקושרות באופן סטטי. מבחינת אבטחה, static-pie
עדיין מצמצם את האנטרופיה של ASLR (מ-30 ביט ל-14 ביט), אבל זה שיפור לעומת המצב הקודם בלי pie
.
Bazel מוסיף את pie
כברירת מחדל, והאפשרות static לא תואמת לו. לכן, כדאי להשתמש בדגל של אפשרויות ה-linker כדי להעביר את דגל ה-linker -static-pie
לכלל cc_binary ולשכתב את ברירת המחדל:
linkstatic = 1,
linkopts=["-static-pie"],
דוגמה לאפשרויות האלה מופיעה בדוגמה הסטטית של BUILD:
static_bin.cc מקושר באופן סטטי עם static-pie
, מה שמאפשר ליצור מדיניות syscall מאוד מצומצמת. השיטה הזו מתאימה גם להרצת ארגז חול (sandbox) של קבצים בינאריים של צד שלישי.
האם אפשר להפעיל ארגז חול (sandbox) לקבצים בינאריים של x86 ב-32 ביט?
Sandbox2 יכול להפעיל ארגז חול רק לאותה ארכיטקטורה שבה הוא קומפל.
בנוסף, התמיכה ב-x86 32-bit הוסרה מ-Sandbox2. אם מנסים להשתמש ב-executor של x86 ב-64 ביט כדי להפעיל בסביבת ארגז חול קובץ בינארי של x86 ב-32 ביט, או קובץ בינארי של x86 ב-64 ביט שמבצע קריאות מערכת ב-32 ביט (באמצעות int 0x80), בשני המקרים תיווצר הפרה של סביבת ארגז החול שאפשר לזהות באמצעות תווית הארכיטקטורה [X86-32].
הסיבה להתנהגות הזו היא שמספרי קריאות המערכת שונים בין ארכיטקטורות, ומכיוון שמדיניות קריאות המערכת נכתבת בארכיטקטורה של תהליך ההפעלה, מסוכן לאפשר ארכיטקטורה שונה עבור Sandboxee. למעשה, זה עלול להוביל לאישור של קריאת מערכת שנראית תמימה, אבל בפועל היא מאפשרת לקריאת מערכת אחרת ומזיקה יותר לפתוח את ארגז החול ולפרוץ ממנו.
האם יש מגבלות על מספר ארגזי החול שתהליך ההרצה יכול לבקש?
לכל מופע של Sandboxee (תהליך חדש שנוצר מ-forkserver), נוצר שרשור חדש – זה המקום שבו נמצאת המגבלה.
האם מנהל הרשאות יכול לבקש ליצור יותר מארגז חול אחד?
לא. יש יחס של 1:1 – מופע של Executor מאחסן את ה-PID של Sandboxee, מנהל את מופע Comms למופע Sandbox וכו'.
למה מופיעה ההודעה 'Function not implemented' (הפונקציה לא הוטמעה) בקובץ forkserver.cc?
Sandbox2 תומך בהרצה רק בגרעינים חדשים יחסית. כרגע, הגרסה המינימלית היא ליבת 3.19, אבל יכול להיות שהיא תשתנה בעתיד. הסיבה לכך היא שאנחנו משתמשים בתכונות חדשות יחסית של ליבת המערכת, כולל מרחבי שמות של משתמשים ו-seccomp עם הדגל TSYNC.
אם אתם מריצים ב-prod, לא אמורה להיות בעיה, כי כמעט כל הציוד מריץ ליבת מערכת חדשה מספיק. אם נתקלתם בבעיות, אתם מוזמנים לפנות אלינו.
אם אתם מריצים Debian או Ubuntu, כדי לעדכן את ליבת המערכת פשוט מריצים את הפקודה:
sudo apt-get install linux-image-<RECENT_VERSION>