הסבר על Sandbox2

תכנון Sandbox2 מבוסס על טכנולוגיות מבוססות וידועות, מסגרת מדיניות ושני תהליכים: ביצוע Sandbox ו-Sandboxee.

הטכנולוגיות שבהן נעשה שימוש

הקטעים הבאים עוסקים בטכנולוגיות שבונות את שכבת הבסיס ל-Sandbox2.

מרחבי שמות ב-Linux

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

  • IPC
  • רשת (אלא אם הרשת הושבתה באופן מפורש על ידי קריאה ל-PolicyBuilder::AllowUnrestrictedNetworking())
  • טעינה (באמצעות תצוגה מותאמת אישית של עץ מערכת הקבצים)
  • אזהרה לפני פסילה
  • משתמש (אלא אם בוצעה השבתה מפורשת על ידי התקשרות אל PolicyBuilder::AllowUnsafeKeepCapabilities())
  • יוטה

מידע נוסף על מרחבי שמות של Linux זמין ב-Wikipedia או בדף מידע רלוונטי.

IPC

Sandbox2 מאפשר החלפת נתונים שרירותיים בין מנהל Sandbox לבין ה-Sandboxee הלא מהימן. הוא תומך בהודעות מסוג Type-Length (TLV), בהעברת מתארי קבצים ובחילופי פרטי כניסה באמצעות אסימונים ונקודות אחיזה.

Seccomp-BPF

Sandbox2 מסתמך על seccomp-bpf, שהוא תוסף למצב מחשוב מאובטח (seccomp) שמאפשר להשתמש בכללים של Berkeley Packet Filter (BPF) כדי לסנן syscalls.

seccomp הוא מתקן ליבה של Linux שמגביל קריאות למערכת של תהליך כדי לאפשר הפעלה של exit, sigreturn, read ו-write בלבד. אם תהליך מסוים ינסה לבצע הפעלה נוספת של מערכת הפעלה, הוא יופסק. התוסף seccomp-bpf מאפשר גמישות רבה יותר מ-seccomp. במקום לאפשר סדרה קבועה של syscalls, seccomp-bpf מפעיל תוכנית BPF על נתוני ה-syscall, ובהתאם לערך ההחזרה של התוכנית, הוא יכול להפעיל את ה-syscall, לדלג על ה-syscall ולהחזיר ערך דמה, לסיים את התהליך, ליצור אות או להודיע לעוקב.

Ptrace

ה-Syscall של ptrace (מעקב אחר תהליכים) מספק פונקציונליות שמאפשרת לתהליך המעקב לצפות בביצוע של תהליך המעקב ולשלוט בו. לתהליך המעקב יש שליטה מלאה על מכשיר המעקב ברגע שצורף. ניתן לקרוא מידע נוסף על ptrace ב-ויקיפדיה או בדף האדם הקשור לנושא.

מדיניות בנושא Sandbox

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

  • מדיניות Syscall
  • הגדרת מרחב שמות

מדיניות ברירת המחדל של Syscall

מדיניות ברירת המחדל חוסמת קריאות למערכות (syscalls) שתמיד מסוכנות ומקבלות עדיפות על פני המדיניות המורחבת שסופקה על ידי המשתמש.

מדיניות מורחבת של Syscall

ניתן ליצור את מדיניות מערכת ההפעלה המורחבת באמצעות המחלקה PolicyBuilder. בקטגוריה הזו מוגדרים כמה כללי נוחות (למשל AllowStaticStartup, AllowDynamicStartup, AllowOpen) שבהם אפשר להשתמש כדי לשפר את נוחות הקריאה של המדיניות.

כדי להגביל עוד יותר את השיחות במערכת או לדרוש כללים מורכבים יותר, אפשר להגדיר פקודות מאקרו גולמיות מסוג BPF באמצעות AddPolicyOnSyscall ו-AddPolicyOnSyscalls. בדוגמה של crc4 נעשה שימוש במנגנון זה כדי להגביל ארגומנטים עבור ה-Syscalls read, write ו-close.

באופן כללי, ככל שמדיניות Sandbox הדוקה יותר, כך טוב יותר כי הניצול של נקודות חולשה שנכללות בקוד יוגבל על ידי המדיניות. אם אתם יכולים לציין בדיוק אילו קריאות מערכת (syscalls) וארגומנטים נדרשים לפעולה הרגילה של התוכנית, גם כל תוקף שמנצל את נקודת החולשה של ביצוע הקוד מוגבל לאותן המגבלות.

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

הגדרת מרחב שמות

האובייקט PolicyBuilder משמש גם להגדרת תצוגה אישית של מערכת הקבצים ב-Sandboxee. אפשר למפות קבצים בודדים (AddFile / AddFileAt), ספריות שלמות (AddDirectory / AddDirectoryAt) וגם אחסון זמני (AddTmpfs) לסביבת ה-Sandboxee. בנוסף, ניתן להשתמש ב-AddLibrariesForBinary כדי למפות באופן אוטומטי את כל הספריות הנדרשות לקובץ ההפעלה שצוין המקושר באופן דינמי.

דגלי שורת פקודה

ניתן להשבית כל מדיניות Sandbox2 על ידי ציון אחד מהסימונים הבאים בשורת הפקודה. הסימונים האלה מיועדים למטרות בדיקה (למשל, תוך כדי שיפור המדיניות של Extended Syscall).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

ביצוע Sandbox

הרצה בארגז חול (Sandbox) הוא תהליך שלא פועל בארגז החול בעצמו. זהו תהליך מעקב אחר ptrace שמצורף ל-Sandboxee (תהליך מעקב אחר ptrace). הכלי Sandbox להפעלה גם מגדיר ומריץ מופע מעקב שעוקב אחר Sandboxee ומספק פרטי סטטוס.

Sandbox2 מאפשר שלושה מצבי הפעלה: עצמאי, Sandbox2 Forkserver ו-Custom Forkserver. אם משתמשים בשרת forkserver, ה-Sandboxee נוצר כתהליך צאצא של מערכת ההפעלה של Sandbox. מצבים אלה מוסברים בפירוט כאן.

ארגז חול

Sandboxee הוא התהליך שפועל בסביבה המוגבלת עם ארגז החול, שהוגדרה במדיניות Sandbox. התכונה 'הפעלה של ארגז חול' שולחת את המדיניות ל-Sandboxee דרך IPC. לאחר מכן, ה-Sandboxee מחיל את המדיניות. כל הפרה של המדיניות תגרום לסיום התהליך, אלא אם הוגדר אחרת (אפשר לעיין במדיניות Sandbox).