Обсуждение тут:
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 июля