הסבר על Sandbox2

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

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

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

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

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

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

מידע נוסף על מרחבי שמות של Linux זמין בויקיפדיה או בדף ה-man שקשור לנושא.

IPC

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

Seccomp-BPF

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

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

Ptrace

קריאת המערכת ptrace (process trace) מספקת פונקציונליות שמאפשרת לתהליך המעקב לצפות בהרצה של תהליך המעקב ולשלוט בה. לתהליך של כלי המעקב יש שליטה מלאה על תהליך ה-tracee אחרי שהוא מצורף. מידע נוסף על ptrace זמין בויקיפדיה או בדף man שקשור לנושא.

מדיניות בנושא ארגז חול

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

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

מדיניות ברירת המחדל של קריאות המערכת

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

מדיניות מורחבת של קריאות מערכת

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

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

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

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

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

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

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

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

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Sandbox Executor

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

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

Sandboxee

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