Vulnerabilitas Session pada Wrapper Tidak Resmi Claude API

Proyek reverse-engineered seperti LinXiaoTao/FuckClaude dan wrapper sejenis umumnya mengeksploitasi endpoint web Claude internal (bukan API enterprise resmi Anthropic) dengan mengekstrak sessionKey atau cookie sesi web aktif. Pola ini memicu celah keamanan kritis: cookie-based impersonation dan token extraction.

Ketika session key statis bocor atau di-hardcode pada client, penyerang dapat membajak seluruh konteks sesi percakapan, menguras kuota rate limit, atau memicu pemblokiran akun oleh sistem anti-bot Cloudflare. Tanpa perlindungan backend, server upstream memperlakukan setiap request yang membawa cookie valid sebagai sesi terautentikasi.

Vektor Serangan Utama

  • Session Token Extraction: Pengambilan token autentikasi sessionKey dari inspect tool browser atau memory injection, lalu didistribusikan tanpa mekanisme invalidasi otomatis.
  • Cookie Impersonation: Replay request HTTP langsung ke endpoint internal Claude tanpa rotasi context session ID.
  • Bypass Anti-Bot: Eksploitasi header browser standar (seperti User-Agent dan sec-ch-ua) palsu untuk mengelabui kontrol TLS dan fingerprinting web.

Strategi Pertahanan: Header Guard dan Token Rotation

Untuk mengamankan integrasi, backend harus berfungsi sebagai reverse proxy guard. Proxy ini memegang kredensial asli upstream, menolak direct-client access, dan menerapkan tiga pilar keamanan:

  1. Token Rotation Berkala: Hindari pemakaian satu session key jangka panjang. Lakukan refresh token atau rotasi session pool secara terprogram.
  2. Header Sanitization: Hapus header berbahaya dari client seperti Host, X-Forwarded-For yang tidak terpercaya, dan set header upstream Claude yang konsisten.
  3. HMAC Payload Signing: Pastikan integritas payload dari client internal Anda untuk mencegah replay attack pihak ketiga.

Implementasi Proxy Request Guard di TypeScript

Berikut adalah implementasi minimal backend guard menggunakan runtime TypeScript (Node.js/Bun) untuk memvalidasi HMAC, menyaring header, dan melakukan rotasi session upstream.

import { createHmac, timingSafeEqual } from "node:crypto";

interface ProxyConfig {
  hmacSecret: string;
  sessionPool: string[];
}

export class ClaudeSessionGuard {
  private sessions: string[];
  private currentIndex: number = 0;
  private hmacSecret: string;

  constructor(config: ProxyConfig) {
    if (!config.sessionPool.length) {
      throw new Error("Session pool cannot be empty");
    }
    this.sessions = config.sessionPool;
    this.hmacSecret = config.hmacSecret;
  }

  // ponytail: Round-robin sederhana. Upgrade ke dynamic lease management jika concurrency tinggi.
  public getRotatedSession(): string {
    const session = this.sessions[this.currentIndex];
    this.currentIndex = (this.currentIndex + 1) % this.sessions.length;
    return session;
  }

  public verifyClientSignature(signature: string, timestamp: string, body: string): boolean {
    const now = Math.floor(Date.now() / 1000);
    const reqTime = parseInt(timestamp, 10);

    // Replay attack window: maksimal 60 detik
    if (Number.isNaN(reqTime) || Math.abs(now - reqTime) > 60) {
      return false;
    }

    const hmac = createHmac("sha256", this.hmacSecret);
    hmac.update(`${timestamp}.${body}`);
    const expected = hmac.digest();
    const provided = Buffer.from(signature, "hex");

    return expected.length === provided.length && timingSafeEqual(expected, provided);
  }

  public sanitizeUpstreamHeaders(clientHeaders: Record<string, string | undefined>): Record<string, string> {
    const activeSession = this.getRotatedSession();

    // Hapus header berbahaya dan standarisasi header browser
    return {
      "Accept": "application/json",
      "Content-Type": "application/json",
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
      "Cookie": `sessionKey=${activeSession}`,
      "Origin": "https://claude.ai",
      "Referer": "https://claude.ai/chats"
    };
  }
}

TLS Fingerprinting Guard

Scraping engine berbasis cURL atau fetch standar Node.js memiliki fingerprint TLS (JA3/JA4) yang mudah diidentifikasi dan diblokir oleh upstream WAF (seperti Cloudflare). Ketika merancang backend forwarding:

  • Gunakan TLS fingerprinting middleware di level edge (misal: Cloudflare Workers, Nginx dengan modul JA3) untuk memblokir client tidak sah sebelum menyentuh Node.js.
  • Jika memforward request upstream, gunakan HTTP client yang mendukung TLS spoofing atau isolasi routing HTTP/2 via connection pool terkontrol untuk mempertahankan karakteristik browser asli.
  • Periksa headers order: Claude upstream mendeteksi urutan pseudo-headers (:method, :authority, :scheme, :path) pada HTTP/2. Forwarder wajib mempertahankan urutan headers standar Chromium.

Batasan dan Rekomendasi Arsitektural

Solusi mitigasi berbasis wrapping web session memiliki trade-off inheren. Session token dapat di-invalidate secara sepihak oleh sistem proteksi upstream sewaktu-waktu. Untuk beban kerja produksi, hindari session hijacking wrapper dan beralihlah ke Claude API resmi dari Anthropic Console yang menggunakan autentikasi x-api-key standar dengan SLA, audit log, dan isolasi keamanan enterprise.