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

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

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

למהנדס שרוצה לדעת מה נאכף. לכל השאר מספיקים הפסקה הראשונה והתמונה הראשונה.

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

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

↔ החליקו לצדדים כדי לראות את התרשים המלא

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

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

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

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

כל השכבות שמתוארות למטה מוקמות עוד לפני שהסוכן קיים, וה-toolchains שיש לכם (mise, cargo, ה-caches של npm ואחרים) ממופים לקריאה בלבד או לתוך cache ששייך לכלא. אם קובץ הגדרות לא קריא או לא תקין, ai-jail עוצר ולא עולה עם כללים חלשים יותר.

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

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

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

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

כל הפעלה בוחרת אחד משלושה מצבי רשת. ברירת המחדל היא המצב ההדוק ביותר: בלי יציאה, חוץ ממה שהפרוקסי המסנן מעביר, כלומר ה-host של ה-API של סוכן מוכר בשתי הפלטפורמות, וב-Linux כשה-toolchains דלוקים (ברירת המחדל) גם רשימה קצרה של registries של חבילות. שני האחרים הם דגלים שמעבירים בכוונה.

↔ החליקו לצדדים כדי לראות את התרשים המלא

כבויה היא ברירת המחדל, עם שער אחד ל-host של ה-API של הסוכן עצמו, וב-Linux גם ל-registries. מסוננת פותחת שער רק ל-hosts בשם. פתוחה מסירה את החומה בצד הרשת.

כבויה

ברירת המחדל. ה-sandbox מקבל network namespace פרטי בלי שום יציאה, חוץ מדרך הפרוקסי המסנן. לסוכן מוכר הפרוקסי מעביר את ה-host של ה-API שלו, ב-Linux וב-macOS, ולכן ai-jail claude חשוף עובד. ב-Linux, כשה-toolchains דלוקים (ברירת המחדל), הוא מעביר גם רשימה קבועה של registries של חבילות, ולכן npm install ו-cargo build עובדים; ב-macOS ה-registries נשארים סגורים. --no-network מנתק לגמרי.

מסוננת

--allow-host HOST, אפשר לחזור עליו. ה-namespace נשאר סגור. גשר קטן בפנים מעביר את התעבורה לפרוקסי CONNECT בחוץ, שמחייג רק ל-hosts שברשימה ולתת-הדומיינים שלהם. הפרוקסי פותר כל שם פעם אחת, בחוץ, ומחייג לכתובת שבדק. הכלי ai-jail מגדיר http_proxy בפנים, ותוכנית שמתעלמת ממנו לא מגיעה לשום מקום.

פתוחה

--network. החומה נעלמת בצד הרשת, והסוכן יכול לשלוח החוצה כל מה שהוא יכול לקרוא.

LinuxmacOS
מה מגדר במצב מסונןה-network namespace עצמו, ועוד הגשר שבתוכוכלל sandbox-exec אחד שמתיר חיבורים יוצאים רק לפורט של הפרוקסי
DNS בתוך ה-sandboxנכשל. הפרוקסי פותר שמות בחוץ.ה-resolver של המערכת לא מגודר, ולכן נשאר ערוץ DNS ברוחב פס נמוך
הדגלים, ההסתייגויות ומה הפרוקסי מתעד

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

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

↔ החליקו לצדדים כדי לראות את התרשים המלא

כל חומה מכסה על טעות בחומה שמחוץ לה.
  1. Namespaces

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

    עיגונים
    מה זה
    בתוך ה-namespace קיים רק מה ש-ai-jail מעגן. הפרויקט זמין לקריאה וכתיבה בנתיב האמיתי שלו, ותיקיות מערכת כמו /usr זמינות לקריאה בלבד. תיקיית הבית ו-/tmp חדשות ומוחזקות בזיכרון. ה-toolchains שיש לכם (mise, cargo, ה-caches של npm) ממופים לתוך תיקיית הבית החדשה הזו, לקריאה בלבד או כ-cache ששייך לכלא.
    מה זה עוצר
    התיקיות ~/.ssh, ~/.aws, ~/.gnupg, ~/.docker והפרופילים של הדפדפן נמצאים ברשימה מובנית של נתיבים שלעולם לא מעוגנים. תיקיית המצב של ה-harness עצמו, למשל ~/.claude של Claude, היא היוצא מן הכלל: ai-jail מעגן אותה כברירת מחדל לקריאה וכתיבה כדי שהסוכן יעלה מחובר, ו---no-agent-state משאיר אותה בחוץ. כל מה שנכתב מחוץ לפרויקט נעלם בסוף הסשן.
  3. Landlock

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

    קריאות מערכת
    מה זה
    תוכנות מבקשות דברים מהקרנל דרך קריאות מערכת (syscalls). המנגנון seccomp מסנן את הקריאות האלה, ו-ai-jail משתמש בו כדי לסרב לקריאות שסוכן קוד אף פעם לא צריך.
    מה זה עוצר
    המסנן חוסם את ptrace, mount, bpf, מודולי קרנל, io_uring, ה-keyring של הקרנל, raw sockets, וגם את TIOCSTI, קריאה שיכולה להקליד תווים לתוך הטרמינל שלכם. זו רשימת חסימה בכוונה, כדי שקומפיילרים ו-runtimes ימשיכו לעבוד. התהליך היחיד שעולה לפני ש-Landlock ו-seccomp חלים הוא הגשר הקטן שמוציא החוצה את תעבורת הרשת המסוננת, ולכן רק הוא נשאר בלי הגבלה.
  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 שלכם לא מגיעים לסוכן, חוץ ממפתח ה-API של ה-harness שהופעל, למשל ANTHROPIC_API_KEY עבור Claude, שמועתק כברירת מחדל יחד עם ההתחברות שלו; --no-agent-state עוצר את זה. כשמשימה צריכה משתנה אחר, מעבירים אותו לפי שם בעזרת --env.
  7. פרוקסי לטרמינל

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

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

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

↔ החליקו לצדדים כדי לראות את התרשים המלא

ב-macOS מקבלים את אותה מדיניות ואת אותם דגלים, מאחורי פחות חומות.
LinuxmacOS
Backendהכלי bubblewrap, ואחריו Landlock, seccomp ומגבלות משאביםsandbox-exec עם פרופיל שנוצר לכל הפעלה. Apple סימנה אותו כ-deprecated, ואין משהו טוב יותר בלי kernel extensions.
תיקיית הביתתיקיית בית חדשה בזיכרון. התיקייה האמיתית לא מעוגנת.הפרופיל מתחיל בלי הרשאות קריאה גלובליות, ואז מתיר רק את הנתיבים שהסוכן צריך. כך תיקיית הבית האמיתית נשארת סגורה.
/tmpפרטית, נזרקת ביציאההתיקייה /tmp של המארח, כי אין mount namespace. המשתנה TMPDIR מצביע על תיקייה פרטית שנוצרת להפעלה, וזה נתיב ה-temp היחיד שמותר.
מיפויי copy-on-writeעם --overlay-map הסוכן כותב לעותקמטופל כמיפוי לקריאה בלבד
רשתסגורה כברירת מחדל: בלי יציאה, חוץ מה-host של ה-API של סוכן מוכר ומה-registries של החבילות שמותרים כשה-toolchains דלוקים. --allow-host או --network פותחים יותר, --forward-port מעביר פורט אחד מה-loopback של המארח, --no-network סוגר הכול. תחת --lockdown הרשת הפתוחה חסומה תמיד, גם עם --network.אותה ברירת מחדל ואותם דגלים, כולל ה-host של ה-API של הסוכן המוכר, אבל בלי --forward-port, בלי ה-registries ובלי מיפויי ה-cache של ה-toolchains, שקיימים רק ב-Linux. גם כאן lockdown חוסם את הרשת הפתוחה.
תוכנות אחרותבלתי נראות: רשימת תהליכים נפרדת, בלי 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
קובץ בינארי להתקנה
11
תלויות ישירות
959
בדיקות יחידה בקוד המקור
23
בדיקות שמנסות לברוח מ-sandbox אמיתי

התלויות נספרו בריפוזיטורי של ai-jail בגרסה 2.9.0; הבדיקות בגרסה 2.9.0.

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

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

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