migration: fix parameter validation on ram load
During migration, the values read from migration stream during ram load are not validated. Especially offset in host_from_stream_offset() and also the length of the writes in the callers of said function. To fix this, we need to make sure that the [offset, offset + length] range fits into one of the allocated memory regions. Validating addr < len should be sufficient since data seems to always be managed in TARGET_PAGE_SIZE chunks. Fixes: CVE-2014-7840 Note: follow-up patches add extra checks on each block->host access. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Amit Shah <amit.shah@redhat.com>
This commit is contained in:
parent
d6be29e3fb
commit
0be839a270
@ -1006,7 +1006,7 @@ static inline void *host_from_stream_offset(QEMUFile *f,
|
|||||||
uint8_t len;
|
uint8_t len;
|
||||||
|
|
||||||
if (flags & RAM_SAVE_FLAG_CONTINUE) {
|
if (flags & RAM_SAVE_FLAG_CONTINUE) {
|
||||||
if (!block) {
|
if (!block || block->length <= offset) {
|
||||||
error_report("Ack, bad migration stream!");
|
error_report("Ack, bad migration stream!");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1019,8 +1019,9 @@ static inline void *host_from_stream_offset(QEMUFile *f,
|
|||||||
id[len] = 0;
|
id[len] = 0;
|
||||||
|
|
||||||
QTAILQ_FOREACH(block, &ram_list.blocks, next) {
|
QTAILQ_FOREACH(block, &ram_list.blocks, next) {
|
||||||
if (!strncmp(id, block->idstr, sizeof(id)))
|
if (!strncmp(id, block->idstr, sizeof(id)) && block->length > offset) {
|
||||||
return memory_region_get_ram_ptr(block->mr) + offset;
|
return memory_region_get_ram_ptr(block->mr) + offset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_report("Can't find block %s!", id);
|
error_report("Can't find block %s!", id);
|
||||||
|
Loading…
Reference in New Issue
Block a user