Tools
تأییدهای اجرا — پیشرفته
موضوعات پیشرفتهٔ تأیید exec: مسیر سریع safeBins، اتصال مفسر/زمان اجرا، و بازارسال تأیید به کانالهای چت (از جمله تحویل بومی).
برای سیاست اصلی و جریان تأیید، تأییدهای Exec را ببینید.
باینریهای امن (فقط stdin)
tools.exec.safeBins فهرست کوچکی از باینریهای فقط stdin را تعریف میکند (برای
مثال cut) که میتوانند در حالت فهرست مجاز بدون ورودیهای صریح فهرست مجاز اجرا شوند.
باینریهای امن آرگومانهای فایلی موضعی و توکنهای شبیه مسیر را رد میکنند، بنابراین
فقط میتوانند روی جریان ورودی عمل کنند. این را بهعنوان یک مسیر سریع محدود برای
فیلترهای جریان در نظر بگیرید، نه یک فهرست اعتماد عمومی.
باینریهای امن پیشفرض:
cut, uniq, head, tail, tr, wc
grep و sort در فهرست پیشفرض نیستند. اگر آنها را فعال میکنید، برای گردشکارهای
غیر stdin آنها ورودیهای صریح فهرست مجاز را نگه دارید. برای grep در حالت باینری امن،
الگو را با -e/--regexp ارائه کنید؛ شکل الگوی موضعی رد میشود
تا عملوندهای فایل نتوانند بهعنوان موضعیهای مبهم پنهان شوند.
اعتبارسنجی Argv و پرچمهای ردشده
اعتبارسنجی فقط از شکل argv قطعی است (بدون بررسی وجود فایل در سیستم فایل میزبان)، که از رفتار اوراکل وجود فایل ناشی از تفاوتهای اجازه/رد جلوگیری میکند. گزینههای فایلمحور برای باینریهای امن پیشفرض رد میشوند؛ گزینههای بلند بهصورت fail-closed اعتبارسنجی میشوند (پرچمهای ناشناخته و اختصارهای مبهم رد میشوند).
پرچمهای ردشده بر اساس پروفایل باینری امن:
grep:--dereference-recursive,--directories,--exclude-from,--file,--recursive,-R,-d,-f,-rjq:--argfile,--from-file,--library-path,--rawfile,--slurpfile,-L,-fsort:--compress-program,--files0-from,--output,--random-source,--temporary-directory,-T,-owc:--files0-from
باینریهای امن همچنین توکنهای argv را در زمان اجرا برای بخشهای فقط stdin بهصورت
متن لفظی در نظر میگیرند (بدون globbing و بدون گسترش $VARS)، بنابراین الگوهایی
مانند * یا $HOME/... نمیتوانند برای پنهانکردن خواندن فایل استفاده شوند.
دایرکتوریهای باینری مورد اعتماد
باینریهای امن باید از دایرکتوریهای باینری مورد اعتماد حل شوند (پیشفرضهای سیستم بهعلاوه
tools.exec.safeBinTrustedDirs اختیاری). ورودیهای PATH هرگز بهصورت خودکار مورد اعتماد نیستند.
دایرکتوریهای مورد اعتماد پیشفرض عمداً حداقلی هستند: /bin، /usr/bin. اگر
اجرایی باینری امن شما در مسیرهای مدیر بسته/کاربر قرار دارد (برای مثال
/opt/homebrew/bin، /usr/local/bin، /opt/local/bin، /snap/bin)، آنها را
بهصراحت به tools.exec.safeBinTrustedDirs اضافه کنید.
زنجیرهسازی Shell، wrapperها، و multiplexerها
زنجیرهسازی Shell (&&، ||، ;) زمانی مجاز است که هر بخش سطح بالا
فهرست مجاز را برآورده کند (از جمله باینریهای امن یا مجوز خودکار skill). تغییرمسیرها
در حالت فهرست مجاز همچنان پشتیبانی نمیشوند. جایگزینی دستور ($() / backticks) در
هنگام تحلیل فهرست مجاز رد میشود، حتی داخل نقلقولهای دوتایی؛ اگر به متن لفظی
$() نیاز دارید از نقلقول تکی استفاده کنید.
در تأییدهای companion-app در macOS، متن خام shell که شامل کنترل shell یا
نحو گسترش (&&، ||، ;، |، `، $، <، >، (، )) باشد
بهعنوان عدم تطابق با فهرست مجاز در نظر گرفته میشود، مگر اینکه خود باینری shell در فهرست مجاز باشد.
برای wrapperهای shell (bash|sh|zsh ... -c/-lc)، بازنویسیهای env با دامنهٔ درخواست
به یک فهرست مجاز صریح کوچک کاهش مییابند (TERM، LANG، LC_*، COLORTERM،
NO_COLOR، FORCE_COLOR).
برای تصمیمهای allow-always در حالت فهرست مجاز، wrapperهای dispatch شناختهشده (env،
nice، nohup، stdbuf، timeout) مسیر اجرایی داخلی را بهجای مسیر wrapper پایدار میکنند.
Multiplexerهای shell (busybox، toybox) برای اپلتهای shell (sh، ash و غیره)
به همان شکل باز میشوند. اگر یک wrapper یا multiplexer را نتوان با ایمنی باز کرد،
هیچ ورودی فهرست مجازی بهصورت خودکار پایدار نمیشود.
اگر مفسرهایی مانند python3 یا node را در فهرست مجاز قرار میدهید، بهتر است
tools.exec.strictInlineEval=true را فعال کنید تا eval درونخطی همچنان به یک
تأیید صریح نیاز داشته باشد. در حالت سختگیرانه، allow-always همچنان میتواند
فراخوانیهای بیخطر مفسر/اسکریپت را پایدار کند، اما حاملهای eval درونخطی
بهصورت خودکار پایدار نمیشوند.
باینریهای امن در برابر فهرست مجاز
| موضوع | tools.exec.safeBins |
فهرست مجاز (exec-approvals.json) |
|---|---|---|
| هدف | اجازهٔ خودکار به فیلترهای محدود stdin | اعتماد صریح به اجراییهای مشخص |
| نوع تطابق | نام اجرایی + سیاست argv باینری امن | glob مسیر اجرایی حلشده، یا glob نام دستور خام برای دستورهایی که از PATH فراخوانی میشوند |
| دامنهٔ آرگومان | محدودشده توسط پروفایل باینری امن و قواعد توکن لفظی | تطابق مسیر بهصورت پیشفرض؛ argPattern اختیاری میتواند argv تحلیلشده را محدود کند |
| نمونههای رایج | head, tail, tr, wc |
jq, python3, node, ffmpeg, CLIهای سفارشی |
| بهترین کاربرد | تبدیلهای متنی کمریسک در pipelineها | هر ابزاری با رفتار یا اثرات جانبی گستردهتر |
محل پیکربندی:
safeBinsاز پیکربندی میآید (tools.exec.safeBinsیاagents.list[].tools.exec.safeBinsمخصوص هر عامل).safeBinTrustedDirsاز پیکربندی میآید (tools.exec.safeBinTrustedDirsیاagents.list[].tools.exec.safeBinTrustedDirsمخصوص هر عامل).safeBinProfilesاز پیکربندی میآید (tools.exec.safeBinProfilesیاagents.list[].tools.exec.safeBinProfilesمخصوص هر عامل). کلیدهای پروفایل مخصوص هر عامل کلیدهای سراسری را بازنویسی میکنند.- ورودیهای فهرست مجاز در
~/.openclaw/exec-approvals.jsonمحلی میزبان، زیرagents.<id>.allowlistقرار دارند (یا از طریق Control UI /openclaw approvals allowlist ...). openclaw security auditوقتی باینریهای مفسر/زمان اجرا بدون پروفایل صریح درsafeBinsظاهر شوند، باtools.exec.safe_bins_interpreter_unprofiledهشدار میدهد.openclaw doctor --fixمیتواند ورودیهای سفارشیِ جاافتادهٔsafeBinProfiles.<bin>را بهصورت{}بسازد (پس از آن بازبینی و سختگیرانهتر کنید). باینریهای مفسر/زمان اجرا بهصورت خودکار ساخته نمیشوند.
نمونهٔ پروفایل سفارشی:
OC_I18N_900000
اگر jq را صریحاً وارد safeBins کنید، OpenClaw همچنان builtin مربوط به env را در حالت باینری امن رد میکند
تا jq -n env نتواند محیط فرایند میزبان را بدون مسیر صریح فهرست مجاز
یا اعلان تأیید dump کند.
دستورهای مفسر/زمان اجرا
اجرای مفسر/زمان اجرا که پشتوانهٔ تأیید دارد عمداً محافظهکارانه است:
- زمینهٔ دقیق argv/cwd/env همیشه متصل میشود.
- شکلهای مستقیم فایل runtime و اسکریپت shell مستقیم، در حد بهترین تلاش، به یک snapshot مشخص از یک فایل محلی متصل میشوند.
- شکلهای رایج wrapper مدیر بسته که همچنان به یک فایل محلی مستقیم حل میشوند (برای مثال
pnpm exec،pnpm node،npm exec،npx) پیش از اتصال باز میشوند. - اگر OpenClaw نتواند دقیقاً یک فایل محلی مشخص را برای یک دستور مفسر/زمان اجرا شناسایی کند (برای مثال اسکریپتهای بسته، شکلهای eval، زنجیرههای loader مخصوص runtime، یا شکلهای چندفایلی مبهم)، اجرای پشتوانهدار با تأیید رد میشود، بهجای اینکه پوشش معناییای را ادعا کند که ندارد.
- برای آن گردشکارها، sandboxing، یک مرز میزبان جداگانه، یا یک فهرست مجاز/گردشکار کامل و مورد اعتماد صریح را ترجیح دهید که در آن operator معنای گستردهتر runtime را میپذیرد.
وقتی تأییدها لازم باشند، ابزار exec بلافاصله با یک شناسهٔ تأیید برمیگردد. از آن شناسه برای
همبستهسازی رویدادهای بعدی سیستم (Exec finished / Exec denied) استفاده کنید. اگر پیش از
timeout هیچ تصمیمی نرسد، درخواست بهعنوان timeout تأیید در نظر گرفته میشود و بهعنوان دلیل رد نمایش داده میشود.
رفتار تحویل followup
پس از پایان یک exec ناهمگام تأییدشده، OpenClaw یک نوبت followup از نوع agent به همان session میفرستد.
- اگر یک هدف تحویل خارجی معتبر وجود داشته باشد (کانال قابل تحویل بهعلاوه هدف
to)، تحویل followup از همان کانال استفاده میکند. - در جریانهای فقط webchat یا session داخلی بدون هدف خارجی، تحویل followup فقط در session میماند (
deliver: false). - اگر یک caller تحویل خارجی سختگیرانه را صریحاً درخواست کند اما کانال خارجی قابل حل وجود نداشته باشد، درخواست با
INVALID_REQUESTشکست میخورد. - اگر
bestEffortDeliverفعال باشد و هیچ کانال خارجیای قابل حل نباشد، تحویل بهجای شکست به حالت فقط session تنزل مییابد.
بازارسال تأیید به کانالهای چت
میتوانید اعلانهای تأیید exec را به هر کانال چت (از جمله کانالهای Plugin) بازارسال کنید و
آنها را با /approve تأیید کنید. این کار از pipeline عادی تحویل خروجی استفاده میکند.
پیکربندی:
OC_I18N_900001
پاسخ در چت:
OC_I18N_900002
دستور /approve هم تأییدهای exec و هم تأییدهای Plugin را مدیریت میکند. اگر ID با تأیید exec در انتظار مطابقت نداشته باشد، بهصورت خودکار تأییدهای Plugin را بررسی میکند.
بازارسال تأیید Plugin
بازارسال تأیید Plugin از همان pipeline تحویل تأییدهای exec استفاده میکند، اما پیکربندی مستقل
خود را زیر approvals.plugin دارد. فعال یا غیرفعالکردن یکی روی دیگری اثر نمیگذارد.
OC_I18N_900003
شکل پیکربندی با approvals.exec یکسان است: enabled، mode، agentFilter،
sessionFilter و targets به همان روش کار میکنند.
کانالهایی که از پاسخهای تعاملی مشترک پشتیبانی میکنند، همان دکمههای تأیید را برای هر دو تأیید exec و
Plugin نمایش میدهند. کانالهای بدون UI تعاملی مشترک به متن ساده با دستورالعملهای /approve
بازمیگردند.
درخواستهای تأیید Plugin ممکن است تصمیمهای در دسترس را محدود کنند. سطوح تأیید از مجموعهٔ تصمیمهای
اعلامشدهٔ درخواست استفاده میکنند، و Gateway تلاش برای ارسال تصمیمی را که ارائه نشده بود رد میکند.
تأییدهای همان چت در هر کانال
وقتی یک درخواست تأیید exec یا Plugin از یک سطح چت قابل تحویل سرچشمه میگیرد، همان چت
اکنون میتواند بهصورت پیشفرض آن را با /approve تأیید کند. این علاوه بر جریانهای موجود Web UI و terminal UI،
برای کانالهایی مانند Slack، Matrix و Microsoft Teams نیز اعمال میشود.
این مسیر دستور متنی مشترک از مدل عادی احراز هویت کانال برای همان گفتگو استفاده میکند. اگر چت مبدأ از قبل بتواند دستورها را ارسال و پاسخها را دریافت کند، درخواستهای تأیید دیگر فقط برای در انتظار ماندن به adapter تحویل بومی جداگانه نیاز ندارند.
Discord و Telegram نیز از /approve در همان چت پشتیبانی میکنند، اما این کانالها حتی وقتی
تحویل تأیید بومی غیرفعال باشد، همچنان از فهرست تأییدکنندگان حلشدهٔ خود برای مجوزدهی استفاده میکنند.
برای Telegram و دیگر مشتریان تأیید بومی که Gateway را مستقیماً فراخوانی میکنند، این fallback عمداً به شکستهای «تأیید یافت نشد» محدود شده است. یک رد/خطای واقعی تأیید exec بیصدا بهعنوان تأیید Plugin دوباره تلاش نمیشود.
تحویل تأیید بومی
برخی کانالها میتوانند بهعنوان کلاینتهای تأیید بومی نیز عمل کنند. کلاینتهای بومی، DMهای تأییدکنندگان، انتشار به چت مبدأ، و تجربه کاربری تعاملی تأیید مخصوص کانال را روی جریان مشترک /approve در همان چت اضافه میکنند.
وقتی کارتها/دکمههای تأیید بومی در دسترس باشند، آن رابط بومی مسیر اصلی روبهروی عامل است. عامل نباید همزمان یک دستور ساده تکراری /approve را در چت بازتاب دهد، مگر اینکه نتیجه ابزار بگوید تأییدهای چتی در دسترس نیستند یا تأیید دستی تنها مسیر باقیمانده است.
اگر یک کلاینت تأیید بومی پیکربندی شده باشد اما هیچ زماناجرای بومی برای کانال مبدأ فعال نباشد، OpenClaw اعلان قطعی محلی /approve را قابل مشاهده نگه میدارد. اگر زماناجرای بومی فعال باشد و ارسال را تلاش کند اما هیچ هدفی کارت را دریافت نکند، OpenClaw یک اعلان جایگزین در همان چت با دستور دقیق /approve <id> <decision> میفرستد تا درخواست همچنان قابل حل باشد.
مدل عمومی:
- سیاست اجرای میزبان همچنان تعیین میکند که آیا تأیید exec لازم است یا نه
approvals.execارسال اعلانهای تأیید به مقصدهای چتی دیگر را کنترل میکندchannels.<channel>.execApprovalsکنترل میکند که آیا آن کانال بهعنوان یک کلاینت تأیید بومی عمل میکند یا نه
کلاینتهای تأیید بومی وقتی همه این موارد درست باشند، تحویل ابتدا-به-DM را خودکار فعال میکنند:
- کانال از تحویل تأیید بومی پشتیبانی کند
- تأییدکنندگان بتوانند از
execApprovals.approversصریح یا هویت مالک مانندcommands.ownerAllowFromتشخیص داده شوند channels.<channel>.execApprovals.enabledتنظیم نشده باشد یا"auto"باشد
برای غیرفعال کردن صریح یک کلاینت تأیید بومی، enabled: false را تنظیم کنید. برای فعالسازی اجباری آن وقتی تأییدکنندگان تشخیص داده میشوند، enabled: true را تنظیم کنید. تحویل عمومی به چت مبدأ از طریق channels.<channel>.execApprovals.target همچنان صریح باقی میماند.
پرسش متداول: چرا برای تأییدهای چتی دو پیکربندی تأیید exec وجود دارد؟
- Discord:
channels.discord.execApprovals.* - Slack:
channels.slack.execApprovals.* - Telegram:
channels.telegram.execApprovals.*
این کلاینتهای تأیید بومی، مسیریابی DM و انتشار اختیاری به کانال را روی جریان مشترک /approve در همان چت و دکمههای تأیید مشترک اضافه میکنند.
رفتار مشترک:
- Slack، Matrix، Microsoft Teams، و چتهای قابلتحویل مشابه از مدل احراز هویت معمول کانال برای
/approveدر همان چت استفاده میکنند - وقتی یک کلاینت تأیید بومی خودکار فعال میشود، هدف پیشفرض تحویل بومی DMهای تأییدکنندگان است
- برای Discord و Telegram، فقط تأییدکنندگان تشخیصدادهشده میتوانند تأیید یا رد کنند
- تأییدکنندگان Discord میتوانند صریح باشند (
execApprovals.approvers) یا ازcommands.ownerAllowFromاستنباط شوند - تأییدکنندگان Telegram میتوانند صریح باشند (
execApprovals.approvers) یا ازcommands.ownerAllowFromاستنباط شوند - تأییدکنندگان Slack میتوانند صریح باشند (
execApprovals.approvers) یا ازcommands.ownerAllowFromاستنباط شوند - دکمههای بومی Slack نوع شناسه تأیید را حفظ میکنند، بنابراین شناسههای
plugin:میتوانند تأییدهای Plugin را بدون یک لایه جایگزین دوم محلیِ Slack حل کنند - مسیریابی بومی DM/کانال و میانبرهای واکنش در Matrix هم تأییدهای exec و هم تأییدهای Plugin را مدیریت میکنند؛ مجوزدهی Plugin همچنان از
channels.matrix.dm.allowFromمیآید - اعلانهای بومی Matrix محتوای رویداد سفارشی
com.openclaw.approvalرا در رویداد اعلان اول شامل میشوند تا کلاینتهای Matrix آگاه از OpenClaw بتوانند وضعیت ساختاریافته تأیید را بخوانند، در حالی که کلاینتهای معمولی جایگزین متنی ساده/approveرا نگه میدارند - درخواستدهنده لازم نیست تأییدکننده باشد
- چت مبدأ وقتی از قبل از دستورها و پاسخها پشتیبانی میکند، میتواند مستقیماً با
/approveتأیید کند - دکمههای تأیید بومی Discord بر اساس نوع شناسه تأیید مسیریابی میکنند: شناسههای
plugin:مستقیماً به تأییدهای Plugin میروند، و هر چیز دیگر به تأییدهای exec میرود - دکمههای تأیید بومی Telegram همان جایگزین محدود exec-به-Plugin را مانند
/approveدنبال میکنند - وقتی
targetبومی تحویل به چت مبدأ را فعال میکند، اعلانهای تأیید متن دستور را شامل میشوند - تأییدهای exec معلق بهطور پیشفرض پس از ۳۰ دقیقه منقضی میشوند
- اگر هیچ رابط کاربری اپراتور یا کلاینت تأیید پیکربندیشدهای نتواند درخواست را بپذیرد، اعلان به
askFallbackبرمیگردد
دستورهای گروهی حساس و فقط-مالک مانند /diagnostics و /export-trajectory از مسیریابی خصوصی مالک برای اعلانهای تأیید و نتایج نهایی استفاده میکنند. OpenClaw ابتدا یک مسیر خصوصی را روی همان سطحی امتحان میکند که مالک دستور را در آن اجرا کرده است. اگر آن سطح مسیر خصوصی مالک نداشته باشد، به اولین مسیر مالک در دسترس از commands.ownerAllowFrom برمیگردد، بنابراین یک دستور گروهی Discord همچنان میتواند تأیید و نتیجه را به DM مالک در Telegram بفرستد وقتی Telegram بهعنوان رابط خصوصی اصلی پیکربندی شده باشد. چت گروهی فقط یک تأیید کوتاه دریافت میکند.
Telegram بهطور پیشفرض از DMهای تأییدکنندگان استفاده میکند (target: "dm"). وقتی میخواهید اعلانهای تأیید در چت/موضوع Telegram مبدأ نیز ظاهر شوند، میتوانید به channel یا both تغییر دهید. برای موضوعهای انجمن Telegram، OpenClaw موضوع را برای اعلان تأیید و پیگیری پس از تأیید حفظ میکند.
ببینید:
جریان IPC در macOS
OC_I18N_900004 یادداشتهای امنیتی:
- حالت سوکت یونیکس
0600، توکن ذخیرهشده درexec-approvals.json. - بررسی همتای همان-UID.
- چالش/پاسخ (nonce + توکن HMAC + هش درخواست) + TTL کوتاه.
مرتبط
- تأییدهای exec — سیاست اصلی و جریان تأیید
- ابزار exec
- حالت ارتقایافته
- Skills — رفتار اجازه خودکار متکی به مهارت