【发布时间】:2018-06-16 06:00:05
【问题描述】:
在幽灵paper 中,有一个利用越界数组访问的示例(第 1.2 节)。代码是
if (x < array1_size)
y = array2[ array1[x] * 256 ];
这个过程是用一些有效的x 值来训练正确的路径。然后给出x 的无效值,同时假设arra1_size 未缓存。由于分支预测器认为条件为真,它会推测性地获取 array2 的偏移量。
现在,问题来了。在推测执行中,它必须获取array1[x],其中 x 是恶意的并且超出了界限。所以,array1[x] 实际上是无效的!那么攻击是什么?!没有获取到有效数据!
谁能帮我解释一下?这里有什么误解?
【问题讨论】:
-
我认为您在该主题中的回答与我的问题没有直接关系。我想知道的是越界异常。假设一个数组有 10 个项目,所以范围是 0..9。现在,cpu 推测性地从索引 8 中获取一些项目。它们是 9、10、11、12。
array1[10]无效,它应该在发生附加之前抛出异常。不是吗? -
在下面给出了答案。 (Here 更能说明投机攻击)。推测执行的代码不会给出异常(否则,在 C 中,
if (arr[x] != NULL) *arr[x] = 3;之类的代码可以在x为NULL时推测运行*arr[x] = 3,这将触发用户不应该得到的异常,因为分支条件最终将评估为 false 并且推测运行代码不会退出。