
스크래퍼와 브라우저 에이전트가 차단되는 것을 방지하는 스텔스 Chromium 엔진, 코드 한 줄 변경만으로.
스텔스 Chromium 엔진
Fortress는 코드 한 줄만 바꾸면 스크래퍼와 브라우저 에이전트가 차단되지 않도록 보호하는 스텔스 Chromium 엔진입니다. 봇 감지기는 브라우저 핑거프린트를 읽어 자동화를 감지합니다. Fortress는 그 핑거프린트를 Chromium의 C++ 내부에서 수정하여, 브라우저가 일반 Chrome 설치처럼 보이도록 합니다. 스크래퍼는 작업을 완료하고, 에이전트는 목표 페이지에 도달하며, CreepJS, Sannysoft, BrowserScan 및 실제 Cloudflare Turnstile은 모두 사람으로 인식합니다. 기존 Playwright 또는 Puppeteer를 CDP를 통해 Fortress에 연결하기만 하면, 코드의 다른 부분은 변경할 필요가 없습니다.
Blink · V8 · BoringSSL 인트리(in-tree) 패치 · ANGLE / D3D11 기반 WebGL · JA3/JA4 일관성 TLS · 월별 업스트림 리베이스 · 재현 가능, gauntlet 테스트 통과 릴리스
34 |

실제 창에서 Fortress 바이너리를 캡처한 모습: 실제 Cloudflare 챌린지를 통과하고, bot.sannysoft.com을 모두 초록색으로 바꾼 후 BrowserScan에서 "Normal"로 표시됩니다. tools/gauntlet.py로 재현 가능.
출시됨. 실행 시 일관된 페르소나, 강화됨.
toString()은 [native code] 유지), realm 불변 (메인 / 워커 / iframe) — JavaScript가 아닌 브라우저에 컴파일된 일관성.```bash
pip install -U tilion-fortress # or: docker run --rm -p 9222:9222 tilion/fortress:latest**[→ 전체 릴리스 노트](https://github.com/tiliondev/fortress/releases/tag/v151.0.7908.0)**
## Contents
| | |
|---|---|
| **[What it is](#what-it-is)** · **[Quick start](#quick-start)** | 정의, 설치, 첫 번째 스크립트, AI 에이전트 설정 |
| **[The Fortress MCP](#the-fortress-mcp--stealth-browsing-as-agent-tools)** | AI 에이전트를 위한 29가지 스텔스 브라우저 도구 (베타) |
| **[Why patch the engine, not the page](#why-patch-the-engine-not-the-page)** | 자기 노출 JS 이론 + 세 가지 탐지 계층 |
| **[How Fortress compares](#how-fortress-compares)** | vs puppeteer-stealth · Camoufox · CloakBrowser · 폐쇄형 벤더 |
| **[Proof: live-detector results](#proof-live-detector-results)** | CreepJS / Sannysoft / BrowserScan / Cloudflare, 스크린샷 포함 |
| **[Configure the persona](#configure-the-persona)** | `--uxr-*` 핑거프린트 표면 |
| **[Works with your stack](#works-with-your-stack)** | browser-use · Crawl4AI · Stagehand · LangChain |
| **[Build & verify](#build--verify)** | 소스에서 재현, 출처 확인 |
| **[Reference](#reference)** | 문제 해결 · FAQ · 로드맵 · 저장소 구조 |
---
## What it is
Fortress는 엔진 내부에서 브라우저 핑거프린트를 스푸핑하는 Chromium 포크입니다. 봇 탐지기가 읽는 표면(캔버스, WebGL, 오디오, 폰트, 네비게이터 등 약 30개 이상)은 Chromium의 **C++**에서 수정되며, 페이지가 잡을 수 있는 JavaScript 패치 레이어가 위에 없습니다.
일반 브라우저 바이너리로 제공되며 CDP 엔드포인트를 노출합니다. Playwright, Puppeteer 또는 다른 CDP 클라이언트를 해당 엔드포인트에 연결하면 기존 자동화가 변경 없이 실행됩니다.
JavaScript 스텔스 패치는 페이지가 찾을 수 있는 추가 레이어를 남깁니다: `.toString()`은 오버라이드의 소스를 표시하며, iframe이나 워커에서 동일한 프리미티브를 다시 가져오면 이를 우회합니다. Fortress는 대신 엔진에서 표면을 수정하므로 `navigator.vendor`는 실제 C++ getter를 반환하고, `[native code]`를 보고하며, 모든 영역에서 동일하게 읽힙니다. 자체를 검사하는 페이지는 표준 Chromium을 보게 됩니다. 이것이 자동화가 이전에 플래그가 지정되던 곳에서 통과하는 이유이며, 남은 차단은 브라우저가 아닌 프록시와 동작에 기인합니다. [엔진을 패치해야 하는 이유, 페이지가 아닌](#why-patch-the-engine-not-the-page)에서 탐지 메커니즘을 자세히 다룹니다.```python
from tilion_fortress import Fortress
from playwright.sync_api import sync_playwright
with Fortress() as f: # launches the stealth engine on a CDP endpoint
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(f.cdp_url)
page = browser.new_page()
page.goto("https://bot.sannysoft.com")
page.screenshot(path="all-green.png")
import { Fortress } from "tilion-fortress";
import { chromium } from "playwright";
const f = await Fortress.launch(); // stealth engine on a CDP endpoint
const browser = await chromium.connectOverCDP(f.cdpUrl);
const page = await browser.newPage();
await page.goto("https://browserscan.net");
await browser.close();
await f.close();
하나의 루프, 모두 실제 캡처: CreepJS / Sannysoft / BrowserScan / rebrowser 통과 → CDP를 통해 구조화된 데이터 스크래핑 → aa.com · lowes · macys · kohls에서 Akamai 차단 해제 (동일한 residential IP).
Fortress 엔진이 CDP를 통해 구동되는 편집되지 않은 캡처. 스텔스 플러그인, JS 패치 없음: 지문이 바이너리에서 수정됩니다. 다음을 사용하여 이를 재현하세요. examples/scrape_demos.py.
구조화된 추출: 각 항목이 읽힐 때마다 레코드가 유형화된 JSON으로 빌드됩니다.
동일한 residential IP, 동일한 사이트 (aa.com · Akamai Bot Manager). 일반/헤드리스 브라우저는 Access Denied (Reference #)를 받습니다; Fortress는 실제 페이지를 로드하고 Akamai는 _abck 센서 쿠키를 발행합니다 — Bot Manager가 이를 실제 브라우저로 수락합니다. 변수는 지문이며 IP가 아닙니다.
pip install tilion-fortress npm install tilion-fortress
docker run --rm -p 9222:9222 tilion/fortress:latest
tar xzf tilion-fortress-linux-x64.tar.gz # Linux ./tilion-fortress/tilion --headless=new --remote-debugging-port=9222 --user-data-dir=/tmp/p
sudo apt install ./tilion-fortress_151.0.7908.0_amd64.deb && tilion https://example.com
> [!TIP]
> SDK는 컴파일된 빌드 **그리고 `patches/`**를 함께 제공하므로, 엔진을 직접 재빌드하면서 모든 표면 수정 사항을 소스와 대조하여 검증할 수 있습니다. 다운로드는 릴리스 `SHA256SUMS`에 대해 SHA-256으로 자동 검증됩니다.
### 버전
Fortress는 **두 가지 Chromium 기반**으로 제공됩니다 — 은닉성과 최신성 사이의 절충점을 선택하세요:
| 채널 | Chromium | 사용 시기 |
|---|---|---|
| **`stable`** *(기본값)* | **149** | 권장 — 실제 사용자 대다수가 사용하는 Chrome 버전과 일치하므로 가장 잘 은닉됩니다 |
| **`latest`** | **151** | 최신 엔진 (안정 버전보다 약간 앞선 버전을 보고함) |```python
Fortress().start() # Python: stable (149) by default
Fortress(channel="latest").start() # opt into 151
await Fortress.launch(); // Node: stable (149) by default
await Fortress.launch({ channel: "latest" });
docker run --rm -p 9222:9222 tilion/fortress:149 # or :151
# or set FORTRESS_CHANNEL=latest for either SDK
네이티브 바이너리: Linux x64 (두 버전) + Windows x64 (151); Windows-149 및 macOS는 Docker 이미지를 통해 실행됩니다.
Fortress는 에이전트가 구동하는 브라우저입니다. :9222에서 원시 CDP를 제공하며, 연결할 스텔스 플러그인이 없습니다. 두 가지 방법이 있습니다.
옵션 1: 채팅 어시스턴트에 미리 로드하여 여세요. 한 번 클릭하면 AGENTS.md를 읽고 전체 설정 과정을 안내합니다:
옵션 2: 에이전트용 복사 (전체를 클립보드로 복사). 아래 상자의 오른쪽 상단에 있는 복사 아이콘을 클릭하세요. 클립보드에 전체 설정 컨텍스트(무엇인지, 설치, 연결, 페르소나, 규칙 등 AGENTS.md의 모든 내용을 간결하게 요약)가 복사됩니다. Cursor, Claude Code, Copilot, ChatGPT 또는 다른 에이전트에 붙여넣으면 바로 시작됩니다:```text You're setting up Fortress, an open-source STEALTH Chromium engine, for browser automation. It corrects the browser fingerprint (canvas, WebGL, audio, fonts, navigator, +30 more) in Chromium's C++ and exposes raw CDP on http://localhost:9222, a drop-in for Playwright/Puppeteer. Do NOT add puppeteer-stealth or any JS fingerprint patching (it self-reveals and undoes Fortress).
LAUNCH (pick one; all expose CDP on http://localhost:9222): Docker: docker run -d --rm -p 9222:9222 tilion/fortress:latest Python: pip install tilion-fortress then from tilion_fortress import Fortress; f=Fortress(); f.start() Node: npm install tilion-fortress then import {Fortress} from "tilion-fortress"; const f=await Fortress.launch()
CONNECT (keep my existing automation code): Playwright(py): browser = p.chromium.connect_over_cdp("http://localhost:9222") Playwright(js): const browser = await chromium.connectOverCDP("http://localhost:9222") Puppeteer(js): const browser = await puppeteer.connect({ browserURL: "http://localhost:9222" }) browser-use / Crawl4AI / Stagehand / LangChain: point their CDP endpoint at http://localhost:9222
PERSONA (optional; default is a coherent Windows identity). Override any surface with --uxr-* flags: --uxr-timezone=America/New_York --uxr-hw-concurrency=16 --uxr-languages=en-US,en
RULES:
Now walk me through launching Fortress and wiring my automation to it. Full guide: https://github.com/tiliondev/fortress/blob/main/AGENTS.md
---
## Fortress MCP — 에이전트 도구로서의 스텔스 브라우징 <sub>베타</sub>
Raw CDP는 직접 작성하는 코드를 위한 것입니다. **Fortress MCP**는 **도구**를 호출하는 에이전트를 위한 것입니다. [Model Context Protocol](https://modelcontextprotocol.io) 서버로, Claude, Cursor 또는 모든 MCP 클라이언트에 스텔스 브라우저를 제공하여, fetch가 차단되는 순간 도구를 호출해 페이지를 가져옵니다. **29개의 도구, 로컬 및 무료** — `fetch_protected_page`, `extract_page`, `crawl_site`, `recon_site_apis`, `search_web`, `run_browser_task`, `save_profile`, `get_stealth_cdp_endpoint` 등.
<p align="center"><img src="https://assets.kitploit.com/production/public/readmes/795/8f328e2498b09d7433208c5b4a9002450643537f2ee6b0519ac10420ef581bf3.gif" alt="동일한 사이트, 동일한 프롬프트: 일반 브라우저는 PerimeterX에 의해 차단되지만 Fortress MCP를 사용하는 에이전트는 깨끗한 JSON을 반환합니다" width="760"/></p>
<sub><i>실제 날짜가 포함된 실행: <b>stockx.com</b> (PerimeterX) 대상. 일반 브라우저는 <b>HTTP 403 — "Access denied"</b>를 받습니다. Fortress MCP를 사용하는 에이전트는 깨끗한 JSON을 반환합니다 — 동일한 사이트, 동일한 프롬프트. 프레임워크 저장소에서 재현 가능합니다.</i></sub>
### 30초 만에 설정하기
두 가지 실행 방식 중 하나를 선택하세요. `npx`는 PATH에 Python이 필요하며, `pip`는 직접 설치합니다:```bash
pip install "tilion[mcp]" # command: tilion-mcp
# —or, zero-install—
npx -y tilion-mcp # auto-runs the server via uv (no global install)
Claude Desktop — 설정 → 개발자 → 구성 편집 (claude_desktop_config.json):```json
{ "mcpServers": { "fortress": { "command": "tilion-mcp" } } }
<sub>npx를 선호하시나요? <code>"command": "npx", "args": ["-y", "tilion-mcp"]</code>를 사용하세요. Claude를 다시 시작하면 <b>fortress</b> 도구가 나타납니다.</sub>
**Claude Code** (CLI) — 한 줄:```bash
claude mcp add fortress -- tilion-mcp # or: claude mcp add fortress -- npx -y tilion-mcp
Cursor (~/.cursor/mcp.json) · Cline / Windsurf (VS Code → MCP servers) — 동일 블록:```json
{ "mcpServers": { "fortress": { "command": "tilion-mcp" } } }
그런 다음 에이전트에게 *“이 StockX 페이지에서 가격을 가져와”* 라고 묻기만 하면, 에이전트가 스스로 `fetch_protected_page`를 호출합니다.
### 에이전트가 얻는 것
| | tools |
|---|---|
| **차단된 페이지 획득** | `fetch_protected_page` · `read_page` · `get_page_html` · `search_web` |
| **구조화된 데이터** | `extract_page` (스키마 인식) · `extract_document` (PDF/DOCX/XLSX) |
| **전체 사이트** | `crawl_site` (자동 SPA) · `recon_site_apis` (비공개 JSON API 찾기) |
| **페이지 조작** | `page_elements` · `click_button` · `fill_field` · `press_key` · `wait_for` · `evaluate_js` |
| **다단계 흐름** | `run_browser_task` (로그인, 페이지네이션, 무한 스크롤, 결제, …) |
| **캡처 / 인증** | `screenshot_page` · `save_page` · `download_file` · `save_profile` / `load_profile` |
| **직접 가져오기** | `get_stealth_cdp_endpoint` → Playwright / Puppeteer / browser-use용 CDP URL |
도구는 주석 처리되어 있고(읽기는 자동 승인, 쓰기는 게이트), 시작 시 **미리 워밍업**(첫 호출 약 100ms)되며, 동시성 안전 및 타임아웃·SSRF 보호됩니다. **리지덴셜 이그레스**를 지원하는 호스팅된 엔드포인트가 곧 제공될 예정입니다.
→ 전체 29개 도구 테이블, 벤치마크 및 에이전트 스킬: **[`mcp/`](https://github.com/tiliondev/fortress/blob/HEAD/mcp/README.md)**
---
## 엔진을 패치해야 하는 이유, 페이지가 아니라
일반적인 접근 방식은 `navigator.webdriver`를 패치하고, WebGL 공급업체를 스푸핑하며, 스크립트에서 `navigator.plugins`를 재정의합니다. CreepJS 및 유사한 탐지기는 여전히 이를 플래그하며, 그 이유는 **구조적**이기 때문입니다. 단순히 또 하나의 속성을 찾는 것이 아닙니다. JavaScript 스푸핑은 네이티브 함수가 있어야 할 자리에 함수를 세워놓은 것입니다. 탐지기는 반환된 값을 따로 설정하고 그 값을 반환하는 대상이 네이티브인지 조사합니다:
| 탐지 지점 | JavaScript 스푸핑이 걸리는 이유 |
|---|---|
| `toString` 자가 노출 | 네이티브 메서드는 `function get vendor() { [native code] }`로 문자열화되지만, 재정의된 것은 자체 소스 코드로 문자열화되므로 `.toString()` 한 번으로 잡힙니다. |
| Descriptor 및 `hasOwnProperty` | `getOwnPropertyDescriptor`는 재정의된 속성을 노출시키고, `hasOwnProperty('toString')`은 변조된 함수에서 `true`를 반환하는 반면 네이티브 함수는 `false`를 반환합니다. |
| `failsTypeError` | 네이티브 getter는 잘못된 `this`에 대해 특정 `TypeError`를 발생시키지만, 단순한 shim은 조용히 넘어가며 그 침묵 자체가 신호가 됩니다. |
Realm 재획득은 모든 메인 월드 패치를 무력화시키는 방법입니다. 탐지기가 다른 realm에서 깨끗한 프리미티브를 가져와 여러분의 함수에 적용합니다:```js
const iframe = document.createElement('iframe'); document.body.appendChild(iframe);
const realToString = iframe.contentWindow.Function.prototype.toString;
realToString.call(navigator.__lookupGetter__('vendor')); // returns your source code. Caught.
Your main-world patch lives in a different realm from that iframe. The same trap fires from a Web Worker, a thread your main-thread shim runs beside rather than inside.
Fortress has no such layer. The getter for navigator.vendor is the C++ getter: it reports [native code] because it is native code, identical across every realm. Camoufox puts it well: "there is no JavaScript hijacking to be detected." Fortress applies the same idea to V8 and Blink in place of Gecko.
Modern anti-bots (Cloudflare, DataDome, Kasada, HUMAN, Akamai) read three structurally different surfaces, in three separate places. One tool rarely fixes all three:
Fortress is the Layer-C engine, built to be driven so A and B hold too. The binary alone leaves the CDP channel open. That part is on the control layer, and pretending otherwise is how you get caught.
Fortress builds on real prior art: fingerprint-chromium, ChromiumFish, and CloakBrowser came first, and commercial vendors (Multilogin, Kameleo, GoLogin, AdsPower, Browserbase, Surfsky) recompile Chromium behind closed source. Most of that work stays closed: the paywalled forks hand you a binary and ask you to trust it, and the vendors keep their patches in-house.
Fortress goes the other way, because a stealth engine only stays useful when the people relying on it can see how it works. Every surface correction lives in patches/ as a small, single-purpose diff you can read in a minute, and the whole engine rebuilds from source with one script. When a detector finds a new tell, you trace the fix, patch it, and send it back. That feedback loop is the point, and it only works while the engine stays open enough to read, extend, and rebuild.
Reproduce any row with tools/gauntlet.py --bundle ./tilion-fortress. Verified against live detectors; re-run dated in docs/GAUNTLET_RESULTS.md.
| BrowserScan | CreepJS | Cloudflare |
|---|---|---|
![]() | ![]() | ![]() |
The binary carries zero brand strings; the launcher applies a coherent default Windows persona. Override any surface with --uxr-* switches, or set TILION_NO_DEFAULTS=1 for a bare launch.```
--uxr-platform / --uxr-ua-platform / --uxr-ua-os / --uxr-ua-arch / --uxr-ua-bitness
--uxr-ua-platform-version / --uxr-ua-brand / --uxr-hw-concurrency / --uxr-device-memory
--uxr-webgl-vendor / --uxr-webgl-renderer / --uxr-webgl-fullparams
--uxr-canvas-seed / --uxr-audio-seed / --uxr-timezone / --uxr-languages
--uxr-screen-width / --uxr-screen-height / --uxr-webrtc-policy=disable_non_proxied_udp
| 환경 변수 | 목적 |
|---|---|
| `TILION_NO_DEFAULTS=1` | 기본 페르소나 건너뛰기 (베어 실행) |
| `TILION_TZ` / `TILION_LANG` | 빠른 시간대/언어 재정의 |
> [!NOTE]
> **페르소나는 오늘날 명령줄에서 실행됩니다.** `--uxr-*` 스위치는 `/proc/<pid>/cmdline`을 통해 전 세계에서 읽을 수 있으므로, 실행당 하나의 페르소나가 있고 호스트의 다른 프로세스에서 볼 수 있습니다. `MaskConfig` 런타임이 다음에 등장합니다: IPC를 통해 페르소나를 전달하고 프로세스당 제한을 해제합니다 (자세한 내용은 [다음 단계](#whats-next) 참조).
---
## 스택과 연동
Fortress는 `:9222`에서 원시 CDP를 노출하므로 Playwright, Puppeteer 또는 CDP를 사용하는 모든 것에서 바로 사용할 수 있습니다.
| 프레임워크 | 연결 방법 |
|---|---|
| [**browser-use**](https://github.com/browser-use/browser-use) (~7만 개의 스타) | `cdp_url="http://localhost:9222"` |
| [**Crawl4AI**](https://github.com/unclecode/crawl4ai) (~5.8만 개의 스타) | CDP 엔드포인트 |
| [**Stagehand**](https://github.com/browserbase/stagehand) (~2.1만 개의 스타) | `connectOverCDP` |
| [**LangChain**](https://github.com/langchain-ai/langchain) Playwright 툴킷 | Playwright CDP |
| **Playwright / Puppeteer** (Python 및 JS) | `connect_over_cdp` / `connect` |```python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp("http://localhost:9222") # Fortress under the hood
export CHROMIUM_VERSION=$(cat CHROMIUM_VERSION) build/build.sh # depot_tools, sync the tag, apply patches, gn gen, ninja build/rebase-monthly.sh 152.0.XXXX.0 # bump + 3-way apply + rebuild + gauntlet-gate
출력: `out/Fortress/chrome`. 이 포크는 34개의 작은 단일 표면 패치(`patches/`)로 이루어져 있어, 대부분의 패치가 업스트림 릴리스에 깔끔하게 다시 적용됩니다. 그런 다음 gauntlet은 릴리스를 검증하여 어떤 회귀가 발생하는지 확인합니다.
| 플랫폼 | 상태 |
|---|---|
| Linux x64 (native) · **Windows x64 (native)** · Docker를 통한 모든 OS | <img src="https://raw.githubusercontent.com/tiliondev/fortress/HEAD/docs/assets/icons/check.svg" width="15" alt="yes"> **출시 중** |
| 코드 서명된 설치 프로그램 · macOS `.app` · `linux/arm64` | 진행 중 |
### 정말 우리 것이 맞는지 확인하세요
Fortress는 네 가지 공식 채널을 통해 제공됩니다. 그 외의 모든 것은 신뢰하지 마십시오:
| | 공식 소스 |
|---|---|
| **소스** | [github.com/tiliondev/fortress](https://github.com/tiliondev/fortress) |
| **Docker** | [`tilion/fortress`](https://hub.docker.com/r/tilion/fortress) |
| **Python** | [`tilion-fortress`](https://pypi.org/project/tilion-fortress/) |
| **Node** | [`tilion-fortress`](https://www.npmjs.com/package/tilion-fortress) |
**다운로드 확인.** 모든 릴리스에는 `SHA256SUMS`가 포함되어 있으며, `pip`/`npm` SDK는 설치 시 이를 자동으로 확인합니다:```bash
BASE=https://github.com/tiliondev/fortress/releases/download/v151.0.7908.0
curl -LO $BASE/tilion-fortress-linux-x64.tar.gz
curl -Ls $BASE/SHA256SUMS | sha256sum -c --ignore-missing # -> OK
Docker 이미지를 확인하세요 (태그뿐만 아니라) 다이제스트로:```bash docker pull tilion/fortress:151.0.7908.0 docker inspect --format '{{index .RepoDigests 0}}' tilion/fortress:151.0.7908.0
**아무것도 신뢰하지 말고 직접 빌드하세요.** 전체 포크는 `patches/` 디렉터리에 34개의 읽기 쉬운 패치로 구성되어 있습니다. `build/build.sh`는 Chromium 소스에서 바이너리를 재현하므로, 직접 빌드한 것과 배포된 것을 비교(diff)할 수 있습니다.
---
## 참고
<details><summary><b>문제 해결</b></summary>
<br/>
**여전히 Cloudflare, DataDome 또는 Kasada에 차단됩니다.** 대부분의 경우 이는 지문(fingerprint)이 아닌 **IP** 문제입니다. 데이터센터 IP 범위는 페이지 스크립트가 실행되기 전에 플래그가 지정됩니다. 트래픽을 가정용 또는 모바일 프록시로 라우팅한 후 재시도하세요. 차단이 해제되면 지문은 문제가 없었던 것입니다.
**Linux 호스트에서 지문이 이상해 보입니다.** 기본 페르소나는 Windows이지만 TLS 모양과 일부 OS 관련 신호는 기본 시스템을 따릅니다. 페르소나를 트래픽이 나가는 OS와 일치시키거나 관련 `--uxr-*` 플래그를 설정하여 OS 정보가 트래픽 출발지와 일치하도록 하세요.
**macOS는 Docker 이미지를 사용합니다.** 현재 네이티브 Linux + Windows 바이너리가 제공되지만, macOS는 여전히 공식 Docker 이미지(`tilion/fortress`)를 통해 Fortress를 실행합니다. Docker Desktop을 설치하거나 Linux/Windows x64에서 네이티브 바이너리를 실행하세요.
**페르소나가 `/proc/<pid>/cmdline`에 나타납니다.** `--uxr-*` 플래그는 호스트의 다른 프로세스가 읽을 수 있으며, 실행마다 하나의 페르소나가 사용됩니다. 런타임 `MaskConfig`가 도입될 때까지는 프로세스당 하나의 페르소나를 유지하고 신뢰할 수 없는 코드와 호스트를 공유하지 마세요.
**검출기가 gauntlet을 통과하는 무언가를 플래그합니다.** 탐지는 계속 진화합니다. 현재 Chromium 리베이스에 있는지 확인한 후 테스트 페이지와 함께 이슈를 열어주세요. 해당 페이지가 다음 패치가 됩니다.
</details>
<details><summary><b>자주 묻는 질문</b></summary>
<br/>
**합법인가요?** Fortress는 합법적인 자동화, 테스트 및 공개 데이터 스크래핑을 위한 브라우저 엔지니어링 프로젝트입니다. 각 사이트의 이용약관과 해당 관할권의 법률을 준수하세요.
**정말 무료인가요?** 네. BSD-3 라이선스로 완전히 오픈되어 있으며 자체 호스팅이 가능합니다. 패치 시리즈가 공개되어 있으므로 현재 엔진을 직접 소스에서 빌드할 수 있습니다.
**그냥 puppeteer-stealth나 undetected-chromedriver를 사용하면 안 되나요?** 이들은 페이지가 브라우저를 검사한 *후에* JS/CDP 계층을 패치하므로 `toString` 및 리얼름 재획득을 통해 스스로 노출됩니다. Fortress는 스푸핑을 C++로 옮겨 페이지가 네이티브 코드를 발견하도록 합니다. ("엔진을 패치해야 하는 이유, 페이지가 아니라" 참조)
**Camoufox와 어떻게 다른가요?** 동일한 C++ 가로채기 아이디어입니다. Camoufox는 Firefox(트래픽의 약 3%, 지속적인 이상치)를 포크하는 반면, Fortress는 Chromium과 V8(주류 엔진)을 포크하므로 Chrome 사용자 에이전트가 설계상 일관성을 갖습니다.
**영원히 모든 것을 통과할 수 있나요?** 아닙니다. 탐지는 계속 진화하므로, 날짜가 지정된 재현 가능한 gauntlet과 월간 Chromium 리베이스를 제공합니다. 오늘 무엇이 통과하는지 정확히 항상 확인할 수 있습니다.
</details>
<details><summary><b>로드맵</b></summary>
<br/>
- [ ] 런타임 JSON 구성을 C++ `MaskConfig`로 (단일 바이너리, 여러 일관된 지문, 명령줄에 아무것도 없음)
- [ ] 자사 MCP 서버 및 Puppeteer/raw-CDP SDK 제공 (AI 에이전트에 바로 사용 가능)
- [ ] 코드 서명된 Windows `.exe` 및 macOS `.app`
- [ ] `linux/arm64` Docker 이미지
- [ ] `patches/`를 Brave 스타일의 `chromium_src/` 오버라이드로 마이그레이션
- [ ] 게시된 reCAPTCHA v3 / DataDome / Kasada 벤치마크 행 (날짜 지정, 재현 가능)
</details>
<details><summary><b>저장소 구조</b></summary>
</details>```
patches/ 34 per-surface C++ patches (+ series), the source of truth for the fork
build/ args.gn, build.sh, apply-patches.sh, rebase-monthly.sh, windows/, macos/
packaging/ tilion launcher, fonts.conf, Dockerfile, .deb + bundle builders
fonts/ 33 metric-compatible Windows-named fonts (incl. color emoji)
sdk/ python + node (tilion-fortress) prebuilt-binary SDKs
tools/ gauntlet.py, the CreepJS / Sannysoft / BrowserScan CI gate
docs/ GAUNTLET_RESULTS, BUILD_NATIVE, BENCHMARK
우리가 놓친 탐지 벡터나 유출을 발견하셨나요? 재현 가능한 테스트 페이지와 함께 이슈를 열어주세요. Fortress를 확실히 탐지하는 페이지야말로 가장 가치 있는 정보입니다. 그것이 다음 패치가 됩니다. 두 가지 규칙이 있습니다: 모든 기능 주장은 이를 재현하는 명령어와 함께 제시되어야 하며, 모든 한계는 문서화되어야 합니다. "탐지 불가능"이라는 단어는 이 저장소에서 사용하지 않습니다.
Fortress 패치 및 도구에 대해 BSD-3-Clause 라이선스(Chromium과 동일)를 적용합니다. Chromium 및 번들 폰트는 각각의 라이선스를 유지합니다. 자세한 내용은 LICENSE 및 NOTICE를 참조하세요. 패치 시리즈는 공개되어 있으므로, 직접 엔진을 감사하고 재구축할 수 있습니다.
[!IMPORTANT]
v2: MaskConfig 런타임 페르소나. IPC로 전달되고 시드 기반으로 생성된 페르소나 그래프가 프로세스 전역 C++MaskConfig싱글톤에 공급됩니다. 단일 바이너리에서 수천 개의 일관성 불변 지문,BrowserContext별 ID 격리, 명령줄 풋프린트 제로를 구현합니다. 나머지는 로드맵에 있습니다.
0%CreepJSheadless / stealth |
모든 |
BSD-3오픈 엔진,직접 재빌드 가능 |
네이티브 코드 동등성모든 스푸핑된 getter는 C++ getter입니다: |
플러그 앤 플레이 CDP:9222에서 nodriver 스타일의 원시 CDP, |
Gauntlet 통과CreepJS에서 0% headless; Sannysoft, BrowserScan 및 실제 Cloudflare Turnstile을 모두 일반 Chrome 설치로 통과합니다. |
감사 가능한 패치
|
구조적 일관성실제 V8, Blink, BoringSSL이 엔진, 사용자 에이전트 및 JA3/JA4 TLS 형태를 일치시킵니다: 일치하는 스택 위의 Windows 페르소나. |
조정 가능한 페르소나하나의 바이너리, 일관성 검증된 Windows ID; |
![]() 자동 페이지 매김: 3페이지에 걸쳐 30개의 인용문. | ![]() 심층 상세 크롤링: UPC · 가격 · 세금 · 재고 · 리뷰. |
![]() lowes.com · 차단됨 → 해제됨 | ![]() macys.com · 차단됨 → 해제됨 | ![]() kohls.com · 차단됨 → 해제됨 |
한 사이트의 우연이 아닙니다 — 동일한 residential IP에서 매 실행마다 주요 Akamai 보호 소매업체에서 동일한 전/후.
| Layer | The tells | Where the fix lives | Fortress |
|---|
| A: driver / binary artifacts | cdc_ ChromeDriver vars, WebDriver protocol surface | Drive raw CDP, skip chromedriver | |
| B: CDP side-effects | Runtime.enable leaks via sourceURL + init-script footprints, however clean the binary is | The control / CDP-client layer: hold back Runtime.enable, use Runtime.addBinding + isolated worlds | |
| C: fingerprint surface | canvas, WebGL, audio, fonts, navigator, across main frame, iframes, workers | The engine (C++), because JS overrides self-reveal |
| Stock Playwright | puppeteer-extra-stealth | undetected-chromedriver | Camoufox | CloakBrowser | Fortress |
|---|
| Spoof layer | none | JS injection | CDP/config patch | C++ engine | C++ engine | C++ engine |
toString yields [native code] | n/a | n/a | ||||
| Survives realm re-acquisition (iframe/worker) | ||||||
No Runtime.enable leak | ||||||
| Engine = Chrome / V8 (majority traffic) | ||||||
| Coherent Chromium TLS shape | ||||||
| Fully open-source engine | ||||||
| Published, auditable patch series | n/a | n/a | n/a | |||
| Reproducible from-source build | n/a | n/a | n/a | |||
| States its own limits | n/a | n/a | n/a |
| Suite | Stock Chromium | Fortress |
|---|
| CreepJS | flagged headless | 0% headless · 0% stealth, worker signals coherent |
| bot.sannysoft.com | red rows | 0 failed · WebDriver Advanced passed · WebGL = NVIDIA RTX 3060 / ANGLE D3D11 |
| browserscan.net | bot detected | “No bots detected, could be a human” |
| rebrowser bot-detector | Runtime.enable LEAK | no leak · webdriver=false · clean init-scripts (raw CDP) |
| Cloudflare Turnstile | blocked | bypassed: a human click cleared a live challenge (headed, datacenter IP) |