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

时间:2014-03-17 06:46:59

标签: java security email phishing homoglyph

主要问题

我正在开发一个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并且具有类似黑客的特性(读“可能很容易被破坏”)。

第一个解决方案是将在[a-zA-Z] 之外的字符写入图像并将该图像提供给OCR API以使其最接近 [a-zA-Z] 代表。

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

其他详情

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

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

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

我已经用我认为合适的标签标记了这个问题,如果您不同意,请提供此问题的编辑,而不是将其投票结束。

2 个答案:

答案 0 :(得分:3)

作为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;
}

答案 1 :(得分:3)

这是一个GitHub repo with a large list of homoglyphs和一些Java和JavaScript来帮助检测使用它们伪装的单词(免责声明 - 我写了它)。

该列表基于@mpkorstanje提到的Unicode混淆列表,但是在该列表中没有其他一些同形词,搜索代码也考虑了案例中的变化(例如,当伪装成时,它会找到'mastercard'这个词'ᗰas⟙eᖇcᴀrd')