
フォントベースの欺瞞ツール。レッドチーム、セキュリティ研究、その他何にでも。
EvilFontTool は、人間の読者にはまったく異なるテキストを表示しながら、機械可読なテキストを文書内に隠します。これはEvil Fonts(悪意のあるフォント)を使用して実現されます。Evil Fonts とは、コンピューターが解釈する文字とは異なる文字を表示することで意図的に閲覧者を欺くフォントです。フォントのグリフを再マッピングすることで、文書の表示上の文字は人間にはある内容を示し、ターミナル、AI システム、クリップボードへのコピー&ペーストには別の内容が見えます。
ワード文書(docx)のデモは、スマートフォンでのフォント描画方法の関係上、モバイルでは動作しません。
pip install evilfonttool
git clone https://github.com/DoctorEww/EvilFontTool.git
cd EvilFontTool
pip install .
開発用(編集可能インストール)の場合:
pip install -e .
pip によって自動的にインストールされます:
fonttools — フォントの解析と操作brotli — WOFF2 圧縮(fonttools が使用)python-docx — DOCX 生成reportlab — PDF 生成pdf2image — PDF から画像への変換pdfminer.six — PDF のテキスト/レイアウト抽出Pillow — PDF パイプライン用の画像処理システム要件(pip ではインストールされません。PATH に含める必要があります):
pdf コマンドに必要です。このコマンドは soffice --headless を呼び出して DOCX を PDF に変換します。pdf コマンドは Windows では実験的であり、意図したとおりに動作しない場合があります。
sudo apt install libreofficebrew install --cask libreofficepdf コマンドの PDF ページ描画のために pdf2image が必要とします
sudo apt install poppler-utilsbrew install popplerpoppler を ~\Documents\poppler にインストールして PATH に追加します。
irm (irm https://api.github.com/repos/oschwartz10612/poppler-windows/releases/latest).assets[0].browser_download_url -OutFile ~\Documents\poppler.zip
Expand-Archive ~\Documents\poppler.zip ~\Documents\poppler -Force
$bin = (gci ~\Documents\poppler -Recurse -Filter pdftotext.exe)[0].DirectoryName
[Environment]::SetEnvironmentVariable('Path', [Environment]::GetEnvironmentVariable('Path','User') + ";$bin", 'User'); $env:Path += ";$bin"
/usr/share/fontsC:\Windows\Fontspdf コマンドは Windows では実験的であり、意図したとおりに動作しない場合があります。pdf コマンドは、段組みなどの複雑なワード文書では動作しません。どうしてもサポートしてほしい機能があれば、遠慮なく issue を開いてください。doc --ttf-dir <ttffonts_dir> を使用するか(EvilFontTool が自動的に埋め込みます)、Windows の Word を使用してください。LibreOffice 自体の「フォントを埋め込む」オプションは Evil Fonts では機能しません。pdf コマンドは Evil Fonts にはまったく依存していません。DOCX を画像にレンダリングし(表示されるページがテキストではなく画像になる)、その上に実際のコンピューターテキストを完全に不可視の選択可能なテキストとして描画します。コピー&ペーストやテキスト抽出は、その不可視レイヤーを読み取ります。これができるツールは他にもいくつかありますが、気に入った DOCX がすでにある場合に pdf コマンドほど簡単なものはありません。
本物の Evil Font PDF が必要な場合は、不可視の文字を使わずに Word 文書を作成する必要があります(不可視の文字は PDF 変換後も保持されません)。そこから、Word から直接エクスポートするか、「PDF に印刷」を使用します。これによりすべてが単一レイヤーに保たれ、pdf コマンドが使用する有名な 2 レイヤートリックとは異なる IOC が文書に与えられます。pdf コマンドが存在する理由は、その手動プロセスが面倒で、Word 文書の PDF コピーをすぐに作成したい場合があるからにすぎません。
要約;
pdf コマンドを使用する → 2 レイヤー PDF。他のツールと同じメカニズム(より有名/検出されやすい)。誰かが不可視の文字を使ったままオプション 2 を実現する方法を編み出したら、ごちそうします。issue を開いてください。README でクレジットします。
すべての機能は、4 つのサブコマンドを持つ単一の CLI で提供されます。
create — HTML または DOC ファイルで使用するフォントファミリーを生成するevilfonttool create <reference_font> <output_dir> <font_name>
| 引数 | 説明 |
|---|---|
reference_font | ソースとなる .ttf または .woff フォントへのパス |
output_dir | フォントと CSS を書き込むディレクトリ |
font_name |
例:
evilfonttool create fonts/Arial.ttf output/ 'Arial'
出力:
output/fonts/*.woff — 文字ごとの Web フォントoutput/ttffonts/*.ttf — 文書埋め込み用の TTF フォントoutput/fonts.css — Web 用の @font-face 宣言.txt ファイル。computer_file の各行は、human_file の対応する行以上の長さである必要があります。web — Evil Font HTML ファイルを生成するevilfonttool web <human_file> <computer_file> <output_file>
HTML ファイルが使用できるように、
fonts.cssと生成されたフォントが出力ディレクトリにある必要があります(または HTML ファイル内のパスを変更してください)。
| 引数 | 説明 |
|---|---|
input_human_file | 人間の読者に表示されるテキスト。複数行可 |
input_computer_file | 機械 / AI に表示されるテキスト。複数行可 |
output_file | 生成される HTML ファイルのパス |
例:
evilfonttool web human.txt computer.txt output/index.html
doc — Evil Font DOCX ファイルを生成するevilfonttool doc <human_file> <computer_file> <output_file> <font_name> [--author AUTHOR] [--ttf-dir DIR]
font_nameはcreateステップで使用した名前と一致している必要があります。TTF フォントは、システムにインストールするか、--ttf-dirで埋め込むか、Word で手動で埋め込む(ファイル -> オプション -> 保存 -> フォントの埋め込み)必要があります。そうしないと、欺瞞が正しくレンダリングされません。
Word 自体の「フォントを埋め込む」保存オプションは正常に機能しますが、LibreOffice のものは機能しません — Evil Fonts を正しく埋め込むことはできませんでした。代わりに --ttf-dir を渡してください。EvilFontTool はフォント自体を .docx に直接埋め込み、Word や LibreOffice の埋め込みには一切依存しません。
例:
evilfonttool doc human.txt computer.txt output/secret.docx MyFont --author "Finance Team" --ttf-dir output/ttffonts
pdf — Evil Font DOCX をコピー&ペースト対応 PDF に変換するevilfonttool pdf <input_docx> <output_file> [--ttf-dir DIR] [--dpi DPI] [--soffice PATH] [--ink-font FONT] [--title TITLE] [--author AUTHOR] [--subject SUBJECT] [--producer PRODUCER]
LibreOffice で DOCX をレンダリングして PDF が文書と同一に見えるようにし、その上に隠れたペイロードを不可視のコピーレイヤーとして重ねるため、すべてのビューアーでコピー&ペーストしても維持されます。
Windows: このコマンドは Windows では実験的であり、意図したとおりに動作しない場合があります。
LibreOffice(
soffice)とpoppler-utilsが必要です — 依存関係 を参照してください。
例:
evilfonttool pdf output/secret.docx output/secret.pdf --ttf-dir output/fonts/ttffonts --title secret
このツールの使用方法については、あなたに責任があります。 明示的な許可なくシステムや個人に対してこの手法を展開することは非倫理的であり、違法となる可能性があります。作者は、防御側がこの種の脆弱性を理解しテストするのを支援するためにこのツールを提供しています — 攻撃を可能にするためではありません。
このツールは、レッドチーマーがフォントベースの攻撃のリスクを組織に対して検証するのを支援するために作成されました。また、ブルーチーマー、研究者、システム所有者が、ユーザーが提供するフォントを無条件に信頼することによって残されるセキュリティのギャップを理解するのを支援するためにも作成されました。以下は、現代のオペレーティングシステムやアプリケーションにおいてフォントがもたらす問題に対処または緩和するための、個人および業界向けの実用的な推奨事項です。
curl の出力を直接 bash / Invoke-Expression にパイプするコマンドを実行しないでください。攻撃者はダウンロード元の Web サイトを切り替えるのは簡単です。Win + R を使用するユーザーに対し、最初に使用するときに「これは非常にリスクが高い」という怖いポップアップで警告してください(なぜこれがまだ実装されていないのか謎ですが...)。コントリビューションは歓迎します。新しい攻撃面、フォント生成パイプラインの改善、または文書化する価値のある防御手法を見つけた場合は、issue または PR を開いてください。
git checkout -b feature/my-feature)このツールは、ワード文書、PDF、フォントの複雑さのため、テストが非常に困難です。再現可能な問題を見つけた場合は、GitHub の issue を開いてください。できるだけ早く対応します。
issue には以下を含めてください:
mismatch の警告)。.docx / 入力ファイル(共有できる場合)。| 生成されたフォントファミリーの内部名プレフィックス |
| 引数 | 説明 |
|---|
input_human_file | 人間の読者に表示されるテキスト。複数行可 |
input_computer_file | 機械 / AI に表示されるテキスト。複数行可 |
output_file | 生成される DOCX ファイルのパス |
font_name | フォントファミリー名(create ステップと一致させる必要があります) |
--author | DOCX 文書の作成者メタデータ(デフォルト: なし) |
--ttf-dir | Evil Font TTF のディレクトリ(例: <output_dir>/ttffonts)。指定した場合、実際に使用されたフォントが直接 .docx に埋め込まれるため、システム全体にインストールしなくても欺瞞が正しくレンダリングされます。human ファイルに含まれる文字のみが埋め込まれます。 |
| 引数 | 説明 |
|---|
input_docx | Evil Font DOCX へのパス(doc ステップの出力) |
output_file | 生成される PDF ファイルのパス |
--ttf-dir | Evil Font TTF のディレクトリ(例: <output_dir>/ttffonts)。LibreOffice に公開され、偽装がレンダリングされます。フォントがシステム全体にインストールされているか、ファイルに埋め込まれている場合のみ省略可能 |
--dpi | 可視レイヤーのラスタライズ品質(デフォルト: 200) |
--soffice | LibreOffice バイナリへのパス(デフォルト: soffice) |
--ink-font | 不可視コピーレイヤー用の TTF(デフォルト: システムのサンズ系フォント) |
--title | PDF 文書タイトルのメタデータ(デフォルト: Untitled) |
--author | PDF 文書作成者のメタデータ(デフォルト: なし) |
--subject | PDF 文書サブジェクトのメタデータ(デフォルト: なし) |
--producer | PDF 文書プロデューサーのメタデータ(デフォルト: なし) |