Topic: Взлом серверов Близзард: на самом деле все серьезнее
9 августа 2012 появились сообщения о взломе серверов Близзарда. Близзард, в частности, заявляют:
Нам также стало известно, что в результате инцидента были получены данные о паролях пользователей, играющих на североамериканских серверах, хранящиеся в формате, не эквивалентном открытому тексту пароля. Для их кодирования использовался протокол парольной аутентификации Secure Remote Password protocol (SRP), обеспечивающий высокую степень защиты данных. Это, в частности, означает, что для получения открытого текста каждый пароль потребуется расшифровывать отдельно.
Т.е. вроде бы все нормально. На самом деле все гораздо серьезнее.
SRP используется в играх Близзард, начиная с Warcraft 3, до этого использовался challenge-responce.
SRP хеш генерируется примерно так (Близзард внесла пару незначительных изменений в оригинальный SRP, ни на что не влияющих. Зачем? ХЗ.):
x = sha1(salt + sha1(username.upper() + ":" + password.upper())
verifier = g ^ x % N
На сервере хранится salt и verifier.
Исходник на питоне можно посмотреть здесь.
Возведение в степень по модулю простого числа (base ^ pow % N) - довольно медленная операция, очень часто применяющаяся в криптографии с открытым ключом (в том же RSA). Операция нахождения pow по известным остальным числам называется дискретным логарифмом.
Фокус в том, что дискретный логарифм имеет ту же сложность (зависимость требующихся ресурсов - времени, памяти - от размера N), что и разложение чисел на два простых множителя, применяемое для взлома RSA. Т.е. для нахождения дискретного логарифма нужно примерно то же время, что и для взлома RSA ключа того же размера. Для Warcraft 3 модуль имеет размер 256 бит... Дискретный логарифм для него вычисляется, по разным оценкам, от нескольких часов до нескольких дней. Вычислив дискретный логарифм, мы получаем x.
Найдя x, мы можем брутать пароль, т.к. соль и имя пользователя известны, а регистронезависимость пароля нам только на руку. Правда хеши будут соленые. Хотя...
Фокус #2 состоит в том, что x в SRP - это эквивалент пароля, т.е. имея его, мы можем делать то же самое, как если бы у нас был пароль. Для этого может лишь понадобиться изменить клиент (для Warcraft 3 это точно не проблема, есть достаточно альтернативных клиентов).
Итого: за фиксированное время, не зависящее от сложности пароля, можно найти нечто, не являющееся паролем, но позволяющее зайти на сервер и поменять пароль.
В Battle.Net 2.0 используется модуль на 1024 бита (кстати, ссылка ведет на исходник эмуля BNet 2.0). Его так просто не взломаешь, но медленный брут паролей это не отменяет.
Battle.Net 2.0 вроде бы относится только к D3 и Starcraft 2, т.е. для WoW описанный выше способ должен тоже работать.
Тут написано, что для нахождения дискретного логарифма понадобилось 2 часа на неясно какой машине. Про то, что пароль брутать не обязательно, ни автор, ни те, на кого он ссылался, не догадались. Вообще ссылку стоит почитать.
Мораль: не страдайте херней, изобретая или даже имплементируя криптографию - оно может больно аукнуться.
it took Sam only two hours on a single machine to complete the initial precomputation. At that point, individual discrete logs which recover x from v take variable time, “ranging from 15 seconds to several minutes depending on our luck
Т.е. 2 часа не на хеш, а на предварительные вычисления, а потом от 15 секунд до несколько минут на получение хеша пароля из verifier-а. Ну это вообще пушка.
Добавлено: 17.08.2012 21:20
Куда бы это еще запостить?