تصور کنید یک برنامهنویس برای جلوگیری از دسترسی عامل هوش مصنوعی به فایلهای حساس، در دستوراتش مینویسد «فایلهای خارج از پوشه پروژه را تغییر نده». این جمله در واقع یک توصیه است، نه یک کنترل امنیتی سختگیرانه. به نقل از راهنمای فنی منتشر شده در dev.to در ۱۰ اوت ۲۰۲۶، همین شکاف در قدرت اجرایی منجر به حوادث امنیتی بحرانی شده است؛ جایی که عاملها پس از یک دستکاری ظریف در گفتگو، فایلهای حساس دایرکتوری خانگی کاربر را بازنویسی کردند. مشکل بنیادین این است که ما قدرت عامل را با زبان طبیعی تعریف میکنیم و سپس وقتی یک مدل زبانی بزرگ (LLM) — مثل کتابخانهداری که میلیاردها صفحه را خوانده و حالا با همان لحن کتابها جواب میدهد — این زبان را انعطافپذیر تفسیر میکند، تعجب میکنیم.
این آسیبپذیری به این دلیل است که مدلهای زبانی مفسر هستند، نه مجری قانون. همانطور که در تحلیل قبلی ما دربارهی استفاده Voor AI از گرافهای JSON برای کنترل نسخهی گردشکارهای پیچیده اشاره کردیم، صنعت اکنون به سمتی میرود که مرزهای عامل را به جای متن، به عنوان کد سخت تعریف کند. این رویکرد شباهت زیادی به استفاده از کدهای بازبینیشده برای مقابله با پرامپتهای سیستمی دارد که لایهای از کنترل را جایگزین توصیفات متنی میکند. برای اکثر توسعهدهندگان، تفاوت این دو رویکرد، تفاوت بین «امید داشتن به رفتار درست عامل» و «اثبات اینکه عامل نمیتواند بدرفتاری کند» است. راهکار پیشنهادی بهطور عمدی ساده و خستهکننده است: قابلیتهای ابزار را در یک فایل ماشینخوان توصیف کنید، آن را در کدی اجرا کنید که مدل نتواند با زبانبازی دور بزند و مجموعهای از تلاشهای حمله را ثبت کنید که باید در محیط یکپارچهسازی مداوم (CI) شکست بخورند.
شکست مرزهای توصیفی
طبق گزارش dev.to، سه ویژگی باعث میشود مرزهای مبتنی بر پرامپت غیرقابلاعتماد باشند. نخست اینکه مدلها را میتوان با استفاده از بستر گفتگو متقاعد کرد تا اقدامات ممنوعه را به عنوان اقدامات مجاز بازتعریف کنند. این یک باگ نیست که با سختگیرانهتر کردن لحن پرامپت حل شود؛ مدل با دریافت بستر کافی، صرفاً قانون را بازتفسیر میکند.
دوم اینکه مسیرها و URLها چندین شکل نوشتاری دارند — مانند ~/.ssh/id_rsa یا ../../etc/shadow یا لینکهای نمادین (symlinks) و نسخههای کدگذاری شده با درصد (percent-encoded) — که سیاستهای متنی بهندرت همه آنها را فهرست میکنند. مدلها وقتی درخواست بازطراحی میشود، بهندرت به این شکلهای ذکرنشده احترام میگذارند. برای درک عمیقتر این چالش، میتوان تفاوت میان فایلهای تله و محیطهای ایزوله در امنیت سیستمفایل را بررسی کرد تا مشخص شود کدام روش در برابر این تغییر شکلها مقاومتر است.
سوم اینکه توالی اقدامات میتواند یک حمله باشد، حتی اگر هر گام بهتنهایی بیخطر باشد. خواندن یک اعتبارنامه درست است و ارسال یک درخواست HTTP هم درست؛ اما انجام این دو پشتسرهم به معنای خروج غیرقانونی دادههاست. چون قوانینِ «در هر درخواست»، این توالیها را نمیبینند، محدودیتها باید خارج از پنجره متنی (Context Window) — مثل میز کاری که جا برای چند ورق دارد، نه برای کل کتابخانه — و در لایهی کد قرار بگیرند و پیش از اجرای ابزار ارزیابی شوند.
گام اول: فایلهای مجوز ماشینخوان
راهکار پیشنهادی با یک فایل مجوز در قالبهایی مثل JSON، TOML یا YAML شروع میشود که در Pull Requestها قابل بررسی باشد. این فایل دقیقاً تعریف میکند که ابزارها مجاز به چه کاری هستند. برای مثال، یک سیاست JSON میتواند به این شکل باشد:
{
"tools": {
"fs_write": {
"allowed_prefixes": ["./src", "./tests"],
"deny_patterns": ["*.lock", "*.secrets.*", "*.pem"]
},
"net_fetch": {
"allowed_hosts": ["registry.npmjs.org", "api.github.com"],
"allow_redirects_to_other_hosts": false
},
"git": {
"allowed_subcommands": ["status", "diff", "add", "commit"],
"push_requires_human": true
}
}
}
قوانین طراحی این فایلها بر اساس اصل «ممنوعیت پیشفرض» (deny by default) است؛ یعنی هر ابزار، میزبان یا مسیری که فهرست نشده، ممنوع است. در این رویکرد، لیستهای سفید (Whitelists) کوچک میمانند در حالی که لیستهای سیاه (Blacklists) همیشه نشت میکنند. همچنین این چارچوب یک مدل تصمیمگیری سهحالته پیشنهاد میدهد: اجازه (allow)، رد (deny)، یا ارجاع به انسان (escalate). اقدامی مثل git push صرفاً مسدود نمیشود، بلکه باعث توقف و درخواست تایید انسانی میشود. این مدل سهحالته بسیار بهتر از یک مدل دوگانه (صفر و یک) با گردشکارهای واقعی سازگار است. چون این فایل به عنوان کد تلقی میشود، بازبینی، نسخهبندی و ردیابی (blame) میشود؛ هرگونه گسترش در allowed_hosts باید باعث تامل بازبین در زمان PR شود.
گام دوم: لایه اجرایی (Enforcement Shim)
برای اینکه مدل نتواند با زبانبازی قوانین را دور بزند، یک لایه واسط یا شیم (Shim) اجرای ابزار را در بر میگیرد. مدل فراخوانی ابزار را صادر میکند، اما شیم پیش از ارسال درخواست، آرگومانها را بازرسی میکند. این لایه برای مدل نامرئی است و به عنوان آخرین دروازهبان عمل میکند. در یک پیادهسازی با TypeScript، شیم مسیرها را با استفاده از realpathSync حل کرده و آنها را با allowed_prefixes و deny_patterns سیاستها تطبیق میدهد.
جزئیات حیاتی در پیادهسازی این لایه عبارتند از:
- نرمالسازی اولویتدار: شیم باید ابتدا
realpathSyncرا اجرا کند تا لینکهای نمادین و بخشهای..را شناسایی و به مسیر واقعی تبدیل کند. این ترتیب حیاتی است؛ عدم نرمالسازی پیش از مقایسه، رایجترین اشتباه در ساخت حفاظهای مسیر است، زیرا بخشهای..بهراحتی میتوانند بررسیهای پیشوند را دور بزنند. - رد آدرسهای IP مستقیم: شیم باید آدرسهای IP خام در URLها را رد کند. نقاط انتهایی متادیتای ابری (مانند ۱۶۹.۲۵۴.۱۶۹.۲۵۴) اهداف کلاسیک برای خروج دادهها و سرقت اعتبارنامهها هستند. اگر عامل بتواند از IP استفاده کند، لیست سفید نامهای میزبان (hostname) بیفایده خواهد بود.
- کنترل تغییر مسیر (Redirect): دنبال کردن یک Redirect به میزبان غیرمجاز، عملاً همان دریافت داده از آن میزبان است. سیستم باید یا هر گام از تغییر مسیر URL را مجدداً بررسی کند یا بهطور کلی تغییر مسیرهای بین-میزبانی (cross-host) را غیرفعال کند.
گام سوم: تست رگرسیون در CI
تبدیل یک سیاست به تضمین امنیتی نیازمند مجموعهای از تلاشهای حمله است که بتوان آنها را بازپخش کرد. این موارد به صورت اشیای JSON در هر خط ذخیره میشوند تا تغییرات آنها در Git بهوضوح دیده شود. نمونههایی از این موارد عبارتند از:
{"case":"w-01","tool":"fs_write","args":{"path":"./src/app.ts"},"want":"allow"}{"case":"w-02","tool":"fs_write","args":{"path":"./src/../../home/user/.bashrc"},"want":"deny"}{"case":"n-02","tool":"net_fetch","args":{"url":"https://169.254.169.254/latest/meta-data"},"want":"deny"}{"case":"g-02","tool":"git","args":{"argv":["push","origin","main"]},"want":"escalate"}
این مجموعه تست باید هر بار که فایل سیاست، لایه شیم، نسخه مدل یا پرامپت سیستمی تغییر میکند، در CI اجرا شود. ارتقای مدل میتواند نحوه نقلقول مسیرها، انتخاب فلگها یا املای مسیرها توسط عامل را تغییر دهد و مرزی را که قبلاً بسته بود، باز کند. در این چارچوب، هر مورد «ردِ موردانتظار» که اجرا شود، به عنوان یک باگ امنیتی سطح ۱ (severity-1 auth bypass) تلقی میشود.
گام چهارم: تیم قرمز با کمک هوش مصنوعی
برای یافتن حملاتی که انسان ممکن است نادیده بگیرد، توسعهدهندگان میتوانند از یک مدل برای تیم قرمز (Red Teaming) — یعنی شبیهسازی حملات برای یافتن نقاط ضعف — روی سیاستهای خود استفاده کنند. با دادن فایل سیاست به مدل و درخواست تولید فراخوانیهایی که باید رد شوند اما احتمالاً عبور میکنند، میتوان لبههای تیز امنیتی را یافت؛ مواردی مثل:
- مسیرهای لینکنمادین (Symlinked) که داخل پیشوندهای مجاز قرار گرفتهاند.
- نامفایلهای یونیکد ترکیبی که شبیه الگوهای ممنوعه هستند اما از نظر بایتی مطابقت ندارند.
- فلگهای خطرناک در Git، مانند
git commit --no-verifyیاgit -c core.sshCommand=.... - ترفندهای Userinfo در URL (مثلاً
https://[email protected]/). - موارد خاص حساسیت به حروف بزرگ و کوچک (Case-sensitivity).
این حملات تولید شده سپس بهشدت فیلتر میشوند. مواردی که دستیافتنی نیستند (هیچ مدل واقعی چنین فراخوانی را نمیسازد)، تکراری هستند (تغییرات ظاهری) یا تشخیصی نیستند (شکست آنها به نقطه ضعف خاصی اشاره نمیکند) حذف میشوند. هدف، رسیدن به یک مجموعه متراکم از حدود ۵۰ مورد دقیق است. نویسنده اشاره میکند که این تولید انبوه برای نسخههای رایگان مدلها، مانند سرویس MonkeyCode، که در آن کمیت بر کیفیت غلبه دارد، ایدهآل است.
نقاط کور شناختهشده
هیچ لایه واسطی گلولهساز نیست. این چارچوب نمیتواند «خروجیهای مسموم» (poisoned tool output) را ببیند؛ جایی که عامل یک صفحه وب یا لاگی را میخواند که حاوی دستورات جاسازی شده است و از آنها اطاعت میکند. این یک تزریق پرامپت (Prompt Injection) غیرمستقیم است که از طریق نتایج ابزار وارد میشود، نه آرگومانهای آن. این موضوع نیازمند لایهای مجزا برای پاکسازی خروجیها یا ایزولهسازی محتوا است. در همین راستا، بررسی متدهای مسدودسازی خروج دادهها در برابر پیشگیری از تزریق در چهارچوب MCP دیدگاههای تکمیلی برای مقابله با این نوع نفوذها ارائه میدهد.
همچنین این سیستم نمیتواند جلوی «سوءاستفاده معنایی» را بگیرد. عاملی که تمام فایلهای یک پوشه مجاز را به متنهای بیمعنی تبدیل میکند، همچنان در چارچوب سیاست است؛ چون حفاظها شکل (shape) را بررسی میکنند، نه قصد (intent) را. در نهایت، سیستم در برابر حملات TOCTOU (تغییر مسیر بین لحظه بررسی و لحظه اجرا) آسیبپذیر است، جایی که یک مسیر از طریق symlink بین بررسی شیم و نوشتن واقعی تغییر میکند. محیطهای با ریسک بالا به معناشناسی open-by-handle یا سیستمفایلهای ایزوله (Sandbox) نیاز دارند.
چه کسانی نباید از این روش استفاده کنند؟
این لایه واسط دستساز جایگزینی برای بررسیهای امنیتی رسمی در محیطهای دادهای تحت نظارت نیست. برای بارهای کاری چندمستاجری (Multi-tenant) که یک اشتباه میتواند دادههای مشتریان دیگر را افشا کند، بازرسی آرگومانها کافی نیست و باید از کانتینرها، seccomp یا MicroVMها استفاده کرد.
تیمهایی که ابزارهایشان هر هفته تغییر میکند نیز ممکن است نگهداری دستی این مجموعه تستها را دشوار بیابند. در این موارد، ابزارهای «سیاست به عنوان کد» (Policy-as-Code) ضروری هستند تا مجموعه امنیتی به یک «نمایش» تبدیل نشود و از واقعیت عقب نماند.
این تغییر در رویکرد به این معناست که جمله «نمیدانستیم عامل میتواند این کار را بکند» دیگر یک عذر نیست، بلکه انتخابی برای نادیده گرفتن مرزهای قابلراستیآزمایی است. برای شروع پیادهسازی، توسعهدهندگان باید ابتدا فرمت فایلهای مورد-تست (Case-file) را برای ثبت تلاشهای حمله به کار بگیرند، زیرا این کار بیشترین نسبت ایمنی به تلاش را ارائه میدهد.
گام بعدی شما
- فرمت فایلهای مورد-تست (Case-file) را برای ثبت تلاشهای حمله به پروژه خود اضافه کنید.
- یک لایه شیم ساده برای نرمالسازی مسیرها (realpathSync) پیادهسازی کنید تا از دور زدن پیشوندها جلوگیری شود.
- از یک مدل زبانی ارزان برای تولید سناریوهای لبهای (Edge Cases) جهت تست سیاستهای دسترسی خود استفاده کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو