Erkennung

Wie die Risk Engine bewertet, wie Profile und Policies greifen und was im Angriffsfall passiert.

Adaptive Risk Engine

Der Risk-Score ist die gewichtete Summe aller Penalties (0-100). Die Schwellwerte werden durch das aktive Site-Profil und die Form-Policy bestimmt. Die V2 Response enthält zusätzlich einen Confidence-Score (0.0-1.0) und maschinenlesbare Reason-Codes.

Score Aktion Bedeutung
0-29allowMenschlich, durchlassen
30-59challengeVerdacht, wird durchgelassen aber geloggt
60-100blockBot erkannt, blockieren

Penalty-Faktoren

pow_failed:          +100   PoW falsch oder fehlend
nonce_reused:        +100   Replay-Angriff
ip_blocked:          +100   IP auf Blockliste
rate_limit_hit:       +80   Zu viele Requests
user_agent_headless:  +70   Puppeteer/Playwright
tor_exit:             +60   TOR Exit Node
behavior_bot:         +50   Verhalten bot-typisch
time_too_fast:        +35   Submit < 1.5 Sekunden
asn_hosting:          +25   Rechenzentrum-ASN
behavior_suspicious:  +20   Verhalten verdächtig

V2.1 Advanced Bot Detection

Zusätzliche Signale die selbst getarnte Headless-Browser entlarven. Alle Prüfungen sind kontextsensitiv: Mobile Geräte und Privacy-Browser (Safari/Firefox) werden korrekt als legitim erkannt und nicht falsch geflaggt.

env_automation_globals: +90   Selenium/Puppeteer/CDP Leak im window-Objekt
env_ua_brand_bot:       +80   UA Client Hints verraten Automation-Framework
env_software_renderer:  +50   WebGL nutzt SwiftShader/llvmpipe = headless
env_canvas_too_fast:    +40   Canvas-Render < 2ms = headless (Mensch: 5-50ms)
env_no_storage:         +30   localStorage UND indexedDB fehlen
env_raf_robotic:        +25   requestAnimationFrame perfekt uniform (CV < 0.05)
env_no_webgl_ext:       +25   0 WebGL-Extensions auf Desktop = headless
header_no_sec_fetch:    +25   Sec-Fetch-* Header fehlen = altes/scripted Client
header_no_accept_lang:  +20   Accept-Language fehlt = scripted
env_no_hover:           +5    Hover nicht unterstützt (selten valide auf Desktop)
env_audio_hash_missing: +5    OfflineAudioContext blockiert (Privacy-Browser ok)

V2.1 erhöht die Erkennungsrate von Stealth-Frameworks (Playwright Stealth, Puppeteer Stealth) deutlich, ohne legitime Nutzer zu beeinträchtigen.

Site-Profile & Form-Policies

Die V2 Risk Engine bewertet kontextabhängig: Login-Formulare werden strenger bewertet als Kontaktformulare. Site-Profile definieren die Grundhaltung, Form-Policies überschreiben gezielt pro Formular-Typ.

Site-Profile (Presets)

Jede Site wird einem Profil zugeordnet. Das Profil bestimmt Schwellen, Challenge-Typen und Behavioral-Gewichtungen.

Profil Allow < Challenge < Difficulty Einsatz
Low Friction 40 70 2 Newsletter, Kommentare, Info-Seiten
Balanced 30 60 4 Standard für die meisten Formulare
Auth Hardened 20 50 5 Login, Registrierung, Passwort-Reset
High Security 15 40 6 Checkout, Admin-Aktionen, Bezahlung

Form-Policies

Form-Policies überschreiben das Site-Profil für bestimmte Formular-Typen. Der form_type wird beim Verify-Request mitgeschickt.

form_type Profil Allow < Challenge < Fail-Mode
login Auth Hardened 20 50 fail_closed
register Auth Hardened 20 50 fail_closed
password_reset High Security 15 40 fail_closed
checkout High Security 15 40 fail_closed
contact Balanced 30 60 fail_open
comment Low Friction 35 65 fail_open
newsletter Low Friction 40 70 fail_open

Merge-Reihenfolge

Spätere Ebenen überschreiben frühere:

1. Globale Defaults     (config: allow<30, challenge<60)
2. Site-Profil           (z.B. "Auth Hardened" → allow<20, challenge<50)
3. Form-Policy           (z.B. login → allow<15, fail_closed)

Integration (Entwickler)

Der form_type wird beim Widget-Einbau und beim Verify-Request angegeben:

<!-- Widget: form_type als data-Attribut -->
<form data-captchacore="interactive" data-form-type="login">
    <div data-captchacore-widget data-form-type="login"></div>
</form>

// Verify-Request: form_type im Body
POST /api/v2/verify
{
    "token":     "...",
    "form_type": "login"   // Steuert welche Policy angewendet wird
}

Verfügbare Typen: login, register, contact, comment, checkout, password_reset, newsletter, custom. Ohne form_type werden die globalen Defaults verwendet.

Under-Attack-Mode

Bei einem Angriff (hohe Block-Rate) kann der Schutz verstärkt werden:

Automatische Aktivierung

Wenn über 70% aller Requests in einem 5-Minuten-Fenster blockiert werden, aktiviert sich der UAM automatisch.

# Konfigurierbar in den globalen Einstellungen
uam.auto_threshold:        0.70     # 70% Block-Rate
uam.window_minutes:        5
uam.auto_deactivate_after: 3600     # 1 Stunde
uam.cookie_ttl_minutes:    30

Im UAM erhöht sich die PoW-Schwierigkeit um +1 Stufe. Verifizierte Besucher erhalten ein HMAC-signiertes Access-Cookie (HttpOnly, SameSite=Strict).