mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
VCPU/timers: Prevent overflow in calculations, leading to DoS vulnerability
The timer action for a vcpu periodic timer is to calculate the next expiry time, and to reinsert itself into the timer queue. If the deadline ends up in the past, Xen never leaves __do_softirq(). The affected PCPU will stay in an infinite loop until Xen is killed by the watchdog (if enabled). This is a security problem, XSA-20 / CVE-2012-4535. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
1 parent
b46c24edb7
commit
dfa0cb6a14
2 files changed
+5
No files matched your search
@@ -903,6 +903,9 @@ long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
if ( set.period_ns < MILLISECS(1) )
|
||||
return -EINVAL;
|
||||
|
||||
if ( set.period_ns > STIME_DELTA_MAX )
|
||||
return -EINVAL;
|
||||
|
||||
v->periodic_period = set.period_ns;
|
||||
vcpu_force_reschedule(v);
|
||||
|
||||
|
||||
@@ -55,6 +55,8 @@ struct tm gmtime(unsigned long t);
|
||||
#define MILLISECS(_ms) ((s_time_t)((_ms) * 1000000ULL))
|
||||
#define MICROSECS(_us) ((s_time_t)((_us) * 1000ULL))
|
||||
#define STIME_MAX ((s_time_t)((uint64_t)~0ull>>1))
|
||||
/* Chosen so (NOW() + delta) wont overflow without an uptime of 200 years */
|
||||
#define STIME_DELTA_MAX ((s_time_t)((uint64_t)~0ull>>2))
|
||||
|
||||
extern void update_vcpu_system_time(struct vcpu *v);
|
||||
extern void update_domain_wallclock_time(struct domain *d);
|
||||
|
||||