lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20160729095015.GB8076@sharon>
Date:	Fri, 29 Jul 2016 17:50:16 +0800
From:	Chen Yu <yu.c.chen@...el.com>
To:	Thomas Gleixner <tglx@...utronix.de>
Cc:	"Rafael J. Wysocki" <rjw@...ysocki.net>,
	John Stultz <john.stultz@...aro.org>,
	Xunlei Pang <xpang@...hat.com>,
	Zhang Rui <rui.zhang@...el.com>,
	Linux PM list <linux-pm@...r.kernel.org>,
	Linux Kernel Mail List <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH][v2] timekeeping: Fix memory overwrite of sleep_time_bin
 array

Hi Thomas,

On Tue, Jul 19, 2016 at 12:40:14PM +0200, Thomas Gleixner wrote:
> On Tue, 19 Jul 2016, Chen Yu wrote:
> > On 2016年07月19日 16:36, Thomas Gleixner wrote:
> > > On Tue, 19 Jul 2016, Chen Yu wrote:
> > > > Further investigation shows that, the problem is caused by setting
> > > > /sys/power/pm_trace to 1 before the 1st hibernation, since once
> > > > pm_trace is enabled, the rtc becomes an unmeaningful value after resumed,
> > >
> > > So why is the RTC value useless if pm_trace is enabled? I really have a hard
> > > time to understand why pm_trace would affect the sleep time readout from
> > > RTC.
> >
> > After pm_trace is enabled, during system suspend/hibernate, the hash name of
> > each devices will be written to rtc, so the rtc value depends on what we
> > write in last suspend round, thus pm_trace can be used for diagnose which
> > device failed to suspend(eg, the suspending on this device hang the system,
> > we reboot the system , and check rtc hash value).
> > 
> > In our case, after first hibernate/resume round, we found our current system
> > time is at 2117, so syscore_resume -> timekeeping_resume :
> > __timekeeping_inject_sleeptime(tk, &ts_delta) would inject a quite large
> > delta : 2117 - 2017 year, thus the sleep_time_bin is overflow.
> 
> While the range check is certainly correct and a good thing to have it's wrong
> in the first place to call __timekeeping_inject_sleeptime() in case that
> pm_trace is enabled simply because that "hash" time value will also wreckage
> timekeeping. Your patch is just curing the symptom in the debug code but not
> fixing the root cause.
> 
I've done more testings on that problematical machine, and the result shows that,
the real offender is that, some BIOSes would like to adjust the 'INVALID' rtc value
to the motherboard released date during POST stage. That is to say, once the rtc
is set to an invalid value, the subsequent hibernate/resume would get a meaningless
tsc delta due to the aggressive BIOSes.

Here's one of scenarios on how the problem is triggered:

1. pm_trace = 1, suspend to disk sets the rtc to year 1912.
2. system reboots, BIOS adjusts the rtc to 2013, which is the release date of that motherboard.
3. resume from disk, and the sleep time(i.e, delta of tsc) is (2013 - 1912), which caused overflow
   in timekeepting_debug.

We can avoid this problem by ignoring the idle injection if pm_trace is enabled,
but we might still miss other cases which might also break the rtc, e.g, buggy
clocksoure/rtc driver, or even user space tool such as hwclock, so actually we
can not distinguish whether the delta of tsc is reasonable(long time sleep or not?), IMO.

I've prepared two version of solutions:

1st is to bypass the sleep time if pm_trace is involved(a little complicated
    because it needs to deal with historical pm_trace), or

2nd version is to introduce a sysfs interface to allow the
    users to specify the threshold of sleep time, any delta
    of tsc bigger than the threshold would be regarded as invalid.

Both two solutions contain the fix for the overflow in timekeeping_debug.
May I know which one do you prefer, or any suggestions would be appreciated.

Thanks,
Yu


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ