Сроки атаки для чайников

Как разработчик, интересующийся безопасностью; Время от времени я узнаю о новой уязвимости, которая настолько коварна и умна, что у меня волосы дыбом встают дыбом. Сегодня настало время атаковать.

Допустим, у вас есть 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 / блог / тайминги-атаки-против-сравнения-строк /