דוגמאות

סקירה כללית

הכנו כמה דוגמאות כדי להדגים איך להשתמש ב-Sandbox2 בתרחישים שונים ואיך לכתוב מדיניות.

ההסברים מפורטים כאן למטה: //sandboxed_api/sandbox2/examples.

CRC4

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

  • crc4bin.cc: התוכנית שרוצים להפעיל ב-Sandbox (כלומר Sandboxee)
  • crc4sandbox.cc: תוכנת Sandbox שתפעיל אותו (כלומר, קובץ ההפעלה).

איך זה עובד:

  1. ההפעלה מתחילה את ה-Sandboxee מנתיב הקובץ שלו באמצעות ::sandbox2::GetDataDependencyFilePath().
  2. המבצע שולח קלט ל-Sandboxee בערוץ התקשורת Comms באמצעות SendBytes().
  3. ה-Sandboxee מחשב את ה-CRC4 ושולח את התשובות שלו למנהל הפעולה דרך ערוץ התקשורת Comms שמקבל אותו באמצעות RecvUint32().

אם התוכנית מבצעת שיחת מערכת שאינה מתקשרת (read() ו-write()), היא מושבתת עקב הפרת מדיניות.

סטטי

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

  • static_bin.cc: ה-Sandboxee הוא קובץ בינארי סטטי מסוג C שממיר טקסט ASCII מקלט סטנדרטי לאותיות רישיות.
  • static_sandbox.cc: האופרטור עם המדיניות והמגבלות שלו ושימוש במתאר קובץ עבור קלט Sandboxee.

איך זה עובד:

  1. ההפעלה מתחילה את ה-Sandboxee מנתיב הקובץ באמצעות GetDataDependencyFilepath, בדיוק כמו ב-CRC4.
  2. היא מגדירה מגבלות, פותחת מתאר קובץ ב-/proc/version ומסמנת אותו למיפוי ב-Sandboxee באמצעות MapFd.
  3. המדיניות מאפשרת לחלק מה-syscalls (open) להחזיר שגיאה (ENOENT) במקום להשבית בגלל הפרת מדיניות. אפשרות זו יכולה להיות שימושית בעת הרצה בארגז חול (sandboxing) של תוכנית צד שלישי שבה אנחנו לא יכולים לשנות את הקריאות ה-syscalls שמתבצעות, כך שבמקום זאת אנחנו יכולים לגרום להן להיכשל בחינניות.

כלי

הכלי לדוגמה הוא כלי לפיתוח מדיניות משלך ולהתנסות בממשקי Sandbox2 API, וכן הדגמה של התכונות שלו.

  • sandbox2tool.cc: קובץ ההפעלה מדגים:
    • איך להריץ קובץ הרצה בארגז חול בינארי נוסף,
    • איך להגדיר בדיקות של מערכת קבצים
    • האופן שבו המפעיל יכול להריץ את Sandboxee באופן אסינכרוני כדי לקרוא את הפלט שלו בהדרגה.

נסו בעצמכם:

Bazel

bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

CMake + נינג'ה

cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

Google3 (Blaze)

blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
 --sandbox2tool_resolve_and_add_libraries \
 --sandbox2tool_additional_bind_mounts /etc \
 /bin/cat /etc/hostname

סימונים:

  • --sandbox2tool_resolve_and_add_libraries כדי לפתור את הבעיה ולטעון את הספריות הנדרשות ל-Sandboxee
  • --sandbox2tool_additional_bind_mounts <PATHS> כדי שספריות נוספות יהיו זמינות ל-Sandboxee
  • --sandbox2tool_keep_env כדי לשמור את משתני הסביבה הנוכחיים
  • --sandbox2tool_redirect_fd1 כדי לקבל את ה-Sandboxee STDOUT_FILENO (1) ולהוציא אותו לפלט מקומי
  • --sandbox2tool_cpu_timeout כדי להגדיר את הזמן הקצוב למעבד (CPU) בשניות
  • --sandbox2tool_walltime_timeout כדי להגדיר זמן קצוב לתפוגה של זמן קיר, בשניות
  • --sandbox2tool_file_size_creation_limit כדי להגדיר את הגודל המקסימלי של קבצים שנוצרו
  • --sandbox2tool_cwd להגדרת ספריית העבודה הנוכחית של ה-Sandbox

custom_fork

הדוגמה של custom_fork מדגימה איך ליצור ארגז חול שיאתחל את הקובץ הבינארי, ולאחר מכן ימתין לבקשות fork() שמגיעות מקובץ ההרצה ההורה.

המצב הזה מציע ביצועים משופרים בהשוואה לסוגים אחרים של הרצה בארגז חול (sandboxing), כי במקרה הזה יצירת מופעים חדשים של Sandboxees לא מחייבת הפעלה של קבצים בינאריים חדשים, אלא רק שכפול של הקבצים הקיימים

  • custom_fork_bin.cc: שרת ה-fork המותאם אישית, שמקבל בקשות אל fork() (דרך Client::WaitAndFork) במטרה להצליב שחקני Sandbox חדשים.
  • custom_fork_sandbox.cc: קובץ ההפעלה, שמפעיל שרת מזלג בהתאמה אישית. לאחר מכן נשלחת אליו בקשות (באמצעות מנהלים חדשים) כדי להציל (באמצעות fork()) ארגזי Sandbox חדשים.

רשת

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

החיבור מתחיל בתוך רכיב ה-Socket שיתקבל דרך ::sandbox2::Comms::SendFD(). ה-Sandboxee מקבל את השקע באמצעות ::sandbox2::Comms::RecvFD() ולאחר מכן הוא יכול להשתמש בשקע הזה כדי להחליף את הנתונים כרגיל.

  • network_bin.cc: התוכנית שאנחנו רוצים להפעיל ב-Sandbox (כלומר Sandboxee).
  • network_sandbox.cc: תוכנית ארגז החול שתריץ אותו (כלומר, קובץ ההפעלה).

network_proxy

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

Sandboxee יכול ליצור חיבור לרשת בשתי דרכים שונות:

  • Automatic (אוטומטית): התקנת handler אוטומטי ויצירה של שיחות התחברות קבועות.
  • ידני – על ידי קבלת NetworkProxyClient ושימוש ישיר ב-NetworkProxyClient::Connect.

בדוגמה הזו מוצגות שתי השיטות. נעשה שימוש במצב אוטומטי כשהדגל connect_with_handler מוגדר, אחרת נעשה שימוש במצב ידני.

  • network_bin.cc: התוכנית שאנחנו רוצים להפעיל ב-Sandbox (כלומר Sandboxee).
  • network_sandbox.cc: תוכנית ארגז החול שתריץ אותו (קובץ ההפעלה).