有哪些方法可以防止文件名中带有从右到左覆盖 (RLO) Unicode 字符的文件(恶意软件欺骗方法)运行?

有哪些方法可以防止文件名中带有从右到左覆盖 (RLO) Unicode 字符的文件(恶意软件欺骗方法)运行?

恶意软件如何使用RLO unicode字符:

[...] 该病毒的文件名经过精心设计,使得 PC 用户可以根据其外观(主要是文件扩展名)将其视为良性文件并打开它。

该病毒使用 Unicode 控制字符伪造其文件扩展名,使此类恶意文件看起来像良性文件。Unicode 是指对世界各国语言表达的文本进行一致编码、表示和处理的标准。控制字符是在字符代码中定义但不显示在屏幕上的字符,用于控制打印机和通信设备等设备。

该病毒使用的控制字符是 RLO(从右到左覆盖)。该控制字符用于将字符序列从“从左到右”反转为“从右到左”。此功能适用于想要阅读阿拉伯语等以反向顺序(即从左到右)阅读的语言的人,就像他们阅读日语和英语时一样。

-2011 年 10 月份计算机病毒/未经授权的计算机访问事件报告摘要. 日本信息技术振兴机构 (IPA)

有关双向文本的更多信息,请参阅维基百科文章:双向文本

你可以尝试一下RLO 性格测试网页了解 RLO 字符的工作原理。RLO 字符也已输入到该网页的“输入测试”字段中。尝试在那里输入,并注意您输入的字符以相反的顺序显示(从右到左,而不是从左到右)。

RLO 字符可以专门放置在文件名中,以欺骗或伪装文件,使其具有与实际不同的文件名或文件扩展名。(即使 '隐藏已知文件类型的扩展名' 未选中。)

作为一项安全措施,有哪些方法可以防止文件名中带有 RLO Unicode 字符的文件被写入、读取或运行?

我的操作系统是 Windows 7,但也欢迎为其他操作系统提出解决方案。

答案1

日本信息技术振兴机构 (IPA)建议配置本地安全策略设置以阻止运行文件名中带有 RLO 字符的文件:

  • 打开本地安全策略(开始菜单 → 运行 → secpol.msc)。
  • 右键单击窗口左侧的“软件限制策略”,并选择“新建软件限制策略”。
  • 右键单击“附加规则”(在“软件限制策略”下),并选择“新建路径规则...”。
  • 在“路径”框中,输入两个星号**,并将光标放在它们之间。
  • 右键单击该处,然后选择“插入 Unicode 控制字符”。
  • 选择“RLO 开始从右到左覆盖”。
  • 确保在“安全级别”→“不允许”下选择。
  • 在“描述”框中输入描述,以便您稍后能够了解该规则的含义。
  • 单击“应用”或“确定”。

您还可以使用相同的方法为其他具有潜在危险的 Unicode 双向字符创建类似的规则。

答案2

你可以使用一切结合自动热键每当双向文本控制字符成为文件名的一部分时,就会创建警报。

剧本

AlertText = A bidirectional text control character was detected in a filename.
AlertText = %AlertText%`n`nClick OK to re-hide the window.

SetTitleMatchMode RegEx
DetectHiddenWindows, On
EnvGet, ProgramFiles32, ProgramFiles

Start:
Run, %ProgramFiles32%\Everything\Everything.exe
WinWaitActive, Everything, , 5
if Errorlevel
    Goto Start
WinGet, Id, ID, A
StatusBarWait, objects, , 1, ahk_id %Id%
StatusBarGetText, Status, 1, ahk_id %Id%
Backup := ClipboardAll
Transform, Clipboard, Unicode, ‎|â€|‪|‫|‬|‭|‮
Send, ^v
WinHide, ahk_id %Id%
Sleep, 100
Clipboard := Backup
Backup =
StatusBarWait, ^(?!^\Q%Status%\E$)
Loop
{
    StatusBarWait, [1-9], , 1, ahk_id %Id%
    IfWinNotExist, ahk_id %Id%
        Goto Start
    WinShow, ahk_id %Id%
    WinRestore, ahk_id %Id%
    MsgBox, %AlertText%
    WinHide, ahk_id %Id%
}

它能做什么

该脚本启动 Everything 并搜索‎|â€|‪|‫|‬|‭|‮(UTF8),即所有七个双向文本控制字符 (来源),用 分隔|

然后,脚本隐藏 Everything 窗口并监视其状态栏。当它包含任何不同于 的数字时0,即表示找到匹配项,将显示 Everything 窗口并弹出以下消息框:

在文件名中检测到双向文本控制字符。

单击“确定”重新隐藏窗口。

如果 Everything 关闭,脚本还会重新启动它。

如何使用

  1. 下载,安装并启动 Everything。

  2. Ctrl+P并切换到标签。

    对于所有应检查的卷,启用监视更改Monitor changes

  3. 下载并安装 AutoHotkey。

  4. 将上述脚本另存为find-bidirectional-text-control-characters.ahk

  5. 双击该脚本来启动它。

  6. 启动文件夹。

答案3

可能还有其他方法,但最简单但并非微不足道的方法是实现一个文件系统过滤器(或文件系统微过滤器)来过滤这些请求。如果从这样的文件中读取,您可以返回,STATUS_ACCESS_DENIED而写入时您不应该做任何事情,而应该首先阻止创建此类文件(可能也会出现上述错误代码)。创建是另一种请求类型。

你也可以想象其他方法也能达到类似的效果,比如 SSDT 挂钩。但唯一可靠的方法还是上述方法。

为了做到这一点,您必须找人为您编写这种过滤器(对于内核开发人员来说,编写微型过滤器相对简单),然后对其进行签名,使其通过 Vista 以来的内核模式签名策略。如果您不想执行后者,您仍然可以对驱动程序二进制文件进行测试签名,并修改启动选项以允许测试签名的内容 - 但这会损害相应系统的安全性。

根据这些信息,我将强烈建议您利用 galacticninja 和 Tom Wijsman 指出的解决方案。

答案4

我不认为这样的东西在桌面上可用,但你应该能够阻止这些东西被写入你的文件服务器:

在 Windows Server 2003 R2 中实现文件筛选

相关内容