پرش به محتوای اصلی
پرش به محتوای مقاله

دسترسی مستقیم به OS در برابر محدودیت‌های Sandbox مرورگر

·۱۴ مرداد ۱۴۰۵۱۲ دقیقه مطالعه۲ بازدید
راهنما
شکستن سندباکس مرورگر: ساخت عامل‌های اتوماسیون دسکتاپ با Node.js و C++
شکستن سندباکس مرورگر: ساخت عامل‌های اتوماسیون دسکتاپ با Node.js و C++
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

خروج از محیط ایزوله مرورگر به سطح هسته‌ی سیستم‌عامل از طریق افزونه‌های بومی Node.js؛ تبدیل عامل‌ها از «تحلیل‌گران DOM» به «اپراتورهای بصری دسکتاپ» با حذف تأخیرهای IPC.

تصور کنید یک عامل هوشمند را استخدام کرده‌اید که به جای کلیک کردن روی دکمه‌های وب، دقیقاً مثل یک انسان موشواره را می‌گیرد و نرم‌افزارهای دسکتاپ شما را مدیریت می‌کند. این دیگر یک تخیل نیست، بلکه نتیجه‌ی خروج مدل‌ها از «قفس طلایی» مرورگرهاست. در حالی که عامل‌های نرم‌افزاری خودگردان سال‌ها بود که در محدوده‌های استریل و بسیار ساختاریافته‌ی مدل شیء‌گرای سند (DOM) و درخواست‌های ایزوله‌ی HTTP محبوس بودند، یک تغییر معماری جدید اکنون به آن‌ها اجازه می‌دهد تا از این قفس خارج شده و دسکتاپ واقعی کاربر را کنترل کنند.

به گزارش وب‌سایت dev.to در ۵ آگوست ۲۰۲۶، یک بررسی فنی عمیق نشان می‌دهد که چگونه می‌توان با پیوند دادن استدلال‌های سطح بالای موتور V8 جاوااسکریپت با فراخوانی‌های سیستمی سطح پایین C++، عامل‌هایی ساخت که قادر به دیدن کل صفحه نمایش و دستکاری فیزیکی سیستم‌عامل میزبان باشند.

تا پیش از این، عامل‌های هوشمند عمدتاً در محیط ساختاریافته‌ی DOM زندگی می‌کردند. آن‌ها در کلیک کردن روی دکمه‌های HTML، پر کردن فرم‌های SaaS، استخراج داده‌ها و تجزیه و تحلیل بسته‌های JSON استاد بودند، اما به محض اینکه یک جریان کاری نیاز به تعامل با پنجره‌ی انتخاب فایل (File Picker) بومی سیستم‌عامل، دستکاری یک نصب محلی از کلاینت یا تأیید نرم‌افزارهای دسکتاپ داشت، به یک دیوار سخت می‌خوردند. همان‌طور که در تحلیل‌های پیشین ما درباره‌ی پروتکل‌های ارتباطی مدل‌ها اشاره کردیم، اکثر این عامل‌ها به پروتکل ابزارهای توسعه کروم (CDP) متکی بودند که آن‌ها را به محیط استریل یک مرورگر شبیه‌سازی‌شده محدود می‌کرد. اما نیازهای مدرن سازمانی و موج بعدی جریان‌های کاری خودگردانِ چندمنظوره، نیازمند عامل‌هایی است که بتوانند از این فضای ایزوله (Sandbox) بیرون بیایند و خودِ سیستم‌عامل میزبان را دستکاری کنند. این تغییر رویکرد باعث شده تا تأخیرهای ناشی از محیط‌های ابری در اجرای عامل‌های تک‌کاربره به شدت کاهش یابد و بهره‌وری عملیاتی افزایش پیدا کند.

برای حل این چالش، مهندسان از Node-API (node-addon-api) برای ساخت کتابخانه‌های اشتراکی دینامیک (فایل‌های .node) استفاده می‌کنند. این رویکرد، فاصله بین محیط اجرای جاوااسکریپت و هسته‌ی سیستم‌عامل را به شدت کاهش می‌دهد. در این معماری، به جای استفاده از پل‌های ارتباطی کندِ بین-فرآیندی (IPC) که بر پایه تفسیر اجرا می‌شوند یا پروکسی‌های مبتنی بر شبکه، افزونه‌ی بومی مستقیماً در همان فضای حافظه‌ی پردازشی برنامه‌ی Node.js اجرا می‌شود. این کار باعث حذف سربار سریال‌سازی (Serialization) و دسریال‌سازی می‌شود که در IPCهای معمول رایج است و در نتیجه، پرفورمنس مورد نیاز برای کنترل بلادرنگ و مبتنی بر بینایی فراهم می‌گردد.

شکاف فنی: V8 در برابر هسته (Kernel)

برای درک ضرورت این افزونه‌ها باید به تفاوت بنیادین معماری بین موتور V8 و هسته‌ی سیستم‌عامل نگاه کرد. موتورهای جاوااسکریپت در محیط‌های اجرای مجازی‌سازی شده و ایزوله‌ای اجرا می‌شوند که برای امنیت حافظه، جمع‌آوری زباله (Garbage Collection) و اجرای وب بدون وابستگی به پلتفرم بهینه شده‌اند. این به این معناست که آن‌ها طبیعتاً از قابلیت‌های خام سیستم مانند مدیران پنجره (Window Managers)، درخت‌های دسترسی‌پذیری (Accessibility Trees)، سرورهای نمایش یا صف‌های رویداد ورودی جدا شده‌اند. در این راستا، بهینه‌سازی‌های جدیدی مانند استفاده از V8 Isolate در برابر سندباکس‌های لینوکسی توانسته‌اند زمان شروع به کار (Cold Start) عامل‌ها را به طور چشم‌گیری کاهش دهند.

بسته به پلتفرم، این قابلیت‌ها از طریق APIهای سیستمی سطح پایین C و C++ ارائه می‌شوند:

  • macOS: مدیریت از طریق CoreGraphics و APIهای دسترسی‌پذیری (Accessibility APIs).
  • Windows: مدیریت از طریق Win32 API.
  • Linux: مدیریت از طریق X11 یا Wayland.

اگر یک عامل بخواهد عکس‌های دقیق (Pixel-perfect) از صفحه بگیرد، مختصات فضایی را محاسبه کند یا کلیک‌های موشواره را از طریق جاوااسکریپت تفسیرشده شبیه‌سازی کند، تأخیر (Latency) ایجاد شده غیرقابل‌قبول خواهد بود. به همین دلیل، افزونه‌ی بومی مانند یک درایور فوق-بهینه‌شده عمل می‌کند. در حالی که V8 همچنان نقش ارکستراتور (سازمان‌دهنده) را بر عهده دارد — یعنی اجرای حلقه‌های عامل، مدیریت وضعیت، رسیدگی به اجرای ابزارهای غیرهمزمان و هماهنگی وظایف موازی — لایه‌ی C++ تعاملات سخت‌افزاری با پهنای باند بالا و در سطح سخت‌افزار خام (Bare-metal) را مدیریت می‌کند.

استعاره‌ی میکروسرویس

این رابطه شبیه به یک معماری توسعه‌ی وب است که در آن یک API Gateway سطح بالا (Node.js/V8) با میکروسرویس‌های سطح پایین و پرقدرتی تعامل دارد که روی سخت‌افزار خام اجرا می‌شوند.

یک پلتفرم را تصور کنید که در آن API Gateway جلسات و منطق کسب‌وکار را با استفاده از TypeScript مدیریت می‌کند. این لایه بسیار بیانگر (Expressive) و منعطف است. با این حال، اگر یک مسیر (Route) به رمزگذاری ویدیویی در لحظه یا تعامل مستقیم با سخت‌افزارهای تخصصی نیاز داشته باشد، تلاش برای انجام این کار در جاوااسکریپت تفسیرشده یا با ایجاد زیر-فرآیندهای پایتون خارجی برای هر فریم ثبت‌شده، باعث کند شدن شدید سیستم می‌شود. سریال‌سازی شبکه و جابه‌جایی زمینه (Context Switching) بین پردازش‌ها، پهنای باند را خفه می‌کند. در عوض، معمار سیستم یک میکروسرویس اختصاصی می‌سازد که با کد ماشین بومی کامپایل شده و از طریق بلوک‌های حافظه‌ی مشترک ارتباط برقرار می‌کند. در این مدل، V8 مغز و سازمان‌دهنده است و افزونه‌ی C++ نقش عضله را ایفا می‌کند.

از تحلیل DOM به حلقه‌های بینایی

سیستم‌عامل‌های دسکتاپ برخلاف وب، یک DOM واحد، تمیز و جهانی برای هر برنامه ارائه نمی‌دهند. یک برنامه قدیمی Win32 که با C++ نوشته شده، یک اپلیکیشن چندپلتفرمی Electron، یک اپلیکیشن بومی macOS SwiftUI و یک بازی ویدئویی با شتاب سخت‌افزاری، همگی پیکسل‌های خود را به یک بافر نمایش مشترک (Shared Display Buffer) می‌فرستند. این بافر توسط یک سرور پنجره (مانند Quartz در macOS، مدیر پنجره‌های دسکتاپ یا DWM در ویندوز، یا Wayland/X11 در لینوکس) مدیریت می‌شود. از دید سیستم‌عامل، این برنامه‌ها اساساً بافت‌های بیت‌مپ (Bitmap Textures) و دستورات ترسیمی هستند که به یک فریم‌باف ارسال می‌شوند.

در نتیجه، عامل‌ها باید از پرس‌وجوی معنایی گره‌ها (مانند تگ‌های <button>، <input> و <div>) به استدلال فضایی مبتنی بر بینایی ارتقا یابند. خط لوله (Pipeline) برای این تعامل بومی از یک حلقه سخت‌گیرانه پیروی می‌کند:

  • تصویربرداری از وضعیت صفحه: افزونه، فریم‌باف نمایش یا بافر پنجره فعلی را در سطح پیکسل خام ثبت می‌کند و بدین ترتیب سندباکس‌های مرورگر را دور می‌زند.
  • استنتاج مدل بینایی: این عکس به یک مدل بینایی-زبانی چندوجهی (VLM) ارسال می‌شود که چیدمان را تحلیل کرده، اجزای رابط کاربری (آیکون‌ها، فیلد‌های متنی، نوارهای اسکرول) را شناسایی می‌کند و مختصات فضایی $(x, y)$ یا کادرهای محیطی (Bounding Boxes) را برمی‌گرداند.
  • شبیه‌سازی رویداد بومی: عامل این مختصات را به یک «امضای فراخوانی ابزار» (Tool Invocation Signature) ترجمه می‌کند که افزونه‌ی بومی آن را به عنوان یک وقفه (Interrupt) سطح پایین سیستم‌عامل اجرا می‌کند (مثلاً CGEventCreateMouseEvent در macOS یا SendInput در ویندوز) تا نشانگر سخت‌افزاری حرکت کرده و کلیک انجام شود.

مدیریت عملکرد و هم‌روندی (Concurrency)

از آنجا که اجرای جاوااسکریپت در Node.js تک‌رشته‌ای (Single-threaded) است، فراخوانی یک API همزمان سیستم‌عامل برای ثبت یک فریم‌باف نمایش 4K یا پرس‌وجو از درخت دسترسی‌پذیری پلتفرم، کل حلقه‌ی رویداد (Event Loop) را منجمد می‌کند. در این حالت، تایمرها متوقف شده و چارچوب عامل به طور کامل از کار می‌افتد.

برای جلوگیری از این اتفاق، افزونه‌های سطح سازمانی باید «مدیریت ابزارهای غیرهمزمان» را در لایه‌ی C++ پیاده‌سازی کنند. این کار با استفاده از موارد زیر محقق می‌شود:

  • Napi::AsyncWorker: برای انتقال کارهای سنگین از رشته‌ی اصلی به پس‌زمینه.
  • napi_create_threadsafe_function: برای برگرداندن ایمن نتایج و ارتباط مجدد با رشته‌ی اصلی V8.

عملیات‌های سنگین — مانند ثبت صفحه، پرس‌وجو از دستگیره‌های پنجره (Window Handles) یا محاسبه تفاوت‌های پیکسلی — به رشته‌های پس‌زمینه که توسط استخر رشته‌های (Thread Pool) libuv مدیریت می‌شوند، سپرده می‌شوند. پس از تکمیل، نتیجه به رشته‌ی V8 بازگشت داده شده و یک Promise جاوااسکریپت را حل (Resolve) می‌کند. این معماری «اجرای موازی ابزارها» را ممکن می‌سازد. به عنوان مثال، عاملی در یک محیط چند-مانیتوره می‌تواند هم‌زمان از دو نمایشگر مختلف تصویر بگیرد یا در حالی که یک کلید اصلاح‌کننده (Modifier Key) را فشار داده، روی یک المان رابط کاربری کلیک کند، بدون اینکه رشته‌ی اصلی استدلال متوقف شود.

جزئیات پیاده‌سازی در سیستم‌عامل‌ها

کنترل مستقیم کامپیوتر بسته به پلتفرم استراتژی‌های متفاوتی می‌طلبد و افزونه‌های بومی اجازه می‌دهند این پیاده‌سازی‌های دقیق صورت گیرند:

تصویربرداری از صفحه و دسترسی به فریم‌باف

  • MacOS: نیازمند تعامل با چارچوب CoreGraphics (مانند CGWindowListCreateImage) یا APIهای ScreenCaptureKit است. این موارد نیازمند مجوزهای صریح دسترسی‌پذیری هستند که باید به باینری در حال اجرا اعطا شوند.
  • Windows: شامل تکثیر خروجی دسکتاپ با استفاده از Desktop Duplication API مبتنی بر DirectX یا استفاده از APIهای قدیمی‌تر GDI مانند GetDC و BitBlt برای ثبت‌های مربوط به پنجره‌های خاص است.
  • Linux: نیازمند ارتباط با سرور نمایش X11 (مانند XGetImage) یا استفاده از پروتکل‌های Screen-casting در PipeWire/Wayland است.

تولید ورودی‌های مصنوعی

  • MacOS: از CGEventCreateMouseEvent ،CGEventSetIntegerValueField و CGEventPost برای تولید حرکات موشواره، فشردن دکمه‌ها، اسکرول و فشردن کلیدها استفاده می‌کند.
  • Windows: بر پایه API SendInput است که آرایه‌ای از ساختارهای INPUT را می‌پذیرد که نشان‌دهنده‌ی ضربات کیبورد و حرکات موشواره هستند.
  • Linux: با افزونه XTest در X11 (مانند XTestFakeMotionEvent و XTestFakeButtonEvent) یا دستگاه‌های ورودی مجازی کیبورد/پوینتر از طریق libinput در Wayland تعامل می‌کند.

زبان C++ اجازه تخصیص بافرهای حافظه (std::vector<uint8_t>) را می‌دهد که داده‌های خام پیکسلی RGBA را نگه می‌دارند. با استفاده از Napi::Buffer، این داده‌ها می‌توانند بدون کپی شدن در حافظه به جاوااسکریپت منتقل شوند که سرعت ارسال تصاویر به مدل بینایی را به شدت افزایش می‌دهد. علاوه بر این، اکشن‌های پیچیده مانند «کشیدن و رها کردن» (Drag and Drop) به صورت توالی‌های هماهنگ پیاده‌سازی می‌شوند: حرکت نشانگر $\rightarrow$ فشردن دکمه $\rightarrow$ تأخیر کوتاه $\rightarrow$ درونیابی حرکت در امتداد یک منحنی بزیر (Bezier Curve) $\rightarrow$ رها کردن دکمه. پیاده‌سازی این موارد در C++ زمان‌بندی قطعی (Deterministic) اجرا را تضمین می‌کند و از لرزش‌های (Jitter) ناشی از توقف‌های Garbage Collection در کدهای تفسیرشده جلوگیری می‌کند.

امنیت و حاکمیت

دادن قدرت تایپ دستورات شل (Shell) یا حرکت دادن موشواره به یک عامل هوش مصنوعی، یک تهدید امنیتی داخلی عظیم ایجاد می‌کند. یک عامل بدون محدودیت می‌تواند داده‌های حساس سازمانی را خارج کند یا اقدامات گرافیکی دلخواه و مخربی را اجرا نماید. حاکمیت بر این ابزارها نمی‌تواند صرفاً به مهندسی پرامپت (مثلاً «لطفاً روی لینک‌های مخرب کلیک نکن») متکی باشد، بلکه باید در معماری C++ و تایپ‌اسکریپت (TypeScript) تعبیه شود.

حفاظ‌های پیشنهادی عبارت‌اند از:

  • کنترل دسترسی مبتنی بر قابلیت (CBAC): مقداردهی اولیه افزونه‌ها با پرچم‌های قابلیت سخت‌گیرانه. برای مثال، یک حالت محدود ممکن است اجازه تصویربرداری از صفحه را بدهد اما شبیه‌سازی بومی کیبورد را غیرفعال کند.
  • سندباکسینگ در سطح پنجره: محدود کردن کلیک‌های موشواره به کادرهای محیطی (Bounding Boxes) پنجره‌های خاص برای جلوگیری از خروج عامل از یک برنامه تعیین‌شده.
  • قطع‌کننده‌های بصری (Visual Circuit Breakers): استفاده از مدل بینایی برای شناسایی اعلان‌های امنیتی پرخطر یا محیط‌های برنامه‌ای غیرمجاز، که منجر به توقف خودکار اجرا و پرتاب یک استثنای حاکمیتی (Governance Exception) شود.
  • ثبت وقایع مرزی هسته: ایجاد یک ردپای بازرسی (Audit Trail) تغییرناپذیر و دارای مهر زمانی در سطح بومی. هر ضربه کلید شبیه‌سازی شده، مختصات موشواره و هشِ فریم‌های ثبت‌شده لاگ می‌شوند تا یک رکورد رمزنگاری‌شده برای افسران تطبیق (Compliance Officers) فراهم شود.

پیاده‌سازی در محیط عملیاتی

در یک محیط تولید، این اتصال بومی در یک کلاس TypeScript پیچیده (Wrap) می‌شود تا امنیت نوع (Type Safety) تضمین گردد. یک پیاده‌سازی استاندارد در سطح تولید شامل یک حالت «شبیه‌سازی» برای محیط‌های CI/CD یا رانرهای ابری است که در آن‌ها باینری‌های بومی قابل اجرا نیستند.

برای مثال، یک کلاس SaaSDesktopAutomationEngine (که از EventEmitter ارث‌بری می‌کند) می‌تواند مدیریت ارکستراسیون سطح بالا را بر عهده بگیرد. این کلاس تضمین می‌کند که یک جلسه مقداردهی شده و مجوزهای سیستم‌عامل از طریق متدی مانند verifyOSPermissions() پیش از اجرای هر اقدامی تأیید شده است. این ساختار، فراخوانی‌های سطح پایین بومی مانند captureScreenRegion یا simulateClick را در قالب Promiseهای غیرهمزمان ارائه می‌دهد و تلمتری (Telemetry) را از طریق رویدادهایی مانند captureStart و actionComplete و بازیابی از خطا را برای لاگ‌های بازرسی فراهم می‌کند.

این تکامل، گامی به سوی «تجسد عامل‌محور» (Agentic Embodiment) است. عامل دیگر یک نمایش متنی از صفحه را نمی‌خواند، بلکه کامپیوتر را دقیقاً همان‌طور که یک انسان می‌بیند، مشاهده کرده و با آن تعامل می‌کند. این یک گذار از استدلال انتزاعی در DOM به واقعیت فیزیکی سیستم‌عامل است.

این چارچوب فنی نشان می‌دهد که آینده بهره‌وری تنها در مدل‌های زبانی بهتر نیست، بلکه در «دست‌های» بهتر برای این مدل‌هاست. با انتقال مرز محاسبات به هسته‌ی سیستم‌عامل، ما از عامل‌هایی که می‌توانند «وب‌گردی» (Browse) کنند به عامل‌هایی می‌رسیم که می‌توانند «اپراتوری» (Operate) کنند.

برای پیاده‌سازی این سیستم، توسعه‌دهندگان باید پروتکل زمینهٔ مدل (MCP) و استانداردهای Computer Use را بررسی کنند تا اطمینان حاصل شود که ابزارهای آن‌ها در محیط‌های مختلف سیستم‌عامل با یکدیگر سازگار هستند. این مفاهیم و نقشه‌های معماری همراه آن‌ها از کتاب Model Context Protocol (MCP) & Computer Use. Standardizing Tool Integration, Vision-Driven Browser Automation, and Agent Governance in TypeScript استخراج شده‌اند.

گام بعدی شما

  • بررسی پروتکل زمینهٔ مدل (MCP) برای استانداردسازی تعامل ابزارها در محیط‌های مختلف سیستم‌عامل.
  • مطالعه استانداردهای Computer Use برای پیاده‌سازی لایه‌های حاکمیتی و امنیتی در TypeScript.
  • آزمایش کتابخانه‌های node-addon-api برای ایجاد پل‌های ارتباطی سریع بین منطق مدل و APIهای سیستم‌عامل.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است — به تحلیل ما درباره‌ی تراشه‌های Blackwell مراجعه کنید.

چرا این موضوع مهم است؟

این معماری به مدل‌ها اجازه می‌دهد از محدودیت‌های وب خارج شده و هر نرم‌افزاری را که انسان می‌تواند اجرا کند، مدیریت کنند. بر اساس تخصص مهندسان سیستم، این تغییر، مرز بین «بهره‌وری نرم‌افزاری» و «اتوماسیون کامل دسکتاپ» را جابه‌جا می‌کند.

تأثیر برای ایران

برای توسعه‌دهندگان ایرانی که روی اتوماسیون‌های سازمانی (RPA) کار می‌کنند، این مسیر جایگزینی ابزارهای قدیمی با عامل‌های هوشمند است؛ هرچند دسترسی به برخی APIهای پیشرفته در محیط‌های ابری محدود است.

·نگاه ما
تحریریه دات‌هوش

جایگزینی DOM با بینایی-فضایی، نقطه پایان دوران «پلاگین‌های مرورگر» و آغاز عصر «اپراتورهای مجازی» است. این رویکرد، وابستگی مدل‌ها به ساختار کد صفحات وب را می‌گیرد و آن‌ها را به سطح انسانی می‌رساند، اما هم‌زمان سطح حمله (Attack Surface) را به شدت افزایش می‌دهد. موفقیت این مدل‌ها نه در هوش استدلالی، بلکه در دقت لایه‌ی C++ برای مدیریت تاخیر در ارتباط با هسته سیستم‌عامل نهفته است.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.