2.3. java cracking random_utils
TRANSCRIPT
Apache RandomStringUtils hackingBy Taras Tatarinov
Jun 30, 2013
WhoamI
• Wannabe IRL
Применение генератора случайных чисел
• -Ключи• -Токены• -Идентификаторы• -Генератор паролей• -Капчи
Немного истории
• Уязвимости ГПСЧ находили в:• Windows XP• Windows server 2003• Ранние версии SSL(v1)• PHP (дада, PHPSESSID) функции mt_rand(),
rand(), uniqid(), shuffle(), lcg_value()
Как это выглядит
Генераторы случайных и псевдослучайных чисел
• Генераторы случайных чисел аппаратные• Идеальный источник энтропии- белый шум• Генераторы псевдослучайных чисел
алгоритмические• Проблема генераторов псевдослучайных
чисел- последовательность и зацикленность.
• ГСЧ= ГПСЧ+ источник энтропии
Предпосылки для «взлома» ГПСЧ
• Значения генерируются исходя из текущего внутреннего состояния ГПСЧ
• Для генерации случайных значений используются однонаправленные свертки.
• При одном и том же исходном значении Seed и равном количестве переходов, значения случайных величин будут одинаковы.
• Вывод. Если станет известно текущее состояние ГСПЧ все последующие состояния и генерируемые значения можно предсказать.
int
Иллюстрация работы алгоритмического ГСПЧ
double
byte boolean
В качестве источника энтропии часто используется системное время
Чем больше энтропия генерируемой величины, тем проще определить состояние ГПСЧ
Java.Util.Random-Seed получается из системного времени:System.currentTimeMillis()
-Значение Seed (long, 64 bit) хранит текущее состояния ГПСЧ-При каждом получении случайного значения выполняется следующее:int next(int bits){
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); return (int) (seed >>> (48 - bits));
}-Преобразователь seed- детерминированный конечный автомат.-Получение случайного int:bits = next(31);val = bits % n;-Сдвиг на 17 позиций вправо.
Получаем Seed
-Берем два созданных int value1 и value2-Сдвигаем биты value1 обратно влево, перебираем все варианты оставшихся 17 неизвестных бит:seed = (value1 << 17) + i;-Когда условие value2 == nextInt(seed) выполнится мы нашли seed!-Возможных комбинаций 131072 (2^17)-Проблема: свертка получением остатка. (val = bits % n;)-Ничего не поделаешь, придется перебирать все варианты =((
Все любят котовint nextInt(){int bits, val;do{bits = next();val = bits % rand;}while (bits - val + (rand - 1) < 0);return val;}void unrand(){boolean circle = true;for(long j = start; j < end && !found; j++){long srclocal = src1 + rand*j;circle = true;
Итак, мы знаем seed
• Теперь мы можем предсказать все последующие и производные значения
• Сессионные ключи, идентификаторы, все случайные значения созданные ГПСЧ итд все наше =))
apache.commons.RandomStringUtils
• -Объект java.util.Random статичен• -Все объекты RandomStringUtils используют один
и тот же объект java.util.Random, который сидится один раз.
• -Принцип работы: задается выбор случайной позиции из заданного charset.
• -Необходимо 7 символов для подбора прииспользовании alphanumeric charset.
• -Время на подбор для Intel core i7 2.5GHZ ~30мин
Как это работает0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
H
A
C
K
E
R
Int = 170123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Int = 10
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Int = 120123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Int = 20
HACKER
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Int = 140123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Int = 27
Что делать? Или криптографически стойкие ГПСЧ
• java.security.SecureRandom• Наследуется от java.util.Random,
оверрайдит методы• Не обеспечивает полной
непредсказуемости, так как использует хеширование для свертки. (по умолчанию-sha-1)
• Множество состояний ГПСЧ все равно long, переходы- все еще однозначны
Что делать (часть 2, суровая)
• Аппаратная энтропия (дробовой шум итд)• /dev/random (суровый, но медленный)• /dev/urandom on Linux (менее суровый, но
побыстрее)• Проблемы с производительностью
(накопление энтропии)
Цена вопросаManufacturer Model Intro
Date Interface OS Price (USD) Price Throughput
SimtecElectronics Entropy Key 2009 USB Windows[1]
/Linux/BSD 60< £36 32 kbit/s[2]
ID Quantique SA Quantis-USB 2006 USB Windows/L
inux 1,310 990€ 4 Mbit/s[3]
ID Quantique SA Quantis-PCI-4 2006 PCI Windows/L
inux 2,952 2,230€ 16 Mbit/s[3]
Comscire R2000KU 2006 USB Linux/Windows 895 738€ 2 Mbit/s[4]
Comscire R32MU 2012 USB Linux/Windows 1,495 1,232€ 32 Mbit/s[5]
LETech GRANG 2008-2012
PCI/USB3/SATA
Linux/Windows 6,800 5,500€ 400 Mbit/s[6]
TRNG98 TRNG9803 2009 SERIALLinux/Windows/Solaris/BSD
230 179€ 72 kbit/s[7]
TRNG98 TRNG9815 2009 USBLinux/Windows/Solaris/BSD
830 620€ 550 kbit/s[8]
Заключение
• Любые алгоритмические генераторы случайных чисел- псевдослучайны.
• При необходимости создания «непредсказуемой» случайной величины необходимо использовать физический источник энтропии
• Человек- хороший физический источник энтропии.
Y.O.B.A. hacking
The end.