すべての投稿に戻る
公開日 · 著者 Renaud Deraison

Bromureがご両親に届く前にフィッシングを止める仕組み

Bromureのアンチフィッシングを順を追って詳しく解説します — ローカルスイープ、モデル、判定、そしてご両親、祖父母、廊下の向かいに住むお隣さんのためにこそ、私たちがこれを作った理由。

ご両親に必要なのは、リンクを慎重にクリックしろというもう一度の説教ではありません。必要なのは、罠に足を踏み入れようとしているのを察知し、間に合ううちに、理解できる言葉で何かを言ってくれるブラウザです。

皆さんの中には、あの電話を受けた方もいらっしゃるでしょう。お母さまの声がすでにか細く、すでに小さくなっていて、コンピュータで何か悪いことをしてしまった気がするとおっしゃるあの電話です。まだその電話を待っておられる方もいるでしょう。この記事の目的は、その電話がかかってくる頻度を減らすために — そして、もしかかってきたとしても、口座が空になる代わりに警告のところで被害が止まるように — 私たちが作り上げた仕組みを、細部にわたって説明することです。

攻撃産業はずっと高齢者を狙い続けてきました。

フィッシングは、決して賢い人間のゲームではありませんでした。これは確率のゲームです。偽のログインページを何千と量産し、見慣れたブランドをなりすまし、急かすような文面を書き、メール・SMS・SNS・電話を通じて押し出す産業的なパイプラインなのです。攻撃者に必要なのは、たった一人が、ある日、ふと気を抜いた一瞬に、間違った欄にパスワードを打ち込んでくれること、それだけです。祖父母、両親、連れ合いを亡くしたお隣さん、郵便で届く銀行の手紙を信じて育った人たち — この方々は遅いのではなく、信じ深いのです。攻撃者はそれを知っており、意図的にそこを狙ってきます。

「荷物のお届け」「税務署からの還付」「Microsoftサポート」「口座ロック」「おばあちゃん、私だよ」「アカウント確認」ご家族パスワード一つの距離どれだけ「誤字を見抜く」研修をしても、これは解決しません。
家で一人座っている高齢の利用者が、グローバルな攻撃産業の全荷重を受け止めています — SMS、メール、電話、SNSのメッセージ、偽の配送通知、還付金詐欺。アンチフィッシングの助言は、この一つひとつを手作業で見分けられることを前提にしています。そんなことは不可能です。

祖父母に向けて発信されるセキュリティ上の助言は、昔からずっともっと気をつけなさいのバリエーションでしかありませんでした。URLを確認しなさい。リンクにカーソルを合わせなさい。送信者を信用するな。問題は祖父母が不注意だということではありません。問題は、攻撃産業が「もっと気をつける」を打ち負かすことをフルタイムの仕事にしているプロを雇っているということです。守る側と攻める側のあいだにある差は、もはや恥ずかしいほど開いてしまっています。

私たちが作ったもの、ひと目で。

Bromureのなかでページが読み込まれると、密閉されたブラウザVMの内部で小さなインスペクターが動き出します。門番のように警戒しながらページを観察します — URL、フォーム、表示されているテキスト、リンク、QRコード、さらにはページがこっそりクリップボードに書き込もうとしている内容まで見ます。何か怪しい点があれば、インスペクターの見つけた情報が隔離されたチャネルを通ってモデルへと送られます。モデルはそれらのシグナルを読み、判定を下し、一文の説明を書いて返します。Bromureはその判定をページ上のバナーとして表示します。あからさまなフィッシングページは、誰かを騙せるようになる前にブロック警告画面へとリダイレクトされます。

サンドボックス内(VM)ページ読込コンテンツスクリプト起動ローカルスイープフォーム · URL · ブランドQR · クリップボードプリフィルタ著名サイト・信頼済み・SSOは除外判定バナーを表示安全 · 疑わしい · フィッシングvsock · port 5950BROMURE API上キャッシュ{domain, path}TTL 1時間Claude Haiku構造化されたJSON判定判定JSON判定 · 確信度 · 理由
パイプライン全体。青の領域のステップはサンドボックス化されたゲストVM内で動きます。オレンジの領域のステップはBromureのサーバー上で動きます。黄色のバーはvsockチャネルで — ネットワークではなく — 両者のあいだで見つけた情報を運びます。

この記事の残りはその仕組みの話です。意図して詳細に書いています。もしご両親のためにこれを読んでいらっしゃるのなら、あなたのデータが実際にどこへ行くのかまで読み飛ばしていただいてかまいません — そして、短い答えは次の通りです。この機能は既定でオフで、同意を求めてから動き、行うことはすべて以下に記されています。

ステップ1 — ローカルスイープ。

どんな情報もあなたのコンピュータから外へ出る前に、ゲストVMのなかでコンテンツスクリプトが動きます。ページを複数の独立したパスで検査します。いずれのパスも重い処理ではありません。どれもブラウザのなかで、あなたのコンピュータのなかで、ページ自身と同じ密閉サンドボックスのなかで動きます。

パスワード欄、現れた瞬間に

<input type="password">がDOMに追加された瞬間 — あなたがまだフォーカスしてもいないうちに — インスペクターはすでにそのドメインを記録し、あなたがそこでパスワードを入力したことが一度でもあるかどうかを判定しています。新しいドメインで初めて?それだけでも一つのシグナルです。

フォーム構造

ナビゲーションのないログインだけのページ。アドレスバーのドメインと異なるドメインにPOSTするフォーム。ロゴが別のホストからホットリンクされているのに、あるブランドになりすましているフォーム。どれも単独では弱いシグナルです。合わされば、確率を動かします。

ブランドの不一致

ページには「Apple ID」と書いてあるのにドメインがAppleのものではない、あるいはロゴが怪しげなホストから配信されている — こうした不一致は記録されます。ネットワーク呼び出しは不要です。すでにページ上にあるものに対するパターンマッチにすぎません。

ホモグリフドメイン

аррӏе.com のようなドメイン — 見た目は「apple.com」と同じだが、キリル文字のそっくりさんで組み立てられている — はほぼ確実にフィッシングです。インスペクターは、表示形を既知の混同しやすい文字の集合と照合してこれを検出します。

詐欺の語彙

「パスワードをご確認ください」。「アカウントを認証してください」。「あなたは選ばれました」。「こちらをクリックして賞品を受け取ってください」。どれも弱いシグナルです。ただ、ログインフォームのなかに、誰も聞いたことのないドメインで、三つのフレーズが揃っていれば、話は違ってきます。

QRコードとクリップボードのペイロード

無関係なウォレットの暗号通貨決済URIにデコードされるQRコード。「Win+Rを押して貼り付けてください」と指示しながら、こっそりシェルコマンドをクリップボードに書き込むページ。これらは従来のあらゆるフィルタをすり抜ける、現代的な攻撃パターンです。

ローカルプリフィルタも働いていて、誰も心配する必要のないサイトについて、インスペクターがサーバーを煩わせないようにしています。Trancoリストの上位10万ドメインと、厳選された30以上のSSOプロバイダ(Google、Microsoft、Okta、Appleなど)は、他に怪しい点がない限り静かに無視されます。お母さまの本物の銀行、本物の薬局、本物のウェブメールについて、サーバーに問い合わせが飛ぶことは決してありません。

ローカルスイープの結果、何も面白いものがなければ、物語はここで終わりです。リクエストはコンピュータから出ていきません。

ステップ2 — セカンドオピニオン。

もし取りまとめた情報が面白いものであれば — あるいは見慣れないドメインにパスワード欄が現れたところであれば — 構造化されたレポートが評価のために送られます。スクリーンショットではありません。DOM全体でもありません。シグナルの、範囲を区切られ、サニタイズされた要約です。

利用者に見えているものpaypai-secure.xyz/loginPayPalアカウントにログインすぐにアカウントをご確認ください。メールアドレスパスワードログインモデルが見ているもの{"domain": "paypai-secure.xyz","urlSuspicion": ["brand-in-subdomain"],"brandSignals": {"title": "Log in to your account","logoDomain": "i.imgur.com"},"domainMismatch": {"claimed": "paypal","actual": "paypai-secure.xyz"},"sensitiveFields": ["password"],"pageStructure": ["only-login-forms","minimal-navigation", "data-uri-favicon"],"contentIndicators": ["urgency-language"]}
モデルが実際に見ているもの。左のページは人間の目にはピクセル単位で完璧に見えるかもしれませんが、右側のモデルはレンダリングされたピクセルからではなく、小さな構造化されたシグナルの一覧から作業しています。

このバンドルには、URL、ドメイン、表示されているテキスト(およそ800文字で上限を設け、制御文字を除去したもの)、各フォームの要約(フィールドの型、ボタンのラベル、アクションURL)、検出された機微なフィールド、ページのタイトルと主要な見出し、ロゴ画像の配信元、ドメイン不一致とホモグリフのフラグ、URLレベルの警戒シグナル(brand-in-subdomain、ピュニコード、ハイフン過多)、構造フラグ(only-login-forms、パスワード自動補完の無効化、data-URIファビコン、隠しiframe)、デコードできたQRコードの中身、静かに書き込まれたクリップボードのペイロードが含まれています。すべての文字列は短い上限で打ち切られ、配列は少数に制限され、制御文字は残りません。

サーバー側では、この一覧がClaude Haiku 4.5 — 小さく高速なモデル — に渡されます。システムプロンプトはモデルに対し、一覧の中身をすべて信頼できない法医学的証拠として扱うように指示します。すなわち、そのページはプロンプトの存在を知っている誰かが、プロンプトを混乱させるために作ったものだと想定するのです。プロンプトはモデルに9つの順序だったチェック(ドメイン分析、ブランドなりすまし、ページ構造、資格情報の収集、疑わしいリンク、詐欺コンテンツ、QRコード、クリップボードペイロード、最終統合)を通させ、単一のJSONオブジェクトを出力するよう求めます。

{
  "verdict": "phishing" | "suspicious" | "safe",
  "confidence": 0.0,
  "reason": "平易な言葉で書かれた一文"
}

しきい値は意図して調整されています。0.85を超えると、判定はphishingとなり、サイトはブロックされます。0.4から0.84のあいだはsuspiciousとなり、警告バナーが表示されます。0.4未満はsafeで、何も表示されません。弱いシグナルが一つだけ — 詐欺的な単語が一語、ファビコンの不一致が一つ — あるだけでは、ハードルを越えません。モデルには明示的に、おばあさまのかかりつけ薬局で誤検知を出すことの方が、そこそこの詐欺を一件通してしまうよりも悪い、と伝えてあります。

答えがすでに明らかな場合、モデルを完全にスキップする二つの高速パスがあります。

  • ブランド不一致ショートカット — ページがPayPalを名乗っているのにドメインがpaypai-secure.xyzである場合、サーバーはLLM呼び出しもコストもなしに即座にsuspiciousを返します。
  • キャッシュヒット — 判定は{domain, normalized path}をキーとし、memcacheに1時間保存されます。同じページへの二度目の訪問はコストがかからず、ミリ秒単位で応答されます。

ステップ3 — ページ上の判定。

判定が返ってくると、Bromureはそれをページ内にインラインで描画します — ページの中、コンテンツの上に。ポップアップでも、ご両親がコンテンツを見る前に閉じなければならないモーダルでもありません。

安全 · 何も表示されない(バナーなし — ページはそのまま読み込まれる)疑わしい · 琥珀色バナー、閉じられる!疑わしいページこのページはパスワードを求めていますが、このドメインを訪れるのは初めてです。このサイトは知っています×フィッシング · 赤い警告画面、既定は戻るフィッシングを検出このサイトはPayPalをなりすましています。資格情報を入力しないでください。paypai-secure.xyz安全な場所へ戻るそれでも進む
ありえる三種類のバナー。安全なら沈黙。疑わしいなら閉じられる琥珀色の警告で、「このサイトは知っています」という脱出口が付いています。フィッシングなら赤い画面全体の警告で、既定の動作は戻ることです。

理由の一文はいつでも、デバッグする人のためではなく、それを読む人のために書かれた一文です。バナーに出ているのは、*「このサイトはPayPalをなりすましています。資格情報を入力しないでください」*であって — 確信度スコアでも、シグナルのトレースでも、正規表現マッチの一覧でもありません。目指しているのは、お母さまが一度バナーを読めばどうすべきかが分かる、ということです。

疑わしいバナーを閉じるたびに、その決定は現在のセッションに限定されます。あるいは、このサイトは知っていますをクリックした場合には、プロファイルの信頼済みリストに昇格されます。信頼するかどうかの判断は、モデルではなく、彼女のものです。

クロスドメインの捕捉 — 判定を必要としないセーフティネット。

どんな判定が届く前でも、Bromureは一つの絶対ルールを守ります。それは、アドレスバーのドメイン以外にパスワードが送られることを、確認なしに許さないというものです。login.bank.com上のフォームが今まさにcredentials.attacker.exampleにPOSTしようとしている場合、その送信は傍受され、モーダルが表示されます。

ページlogin.bank.comパスワード: ••••••••傍受!パスワードが別の宛先へこのページはあなたのパスワードを別のドメインに送ろうとしています。キャンセル続ける既定の動作はキャンセルフォームの宛先creds.attacker.example異なるドメインSSO許可リストになし確認されるまでブロック
クロスドメインのパスワード捕捉。サーバーの判定を待たずに、パスワードの送信先がページのドメインと一致しないフォーム送信はすべて停止され、両方のドメインを平易な言葉で示した明示的な確認が求められます。

既知のアイデンティティプロバイダの短い厳選された許可リスト — Google、Microsoft、Okta、Apple、その他数十 — によって、正規のフェデレーションサインインはこの捕捉から除外されます。それ以外はすべて、毎回モーダルを経由します。この一つのルールだけで、モデルが判定を返すよりも前に、資格情報フィッシングページのかなりの割合を捕まえられます。

あなたのデータが実際にどこへ行くのか。

データの経路を決める制約は二つです。一つは同意。もう一つは隔離です。

同意。 この機能は、新しいプロファイルではすべて既定でオフです。有効にするには、利用者がプライバシーと安全を開きます。そこでは、いずれかのトグルが切り替えられる前に、送信される内容(URL、ページテキスト、フォーム構造、警戒シグナル)、送信先(Bromureがbromure.ioで運用するサーバー)、保持期間(短期ログ、不正対策とモデル改善のため)、そして無効化の方法を説明する専用のモーダルが現れます。この機能はそもそも永続的なプロファイルでのみ利用できます — 一時的に使い捨てるセッションでは使えません — ので、匿名の調査セッションが誤ってサーバーにデータを漏らすことはありません。もしおばあさまのMacにBromureを入れて、この機能を彼女のために有効にしたのであれば、彼女の目の前に現れるバナーこそが、信頼する誰かによって、彼女のために、意図的にその選択がなされた証なのです。

隔離。 ブラウザはインターネットに直接つながっていません。インスペクターもそうです。見つかった情報はすべて、ゲストVMからホストへ、内部ポートを通るvsockチャネルを流れます — ウェブページから見えるネットワークインターフェースを通らず、ページが操作できるプロキシも経由しません。ホストはリクエストをAPIに中継し、判定を受け取り、それをインスペクターに手渡します。世界中のどのウェブページも、vsockブリッジには届きません。どのウェブページも、ホストに直接は届きません。どのウェブページも、ブリッジの存在を知ることすらできません。

ゲストVM(ブラウザ)ウェブページphishing-guardコンテンツスクリプトバックグラウンドワーカーvsock :5950macOSホストPhishingAnalysisBridgeゲストの発見を中継APIへの唯一の経路HTTPSBROMURE APIbromure.io/v1/analyzememcacheTTL 1時間Haiku 4.5判定JSONウェブページはこれらの経路のいずれにもアクセスできません。
データの経路。見つかった情報はゲストの拡張機能から、vsockを通ってホストのブリッジへ、そしてHTTPSでAPIへと流れます。ウェブページはこれらの経路のいずれにも直接触れません。

チェック対象となったページのURL、不正対策のために短期間サーバー上に記録されます。表示されているテキストは分析のためにモデルへ送られ、応答後には保持されません。あなたがフォームに打ち込んだ内容は、いかなるときもバンドルに含まれません。この機能を切っていれば、何一つデータは送信されません。

既知のページでは高速に。

ページが読み込まれるたびに言語モデルを呼び出していれば、ブラウザは重たく感じられてしまいます。Bromureは判定を積極的にキャッシュしており、インターネットの人気ページは、初回訪問以降は事実上コストゼロで評価できます — そして万一サーバーが到達できない場合も、ローカルスイープは仕事を続けます。

キャッシュが最初、モデルは最後

判定は{domain, normalized path}で1時間キャッシュされます。同じページへの二度目の訪問はモデルに触れずにミリ秒で応答します。ブランド不一致のショートカットは、モデル自体を完全に飛ばします。

ローカルスイープが下支え

サーバーが届かない、あるいは遅いときでも、ローカルスイープは動き続けます。もっとも明らかなケース — クロスドメインのパスワード、ホモグリフドメイン、クリップボードのペイロード — のバナーは、完全にあなたのコンピュータのなかで生成され、ネットワークは不要です。

約束、守られて。

最初の記事で、守りは決して瞬きをしないもう一組の目であるべきだと申し上げました。これが、いままさにBromureのなかで、その一組の目が実際にやっていることです。

お母さまが、ニュースを読むためにセキュリティ試験に合格する必要などあってはなりません。お父さまが、ホモグリフとは何かを知っていなければならない道理もありません。おじいさまが、電話口の物腰のよい声に何かをインストールするよう言われたからといって、自分を愚かだと感じなければならないなど、あってはならない話です。ブラウザが、罠を、間に合ううちに見抜き、そうだと言ってくれるべきなのです — 専門用語ではなく、一文で — パスワードがキーボードから出ていく前に。

それが、Bromureのアンチフィッシングがそのために存在している目的です。だからこそ、これは既定でオフで、有効化の前に文書化され、ページから隔離され、大規模でも安価に動くように作られています。ご両親のMacにインストールしてください。プライバシーと安全のパネルを一緒に見ていってください。機能をオンにしてください。そして、食事に行きましょう。