Cloudflare Turnstile ソルバーライブラリ(ヘッドレスブラウザ不要)

2026/10/29 2:29

Cloudflare Turnstile ソルバーライブラリ(ヘッドレスブラウザ不要)

RSS: https://news.ycombinator.com/rss

要約▶

Japanese Translation:

主な要点は、

cfsolve
が無頭ブラウザを必要としない Rust ベースのライブラリおよびコマンドラインツールであり、Cloudflare Turnstile の課題を解決することを目的としている点である。仮想ブラウザを起動する代わりに、Safari および Chromium と互換性のある JSON ベースのブラウザプロファイルを活用し、ウィジェットに必要なトークンを生成するか、課題ページに対してクリアランスクッキーを発行する。正常に動作させるためには、ページの URL、サイトキー、生の HTML といった特定の入力を提供し、現在の設定に応じて再試行可能なネットワーク問題から再試行不能なブロックまで幅広いエラー種別を管理する必要がある。このプロジェクトの開発には、Rust、CMake、および完全性を保つためのパッチ済みの BoringSSL 依存関係を含む特定のエビロメントが必要である。さらに、適切な使用には、プロフィールディレクトリが損なわれないように維持し、プロフィールの IP アドレスとユーザーエージェント文字列に正確に一致するクッキーを保ち続けることが求められる。この機能により、開発者は MIT ライセンスの下でパス依存関係を通じて
cfsolve
を自らのアプリケーションに直接統合でき、広範な採用を可能にするとともに、btls-sys および wreq といった基礎的なコンポーネントに対してカスタマイズされた制御を行い、特化したソリューションを実現できる。

本文

cfsolve: Cloudflare Turnstile 解決用 Rust ライブラリ

cfsolve は、ヘッドレスブラウザを使わずに Cloudflare Turnstile ウィジェットや挑戦ページを解決するための Rust ライブラリおよびコマンドラインツール です。

機能と出力

  • Turnstile ウィジェットの場合: Turnstile トークンを返し、ログイン処理を完了させます。
  • 挑戦ページの場合:
    cf_clearance
    クッキーを返し、保護されたページへのアクセスを可能にします。
  • 解決方法の違い:
    • ウィジェット: ページ URL、sitekey を使用。HTML は不要なケースが多いです。
    • 挑戦ページ: ページへの直接アクセスまたはその HTML が必須です。

ブラウザのプロフィール管理

cfsolve は、特定ブラウザを模擬するための プロフィールファイル を利用します(例:

profiles/safari-26-ios.json
)。

プロフィールの注意点

  • 保存時のルール: コピーする際は、必ずプロフィールとその関連ディレクトリも一緒に移動させてください。プロフィールは挑戦時のブラウザチェックに対する記録された応答を参照しています。
  • 生成方法:
    • 通常は手動作業または AI を活用する必要があります。
    • キャプチャプロキシを設定して実際のブラウザで問題に解決することで、Cloudflare に送信されたデコード済みのペイロードを自動記録し生成をサポートできます。
    • 現在サポートされているタイプ:Safari および Chrome (iium) のみです。

コマンドラインツールの使い方

基本コマンド

cargo build --release --bin challenge

実行例

./target/release/challenge \
  --page 'https://example.com/login' /tmp/solve \
  --solve --fingerprint profiles/safari-26-ios.json

動作仕様:

  • 成功時: トークン(または
    cf_clearance
    )を標準出力に、進行状況を標準エラー出力に表示。
  • ディレクトリ引数 (
    /tmp/solve
    ):
    デバッグ用リクエスト・応答を保持するため、空または既存である必要があります。
  • デフォルト動作: ページ内の最初のウィジェット解決、または挑戦ページクリア。
    • 複数のウィジェットがある場合:
      --sitekey
      で特定を選択します。
    • サイト固有の設定:
      action
      および
      cData
      も含める必要があります。

Sitekey を指定したケース

特定のサイトキーを指定する場合の例:

./target/release/challenge \
  --page 'https://example.com/login' /tmp/solve \
  --solve --fingerprint profiles/safari-26-ios.json \
  --sitekey 'SITEKEY' --action 'login' --cdata 'CUSTOM_DATA'

空白のページ: Sitekey のみを持つ場合、以下のオプションを追加してください。

--blank-page --page <actual_site_url>

オプション一覧

オプション説明
--fingerprint <file>
使用するブラウザプロフィールファイル。必須。
--page <url>
ウィジェットが存在するページまたは挑戦ページの URL。
--solve
解決を実行します(フラグなしでは送信のみで停止)。
--sitekey <key>
sitekey により対象ウィジェットを選択します。
--action <value>, --cdata <value>
--sitekey
が必要な場合、アクションデータを上書きします。
--blank-page
ページ読み込みをスキップし、空白ページ上にウィジェットを描画(
--solve
と
--sitekey
必須)。
--proxy <url>
プロキシ経由でリクエストを送信 (
http://
,
https://
,
socks5://
,
socks5h://
)。認証情報は URL に埋め込み可。
-h, --help
ヘルプ表示。

ライブラリとしての使用法

パッチ適用と依存関係

Cargo.toml
に cfsolve を追加する際、トップレベルの
[patch]
セクションもコピー
してください。これにより Cargo が依存関係のパスを正しく読み取ります。

[dependencies]
cfsolve = { path = "/path/to/cfsolve", default-features = false }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }

[patch.crates-io]
btls-sys = { path = "/path/to/cfsolve/vendor/btls-sys" }
wreq = { path = "/path/to/cfsolve/vendor/wreq" }
http2 = { path = "/path/to/cfsolve/vendor/http2" }

実装の要点:

  • default-features = false
    を指定することで、内部コマンドツールが無効化され、ソルバー機能のみが動作します。
  • Rust バージョンは
    rust-toolchain.toml
    に記載されたもの(またはそれより新しい)を使用してください。

コード実装例

基本的な解決処理

use cfsolve::{Browser, Options, PageSource, Turnstile};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // ブラウザインスタンスを読み込んで共有します(一度読み込み推奨)
    let browser = Browser::read("/path/to/cfsolve/profiles/safari-26-ios.json")?;
    let options = Options::default();

    // ウィジェット解決
    let turnstile = Turnstile {
        url: "https://example.com/login".parse()?,
        page: PageSource::Navigate,
        widget: None,
    };
    let token = browser.solve_turnstile(turnstile, &options).await?;
    println!("{token}");

    // 挑戦ページクリア
    let cleared = browser.clear(&"https://example.com/".parse()?, &options).await?;
    println!("cf_clearance={}", cleared.clearance);
    println!("{} cookies; protected page: {}", cleared.cookies.len(), cleared.page.url);
    
    Ok(())
}

Sitekey または独自 HTML を持つ Turnistle

URL と sitekey のみの場合、

PageSource::Blank
を使用し、Widget オプションを指定します。

use cfsolve::{PageSource, Turnstile, Widget};

let turnstile = Turnstile {
    url: "https://example.com/login".parse()?,
    page: PageSource::Blank,
    widget: Some(Widget {
        sitekey: "SITEKEY".into(),
        action: Some("login".into()),
        cdata: None,
    }),
};
let token = browser.solve_turnstile(turnstile, &options).await?;

設定のポイント:

  • Action/CData: サイトが設定する値に従ってください。未設定の場合は
    None
    にします。
  • 複数のウィジェット:
    PageSource::Navigate
    と共に特定の
    Widget
    を渡して選択可能です。
  • 読み込んだページ: 既に HTML を持つ場合(例:ログイン画面裏側)、
    PageSource::Html
    で URL と HTML を渡します。

クリアランスのルール

  • プロファイルと同じ IP アドレスとユーザーエージェントから
    cf_clearance
    クッキーを送信する必要があります。これ否则 Cloudflare は拒否します。

チャンレンジ(挑戦)ページの処理

明確なケース別処理

  • ブラウザがフェッチ:
    browser.clear(&url, &options)
    を使用。返却された
    Clearance
    にクッキーと保護ページが含まれます。
    • 挑戦が存在しない場合は
      Error::NotChallenged
      で失敗します。
    • 外部でフェッチしたページは、
      FetchedPage
      を渡して処理可能です。

ユーニバーサル解決 (
browser.solve
)

URL の種類が不明な場合や両方をカバーしたい場合に使用します:

use cfsolve::Outcome;

match browser.solve(&url, &options).await? {
    Outcome::Token(token) => println!("{token}"),
    Outcome::Cleared(cleared) => println!("cf_clearance={}", cleared.clearance),
}

オプション(プロキシとログ出力)

プロキシ設定

各操作ごとに

Options
を介して HTTP、HTTPS、SOCKS5 を設定できます:

let options = cfsolve::Options {
    proxy: Some("socks5h://127.0.0.1:1080".into()),
    ..Default::default()
};

ログとデバッグ出力(Sink)

ライブラリ操作はデフォルトでサイレントです。進行状況やデバッグファイルを取得するには

Sink
を実装し、
options.sink
に設定してください:

let options = cfsolve::Options {
    sink: Some(Arc::new(your_sink)),
    ..Default::default()
};

エラーハンドリング

エラー原因リトライ推奨?
Error::Network
接続失敗はい
Error::Rejected
Cloudflare が解決を拒否はい
Error::Blocked
サイトがエラーページを返すいいえ
Error::Challenged
トークン要求に対し、挑戦ページを受け取りはい(クリア後)
Error::NotChallenged
挑戦がない場合の失敗いいえ
Error::Config
プロフィールまたはオプションが無効いいえ
Error::Unsupported
新しい挑戦形式や無効な構造などいいえ

ライセンス

  • ソースコード:MIT ライセンス。
  • 例外:
    vendor/
    内のパッチ済み依存関係については、それぞれの元のライセンスが維持されます。

同じ日のほかのニュース

一覧に戻る →

2026/10/31 2:25

僕の一番好きなPower Macは、ニンテンドーWiiだ

## Japanese Translation: Rairii のゲスト投稿では、ArtX ベースの PowerPC システム(特にニンテンドーコンソールであるゲームキューブ、Wii、Wii U)への古典的な Mac OS バージョン 7.6 と 9.2.2 の成功したポート作業について詳述されている。同プロジェクトは 2025 年 6 月 22 日に開始され、AI の助力なしに完全に手動作業によるコーディング、リバースエンジニアリング、デバッグを通じて完了している。大きな突破点は、FAT ファイルシステムを備えた OpenBIOS を改修して Mac OS イメージをロードできるようにしたことであり、開発者は NT ARC ファームウェアローダーなどの既存のツールの再利用を行ったが、ドライバーは大幅に修正した:Elliott Nunn の virtio ベースのディスプレイドライバーの再利用、"SD Gecko"(SPI アダプター)および"EXI-IDE"(SPI エミュレーション)ディスクドライバーの実装、物理アドレス空間の前提条件と MMIO マッピングのエラーを修正する「Trampoline」へのパッチ適用などである。重要なカーネルパッチはマイクロコントローラー用のビットフラグの修正、Flipper および PCI アーキテクチャ間の中断コントローラの不整合への対処、レガシーモードの問題の解消といったハードウェア固有の課題に対応している。具体的なレガシーバグも修正された例として、「SuperMario」m68k 環境におけるシリアルポートコード内の無限ループがある。現在、SD を通じて SPI で実機上で Mac OS 7.6 は 40 秒以内に正常に起動するが、Mac OS 9.2.2 については不安定な Open Transport コンポーネントを除去しクラッシュを防ぐためにさらなる作業が必要である。

2026/10/30 16:09

Cursor マーケットの VS コード拡張機能「Claude Code」に後門が存在する

## Japanese Translation: 公式 Cursor マーケットPLACE で配布されている公式 Claude Code 拡張機能(バージョン 2.1.313)に重大な裏門(バックドア)が発見された。攻撃者は Windows、Linux、macOS のいずれの環境でもユーザーのマシンに対して永続的なアクセス権を取得できる。ベンダーが管理する配布チャネルに関する標準的な仮説とは異なり、この悪意のあるアップデートは SSH キーを埋め込み、逆回線トンネルを確立することで、インストール時に直接ユーザーの関与を必要とせずにもれなくシェルへの完全なアクセス権限を取得する。この脅威は macOS のセットアップスクリプトに含まれる特定の脆弱性を利用し、セキュリティチェックを迂回すると同時に、機微なシステムデータを攻撃者管理のサーバーにビーコン送信している。Cursor は以来、その登録から該当の侵害されたリリースを削除した。バージョン 2.1.313 を使用している組織は、直ちに環境を検査し、拡張機能をアンインストールし、埋め込まれた認証情報や実行中のトンネルプロセスを能動的に探してセキュリティを回復する必要がある。この事件は、堅牢なサプライチェーン監査の緊急性を示しており、正規の開発ツールが企業ネットワーク内におけるデータ窃取および lateral movement(横方向移動)の予期せぬベクトルとして機能し、ベンダー配布ソフトウェアへの信頼を損なう可能性があることを強調している。

2026/10/31 6:30

sanstun:Rust で実装された、sans-IO を採用した並列性に優れた WireGuard 実装

## Japanese Translation: Sanstun は、非推奨の `firezone/boringtun` フォークを代替する、WireGuard 状態機械の最適化された Rust 実装(IO なし)をリリースしました。この新しい設計は、並列処理に適した慣用 API を使用して I/O および副作用(時間と乱数を含む)をコアビジネスロジックから分離することで、使いやすさ、セキュリティ向上、パフォーマンスを優先しています。主な利点には、プロトコル不変性をマッピングする型を通じたコンパイル時安全性、`Instant` オブジェクトによる時間処理を通じた正確なシステムシミュレーション、Diffie-Hellman 鍵交換およびクッキー管理を通じた DoS 攻撃に対する内蔵防御が含まれます。API は明示的に記録業務(例:カプセル化の開始)と重い暗号化/復号化を分離することで同期ボトルネックを回避し、暗号処理をワーカースレッドにオフロードした場合のベンチマークでは 45 倍以上のスピードアップの可能性を示しています。ユーザーは現在、パケットを手動でバッファリングする必要があり、`Tunnel::initiate_handshake` を通じてハンドシェイクを開始する必要がありますが、この設計はプライベートハンドシェイクコンスストラクタ(`Interface::receive` のみアクセス可能)を介してコンパイル時にレート制限および正しいトンネルルートを強制します。このアプローチにより、以前のフォークで問題となった直感的ではないドレインや設定できないバッファサイズのなどの内部バッファリング問題は解消されます。Sanstun パターンは Rust に限定されず、様々なプログラミング言語での実装にも有益である可能性があります。Apache 2.0 ライセンスの下で crates.io で利用可能であり、非推奨の `firezone/boringtun` フォークから移行する過程で GitHub の issue および PR を通じて貢献を招集しています。

Cloudflare Turnstile ソルバーライブラリ(ヘッドレスブラウザ不要) | そっか~ニュース