اگر همین حالا از ابزارهای اتوماسیون مرورگر برای استخراج داده استفاده میکنید، احتمالاً با سدی از پیامهای «دسترسی رد شد» (Access Denied) روبهرو شدهاید. این یعنی اثرانگشت دیجیتالی شما توسط شناسگرهای مدرن لو رفته است.
Fortress — یک فورک (Fork) متنباز از کرومیوم که در ۸ ژوئیه ۲۰۲۶ توسط tiliondev منتشر شد — ادعا میکند با تغییر لایههای زیرین مرورگر، عاملهای خودکار را از کاربران انسانی غیرقابل تشخیص میکند. هدف این موتور این است که اسکریپتهای اتوماسیون به «دیوار بتنی» مدیران باتهای مدرن برخورد نکنند. این موتور با لایسنس BSD-3 عرضه شده تا توسعهدهندگان بتوانند آن را بهصورت باز و شخصی میزبانی کنند.
اکثر توسعهدهندگان برای پنهان کردن وضعیت اتوماسیون به پچهای جاوااسکریپتی تکیه میکنند تا پرچم navigator.webdriver را مخفی کنند یا فروشندگان WebGL را جعل نمایند؛ چیزی شبیه به پوشاندن چهره با یک ماسک کاغذی که به راحتی با کمی دقت یا یک نسیم کوچک (تغییر در Realm) میافتد. شناسگرهای پیشرفتهای مثل CreepJS و Cloudflare اکنون تکامل یافتهاند تا این لایههای واسط (Shims) را شناسایی کنند. در همین راستا، کلاودفلر اخیراً کنترل دسترسی رباتهای هوش مصنوعی را تفکیک کرد تا بتواند بهصورت دقیقتر بین باتهای مفید و مخرب تمایز قائل شود. آنها از تکنیکی به نام «بازیابی مجدد قلمرو» (Realm Re-acquisition) استفاده میکنند؛ به این صورت که یک شیء اولیه و دستنخورده (Pristine Primitive) را از یک iframe یا Web Worker میگیرند تا لایه جاوااسکریپت را دور بزنند و ویژگیهای اصلی و دستنخورده مرورگر را استخراج کنند. این وضعیت یک نقطه ضعف دائمی برای هر کسی ایجاد میکند که سعی در استخراج دادههای محافظتشده دارد.
Fortress این مشکل را با انتقال عملیات جعل از لایه صفحه به لایه موتور حل میکند. طبق مستندات این پروژه، با پچ کردن متدهای Getter در سورس C++ موتورهای Blink، V8 و BoringSSL، مرورگر مقادیر جعلی را بهصورت کد بومی (Native Code) گزارش میدهد. بنابراین، وقتی یک شناسگر متد .toString() را روی یک ویژگی صدا میزند، بهجای دیدن کد منبع یک تابع جاوااسکریپتی که ماهیت جعلی بودن آن را لو میدهد، عبارت [native code] را میبیند. چون این تغییرات در فایل باینری کامپایل شدهاند، اثرانگشت در تمامی قلمروها، از جمله فریم اصلی، iframeها و Web Workerها یکسان و منسجم باقی میماند. در نتیجه، صفحهای که خودش را بازرسی میکند، یک نصب استاندارد از کرومیوم را میبیند.
هسته فنی و کنترل اثرانگشت
به گزارش github.com، این موتور بر سه لایه اصلی شناسایی بات تمرکز دارد:
- لایه A (آثار باینری): Fortress پروتکل خام CDP (Chrome DevTools Protocol) را روی پورت ۹۲۲۲ هدایت میکند. این موتور بهطور کامل متغیرهای
chromedriverو سطوح پروتکل WebDriver را حذف میکند. مرورگر دقیقاً به گونهای ساخته شده است که از این طریق هدایت شود. - لایه B (عوارض CDP): اثرات ناشی از نشتهای
Runtime.enableاز طریق sourceURL و ردپاهای init-script را حذف میکند، چرا که باینریهای پاک معمولاً از این طریق شناسایی میشوند. این سیستم ازRuntime.addBindingو دنیاهای ایزوله (Isolated Worlds) استفاده میکند تا تضمین شود هیچ نشتی رخ نمیدهد؛ وضعیتی که در تستهای پروژه تایید شده است. - لایه C (سطوح اثرانگشت): بیش از ۳۰ سطح اثرانگشت را مستقیماً در سورس C++ اصلاح میکند. این موارد شامل Canvas، WebGL، صدا (Audio)، فونتها، Navigator و سیگنالهای سختافزاری است. بخش اصلی فعالیت Fortress در این لایه نهفته است.
توسعهدهندگان از ۳۴ پچ کوچک و تکمنظوره در دایرکتوری patches/ استفاده میکنند. این پچها قابل بازبینی و بازتولید هستند؛ به گونهای که هر پچ را میتوان در کمتر از یک دقیقه خواند. این شفافیت به توسعهدهندگان اجازه میدهد تا موتور را با استفاده از build/build.sh از سورس بازسازی کنند تا اصالت باینری را تایید نمایند. فرآیند ساخت شامل استفاده از depot_tools، همگامسازی تگ، اعمال ۳۴ diff و در نهایت اجرای gn gen و ninja است.
برای جلوگیری از ایجاد یک «فرانکنشتاین دیجیتال» — یعنی تضاد بین سیگنالهای مختلف (مانند تضاد بین نوع سیستمعامل و کارت گرافیک) — این موتور یک «پرسونا» (Persona) منسجم را تحمیل میکند. Fortress تضمین میکند که پلتفرم، GPU، منطقه زمانی، زبان، صداها و نوع کیبورد (QWERTY/QWERTZ/AZERTY) در هر بار اجرا، مانند یک دستگاه واقعی عمل کنند. برای مثال، یک هویت ویندوزی با یک شکل TLS متناسب (سازگاری JA3/JA4) و یک رندرر WebGL مبتنی بر ANGLE / D3D11 جفت میشود. این انسجام بهجای پچ شدن توسط جاوااسکریپت، در خودِ باینری مرورگر کامپایل شده است.

تزههای خود-افشاگر جاوااسکریپت
فرض اصلی Fortress این است که هایجک کردن جاوااسکریپت ذاتاً قابل شناسایی است. شناسگرهای مدرن فقط مقدار بازگشتی یک ویژگی را چک نمیکنند، بلکه خودِ تابعی که آن مقدار را برمیگرداند بازجویی میکنند:
- افشای toString: یک متد بومی هنگام تبدیل به رشته، خروجی
function get vendor() { [native code] }میدهد. اما یک اورراید (Override) کد منبع آن شیم (Shim) را برمیگرداند، که اجازه میدهد تنها یک فراخوانی.toString()کل جعل را لو دهد. - تحلیل Descriptor: توابعی مانند
getOwnPropertyDescriptorویژگیهای بازنویسی شده را برملا میکنند و متدhasOwnProperty('toString')در توابع دستکاری شده مقدار true را برمیگرداند، در حالی که در توابع بومی مقدار false میدهد. - سیگنالهای TypeError: گترهای بومی وقتی در کانتکست
thisاشتباه فراخوانی شوند، یک TypeError خاص پرتاب میکنند؛ اما شیمهای ساده اغلب ساکت میمانند و همین سکوت، سیگنال شناسایی برای باتدی텍تور است. - بازیابی Realm: شناسگر میتواند یک iframe پاک بسازد، متد
Function.prototype.toStringرا از آن قلمرو مجزا بگیرد و آن را رویnavigator.vendorدنیای اصلی اجرا کند. این کار کد منبع شیم را برمیگرداند و تمام پچهای رشته اصلی را دور میزند. همین تله در Web Workerها نیز فعال است؛ رشتههایی که در کنار رشته اصلی اجرا میشوند و نه درون شیم آن.

عملکرد در برابر شناسگرهای زنده
بر اساس مستندات github.com، Fortress چندین بنچمارک استاندارد صنعت را که معمولاً مرورگرهای Headless را علامتگذاری میکنند، با موفقیت پشت سر میگذرد. این نتایج با استفاده از اسکریپت tools/gauntlet.py قابل بازتولید هستند و تاریخچه کامل نتایج در فایل docs/GAUNTLET_RESULTS.md ثبت شده است:
- CreepJS: گزارش ۰٪ برای حالت Headless و ۰٪ برای شناسایی Stealth. سیگنالهای Workerها کاملاً منسجم باقی میمانند.
- Sannysoft: تمامی ردیفها سبز هستند. بهطور خاص، تست WebDriver را پاس کرده و WebGL را به عنوان NVIDIA RTX 3060 از طریق ANGLE D3D11 گزارش میکند.
- BrowserScan: نمونه را به عنوان "Normal" میشناسد با این حکم: "هیچ باتی شناسایی نشد، میتواند یک انسان باشد."
- Cloudflare Turnstile: با استفاده از یک IP مسکونی استاندارد، چالشهای زنده را دور میزند و یک کلیک انسانی برای تکمیل چالش کافی است.
- Rebrowser: هیچ نشتی مربوط به
Runtime.enableشناسایی نکرد و تایید کرد کهwebdriver=falseاست و اسکریپتهای اولیه پاک هستند.

کارایی این موتور در مواجهه با Akamai Bot Manager بیشترین جلوه را دارد. در تستهای مقایسهای روی سایتهایی مانند aa.com، Lowes، Macys و Kohls، یک مرورگر Headless معمولی پاسخی با خطای "Access Denied" و یک شماره رفرنس دریافت میکند. اما Fortress با استفاده از همان IP مسکونی، با موفقیت صفحه را لود کرده و کوکی سنسور _abck را دریافت میکند. این ثابت میکند که متغیر مسدودکننده، اثرانگشت (Fingerprint) است و نه آدرس IP. این یک اتفاق تصادفی در یک سایت نیست، بلکه در تمامی خردهفروشان بزرگ محافظتشده توسط Akamai تکرار شده است.
ادغام با عاملهای هوش مصنوعی
Fortress بهگونهای طراحی شده است که جایگزینی مستقیم (Drop-in replacement) برای استکهای اتوماسیون فعلی باشد. توسعهدهندگان میتوانند Playwright، Puppeteer، Crawl4AI، Stagehand یا LangChain را بدون تغییر در منطق برنامه، به نقطه اتصال CDP Fortress (http://localhost:9222) متصل کنند.
برای کاربران پایتون، SDK از طریق pip install tilion-fortress قابل نصب است. یک پیادهسازی معمولی شامل اتصال از طریق CDP است: browser = p.chromium.connect_over_cdp(f.cdp_url). برای Node.js، کاربران میتوانند با دستور npm install tilion-fortress اقدام کرده و از chromium.connectOverCDP(f.cdpUrl) استفاده کنند.
کاربران میتوانند بین دو پایه کرومیوم برای استقرار خود انتخاب کنند:
- Stable (Channel 149): برای اکثر کاربران توصیه میشود زیرا با نسخهای که توده کاربران واقعی استفاده میکنند مطابقت دارد و باعث ترکیب بهتر (Blend-in) میشود.
- Latest (Channel 151): جدیدترین موتور (v151.0.7908.0) که نسخهای اندکی جلوتر از نسخه Stable را گزارش میدهد.

فراتر از CDP خام، این پروژه سرور Fortress MCP (Model Context Protocol) را در حالت بتا معرفی کرده است. این سرور ۲۹ ابزار اختصاصی برای LLMهایی مانند Claude، Cursor، Cline یا Windsurf فراهم میکند. سرور در هنگام استارتآپ پیشگرم (Pre-warmed) میشود (حدود ۱۰۰ میلیثانیه برای اولین فراخوانی)، ایمن در برابر تداخلات همزمانی (Concurrency-safe) است و در برابر SSRF و Timeoutها محافظت شده است.
این ابزارها شامل موارد زیر است:
- دسترسی محافظتشده: ابزارهای
fetch_protected_page،read_pageوget_page_htmlبرای دور زدن بلاکها. در تستها علیه stockx.com (PerimeterX)، در حالی که یک مرورگر معمولی خطای HTTP 403 میگرفت، MCP یک JSON پاک برگرداند. این رویکرد در تضاد با استراتژیهایی است که برخی پلتفرمها مانند monday.com با ابزار HATCHA برای مسدود کردن انسانها و پذیرش انحصاری عاملهای هوش مصنوعی به کار میبرند. - استخراج داده: ابزارهای
extract_pageوextract_documentبا قابلیت درک اسکیما برای فایلهای PDF، DOCX و XLSX. - تحلیل سایت: قابلیت
crawl_site(پشتیبانی از auto-SPA) وrecon_site_apisبرای کشف نقاط انتهایی (Endpoints) خصوصی JSON. - تعامل مرورگر: متدهای
click_button،fill_field،press_keyوevaluate_jsبرای هدایت صفحه. - جریانهای پیچیده: ابزار
run_browser_taskبرای مدیریت اهداف سطح بالا مانند ورود به سیستم (Login)، صفحهبندی (Pagination)، اسکرول بینهایت و پرداخت. - ابزارهای کمکی:
screenshot_page،save_page،download_file،save_profile،load_profileوget_stealth_cdp_endpointبرای استفاده دستی در Playwright.
این سیستم بهطور موثری به یک عامل هوش مصنوعی قابلیت «مرورگر مخفی» میدهد. سرور MCP را میتوان در ۳۰ ثانیه از طریق pip install "tilion[mcp]" (دستور tilion-mcp) یا npx -y tilion-mcp (که از طریق uv اجرا میشود) راهاندازی کرد.
تنظیم پرسونا و استقرار
باینری این موتور هیچ رشتهای از برندهای تجاری را حمل نمیکند؛ لانچر یک پرسونای پیشفرض و منسجم ویندوزی را اعمال میکند. کاربران میتوانند این سطح را با استفاده از سوئیچهای --uxr-* بازنویسی کنند یا برای یک اجرای خام TILION_NO_DEFAULTS=1 را تنظیم نمایند.
فلگهای بازنویسی اثرانگشت:
- سختافزار و حافظه:
--uxr-hw-concurrencyو--uxr-device-memory. - موتور گرافیکی:
--uxr-webgl-vendor،--uxr-webgl-renderer،--uxr-webgl-fullparamsو--uxr-canvas-seed. - منطقه و محیط:
--uxr-timezone،--uxr-languages،--uxr-screen-width،--uxr-screen-heightو--uxr-audio-seed. - هویت و سیستمعامل:
--uxr-platform،--uxr-ua-platform،--uxr-ua-os،--uxr-ua-arch،--uxr-ua-bitness،--uxr-ua-platform-versionو--uxr-ua-brand. - شبکه:
--uxr-webrtc-policy=disable_non_proxied_udp.
در حال حاضر، پرسونا در خط فرمان قرار دارد و از طریق /proc/<pid>/cmdline قابل خواندن است، که این تنظیمات را به یک پرسونا برای هر بار اجرا محدود میکند.
گزینههای استقرار انعطافپذیر هستند:
- Docker: با دستور
docker run --rm -p 9222:9222 tilion/fortress:latest. حجم ایمیج حدود ۳۰۲ مگابایت هنگام Pull و ۸۵۱ مگابایت روی دیسک است. - باینریهای Native: برای لینوکس x64 و ویندوز x64 (v151.0.7908.0) در دسترس هستند.
- macOS: در حال حاضر از طریق ایمیج رسمی داکر اجرا میشود.
تمامی دانلودها با استفاده از SHA256SUMS تایید شدهاند. کاربران میتوانند ایمیجهای داکر را از طریق digest (مثلاً با دستور docker inspect --format '{{index .RepoDigests 0}}') بررسی کرده و با یادداشتهای Release در گیتهاب مقایسه کنند.
مقایسه با سایر راهکارها
در مقایسه با ابزارهای دیگر، Fortress جایگاه منحصربهفردی در اکوسیستم دارد:
- در مقابل puppeteer-extra-stealth: در حالی که دومی از تزریق JS استفاده میکند، Fortress از پچهای موتور C++ بهره میبرد. این یعنی
toStringمقدار[native code]را برمیگرداند و در برابر بازیابی Realm مقاوم است. - در مقابل Camoufox: هر دو از رهگیری C++ استفاده میکنند، اما Camoufox فایرفاکس را فورک کرده (که حدود ۳٪ ترافیک را تشکیل میدهد)، در حالی که Fortress کرومیوم/V8 را فورک کرده تا تگ User-Agent کروم بهصورت ذاتی منسجم باشد. این رویکرد مشابه تلاشاتی است که در ساختار مرورگر Stealth برای کاهش شکستهای تشخیص بات دیده شده است.
- در مقابل فروشندگان بسته (Closed Vendors): شرکتهای تجاری مانند Multilogin، Kameleo، GoLogin، AdsPower، Browserbase و Surfsky کرومیوم را بهصورت بسته کامپایل میکنند. Fortress یک سری پچ منتشر شده و قابل بازبینی را ارائه میدهد و امکان ساخت بازتولیدپذیر از سورس را با
build/rebase-monthly.shفراهم میکند.
تحلیل: تغییر به سمت مخفیسازی در سطح موتور
این توسعه نشاندهنده یک تغییر قابل توجه در «جنگ» بین اسکرپرهای داده و فروشندگان ضد-بات است. برای سالها، استاندارد صنعت بازی «ضربه زدن به موش» با ویژگیهای جاوااسکریپتی بود. Fortress اذعان میکند که لایه JS اساساً به مخاطره افتاده است؛ اگر شناسگر به توابع بومی موتور دسترسی داشته باشد، یک شیم جاوااسکریپتی نه یک ویژگی، بلکه یک نقطه ضعف (Liability) است.
با متنباز کردن پچهای C++، tiliondev مدل کسبوکار فروشندگان «مرورگرهای مخفی» کدبسته را به چالش میکشد. بهطور سنتی، این شرکتها مبالغ بالایی را برای باینریهایی میگرفتند که از شما میخواستند کورکورانه به آنها اعتماد کنید. یک فورک متنباز و بازتولیدپذیر، همان قابلیت را با قابلیت بازرسی کامل ارائه میدهد. پروژه یک Rebase ماهانه با نسخه اصلی کرومیوم دارد تا بهروز بماند (مثلاً بهروزرسانی به 152.0.XXXX.0).
برای اکوسیستم عاملهای هوش مصنوعی، این امر یک گلوگاه بزرگ را حذف میکند. راهنما تاکید میکند که اگر از پروکسی مسکونی استفاده شود و باز هم بلاک اتفاق بیفتد، مشکل اثرانگشت است؛ و اگر اثرانگشت پاک شود اما بلاکها باقی بمانند، مشکل احتمالاً محدوده IP دیتاسنتر است.
در آینده، منتظر انتشار زمان اجرای MaskConfig (نسخه ۲) باشید. این سیستم مدیریت پرسونا را از فلگهای خط فرمان به یک پیکربندی JSON منتقل میکند که از طریق IPC ارسال شده و مبتنی بر Seed است. این قابلیت امکان ایجاد هزاران هویت منحصربهفرد و منسجم از یک باینری واحد را با ایزولاسیون کامل در سطح BrowserContext و بدون هیچ ردپایی در خط فرمان فراهم میکند.
مراجع و ساختار مخزن
برای حفظ شفافیت، پروژه سورس خود را به صورت زیر سازماندهی کرده است:
patches/: ۳۴ پچ C++ برای هر سطح اثرانگشت که منبع حقیقت (Source of Truth) این فورک هستند.build/: اسکریپتهایی برایgn gen،ninjaوrebase-monthly.sh.packaging/: لانچر Tilion، فایلfonts.confو سازندههای.deb.fonts/: ۳۳ فونت با ابعاد سازگار و نامگذاری شده ویندوزی، شامل ایموجیهای رنگی.sdk/: SDKهای پیشساخته برای پایتون و نود (tilion-fortress).tools/: اسکریپتgauntlet.pyکه به عنوان دروازه CI برای تست CreepJS، Sannysoft و BrowserScan عمل میکند.
این پروژه برای پچها و ابزارها تحت لایسنس BSD-3-Clause است، در حالی که کرومیوم و فونتهای bundled لایسنسهای خود را حفظ میکنند.
گام بعدی شما
- اگر از مدلهای agentic برای وب-اسکرپینگ استفاده میکنید، سرور MCP این پروژه را برای حذف خطاهای ۴۰۳ امتحان کنید.
- برای شناسایی نقاط ضعف اثرانگشت خود، از اسکریپت
gauntlet.pyدر مخزن Fortress استفاده کنید. - منتظر انتشار MaskConfig v2 باشید تا مدیریت پرسوناها از فلگهای خط فرمان به JSON منتقل شود.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما درباره تراشههای Blackwell برای استقرار مدلهای استدلالی مراجعه کنید.




گفتگو