8

主要问题

我正在使用 Java 开发一个 API,该 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]等效项。该地图要么必须手工完成,要么必须使用上述第一种解决方案。

额外细节

我已经在这里问过这个问题。然而,尽管我进行了编辑,这个问题仍然没有解决。可能是因为我没有很好地表达自己,并且我没有正确标记问题。

在那个特定的问题中,我还解决了我对 Java 使用的字符集的一些担忧,这些担忧掩盖了实际问题。但是,如果您觉得有必要在您的答案中包含此类信息,我将不胜感激,因为这可以节省我研究此类问题的时间。同形字攻击的问题和 Java 或 *javax.mail.** 中的字符集问题是分开但相互关联的。

作为主要问题中描述的同形文字攻击的一个特定示例是这封电子邮件。谨防!这是使用这种特定攻击方法的网络钓鱼电子邮件的实际内容,因此请不要点击该电子邮件中包含的任何链接。

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

4

2 回答 2

4

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

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

除了这个删除变音符号和大写字母也将有所帮助。这些没有被骨架算法标准化。所以整个过程应该类似于骨架->删除变音符号->小写。

/*
 * 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;
}
于 2015-02-03T16:50:00.563 回答
3

这是一个GitHub 存储库,其中包含大量同形文字以及一些 Java 和 JavaScript,以帮助检测使用它们伪装的单词(免责声明 - 我写的)。

该列表基于@mpkorstanje 提到的易混淆的Unicode 列表,但有一些额外的同形文字不在该列表中,搜索代码还考虑了大小写的变化(例如,当伪装成“ᗰas⟙”时,它会找到“万事达卡”这个词eᖇcᴀrd')

于 2015-11-13T18:27:58.343 回答