anti-mage:Goで作られたブラウザ一貫性検証ツール、アンチディテクトブラウザを検出する仕組みとは
アンチディテクトブラウザの検出に疲れていませんか?署名リストもデータベースも要らない、新しいアプローチのGo製ツール anti-mage(N4darae)が GitHub で注目を集めています。リリースからわずかな期間で 1,554スターを獲得し、セキュリティエンジニアの間で話題になっています。
この記事では、anti-mageの仕組み・使い方・実務への導入方法を徹底解説します。
anti-mageとは?ブラウザの自己矛盾を突く検出手法
anti-mageは「ブラウザが自分自身の測定値と矛盾しているかどうか」だけでスコアを算出するツールです。AdsPower・CloakBrowser・NSTBrowserなどのアンチディテクトブラウザは、Chromeに見えるよう多くのAPIを偽装しますが、23箇所の独立した測定値をすべて整合させるのは極めて困難です。
anti-mageはこの矛盾を突きます。シグネチャデータベースや「既知のアンチディテクトツールリスト」は一切不要で、バージョンアップのたびにリストを更新する必要もありません。
23の測定ポイント
以下はanti-mageが確認する一貫性チェックの一部です:
| チェック項目 | 内容 |
|---|---|
| プラットフォームとフォント | 申告プラットフォームとインストールフォントの整合性 |
| ネイティブアクセサ完全性 | toString のシリアライズ・列挙・プロトタイプ位置 |
| 数値組み込み動作 | 仕様書通りの動作かどうか |
| スクリーンジオメトリ | CSS とスクリプトの両経路が同じ値を報告するか |
| 音声バッファコヒーレンス | オーディオコンテキストの一貫性 |
| WebRTC ICE 状態 | ICE 収集状態とステートマシンの整合性 |
| GPU デバイス名と世代 | 申告デバイス名と実際の世代の一致 |
実測スコア(Windows環境・各100サンプル)
| ブラウザ | 中央値スコア | 判定 |
|---|---|---|
| Chrome(標準) | 0 | ✅ 正常 |
| Firefox(標準) | 0 | ✅ 正常 |
| Brave | 10 | 🟡 軽微な変更 |
| AdsPower | 60 | 🔴 改ざん検出 |
| CloakBrowser | 70 | 🔴 改ざん検出 |
| NSTBrowser | 70 | 🔴 改ざん検出 |
| Camoufox | 80 | 🔴 改ざん検出 |
注意: スコア上限は90です。「環境が完全に正規」とは絶対に言わない設計です。
インストール・使い方:Go 1.24で3コマンド起動
# クローンして起動(外部依存ゼロ)
git clone https://github.com/N4darae/anti-mage && cd anti-mage && go run .
サーバーが 127.0.0.1:8787 で起動します。検証したいブラウザでこのURLにアクセスし、ボタンを押すだけでスコアと判定文が返ります。
コマンドラインオプション
# アドレス変更(ループバック限定・外部公開不可)
go run . -addr 127.0.0.1:9000
# ページをディスクから配信(開発・カスタマイズ用)
go run . -web ./my-custom-web
# ペイロードをダンプして後からデバッグ
go run . -dump /tmp/scans
GoライブラリとしてのAPI統合:in-processでの使い方
HTTPサーバーを介さず、既存のGoサービスに直接組み込む方法も提供されています。
import "github.com/N4darae/anti-mage/assess"
env := assess.Environment{
Observations: map[string]assess.Observation{
"scope.main": {Status: assess.StatusOK, Value: mainThreadFacts},
"native.tostring": {Status: assess.StatusOK, Value: accessorSources},
"font.resolved": {Status: assess.StatusUnsupported},
},
FontControls: controls,
OffsetDates: dates,
ElapsedMS: int(time.Since(issued) / time.Millisecond),
}
a := assess.Evaluate(env)
// ポリシー定義
if a.Determination.AtLeast(assess.Discrepant) && a.Score >= 30 {
rejectRequest()
}
Evaluate は純粋関数で、グローバル変数・クロック・ファイルシステム・ネットワークのいずれにもアクセスしません。テストが書きやすく、本番投入のリスクが低い設計です。
anti-mageとの違い・なぜ今このツールか
既存のアンチディテクトブラウザ検出ツールの多くは「既知ツールの署名リスト」に依存しています。これはツールがアップデートするたびに署名も更新が必要で、いたちごっこになりがちです。
anti-mageはアプローチが根本的に異なります。「どのツールを使ったか」ではなく「ブラウザが自己矛盾しているか」だけを問います。これにより、シグネチャを書き換えた新しいアンチディテクトブラウザに対しても、リスト更新なしで機能します。
FingerprintJS Proなどの商用サービスと比較した場合、anti-mageは無料・OSSでセルフホスト可能です。その代わり、商用サービスほどの多次元フィンガープリント収集は行いません。用途に応じた使い分けが必要です。
こんな人に向いている
Webセキュリティエンジニア
不正アカウント作成やスクレイピング対策システムを構築しているエンジニアに最適です。GoライブラリとしてAPIサーバーに組み込み、リクエスト時にブラウザスコアを算出して閾値以上はブロックするフローを数百行で実装できます。
セキュリティ研究者・ペネトレーションテスター
各種ブラウザのフィンガープリント耐性を定量的に評価するベンチマークツールとして利用できます。-dump オプションでペイロードを保存し、tools/debugscan で詳細分析する研究用途にも対応しています。
ブラウザ自動化エンジニア
自社の自動化ツールやヘッドレスブラウザが正規ブラウザとして認識されるかを定期テストする品質管理ツールとして活用できます。スコア0を維持することが目標になります。
使う前に知っておきたいこと
ループバック専用: サーバーは 127.0.0.1 のみにバインドします。コードレベルで外部公開を禁止しており、設定ミスによる誤公開が起きない設計です。
スコア上限は90: 「完全に正規のブラウザ」という判定は返しません。プライバシーツールが正直に変更を宣言している場合は、改ざんではなく「宣言済み変更」として扱われ、スコアは低くなります(Braveのスコアが10なのはこのため)。
per-reading breakdownは非公開: どの測定値がスコアに寄与したかは意図的に返しません。チューニングテーブルとして悪用されないための設計判断です。ソースはMITで公開されているので、自分で読めばわかります。
7/22のリファレンスエントリが未検証: 実測スコアは「フロア」です。残りのエントリが検証されると、アンチディテクトブラウザのスコアはさらに上がります。
ライセンス: MIT。商用利用・改変・再配布すべて自由です。
まとめ
anti-mageはシグネチャ不要のブラウザ一貫性検証という新しいアプローチで、セキュリティエンジニアのボット検出ツールボックスに加える価値があります。Go 1.24さえあれば3コマンドで動作確認でき、Goライブラリとして既存サービスへの統合も容易です。GitHubで1,554スターを集めた背景には、この「メンテナンスコストゼロ」という実用的な利点があります。
関連ツール・おすすめサービス
- DigitalOcean — Goサービスのデプロイ先として開発者向けクラウド・App Platformでかんたんホスティング
この技術を学ぶ
Webセキュリティに興味を持った方には、Udemyのオンラインコースもおすすめです。
- 🎓 関連するDevToolコース一覧 — セール時(最大90%OFF)を狙うとお得です
関連記事
この記事が役に立ったらシェアしてください