跳到正文
Hacker News· woliveirajr·· 10 天前AI 评分38

Evil Font Tool:把机器可读文本藏在文档里的红队欺骗工具

Evil Font Tool

AI 导读

Evil Font Tool 是一款基于字体的欺骗工具,通过重映射字体字形,让文档对人类显示一种文字,而终端、AI 系统和复制粘贴看到的是另一种文字,可用于红队测试与安全研究。

正文 · AI 翻译

一款基于字体的欺骗工具,用于红队演练、安全研究以及其他各种用途。

EvilFontTool 将机器可读的文本隐藏在文档中,而向人类读者显示完全不同的文本。它通过 Evil Fonts(恶意字体)实现这一点——这些字体故意欺骗查看者,渲染出与计算机所理解的不同的字母。通过重新映射字体字形,文档的可见字符向人类展示一种内容,而终端、AI 系统和剪贴板复制粘贴则看到另一种内容。

Evil Font 演示/实验室 !!不要错过这个!!

Word 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 上):

  • LibreOffice — required for the pdf command, which shells out to soffice --headless to convert DOCX to PDF. The pdf command is experimental on Windows and may not work as intended.
    • Ubuntu/Debian:sudo apt install libreoffice
    • macOS:brew install --cask libreoffice
    • Windows:下载安装程序
  • poppler-utils — required by pdf2image to render PDF pages for the pdf command
    • Ubuntu/Debian:sudo apt install poppler-utils
    • macOS:brew install poppler
    • Windows:适用于 Windows 的 poppler(将 Library\bin 文件夹添加到路径)或见下文。

Poppler 安装 Windows 辅助脚本

将 poppler 安装到 ~\Documents\poppler 并添加到路径。

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"

我在哪里可以找到要使用的字体?


使用技巧

  • 在 Linux 上生成字体和 PDF。pdf 命令在 Windows 上处于实验阶段,可能无法按预期工作。
  • pdf 命令不适用于复杂的 Word 文档,例如分栏。如果你确实希望它支持某个功能,欢迎提交 issue。
  • 要嵌入字体,请使用 doc --ttf-dir <ttffonts_dir>(EvilFontTool 会自行嵌入它们)或 Windows 上的 Word。LibreOffice 自带的“嵌入字体”选项对 Evil Fonts 无效。

PDF 问题详解

pdf 命令完全不依赖 Evil Fonts。它将 DOCX 渲染为图像(因此可见页面是图片,而非文本),然后将真实的计算机文本作为完全不可见、可选择的文本绘制在其上。复制粘贴和文本提取读取的是那个不可见层。还有其他一些工具可以做到这一点,但当你已经有一个满意的 DOCX 时,没有什么比 pdf 命令更简单了。

如果你想要一个真正的 Evil Font PDF,你需要构建不带不可见字母的 Word 文档(不可见字母无法在 PDF 转换中保留)。然后,直接从 Word 导出或使用“打印为 PDF”。这样所有内容都保持在单层中,使文档具有与 pdf 命令所使用的众所周知的双层技巧不同的 IOC。pdf 命令的存在纯粹是因为手动过程很繁琐,有时你只是想要一个 Word 文档的快速 PDF 副本。

简而言之;

  • 选项 1:(简单的方法)使用 pdf 命令 → 双层 PDF,与其他工具机制相同(更广为人知/更易检测)。
  • 选项 2:(真正的 Evil Font 方法)构建不带不可见字体的 Word 文档,然后通过“打印为 PDF”转换 → 更麻烦,但产生的 IOC 与选项 1 不同。

如果有人能想出如何用不可见字母实现方案 2,我欠你一杯酒。开个 issue,我会在 README 里致谢。

用法

所有功能都通过一个带有四个子命令的 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 中对应的行
  • 行按位置匹配(第 1 行对第 1 行,依此类推)

web — 生成 Evil Font HTML 文件

evilfonttool web <human_file> <computer_file> <output_file>

需要 fonts.css 和生成的字体位于输出目录中,以便 HTML 文件可以使用它(或更改 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 的嵌入。

参数 描述
input_human_file 人类读者可见的文本。可以多行
input_computer_file 机器 / AI 可见的文本。可以多行
output_file 生成的 DOCX 文件的路径
font_name 字体家族名称(必须与 create 步骤匹配)
--author DOCX 文档作者元数据(默认:无)
--ttf-dir Evil Font TTF 的目录(例如 <output_dir>/ttffonts)。如果提供,实际使用的字体会直接嵌入到 .docx 中,因此无需在系统范围内安装即可正确渲染欺骗。仅嵌入人类文件中包含的字母。

示例:

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 上为实验性,可能无法按预期工作。

参数 描述
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 文档生成器元数据(默认:无)

需要 LibreOffice(soffice)和 poppler-utils——参见 依赖项。

示例:

evilfonttool pdf output/secret.docx output/secret.pdf --ttf-dir output/fonts/ttffonts --title secret

道德使用与免责声明

你需要对自己的工具使用方式负责。 未经明确授权就针对系统或个人部署此技术是不道德的,且可能违法。作者提供此工具是为了帮助防御者理解和测试此类漏洞——而非助长攻击。


防范恶意字体

此工具旨在帮助红队人员验证基于字体的攻击对其组织的风险。它同样旨在帮助蓝队人员、研究人员和系统所有者理解因内在信任用户提供的字体而留下的安全缺口。以下是一些针对个人和行业的实用建议,以应对或缓解字体在现代操作系统和应用程序中带来的问题。

我能如何防范恶意字体?

  • 不要信任任何来自不可信来源的内容。检查电子邮件发件人并检查域名。
  • 粘贴命令后,在执行之前先核实。
  • 绝不运行你不理解的命令。
  • 不要运行将 curl 输出直接管道到 bash / Invoke-Expression 的命令。攻击者很容易切换你正在下载的网站。
  • 绝不打开来自不可信来源的电子邮件附件。
  • 请记住,恶意字体依靠诱骗观察者才能生效。用户必须采取行动,恶意字体才会构成风险。如果不采取有风险的操作,恶意字体就无法影响你。
  • 不要将他人创建的文档上传到 AI 工具。

行业可以采取什么措施来防范恶意字体?

  • 不允许自定义字体在受保护的视图(Microsoft Office 套件)中渲染。
  • 不允许用户携带自定义字体,或限制自定义字体的数量。
  • 将网页或 Word 文档中大量自定义字体视为恶意软件信号。
  • 对使用 Win + R 的用户,在首次使用时弹出吓人的警告,说明这非常危险(我不知道为什么这还没成为标配……)。
  • 在使用 AI 处理文档时,将文档渲染为图像并用 OCR 提取文本。这还有一个额外好处,即能防范包含文本的图像。
  • 不要在威胁模型中忽略用户提供的字体。
  • 将用户提供的字体视为其本来面目:不可信的用户输入。

贡献

欢迎贡献。如果你发现了新的攻击面、对字体生成流程的改进,或值得记录下来的防御技术,请提交 issue 或 PR。

  1. Fork 仓库
  2. 创建功能分支(git checkout -b feature/my-feature)
  3. 提交你的更改
  4. 提交拉取请求,清楚描述更改了什么以及为什么

帮帮我,有些东西不工作!

由于 Word 文档、PDF 和字体的复杂性,这个工具真的很难测试。如果你发现可复现的问题,请提交 GitHub issue,我会尽快处理。

请在 issue 中包括以下内容:

  • 操作系统 + LibreOffice 版本,以及你在哪里查看文件(Word / LibreOffice / 其他)。
  • 字体是已安装、已嵌入,还是两者都不是。
  • 你运行的确切命令及任何终端输出(尤其是 mismatch 警告)。
  • 一个能复现问题的最小 .docx / 输入,如果你能分享的话。
  • 任何其他可能导致问题的因素。

来源:Hacker News · github.com