סקירה כללית
הכנו כמה דוגמאות כדי להדגים איך להשתמש ב-Sandbox2 בתרחישים שונים ואיך לכתוב מדיניות.
ההסברים מפורטים כאן למטה: //sandboxed_api/sandbox2/examples.
CRC4
הדוגמה של CRC4 היא חישוב שגוי מכוון של סיכום ביקורת CRC4, שמדגים כיצד להפעיל בארגז חול של תוכנית אחרת ואיך לתקשר איתה.
- crc4bin.cc: התוכנית שרוצים להפעיל ב-Sandbox (כלומר Sandboxee)
- crc4sandbox.cc: תוכנת Sandbox שתפעיל אותו (כלומר, קובץ ההפעלה).
איך זה עובד:
- ההפעלה מתחילה את ה-Sandboxee מנתיב הקובץ שלו באמצעות
::sandbox2::GetDataDependencyFilePath()
. - המבצע שולח קלט ל-Sandboxee בערוץ התקשורת
Comms
באמצעותSendBytes()
. - ה-Sandboxee מחשב את ה-CRC4 ושולח את התשובות שלו למנהל הפעולה דרך ערוץ התקשורת
Comms
שמקבל אותו באמצעותRecvUint32()
.
אם התוכנית מבצעת שיחת מערכת שאינה מתקשרת (read()
ו-write()
), היא מושבתת עקב הפרת מדיניות.
סטטי
הדוגמה הסטטית מדגימה איך להפעיל ארגז חול (sandbox) של קובץ בינארי המקושר באופן סטטי, כמו קובץ בינארי של צד שלישי שהמקור שלו אינו בידיכם. כלומר, הוא לא מודע להרצה שלו בארגז חול.
- static_bin.cc: ה-Sandboxee הוא קובץ בינארי סטטי מסוג C שממיר טקסט ASCII מקלט סטנדרטי לאותיות רישיות.
- static_sandbox.cc: האופרטור עם המדיניות והמגבלות שלו ושימוש במתאר קובץ עבור קלט Sandboxee.
איך זה עובד:
- ההפעלה מתחילה את ה-Sandboxee מנתיב הקובץ באמצעות
GetDataDependencyFilepath
, בדיוק כמו ב-CRC4. - היא מגדירה מגבלות, פותחת מתאר קובץ ב-
/proc/version
ומסמנת אותו למיפוי ב-Sandboxee באמצעותMapFd
. - המדיניות מאפשרת לחלק מה-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
כדי לקבל את ה-SandboxeeSTDOUT_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: תוכנית ארגז החול שתריץ אותו (קובץ ההפעלה).