base-files: sysfixtime exclude dnsmasq.time
authorKevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk>
Thu, 5 May 2016 11:34:49 +0000 (12:34 +0100)
committerJo-Philipp Wich <jo@mein.io>
Wed, 18 May 2016 20:17:33 +0000 (22:17 +0200)
dnsmasq maintains dnsmasq.time across reboots and uses it as a means of
determining if current time is good enough to validate dnssec time
stamps.  By including /etc/dnsmasq.time as a time source for sysfixtime,
the mechanism was effectively defeated because time was set to the
last time that dnsmasq considered current even though that time is in
the past.  Since that time is out of date, dns(sec) resolution would
fail thus defeating any ntp based mechanisms for setting the clock
correctly.

In theory the process is defeated by any files in /etc that are newer
than /etc/dnsmasq.time however dnsmasq now updates the file's timestamp
on process TERM so hopefully /etc/dnsmasq.time is the latest file
timestamp in /etc as part of LEDE shutdown/reboot.

Either way, including /etc/dnsmasq.time as a time source for
sysfixtime is not helpful.

package/base-files/files/etc/init.d/sysfixtime

index ab946f6518f6f6eb373313a897ca47c9682d5cca..1354a586ce4e11859d8fcb844eff154b09adfce7 100755 (executable)
@@ -10,8 +10,8 @@ HWCLOCK=/sbin/hwclock
 boot() {
        start && exit 0
 
 boot() {
        start && exit 0
 
+       local maxtime="$(maxtime)"
        local curtime="$(date +%s)"
        local curtime="$(date +%s)"
-       local maxtime="$(find /etc -type f -exec date -r {} +%s \; | sort -nr | head -n1)"
        [ $curtime -lt $maxtime ] && date -s @$maxtime
 }
 
        [ $curtime -lt $maxtime ] && date -s @$maxtime
 }
 
@@ -23,3 +23,12 @@ stop() {
        [ -e "$RTC_DEV" ] && [ -e "$HWCLOCK" ] && $HWCLOCK -w -f $RTC_DEV && \
                logger -t sysfixtime "saved '$(date)' to $RTC_DEV"
 }
        [ -e "$RTC_DEV" ] && [ -e "$HWCLOCK" ] && $HWCLOCK -w -f $RTC_DEV && \
                logger -t sysfixtime "saved '$(date)' to $RTC_DEV"
 }
+
+maxtime() {
+       local file newest
+
+       for file in $( find /etc -type f ! -path /etc/dnsmasq.time ) ; do
+               [ -z "$newest" -o "$newest" -ot "$file"] && newest=$file
+       done
+       [ "$newest" ] && date -r "$newest" +%s
+}