2.3. java cracking random_utils

19
Apache RandomStringUtils hacking By Taras Tatarinov Jun 30, 2013

Upload: defconmoscow

Post on 29-Jul-2015

129 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: 2.3. Java cracking random_utils

Apache RandomStringUtils hackingBy Taras Tatarinov

Jun 30, 2013

Page 2: 2.3. Java cracking random_utils

WhoamI

• Wannabe IRL

Page 3: 2.3. Java cracking random_utils

Применение генератора случайных чисел

• -Ключи• -Токены• -Идентификаторы• -Генератор паролей• -Капчи

Page 4: 2.3. Java cracking random_utils

Немного истории

• Уязвимости ГПСЧ находили в:• Windows XP• Windows server 2003• Ранние версии SSL(v1)• PHP (дада, PHPSESSID) функции mt_rand(),

rand(), uniqid(), shuffle(), lcg_value()

Page 5: 2.3. Java cracking random_utils

Как это выглядит

Page 6: 2.3. Java cracking random_utils

Генераторы случайных и псевдослучайных чисел

• Генераторы случайных чисел аппаратные• Идеальный источник энтропии- белый шум• Генераторы псевдослучайных чисел

алгоритмические• Проблема генераторов псевдослучайных

чисел- последовательность и зацикленность.

• ГСЧ= ГПСЧ+ источник энтропии

Page 7: 2.3. Java cracking random_utils

Предпосылки для «взлома» ГПСЧ

• Значения генерируются исходя из текущего внутреннего состояния ГПСЧ

• Для генерации случайных значений используются однонаправленные свертки.

• При одном и том же исходном значении Seed и равном количестве переходов, значения случайных величин будут одинаковы.

• Вывод. Если станет известно текущее состояние ГСПЧ все последующие состояния и генерируемые значения можно предсказать.

Page 8: 2.3. Java cracking random_utils

int

Иллюстрация работы алгоритмического ГСПЧ

double

byte boolean

В качестве источника энтропии часто используется системное время

Чем больше энтропия генерируемой величины, тем проще определить состояние ГПСЧ

Page 9: 2.3. Java cracking random_utils

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 позиций вправо.

Page 10: 2.3. Java cracking random_utils

Получаем Seed

-Берем два созданных int value1 и value2-Сдвигаем биты value1 обратно влево, перебираем все варианты оставшихся 17 неизвестных бит:seed = (value1 << 17) + i;-Когда условие value2 == nextInt(seed) выполнится мы нашли seed!-Возможных комбинаций 131072 (2^17)-Проблема: свертка получением остатка. (val = bits % n;)-Ничего не поделаешь, придется перебирать все варианты =((

Page 11: 2.3. Java cracking random_utils

Все любят котов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;

Page 12: 2.3. Java cracking random_utils

Итак, мы знаем seed

• Теперь мы можем предсказать все последующие и производные значения

• Сессионные ключи, идентификаторы, все случайные значения созданные ГПСЧ итд все наше =))

Page 13: 2.3. Java cracking random_utils

apache.commons.RandomStringUtils

• -Объект java.util.Random статичен• -Все объекты RandomStringUtils используют один

и тот же объект java.util.Random, который сидится один раз.

• -Принцип работы: задается выбор случайной позиции из заданного charset.

• -Необходимо 7 символов для подбора прииспользовании alphanumeric charset.

• -Время на подбор для Intel core i7 2.5GHZ ~30мин

Page 14: 2.3. Java cracking random_utils

Как это работает0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

H

A

C

K

E

R

Int = 170123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

Int = 10

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

Int = 120123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

Int = 20

HACKER

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

Int = 140123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

Int = 27

Page 15: 2.3. Java cracking random_utils

Что делать? Или криптографически стойкие ГПСЧ

• java.security.SecureRandom• Наследуется от java.util.Random,

оверрайдит методы• Не обеспечивает полной

непредсказуемости, так как использует хеширование для свертки. (по умолчанию-sha-1)

• Множество состояний ГПСЧ все равно long, переходы- все еще однозначны

Page 16: 2.3. Java cracking random_utils

Что делать (часть 2, суровая)

• Аппаратная энтропия (дробовой шум итд)• /dev/random (суровый, но медленный)• /dev/urandom on Linux (менее суровый, но

побыстрее)• Проблемы с производительностью

(накопление энтропии)

Page 17: 2.3. Java cracking random_utils

Цена вопроса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]

Page 18: 2.3. Java cracking random_utils

Заключение

• Любые алгоритмические генераторы случайных чисел- псевдослучайны.

• При необходимости создания «непредсказуемой» случайной величины необходимо использовать физический источник энтропии

• Человек- хороший физический источник энтропии.

Page 19: 2.3. Java cracking random_utils

Y.O.B.A. hacking

The end.