Skip to content

Commit a89db44

Browse files
committed
vhost: block speculation of translated descriptors
iovec addresses coming from vhost are assumed to be pre-validated, but in fact can be speculated to a value out of range. Userspace address are later validated with array_index_nospec so we can be sure kernel info does not leak through these addresses, but vhost must also not leak userspace info outside the allowed memory table to guests. Following the defence in depth principle, make sure the address is not validated out of node range. Signed-off-by: Michael S. Tsirkin <[email protected]> Cc: [email protected] Acked-by: Jason Wang <[email protected]> Tested-by: Jason Wang <[email protected]>
1 parent cf8f169 commit a89db44

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

drivers/vhost/vhost.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,8 +2071,10 @@ static int translate_desc(struct vhost_virtqueue *vq, u64 addr, u32 len,
20712071
_iov = iov + ret;
20722072
size = node->size - addr + node->start;
20732073
_iov->iov_len = min((u64)len - s, size);
2074-
_iov->iov_base = (void __user *)(unsigned long)
2075-
(node->userspace_addr + addr - node->start);
2074+
_iov->iov_base = (void __user *)
2075+
((unsigned long)node->userspace_addr +
2076+
array_index_nospec((unsigned long)(addr - node->start),
2077+
node->size));
20762078
s += size;
20772079
addr += size;
20782080
++ret;

0 commit comments

Comments
 (0)