Сроки атаки для чайников
Как разработчик, интересующийся безопасностью; Время от времени я узнаю о новой уязвимости, которая настолько коварна и умна, что у меня волосы дыбом встают дыбом. Сегодня настало время атаковать.
Допустим, у вас есть API, который клиенты могут использовать для получения информации. Чтобы убедиться, что информация поступает только намеченным сторонам, вам необходимо, чтобы ваши клиенты аутентифицировали себя с помощью ключа API, который представляет собой случайную строку, которую они отправляют вместе с каждым запросом. Когда приходит запрос, вы сравниваете ключ API, который они отправили, с ключом, который у вас есть в файле, если ключи совпадают, вы знаете, что клиент - это тот, кем они себя называют.
Атаки по времени - это умный обходной путь для терпеливых хакеров, чтобы получить эту личную информацию без ключа. Как они это делают? Используя математику и статистику, а также некоторые точные измерения.
Как видите, в основе функции, которая сравнивает отправленный ключ API с ключом API в файле, лежит алгоритм, используемый для сравнения двух строк. Этот алгоритм обычно выглядит примерно так (в псевдокоде):
Просмотрите отправляемую строку и проверьте первый символ, если он соответствует первому символу строки в файле, проверьте следующий символ, если он соответствует, переходите к следующему и т. Д., Пока не дойдете до последнего символа. Если последний символ соответствует, верните «true», если какой-либо из отмеченных символов не соответствует, верните «false».
Уязвимость находится в последней строке. Допустим, ключи API состоят из 15 символов, злоумышленник отправит несколько сотен запросов, используя несколько сотен строк, которые выглядят как a00000000000000
, b00000000000000
, c00000000000000
и т. Д., Отправив по несколько сотен каждой. Затем они очень внимательно проанализируют, сколько времени требуется серверу, чтобы отклонить их запрос. Используя статистику, они обнаружат, что отклонение одной из версий их строки в среднем занимает всего несколько миллисекунд. Причина небольшой задержки проста; большинство строк отклонялось, как только сравнивался первый символ, в то время как одна строка (скажем, g00000000000000
) проходила через первую букву и отклонялась только тогда, когда доходила до второй буквы. Теперь хакеры знают, что первая буква ключа API - это буква g
.
Разница очень тонкая и может зависеть от многих факторов (таких как скорость интернета, задержка, факторы окружающей среды и т. Д.). Вот почему необходимы сотни запросов, чтобы получить статистически значимый результат.
Теперь хакеры будут повторять процесс, используя строки ga0000000000000
, gb0000000000000
, gc0000000000000
и т. Д., Пока не найдут следующую букву в ключе. Они будут повторять этот процесс до тех пор, пока не выяснят все 15 символов ключа API, и злоумышленник теперь не сможет выдать себя за законного клиента и получить доступ к любой информации, доступной этому клиенту.
Способ обойти эту атаку относительно прост; замените алгоритм, который проверяет, равны ли строки, на алгоритм, который занимает такое же количество времени, независимо от того, какие символы не совпадают.
Одна реализация (в псевдокоде) выглядит следующим образом:
let indicator = 0 for (each char in the string) { if (char is not equal to the corresponding char in the string on file) { change the value of indicator by one } } return true if the value of indicator is 0 //i.e. it was never changed due to a mismatched character otherwise return false
Как видите, приведенная выше функция каждый раз просматривает всю строку и возвращает только true или false в конце. Следовательно, это займет одинаковое количество времени, независимо от того, какая строка передана.
Для тех из вас, кто использует Rails, ActiveRecord имеет для этого встроенный метод: ActiveSupport::SecurityUtils.secure_compare(string1, string2)
Этот метод включает в себя описанные выше функции для сравнения обеих строк за постоянное время.
Этот пост упрощает многие концепции. Если безопасность вашего приложения является проблемой (и если вы обрабатываете информацию о клиенте, так и должно быть!), Узнайте о последствиях различных уязвимостей системы безопасности и векторах атак.
Подробнее о временных атаках можно узнать по следующим ссылкам:
https://codahale.com/a-lesson-in-timing-attacks/
https: // thisdata. ru / блог / тайминги-атаки-против-сравнения-строк /