שאלות נפוצות

האם אפשר להשתמש בשרשורים?

כן, יש תמיכה בשרשורים ב-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 כברירת מחדל. כדי להגדיר מסנן syscall מחמיר, צריך היה להחליף את ערך ברירת המחדל של Bazel.

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

‫Bazel מוסיף את pie כברירת מחדל, והוא לא תואם ל-static. לכן, כדאי להשתמש בדגל של אפשרויות ה-linker כדי להעביר את דגל ה-linker ‏pie לכלל cc_binary ולשכתב את ברירת המחדל:-static-pie

  linkstatic = 1,
  linkopts=["-static-pie"],

דוגמה לאפשרויות האלה מופיעה בדוגמה הסטטית של BUILD: static_bin.cc מקושר באופן סטטי עם static-pie, מה שמאפשר ליצור מדיניות syscall מאוד מצומצמת. השיטה הזו מתאימה גם להרצת ארגז חול (sandbox) לקבצים בינאריים של צד שלישי.

האם אפשר להפעיל ארגז חול (sandbox) לקובצי הפעלה (binaries) של x86 ב-32 ביט?

‫Sandbox2 יכול להפעיל ארגז חול רק לאותה ארכיטקטורה שבה הוא עבר קומפילציה.

בנוסף, התמיכה ב-x86 32-bit הוסרה מ-Sandbox2. אם מנסים להשתמש ב-executor של x86 64-bit כדי להפעיל בסביבת ארגז חול קובץ בינארי של x86 32-bit, או קובץ בינארי של x86 64-bit שמבצע קריאות למערכת של 32-bit (באמצעות int 0x80), בשני המקרים תיווצר הפרה של ארגז החול שאפשר לזהות באמצעות תווית הארכיטקטורה [X86-32].

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

האם יש מגבלות על מספר ארגזי החול שתהליך ההרצה יכול לבקש?

לכל מופע של Sandboxee (תהליך חדש שנוצר מ-forkserver), נוצר שרשור חדש – זה המקום שבו נמצאת המגבלה.

האם אפשר לבקש ליצור יותר מארגז חול אחד?

לא. יש יחס של 1:1 – מופע של Executor מאחסן את ה-PID של Sandboxee, מנהל את מופע Comms למופע Sandbox וכו'.

למה מופיעה ההודעה 'הפונקציה לא הוטמעה' ב-forkserver.cc?

‫Sandbox2 תומך בהרצה רק בליבות חדשות יחסית. הסף הנוכחי שלנו הוא ליבת 3.19, אבל יכול להיות שהסף הזה ישתנה בעתיד. הסיבה לכך היא שאנחנו משתמשים בתכונות חדשות יחסית של ליבת המערכת, כולל מרחבי שמות של משתמשים ו-seccomp עם הדגל TSYNC.

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

אם אתם מריצים Debian או Ubuntu, כדי לעדכן את ליבת המערכת פשוט מריצים את הפקודה:

sudo apt-get install linux-image-<RECENT_VERSION>