Обнаружение атаки Homoglyph при фишинге электронной почты

Основной вопрос

Я работаю над API на Java, который должен обнаруживать использование брендов (например, PayPal, Mastercard и т. д.) в фишинговых электронных письмах.

Очевидно, что злоумышленники используют разные стратегии для нацеливания на эти бренды, чтобы их было труднее обнаружить. Например, "rnastercard" очень похоже на "mastercard" и может обмануть ничего не подозревающего пользователя.

В настоящее время я могу легко обнаружить орфографические ошибки в названиях этих брендов, используя поиск по нечетким строкам. Однако проблема, с которой я сталкиваюсь, заключается в том, что злоумышленник использует гомоглипы для изменения названия определенного бренда, но сохраняет ту же визуальную интерпретацию.

Атака гомоглифами заменяет символ из шаблона [a-zA-Z] символом, который выглядит похожим, но находится за пределами этого диапазона. Например, злоумышленник, использующий определенный набор символов, может использовать греческую букву RHO, похожую на P, для нападения на PayPal. Торговая марка PayPal в такой атаке будет выглядеть так:

[греческий символ RHO][a][y][греческий символ RHO][a][l]

Поскольку у меня практически нет опыта работы с различными стандартами, такими как стандарты Unicode или ISO, и их кодировками, я обращаюсь к вам за советом. Есть ли способ программно определить визуальный эквивалент символа вне набора [a-zA-Z], чтобы результатом был символ внутри [a-zA-Z] установить?

Некоторые из ваших ответов могут быть основаны на определенном наборе символов, я ищу решение, которое помогло бы мне определить такие представления для каждого набора символов, который можно использовать в электронном письме.

Я не читал стандарты RFC для обмена почтой, но они есть в моем списке, я задаю этот вопрос сейчас, чтобы сэкономить время.

Возможные, но неосуществимые решения

Я думал о некоторых решениях, но они не подходят для моего конкретного случая, поскольку они очень интенсивно используют ЦП и имеют характер взлома (читай «могут быть легко взломаны»).

Первым решением было бы записать символ, который за пределами [a-zA-Z] в его форме, в изображение и передать это изображение в API OCR, чтобы получить его ближайший [a- zA-Z] представление.

Вторым решением будет создание карты для каждого набора символов, ключом карты будет сам символ, а значением будет его эквивалент [a-zA-Z]. Эта карта должна быть сделана вручную или с использованием первого решения, описанного выше.

Дополнительная информация

Я уже задавал этот вопрос здесь. Однако вопрос остался закрытым, несмотря на мои усилия по редактированию. Возможно, потому что я не очень хорошо выразился и не правильно отметил вопрос.

В этом конкретном вопросе я также рассмотрел некоторые опасения, которые у меня были относительно наборов символов, используемых Java, которые затуманили фактический вопрос. Однако, если вы чувствуете необходимость включить такую ​​информацию в свой ответ, я был бы признателен, так как это сэкономило бы мне время на изучение таких вопросов. Вопрос об атаках с использованием гомоглифов и вопрос о наборах символов в Java или *javax.mail.** являются отдельными, но связанными между собой вопросами.

Конкретным примером атаки с использованием гомоглифов, описанной в основном вопросе, является это электронное письмо. ОСТЕРЕГАТЬСЯ! Это фактическое содержание фишингового электронного письма, использующего этот конкретный метод атаки, поэтому не переходите ни по одной из ссылок, содержащихся в этом электронном письме.

Я пометил этот вопрос теми тегами, которые, по моему мнению, были бы подходящими. Если вы не согласны, пожалуйста, отредактируйте этот вопрос, а не голосуйте за его закрытие.


person Sebastian-Laurenţiu Plesciuc    schedule 17.03.2014    source источник
comment
Я бы пошел со вторым решением. Но сначала я рекомендую вам проверить, какое программное обеспечение для обнаружения плагиата использует.   -  person Karol S    schedule 21.07.2014
comment
Также см. stackoverflow.com/q/18060037/632951.   -  person Pacerier    schedule 14.10.2014
comment
@Pacerier Эти вопросы относятся только к гомоглифам ASCII, что проще сделать, чем обнаружение атак гомоглифов Unicode. Я просил эффективный способ преобразования символов Unicode, таких как греческие или русские буквы, в их визуальный эквивалент в этом типе обнаружения.   -  person Sebastian-Laurenţiu Plesciuc    schedule 15.10.2014
comment
Для гомоглифов ASCII достаточно нечеткого сопоставления строк. Например, я могу обнаружить mastercard в rnastercard с поиском нечетких строк (расстояние Левенштейна). Я не обнаружу, если буква «M» в Mastercard будет заменена греческой заглавной буквой Mu (U + 039C).   -  person Sebastian-Laurenţiu Plesciuc    schedule 15.10.2014
comment
Вместо того, чтобы искать атаку на конкретную торговую марку, вы можете использовать символы внешнего вида, которые находятся за пределами [a-z] и нетипичны для региона, как свидетельство атаки гомоглифов.   -  person M.P. Korstanje    schedule 03.02.2015
comment
Почему подход OCR невозможен? После того, как вы создали сопоставление символов с их эквивалентом [a-z], вы можете поместить результаты в таблицу поиска и покончить с этим. Это одноразовый процесс.   -  person M.P. Korstanje    schedule 03.02.2015
comment
Спасибо @CodesInChaos, я прочитаю это как можно скорее.   -  person Sebastian-Laurenţiu Plesciuc    schedule 03.02.2015
comment
@mpkorstanje Справочная таблица может работать, как только я ее создам. Меня беспокоит создание достаточно полного решения. Скорость поиска может не быть проблемой, поскольку операция может быть O (1), если заменяемый символ является ключом, однако в зависимости от размера таблицы это может быть проблематично, поскольку оно может выполняться на клиентских машинах. Теперь я могу только надеяться, что сторонние библиотеки, такие как ICU, хорошо справятся с определением локали персонажа. Тем временем я пробовал API-интерфейсы OCR, но они не дают наилучших результатов.   -  person Sebastian-Laurenţiu Plesciuc    schedule 03.02.2015


Ответы (2)


В рамках TR-39 консорциум Unicode поддерживает список confusables, которые вы можете использовать, чтобы помочь в составлении карты. Я не могу засвидетельствовать его полноту.

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;
}
person M.P. Korstanje    schedule 03.02.2015
comment
Это то, о чем я не знал. Попробую, через пару дней сообщу, что получилось. Спасибо за помощь. - person Sebastian-Laurenţiu Plesciuc; 03.02.2015
comment
Я провел некоторые испытания. Это очень хороший ответ для получения латинского эквивалента таких символов, как Â,Ș,Ț,Î,..., но он не работает, например, для получения латинского эквивалента Greek Letter Rho. Кодировка символа Rho и кодировка P имеют между собой существенную числовую разницу, и из-за этого нечеткий строковый поиск не даст результата. Однако это полезный ответ, потому что он значительно уменьшит количество сравнений для возможной реализации решения, описанного в вопросе, но это не тот ответ, который я ищу. - person Sebastian-Laurenţiu Plesciuc; 14.04.2015
comment
Однако я рассмотрю это в сочетании со списком упомянутых вами запутанных вещей, которые, кажется, отображают эти эквивалентности. Это займет у меня некоторое время, но я надеюсь, что приду к работоспособному решению. Если это сработает для всех моих тестов в течение разумного времени для каждого фишингового письма, я приму ваш ответ. Спасибо за помощь. - person Sebastian-Laurenţiu Plesciuc; 14.04.2015
comment
Я только что столкнулся с библиотекой, которая реализует решение. Он анализирует списки запутанных и подставляет нормальную форму, в которой он сравнивает строки. Это не java, но он также выглядит переносимым на java github.com/FiloSottile/tr39-confusables unicode.org/reports/tr39 - person M.P. Korstanje; 12.05.2015
comment
Это на самом деле здорово. Благодарю вас! Пожалуйста, включите это в свой ответ, если можете :) - person Sebastian-Laurenţiu Plesciuc; 13.05.2015
comment
Ваше здоровье! Собираюсь написать Java-реализацию скелетного алгоритма. Смешно, что его еще нет. - person M.P. Korstanje; 13.05.2015
comment
@Sebastian-LaurenţiuPlesciuc Я написал быструю реализацию скелетного алгоритма на Java. Это работает, но я, вероятно, добавлю и другие таблицы путаницы. github.com/mpkorstanje/tr39-confusables - person M.P. Korstanje; 14.05.2015
comment
Отличная работа! Это очень поможет. - person Sebastian-Laurenţiu Plesciuc; 14.05.2015

Вот репозиторий GitHub с большим списком омоглифов и немного Java и JavaScript, чтобы помочь обнаружить слова, которые были замаскировано с их помощью (отказ от ответственности - это я написал).

Список основан на списке Unicode путаных слов, упомянутом @mpkorstanje, но имеет некоторые дополнительные омоглифы, которых нет в этом списке, код поиска также учитывает вариации в регистре (например, он найдет слово «mastercard», замаскированное под «ᗰas⟙»). eᖇcᴀrd')

person codebox    schedule 13.11.2015
comment
Не могли бы вы отправить по почте отсутствующие символы людям, использующим юникод? - person M.P. Korstanje; 23.09.2016