• Justin Stitt's avatar
    ntp: Safeguard against time_constant overflow · 06c03c8e
    Justin Stitt authored
    Using syzkaller with the recently reintroduced signed integer overflow
    sanitizer produces this UBSAN report:
    
    UBSAN: signed-integer-overflow in ../kernel/time/ntp.c:738:18
    9223372036854775806 + 4 cannot be represented in type 'long'
    Call Trace:
     handle_overflow+0x171/0x1b0
     __do_adjtimex+0x1236/0x1440
     do_adjtimex+0x2be/0x740
    
    The user supplied time_constant value is incremented by four and then
    clamped to the operating range.
    
    Before commit eea83d89 ("ntp: NTP4 user space bits update") the user
    supplied value was sanity checked to be in the operating range. That change
    removed the sanity check and relied on clamping after incrementing which
    does not work correctly when the user supplied value is in the overflow
    zone of the '+ 4' operation.
    
    The operation requires CAP_SYS_TIME and the side effect of the overflow is
    NTP getting out of sync.
    
    Similar to the fixups for time_maxerror and time_esterror, clamp the user
    space supplied value to the operating range.
    
    [ tglx: Switch to clamping ]
    
    Fixes: eea83d89 ("ntp: NTP4 user space bits update")
    Signed-off-by: default avatarJustin Stitt <justinstitt@google.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Miroslav Lichvar <mlichvar@redhat.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/all/20240517-b4-sio-ntp-c-v2-1-f3a80096f36f@google.com
    Closes: https://github.com/KSPP/linux/issues/352
    06c03c8e
ntp.c 28.3 KB