[ALERT] Ошибка в реализации OpenID во многих библиотеках
От: Mamut Швеция http://dmitriid.com
Дата: 15.07.10 06:58
Оценка: 16 (4)
Обсуждение тут: http://lists.openid.net/pipermail/openid-security/2010-July/001156.html

Суть такова: огромное количество реализаций OpenID при проверке HMAC'а опираются на функции, скорость работы которых варьируется по времени в зависимости от переданных данных.

Это позволяет потенциальному злоумышленнику пошагово определить правильный HMAC. Для этого достаточно отсылать сообщения с HMACом и замерять скорость ответа сервера. Чем длиннее правильная последовательность в переданном HMAC'е, тем дольше будет ответ сервера. Таким образом в итоге можно создать вообще любое сообщение, которое сервер примет за валидное.

Для избежания такого достаточно сделать функцию, которая будет отрабатывать за одно и то же время. Например, на С:

/*
  * Функция, сравнивающая секретные значения за постоянное время
  * Возвращает 0, если они равны. Число, отличное от нуля в противном случае
  */
int
secret_cmp(uint8_t *a, uint8_t *b, size_t n)
{
     int result = 0;

     // в случае, если длина равна нулю
     if (n == 0)
         return 1;

     // Сравниваем все байты массива, аккумулируя разницу
     while (n--)
         result |= *a++ ^ *b++;

     return result != 0;
}


При реализации в других языках нужно внимательно смотреть на потенциальные моменты, вроде тернарного оператора (x == y ? 0 : 1), которые вводят ветвления, зависящие от входных данных (и потенциально уменьшающих/увеличивающих время работы функции). В этой статье описывает подробнее о таких моментах: http://rdist.root.org/2010/01/07/timing-independent-array-comparison/

Подробнее о подобных (связанных со временем) атаках:
http://rdist.root.org/2009/05/28/timing-attack-in-google-keyczar-library/
http://codahale.com/a-lesson-in-timing-attacks/

О сербезности таких атак говорит и это исследование: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.65.9811 Иногда достаточно 20 микросекунд в WAN и 100 наносекунд в LAN, чтобы выполнить такую атаку.

Подробнее о конкретно OpenID будет говориться на Blackhat USA 28 июля


dmitriid.comGitHubLinkedIn
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.