主要问题
我正在使用 Java 开发一个 API,它需要检测网络钓鱼电子邮件中品牌(例如 PayPal、Mastercard 等)的使用情况。
显然,攻击者使用不同的策略来瞄准这些品牌,从而使它们更难被发现。例如,“rnastercard”看起来与“mastercard”非常相似,可以欺骗毫无戒心的用户。
此时我可以使用模糊字符串搜索的形式轻松检测出这些品牌的拼写错误。然而,我面临的问题是,当攻击者使用同形文字更改特定品牌的名称但保持相同的视觉解释时。
同形文字攻击将 [a-zA-Z] 模式中的字符替换为看起来相似但超出此范围的字符。例如,使用特定字符集的攻击者可以使用看起来像 P 的希腊字母 RHO 来攻击 PayPal。此类攻击中的 PayPal 品牌名称将变为:
[希腊字符 RHO][a][y][希腊字符 RHO][a][l]
由于我对不同标准(如 Unicode 或 ISO 标准及其编码)几乎没有经验,因此我希望得到您的建议。有没有办法以编程方式确定字符在 [a-zA-Z] 集之外 的视觉等效项,以便结果将是字符在 [a-zA-Z] 中设置?
您的一些答案可能基于特定的字符集,我正在寻找一种解决方案来帮助我确定电子邮件中可用的每个字符集的此类表示。
我没有阅读邮件交换的 RFC 标准,但它们在我的列表中,我现在问这个问题是为了节省时间。
可能但不可行的解决方案
我已经想到了一些解决方案,但它们不适用于我的特定情况,因为它们非常占用 CPU 资源并且具有类似 hack 的性质(读作“可能很容易被破坏”)。
第一个解决方案是将在 [a-zA-Z] 之外 的字符写入图像并将该图像提供给 OCR API 以获得最接近的 [a-zA-Z] 表示。
第二种解决方案是为每个字符集创建一个映射,映射的键是字符本身,值是它的 [a-zA-Z] 等价物。该 map 要么必须手动完成,要么使用上述第一种解决方案。
其他详细信息
这个问题我已经问过了here .然而,尽管我进行了编辑工作,但问题仍然没有解决。可能是因为我没有很好地表达自己并且没有正确标记问题。
在那个特定的问题中,我还解决了一些我对 Java 使用的字符集的担忧,这些字符集使实际问题蒙上了阴影。但是,如果您觉得有必要在您的回答中包含此类信息,我将不胜感激,因为这可以节省我研究此类问题的时间。 Java 或*javax.mail.** 中的同形文字攻击问题和字符集问题是分开但又相互联系的。
作为主要问题中描述的同形文字攻击的一个特定示例是 this email .谨防!这是使用这种特定攻击方法的网络钓鱼电子邮件的实际内容,因此请勿点击该电子邮件中包含的任何链接。
我已经用我认为合适的标签标记了这个问题,如果您不同意,请提供对此问题的编辑而不是将其关闭。
最佳答案
作为 TR-39 的一部分Unicode 联盟维护一个 list of confusables你可以用来帮助你的映射。我无法证明它的完整性。
TR-39还描述了一个框架算法来比较使用混淆列表的易混淆字符串。你是A GoLang算法的实现,我写了一个快速 java port .
除此之外,删除变音符号和大写字母也会有所帮助。这些没有被骨架算法归一化。因此,完整的过程应该类似于骨架 --> 删除变音符号 ---> 小写。
/*
* Special regular expression character ranges relevant for simplification
* -> see http://docstore.mik.ua/orelly/perl/prog3/ch05_04.htm
* InCombiningDiacriticalMarks: special marks that are part of "normal" ä,
* ö, î etc.. IsSk: Symbol, Modifier see
* http://www.fileformat.info/info/unicode/category/Sk/list.htm IsLm:
* Letter, Modifier see
* http://www.fileformat.info/info/unicode/category/Lm/list.htm
*/
private static final Pattern DIACRITICS_AND_FRIENDS = Pattern.compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+");
private static String stripDiacritics(String str) {
str = Normalizer.normalize(str, Normalizer.Form.NFD);
str = DIACRITICS_AND_FRIENDS.matcher(str).replaceAll("");
return str;
}
关于java - 电子邮件网络钓鱼中的同形文字攻击检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22448369/