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

מה קורה כשמקלידים ai-jail claude

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

מה קורה בזמן ההפעלה

זה לוקח רגע, בכל פעם מחדש, ואחר כך שום דבר לא ממשיך לרוץ ברקע.

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

הוא קורא את הכללים שלכם

הקובץ ~/.ai-jail שלכם נחשב אמין. קובץ .ai-jail שנמצא בתוך הפרויקט נחשב לא אמין: הוא יכול להדק את ה-sandbox, ולעולם לא לפתוח אותו. דגלים בשורת הפקודה גוברים על שניהם.

הוא בונה את ה-sandbox

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

הוא מעלה את הסוכן בפנים

הסוכן יורש את החומות, וכך גם כל סקריפט, חבילה ושרת MCP שהוא מפעיל. כשהסוכן יוצא, גם ai-jail יוצא.

כל הדגלים ומפתחות ההגדרה

השכבות, מבחוץ פנימה

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

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

    bubblewrap
    מה זה
    בעזרת namespace הקרנל נותן לתהליך תמונה פרטית משלו של המערכת. את ה-namespaces יוצר bubblewrap לבקשת ai-jail. זה אותו כלי קטן שמשמש את Flatpak לבידוד אפליקציות דסקטופ, והוא לא צריך root.
    מה זה עוצר
    הסוכן מקבל רשימת תהליכים משלו ושם מארח משלו (ai-sandbox). אין לו ערוצי תקשורת בין-תהליכית מול תוכנות של המארח, ואין לו רשת אלא אם העברתם --network. אם ai-jail מת, כל מה שבפנים מת יחד איתו.
  2. מערכת קבצים

    עיגונים
    מה זה
    בתוך ה-namespace קיים רק מה ש-ai-jail מעגן. הפרויקט זמין לקריאה וכתיבה בנתיב האמיתי שלו, ותיקיות מערכת כמו /usr זמינות לקריאה בלבד. תיקיית הבית ו-/tmp חדשות ומוחזקות בזיכרון.
    מה זה עוצר
    התיקיות ~/.ssh, ~/.aws, ~/.gnupg, ~/.docker והפרופילים של הדפדפן נמצאים ברשימה מובנית של נתיבים שלעולם לא מעוגנים. כל מה שנכתב מחוץ לפרויקט נעלם בסוף הסשן.
  3. Landlock

    קרנל 5.13 ומעלה
    מה זה
    היכולת Landlock של קרנל Linux מאפשרת לתהליך לוותר לצמיתות על גישה לקבצים. בעזרתה ai-jail אוכף שוב את כללי מערכת הקבצים, הפעם כרשימת היתרים שנייה בתוך הקרנל.
    מה זה עוצר
    טעות או תרגיל בשכבת העיגון לא מספיקים כדי להגיע לנתיב שלא ברשימה, ומה שמוגדר לקריאה בלבד נשאר כזה. בקרנלים ישנים מדי בשביל Landlock, הכלי ai-jail מודיע על כך וממשיך עם שאר השכבות.
  4. seccomp

    קריאות מערכת
    מה זה
    תוכנות מבקשות דברים מהקרנל דרך קריאות מערכת (syscalls). המנגנון seccomp מסנן את הקריאות האלה, ו-ai-jail משתמש בו כדי לסרב לקריאות שסוכן קוד אף פעם לא צריך.
    מה זה עוצר
    המסנן חוסם את ptrace, mount, bpf, מודולי קרנל, io_uring, ה-keyring של הקרנל, raw sockets, וגם את TIOCSTI, הקריאה שמקלידה תווים לתוך טרמינל. זו רשימת חסימה בכוונה, כדי שקומפיילרים ו-runtimes ימשיכו לעבוד.
  5. מגבלות משאבים

    rlimits
    מה זה
    תקרות שהקרנל אוכף על הכמות שעץ תהליכים רשאי לצרוך: 4,096 תהליכים ו-65,536 קבצים פתוחים, בלי core dumps. במצב lockdown התקרות יורדות ל-1,024 ול-4,096.
    מה זה עוצר
    סקריפט שיצא משליטה או fork bomb נתקעים בתקרה בתוך הכלא ולא מקפיאים לכם את המחשב. הסוכן לא יכול להעלות את המגבלות בחזרה.
  6. רשימת היתרים לסביבה

    מה שנכנס
    מה זה
    ה-shell שלכם מלא במשתנים, וחלק מהם הם מפתחות API. לפני ההפעלה ai-jail מנקה את הסביבה ומעביר רק רשימה קצרה: PATH, HOME, TERM, הגדרות locale, פרוקסי ותעודות.
    מה זה עוצר
    טוקנים ופרטי גישה לענן שיוצאו ב-shell שלכם לא מגיעים לסוכן. כשמשימה צריכה אחד מהם, מעבירים אותו לפי שם בעזרת --env.
  7. פרוקסי לטרמינל

    מה שיוצא
    מה זה
    הסוכן רץ מאחורי פסאודו-טרמינל משלו, וכל מה שהוא מדפיס עובר דרך parser של טרמינל לפני שהוא מגיע למסך שלכם. אותו פרוקסי מצייר את שורת הסטטוס של ai-jail בשורה התחתונה.
    מה זה עוצר
    הפרוקסי מסנן escape sequences שנוגעים בלוח ההעתקה שלכם או מתשאלים את הטרמינל. בתוך tmux או zellij הוא מכבה את עצמו, כי טרמינלים מקוננים רבים על שינוי גודל.

ב-macOS החומה דקה יותר

ב-macOS אין namespaces, אין Landlock ואין seccomp. אותה מדיניות הופכת לפרופיל של sandbox-exec, ה-sandbox המובנה של Apple. התיעוד של ai-jail אומר במפורש שזה לא שקול לבידוד שמתקבל ב-Linux.

שני חלקים. משמאל, Linux: שבב הסוכן והפרויקט שלו בתוך חמש חומות זו בתוך זו. מימין, macOS: אותו שבב ואותו פרויקט בתוך חומה אחת, עם הכיתוב פרופיל אחד.
ב-macOS מקבלים את אותה מדיניות ואת אותם דגלים, מאחורי פחות חומות.
LinuxmacOS
Backendהכלי bubblewrap, ואחריו Landlock, seccomp ומגבלות משאביםsandbox-exec עם פרופיל שנוצר לכל הפעלה. Apple סימנה אותו כ-deprecated, ואין משהו טוב יותר בלי kernel extensions.
תיקיית הביתתיקיית בית חדשה בזיכרון. התיקייה האמיתית לא מעוגנת.הפרופיל מתחיל בלי הרשאות קריאה גלובליות, ואז מתיר רק את הנתיבים שהסוכן צריך. כך תיקיית הבית האמיתית נשארת סגורה.
/tmpפרטית, נזרקת ביציאההתיקייה /tmp של המארח, כי אין mount namespace. המשתנה TMPDIR מצביע על תיקייה פרטית שנוצרת להפעלה, וזה נתיב ה-temp היחיד שמותר.
מיפויי copy-on-writeעם --overlay-map הסוכן כותב לעותקמטופל כמיפוי לקריאה בלבד
רשתכבויה כברירת מחדל, ב-network namespace משלהכבויה כברירת מחדל. במצב lockdown היא חסומה תמיד, גם עם --network.
תוכנות אחרותבלתי נראות: רשימת תהליכים נפרדת, בלי IPC של המארחהגישה אל Mach, IOKit ו-IPC של המארח נדחית, אלא אם העברתם --macos-host-ipc

למה דווקא אבני הבניין האלה

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

אפשרותלמה לא
Firejailמסוגל לעשות את העבודה, אבל זה קובץ בינארי עם setuid root, וכמה CVEs נובעים מהתכנון הזה. לעומתו, bubblewrap עובד בלי root.
לשכתב את bubblewrap ב-Rustיותר מ-500 שורות של קוד רגיש מבחינת אבטחה שצריך לתחזק ולתקן לבד, רק כדי לחסוך תלות של בערך 50 KB שמקבלת תיקונים מה-upstream.
nsjailמסוגל, אבל נבנה לשרתים, מוגדר דרך קובצי protobuf, וארוז בפחות הפצות.
systemd-nspawnדורש systemd, ולכן נכשל בתוך קונטיינרים ובמערכות שאין בהן systemd.

להערכה המלאה

קטן מספיק כדי לקרוא אותו

הכלי כולו הוא תוכנת Rust סינכרונית אחת, בלי async runtime, בלי daemon ובלי image של קונטיינר.

1
קובץ בינארי להתקנה
8
תלויות ישירות
720
בדיקות יחידה בקוד המקור
19
בדיקות שמנסות לברוח מ-sandbox אמיתי

נספר בריפוזיטורי של ai-jail בגרסה 1.22.0.

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

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

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