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

שכבה מועילה, עם גבולות ידועים

הכלא של ai-jail מרחיק סוכן קוד מבוסס AI מהמפתחות שלכם, מתיקיית הבית ומשאר המחשב. מדובר ב-sandbox ברמת התהליך, ולכן הוא חולק איתכם את הקרנל. כשהקוד עוין, הוא לא מחליף מכונה וירטואלית חד-פעמית.

מה הוא נבנה לעצור

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

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

מחוץ להישג יד

  • תיקיית הבית שלכם ופרטי הגישה שבה. הסוכן מקבל תיקיית בית חדשה וריקה, כך ש-~/.ssh ו-~/.aws לא קיימים שם.
  • סודות ב-shell שלכם. משתני הסביבה מצטמצמים לרשימת היתרים קטנה, כך שטוקנים שיוצאו נשארים בחוץ.
  • הרשת. היא כבויה, ולכן שום דבר שהסוכן קורא לא יכול להישלח לשום מקום.
  • הזיכרון המשותף של המארח, שרת התצוגה ולוח ההעתקה שלכם. הפלט של הסוכן עובר דרך מסנן שזורק sequences של טרמינל שנוגעים בלוח ההעתקה או מתשאלים את הטרמינל.
  • הקלדה לתוך הטרמינל שלכם. ב-Linux נחסמת הקריאה TIOCSTI שמזייפת הקשות, וב-macOS השליטה בטרמינל מוגבלת לטרמינל האחד שנוצר עבור ההרצה.
  • הכללים שלו עצמו. קובץ .ai-jail בתוך ריפוזיטורי נחשב לא אמין: הוא יכול להדק את ה-sandbox, ולעולם לא לפתוח אותו.
איך כל שכבה עושה את זה

איפה החומה נגמרת

הכלא והמערכת שלכם עומדים על אותו קרנל. באג בקרנל הזה, בדרייבר או ב-backend של ה-sandbox הוא דרך לעקוף את החומה, ו-ai-jail לא יכול לעשות שום דבר בעניין. מכונה וירטואלית מביאה קרנל משלה, ולכן היא גבול חזק יותר.

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

מה נשאר בסיכון

  • פגיעויות בקרנל ובדרייברים. כל תהליך שרץ ב-sandbox מדבר עם אותו קרנל כמו שאר המחשב שלכם.
  • באגים באמולטור הטרמינל שלכם, בעיקר עם --terminal-passthrough, שמכבה את מסנן הפלט.
  • פגמים ב-backend של ה-sandbox עצמו: bubblewrap, Landlock ו-seccomp ב-Linux, או sandbox-exec ב-macOS.
  • סודות בתוך הפרויקט. קובץ .env בריפוזיטורי קריא, אלא אם מיסכתם אותו. כך ממסכים קבצים.
  • מיסוך מכסה רק נתיבים שקיימים כשה-sandbox עולה. קובץ סודות שנוצר מאוחר יותר, במהלך הסשן, לא מוסתר.
  • ערוצי צד (side channels) וכמה סוגים של תקשורת בין-תהליכית.
  • ב-macOS, הממשק sandbox-exec סומן על ידי Apple כ-deprecated ואינו שקול לבידוד שמתקבל ב-Linux. להבדלים ב-macOS.

מתגים שפותחים את החומה

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

מתגמה כל דבר שרץ ב-sandbox יכול לעשות אחר כך
--networkלשלוח לכל מקום את כל מה שהוא יכול לקרוא. התעבורה לא מוגבלת ואין סינון לפי דומיין.
--dockerלפעול כ-root על המחשב שלכם דרך ה-daemon של Docker.
--x11להקליט הקשות מקלדת ולצלם חלונות X11 אחרים.
--systemd-userלבקש מה-user manager של systemd להריץ שירותים על המארח.
--inherit-envלקרוא את כל סביבת ה-shell שלכם, כולל הסודות.
--agent-stateלהשתמש בהתחברות השמורה של הסוכן, למשל ~/.claude של Claude.
--audioלהקליט ולנגן אודיו כל עוד המתג דלוק.
--no-private-homeלראות את תיקיית הבית האמיתית שלכם. זו חריגה רחבה, ועדיף למפות רק את הנתיב האחד שאתם צריכים.

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

כלי sandbox שעולה בשקט במצב חלש ממה שביקשתם גרוע מכלי שעוצר עם שגיאה. במקרים האלה ai-jail עוצר.

  • קובץ הגדרות שקיים, אבל לא תקין או לא קריא.
  • קובץ .ai-jail של פרויקט שהוא symlink. כשהקובץ הגלובלי ~/.ai-jail הוא symlink, הולכים אחריו רק אם הוא מוביל לקובץ רגיל בבעלותכם, שאף אחד אחר לא יכול לכתוב אליו ושנמצא מחוץ לפרויקט.
  • הדגל --lockdown כש-Landlock, כללי מערכת הקבצים של הקרנל עצמו, חסר, חלקי או לא מצליח לחול. גם הצירוף --lockdown --no-landlock נדחה.
  • הדגל --allow-tcp-port. הממשק הזה לא מסוגל להגביל UDP, ולכן הדגל מתקבל לצורכי תאימות וההפעלה נכשלת.
  • ערך של BWRAP_BIN שמצביע על קובץ בינארי של bubblewrap שמישהו שאינו root יכול היה להחליף. הערך לא נלקח בחשבון ומודפסת אזהרה, ואם אין bubblewrap אמין ההפעלה נכשלת.

איך הפרויקט נבדק

מתחזק אחד מנהל את הפרויקט בגלוי. בהמשך מפורט מה נבדק ומה לא.

19
בדיקות אינטגרציה של בריחה מה-sandbox, שמנסות לכתוב אל /usr, לקרוא את ~/.ssh, לקרוא ל-ptrace ול-bpf, ומצפות להיכשל
720
בדיקות יחידה בעץ המקור בגרסה 1.22.0
0
בקשות רשת בזמן ההפעלה. בדיקת העדכונים היא opt-in, דרך --update-check

איך נוצרת גרסה

  • תגיות הגרסה חתומות, וה-CI מאמת כל אחת מהן מול טביעת אצבע של מפתח שמקובעת בריפוזיטורי.
  • כל GitHub Action מקובע ל-SHA של commit, וה-actions מוגבלים לרשימת היתרים.
  • ה-builds משתמשים ב-toolchain מקובע של Rust ובתלויות עם --locked.
  • הקבצים הבינאריים של macOS חתומים ועברו notarization של Apple.
  • לכל ארכיון מצורף checksum מסוג SHA-256, ושלב הפרסום בודק אותם שוב.

מה עדיין חסר, לפי מסמך הגרסאות

  • סודות החתימה והפרסום עדיין שמורים ברמת הריפוזיטורי, וצריכים לעבור לסביבות ה-release.
  • עדיין אין ruleset שמחייב חתימה על כל תגית v*.
  • האפשרות immutable releases לא מופעלת.
  • הפרסום ל-crates.io עדיין נעשה עם טוקן. מעבר ל-trusted publishing מתוכנן.
  • עם מתחזק יחיד, אין בודק שני לשינויים או לגרסאות.

לקובץ RELEASE_SECURITY.md

דיווח על פגיעות

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

שאלות נפוצות

הסוכן יכול לפרוץ החוצה?
ברירות המחדל נבנו ונבדקו כדי לחסום את הדרכים הרגילות: קבצים, סביבה, רשת ו-IPC של המארח. באג בקרנל, בדרייבר, בטרמינל או ב-backend של ה-sandbox עדיין יכול להוציא אותו. לכל sandbox ברמת התהליך יש את המגבלה הזאת, ולכן קוד עוין שייך למכונה וירטואלית חד-פעמית.
בטוח להריץ כשהרשת דלוקה?
זה בטוח יותר מלהריץ את הסוכן חשוף, כי המפתחות ותיקיית הבית שלכם עדיין לא נמצאים שם ואין מה לשלוח. כל מה שהסוכן יכול לקרוא הוא יכול גם לשלוח, ואין ב-ai-jail סינון לפי דומיין. מסכו קודם את הסודות שבתוך הפרויקט. כך ממסכים אותם.
הוא עבר ביקורת?
ביקורת פנימית, לפני גרסה 1.0, והדוחות פורסמו בריפוזיטורי. ביקורת של צד שלישי לא נערכה. הקוד פתוח ברישיון GPL 3.0, ודיווחים פרטיים על פגיעויות יתקבלו בברכה.

שימו את הסוכן מאחורי סורגים

כל ai-jail הוא קובץ בינארי אחד, בלי daemon ובלי root. מוסיפים מילה אחת לפני הפקודה שאתם מריצים ממילא.

terminal
brew tap akitaonrails/tap && brew install ai-jailai-jail claude