機能

人間の目には透明、AIスクリーンリーダーには悪夢

レンダリングされたページの文字は同じアルファベット内の視覚的に類似した兄弟文字と静かに交換されます — aはeに、bはpに、mはwになります。ユーザーのカーソル周辺の領域はオリジナルを表示するため、ページを読む人は変化を感じません。同じページのスクリーンショットがOCRエンジンやAIビジョンモデルに与えられると、モデルはページ全体で全く異なる単語を読み取ります。

ピクセルレベルの歪みは防御として侵食されつつあります。GPT-4V、Claude Vision、GeminiなどのモダンなAIビジョンモデルは、ノイズ、ブラー、アドバーサリアルパターンを通じてテキストを読む能力を着実に向上させています。より深い攻撃サーフェスはテキスト自体です。ZeroLeakはレンダリングされたページの文字の一部を、同じラテンアルファベット内の視覚的に類似しているが意味的には異なる兄弟文字と静かに置き換えます。ユーザーのカーソルがある場所では、置換されたテキストをオリジナルに戻すリビール領域があります — そのため人間は見ている場所を見て、脳の自然なパターン認識が残りを補完します。同じページのスクリーンショットを撮ってAIモデルに与えると、モデルはカーソルもリビールもありません。置換された文字を実際のコンテンツとして読み取り、返すものは別の文書になります。

同一スクリプト
ラテン文字がラテンの隣人と交換 — OCR正規化が元に戻すものなし
カーソル駆動
カーソル周辺のリビール領域がオリジナルを表示 — ユーザーは見ている場所を見る
DOM層
文字データで動作、ピクセルレベルの歪みと補完的

ピクセルレベルの防御が侵食されています。AIビジョンモデルはそれを通じて読み取ります。

AIスクリーン読み取りに対する以前の防御はピクセル層で動作していました — ランダムノイズ、周波数領域の摂動、サブピクセルジッター、マイクロブラー、クロマシフト。これらは依然として古典的なOCRエンジンに対して有効であり、層状防御の一部として残っています。しかしモダンなビジョン言語モデル — GPT-4V、Claude Vision、Gemini、およびその後継 — は部分的な視覚的証拠から単語を再構築するトークナイザー認識パッチエンコーダーを持っており、着実に向上しています。ピクセルがノイズだらけでも、モデルは依然として根底にあるテキストを復元します。

次の攻撃サーフェスは一層上にあります。DOM。保護されたページをレンダリングするヘッドレスブラウザの内部では、スクリーンに描かれる実際の文字データを私たちが所有しています。第3段落の47番目の位置の文字はもはやオリジナルではないと決定できます。同じアルファベット内の視覚的に類似しているが異なる文字です。そのページのスクリーンショットを見るOCRまたはVLMは置換された文字を見て、それを真実として報告します。モデルは置換されたことを知らず、比較するものもありません。

難しい部分は人間ユーザーの読書を壊さずにこれを行うことです。リビールメカニズム — カーソル周辺の小さな領域で置換されたテキストをオリジナルに戻す — がその答えです。人々は一瞥して読みます。目は1つのフレーズに固定し、脳のパターン認識が周辺視野とコンテキストから残りを補完します。カーソルリビールはユーザーが実際に見ている場所に合わせられています。ページの残りは置換されたままでいられます。ユーザーはいずれにせよ一文字ずつ読んでいないからです。同じスクリーンショットを見るAIモデルはそのようなカーソルも、そのようなリビールも持ちません — すべてを置換されたテキストとして読みます。

文字を置換し、ユーザーが見ている場所を表示する

スクリプトはZeroLeakのヘッドレスブラウザによってすべての保護されたページに注入されます。起動時にスクリプトはDOMを走査し、同じラテンアルファベットから文字の一部に視覚的に類似した置換を選んでページに書き込みます。カーソルの位置がリビールゾーンを駆動します — ユーザーが見ている場所ならどこでもオリジナルが表示されます。リビールの外はすべて置換されたままです。

同じアルファベットの視覚的に類似した兄弟文字と静かに交換

ページ上のある位置の文字は視覚的に類似しているが異なる文字になります — aはeに、bはpに、mはwに、nはuになります。この交換はラテンアルファベット内で視覚的なファミリーを共有する文字間で行われ、Unicodeの見た目が似た文字の間ではありません。この区別が重要な理由:OCRとAIビジョンパイプラインはUnicode同形文字(キリル文字のaをラテン文字のaに)を正規のラテン文字に正規化します。同一スクリプトの交換は正規化するものを何も残しません — モデルは置換された文字を実際の文字として読み取ります。

カーソル周辺のリビール領域がオリジナルを表示

ユーザーがカーソルを動かすと、その周辺の領域(デフォルトは円形、水平バンドとして設定可能)が置換された文字をオリジナルに戻します。ユーザーは見ている場所を見ます。脳の自然なパターン認識が周辺視野から残りを処理します。リビールの外では、ページは置換されたままです — これがスクリーンショットを見るAIモデルが見るものです。

静的暗号 — 各文字は変化しない1つの置換を受け取る

ページが読み込まれると、各置換された文字はページの生存期間中安定したままの特定の置換を受け取ります。ユーザーの視野にはフリッカーなし、時間的回転なし、アニメーションなし — 暗号はカーソルリビールの後ろに静かに座っています。以前のデザインは数フレームごとに暗号を回転させました。ユーザー疲労テストにより測定可能な読書不快感が生じることが示され、最終的なデザインは静的のままになりました。

DOM層で動作し、ピクセルレベルの防御と補完的

テキスト暗号はヘッドレスブラウザのDOM内部で動作します — レンダリングされたピクセルではなく、文字データに直接。AIビジョンモデルに対するピクセル層の防御は引き続き下で動作します。テキスト暗号はピクセル回復技術では対処できない直交する攻撃サーフェスを追加します。ピクセル層を破った攻撃者は依然として置換されたテキストを正しく読む必要があります。何らかの形でオリジナルの文字を回復した攻撃者は依然としてピクセル層を打ち負かす必要があります。

暗号が実際に行うこと

以下の各動作は経験的疲労リビジョン後の製品設計の一部です。ライブ実装はこれと完全に一致しています。設定はオペレーターコンソールを通じて保護されたサービスごとに行われます。

同一スクリプトのラテン置換、手作業でキュレーションされたテーブル

置換はラテンアルファベット内に留まります。置換テーブルは視覚的なファミリーでキュレーションされています:丸いボウル(a、e、o、c)、鏡像ボウル(b、p、d、q)、細い縦線(i、l、j、1)、アーチ(m、n、u、h、w)、ディセンダー(g、y、j、q)。テーブルの各文字は2〜4個の視覚的な隣人を持ちます。置換はその1つを選びます。レイアウトのリフローが起きないよう幅のマッチングが優先されます。

リビールゾーン — カーソル周辺の円または水平バンド

デフォルトの形状は設定可能な半径(デフォルト200 px)の円です。代替バンド形状はカーソルの高さで水平ストリップをカバーします — 目の動きが主に水平な長い行のコンテンツを読む場合に便利です。形状は他のZeroLeakカーソルベースのエフェクトと共有されるため、オペレーターは一度設定するだけです。

ノードごとのマップに永続する静的暗号

スクリプトがテキストノードを最初に見ると、ノードごとのマップにオリジナル値を保存し、置換された値をDOMに書き込みます。後続の更新は同じ置換を使用します — フレームごとの回転はありません。ユーザーは静止したページを認識します。暗号はカーソルリビールの後ろに見えません。

ヘッドレスブラウザのスクリプトフック経由で注入

置換スクリプトはZeroLeakエンジンによってヘッドレスChromium内のすべてのナビゲートされたドキュメントに注入されます。保護されたWebアプリケーションは変更されません。暗号はレンダリングされたドキュメントとユーザーの表示層の間のページサイドヘルパーとして動作します。保護されたアプリケーションのコードとの調整は不要です。

ユーザーが入力したフォーム入力は除外

ユーザーがinput、textarea、またはcontentEditable領域に入力したテキストは置換から除外されます。保護されたアプリケーションはユーザーが入力したとおりのクリーンな入力を受け取ります。検索ボックス、メッセージ作成、フォーム送信 — すべて影響を受けません。

ビューポート内の可視テキストのみが対象

IntersectionObserverはどのテキストノードが実際に可視かを追跡します。画面外のテキストは置換されません(いずれにせよユーザーには見えません)。ユーザーが非表示のセクションをスクロールして表示すると、置換がちょうど間に合って適用されます。これにより実行コストはページ全体のサイズではなく、画面上にあるものに比例します。

置換テーブルと手付かずのもの

同一スクリプトの視覚的置換がこの技術の核心です。以下のテーブルは実際の製品マッピングのサンプルです。完全なテーブルはすべての小文字、大文字、選択された数字をカバーします。

01

丸いボウル — a、e、o、c

これら4つの文字はすべて閉じたボウル形状を共有します。一方を他方に置換すると読書距離でシルエットが保持されます。「data」のような単語は置換された形で「doto」になるかもしれません — カーソルリビールを通じて一瞥した人間は即座に「data」と読み取りますが、OCRまたはAIモデルが置換された形を読むと「doto」を返します。

02

鏡像ボウル — b、p、d、q

これら4つは互いの視覚的な鏡像です。一方を他方に置換すると縦棒+ボウルのパターンが保持されます。「database」という単語は暗号形式で「patabose」になるかもしれません — 脳のパターン認識がオリジナルを回復するのに十分なほど視覚的に近いですが、AIモデルが読むと間違った単語を返すほど意味的に無関係です。

03

アーチ — m、n、u、h、w

これら5つはアーチ/逆アーチ/繰り返しアーチのパターンを共有します。このファミリー内での置換はテキストの全体的なリズムを保持します。「human」は「wuwon」になるかもしれません — カーソルの下で一瞥して読めますが、置換されたテキストを読むAIには認識できません。

04

なぜUnicode同形文字(キリル文字、ギリシャ文字)を使わないのか

以前の提案はUnicodeの混同文字(ラテン文字aのためのキリル文字а、ラテン文字oのためのギリシャ文字ο)を使用していました。これらは拒否されました。OCRパイプラインとAIビジョンモデルは言語モデルステージでこれらを正規のラテン文字に正規化するからです。ラテン-キリル混在テキストにロシア語言語パックを持つTesseractはクリーンなラテン出力を返します。言語モデルの第2パスがキリル文字の同形文字をラテン文字の等価物に投影するからです。同一スクリプトの置換は正規化するものを何も残しません。

05

手付かずのもの — canvas、SVGテキスト、フォーム入力

HTML5 canvasまたはSVG内でレンダリングされたテキストはDOMテキストノードセットの一部ではありません。暗号はそれに触れません。同様に、ユーザーがinputやtextareaに入力したテキストもクリーンのままです。これらのカバレッジのギャップは意図的です。canvasとSVGコンテンツは並行してピクセル層の防御によって処理され、フォーム入力は保護されたアプリケーションが機能するためにクリーンのままである必要があります。

テキスト暗号が経路を閉じる場所

スクリーンをキャプチャするAIビジョンモデル

スマートフォンやワークステーションの傍らでパーソナルAIアシスタントを持つユーザー — 誰もがスクリーンショットをGPT-4VまたはClaude Visionに貼り付けてサマリーを求めることができます。テキスト暗号が有効な場合、AIのサマリーは置換されたテキストに基づいて構築されます — 検査すると元の画面にあったものとは異なる、もっともらしい出力を返します。

財務諸表とディールルーム文書

画面で読まれるが、AIツールを通じて持ち出されることを意図しない文書。スクリーンショットを撮ってAIに分析させると、ゆがんだ数字と変更された名前が返されます — AIは実際の文書と一致しないコンテンツを自信を持って報告します。

AIアシスタントによって分析される患者記録

患者記録への閲覧のみのアクセス権を持つ医療スタッフは、データをサマリーしたりクエリしたりするために外部のAIを有意義に使用することができません — AIは置換されたテキストを見ます。臨床的な洞察は保護された環境内に留まります。AIの取り込みパスは別の文書を返します。

政府・情報機関のコンソール

アナリストが閲覧する機密コンテンツ。保護された環境の外から参照されるAIツールは、オリジナルの機密素材ではなく置換されたテキストを読み取ります。開示の境界はスクリーンショットパスと同様にAI取り込みパスでも維持されます。

よくある質問

置換は人間のページの読みやすさに影響しますか?
読書はカーソルがある場所で行われます。リビール領域はユーザーが見ている場所のオリジナルを表示します。脳の自然なパターン認識は周辺視野から残りを処理します。そこでは可読性がいずれにせよ低くなっています。経験的な読書疲労テストにより現在の静的(回転しない)暗号が生まれました。以前の回転するデザインは測定可能な不快感を引き起こしていましたが、静的バージョンは引き起こしません。
カーソルを持たないタッチデバイスはどうですか?
典型的なZeroLeakのデプロイ(デスクトップワークステーションのエンタープライズオペレーター、アナリスト、コントラクター)ではタッチのみのアクセスは一般的ではありません。しかしタッチコンテキストでは、リビールメカニズムはタッチされた領域がリビールゾーンとなるタップアンドホールドモデルに戻ります。主にタッチで読書量が多いワークフローの場合、テキスト暗号は保護されたサービスごとに無効にし、ピクセル層の防御のみを優先することができます。
なぜキリル文字やギリシャ文字の見た目が似た文字を使わないのですか?
OCRエンジンとAIビジョンモデルは言語モデルステージでUnicode同形文字を正規のラテン文字に正規化します。ラテンテキストに挿入されたキリル文字「а」は出力が生成されるまでに通常のラテン文字「a」に折り畳まれます — 置換は痕跡を残しません。同一スクリプトのラテン置換(aがeに変換される)には正規化するものが何もありません。置換された文字がモデルが読む正規の文字です。
暗号がカバーしないものは何ですか?
HTML5 canvasまたはSVG内でレンダリングされたテキストはDOMテキストノードセットの一部ではありません。暗号はそれに触れません。ピクセル層の防御がそれらのサーフェスをカバーします。ユーザーがフォーム入力やtextareaに入力したテキストも除外されるため、保護されたアプリケーションはクリーンな入力を受け取ります。ページに埋め込まれたテキストの画像(写真、スクリーンショット)もDOMテキストスコープの外にあります。
これはanti-OCRピクセル防御とどのように組み合わさりますか?
この2つは補完的であり、重複していません。ピクセル層の防御(anti-OCR保護)は、レンダリングされた画像が文字認識によってどのように読まれるかを乱します。テキスト暗号は1層上で動作します — AIビジョンモデルがすべてのピクセルレベルの防御を回避してページをクリーンに読んだとしても、置換されたテキストを読みます。両方を打ち負かすには、攻撃者はクリーンな文字を見るためにピクセル層を破り、かつ置換されたものからオリジナルの根底にある文字を回復する必要があります — 2つの直交する問題です。
ユーザーセッションへのパフォーマンスへの影響は何ですか?
置換スクリプトはヘッドレスブラウザのレンダラー内で、ビューポートで実際に可視のテキストノードのみで動作します。カーソル駆動のリビール更新はブラウザのアニメーションフレームにスロットルされ、小さなマウスの動きが再描画をトリガーしないように移動閾値を使用します。一般的なハードウェアでは暗号はフレームあたりミリ秒のわずかな割合を追加します。ユーザーが見るインタラクションはスムーズのままです。

ライブデモで暗号を見る

ページを読み込み、通常の読書が見えるようにカーソルをテキストの上で動かし、スクリーンショットを撮り、そのスクリーンショットをTesseract、GPT-4V、Claude Visionに送信します — そして各々が返す非常に異なるテキストをお見せします。