电子邮件网络钓鱼中的Homoglyph攻击检测

Seb*_*iuc 8 java security email phishing homoglyph

主要问题

我正在开发一个Java中的API,需要检测网络钓鱼电子邮件中品牌的使用(例如PayPal,Mastercard等).

显然,攻击者使用不同的策略来瞄准这些品牌,以便更难以发现.例如" rnastercard "看起来非常相似," 万事达 ",可以愚弄不知情的用户.

此时,我可以使用模糊字符串搜索的形式轻松检测这些品牌的拼写错误.然而,我面临的问题是攻击者使用同性恋改变特定品牌的名称但保持相同的视觉解释.

同形文字攻击用[a-zA-Z]模式中的一个字符替换一个看起来相似但超出此范围的字符.例如,使用特定字符集的攻击者可以使用看起来像P 的希腊字母RHO来定位PayPal.这种攻击中的PayPal品牌名称将成为:

[希腊字符RHO] [a] [y] [希腊字符RHO] [a] [l]

由于我对Unicode或ISO标准等不同标准及其编码几乎没有经验,因此我请求您的建议.有没有办法以编程方式确定[a-zA-Z]集之外的字符的视觉等效,以便结果是[a-zA-Z]集内的字符?

您的一些答案可能基于特定的字符集,我正在寻找一种解决方案,可以帮助我确定电子邮件中可用的每个字符集的此类表示.

我没有读过邮件交换的RFC标准,但它们在我的列表中,我现在问这个问题是为了节省时间.

可能但不可行的解决方案

我已经想到了一些解决方案,但它们对我的特定情况不可行,因为它们非常占用CPU并且具有类似黑客的特性(读"可能很容易被破坏").

第一种解决方案是将[a-zA-Z]之外的字符以其形式写入图像,并将该图像提供给OCR API,以获得最接近的[a-zA-Z]表示.

第二种解决方案是为每个字符集创建一个映射,映射的关键字是字符本身,值将是它的[a-zA-Z]等价物.该地图要么必须手工完成,要么使用上述第一种解决方案.

额外细节

这里已经问过这个问题.然而,尽管我进行了编辑工作,但这个问 可能是因为我没有很好地表达自己,我没有正确地标记这个问题.

在那个特定的问题中,我还解决了一些关于Java使用的字符集的问题,这些字符集使实际问题变得模糊不清.但是,如果您认为需要在答案中包含此类信息,我将不胜感激,因为这样可以节省一些时间来研究这些问题.纯文字攻击的问题和Java或*javax.mail.**中的字符集问题是分开但相互关联的.

正如主要问题中描述的同性恋攻击的一个特定例子是这封电子邮件.谨防!这是使用此特定攻击方法的网络钓鱼电子邮件的实际内容,因此请勿遵循该电子邮件中包含的任何链接.

我用我认为合适的标签标记了这个问题,如果你不同意请提供这个问题的编辑,而不是投票关闭.

mpk*_*nje 4

作为TR-39的一部分,Unicode 联盟维护了一个易混淆的列表,您可以使用它来帮助您进行映射。我无法证明其完整性。

\n\n

TR-39还描述了一种使用易混淆列表来比较易混淆字符串的骨架算法。这是该算法的GoLang实现,我编写了一个快速的java 端口

\n\n

除此之外,删除变音符号和大写字母也会有所帮助。这些没有被骨架算法标准化。所以完整的过程应该是类似骨架-->删除变音符号-->转小写。

\n\n
/*\n * Special regular expression character ranges relevant for simplification\n * -> see http://docstore.mik.ua/orelly/perl/prog3/ch05_04.htm\n * InCombiningDiacriticalMarks: special marks that are part of "normal" \xc3\xa4,\n * \xc3\xb6, \xc3\xae etc.. IsSk: Symbol, Modifier see\n * http://www.fileformat.info/info/unicode/category/Sk/list.htm IsLm:\n * Letter, Modifier see\n * http://www.fileformat.info/info/unicode/category/Lm/list.htm\n */\nprivate static final Pattern DIACRITICS_AND_FRIENDS = Pattern.compile("[\\\\p{InCombiningDiacriticalMarks}\\\\p{IsLm}\\\\p{IsSk}]+");\n\nprivate static String stripDiacritics(String str) {\n    str = Normalizer.normalize(str, Normalizer.Form.NFD);\n    str = DIACRITICS_AND_FRIENDS.matcher(str).replaceAll("");\n    return str;\n}\n
Run Code Online (Sandbox Code Playgroud)\n