ntp: Audit NTP parameters adjustment
Emit an audit record every time selected NTP parameters are modified from userspace (via adjtimex(2) or clock_adjtime(2)). These parameters may be used to indirectly change system clock, and thus their modifications should be audited. Such events will now generate records of type AUDIT_TIME_ADJNTPVAL containing the following fields: - op -- which value was adjusted: - offset -- corresponding to the time_offset variable - freq -- corresponding to the time_freq variable - status -- corresponding to the time_status variable - adjust -- corresponding to the time_adjust variable - tick -- corresponding to the tick_usec variable - tai -- corresponding to the timekeeping's TAI offset - old -- the old value - new -- the new value Example records: type=TIME_ADJNTPVAL msg=audit(1530616044.507:7): op=status old=64 new=8256 type=TIME_ADJNTPVAL msg=audit(1530616044.511:11): op=freq old=0 new=49180377088000 The records of this type will be associated with the corresponding syscall records. An overview of parameter changes that can be done via do_adjtimex() (based on information from Miroslav Lichvar) and whether they are audited: __timekeeping_set_tai_offset() -- sets the offset from the International Atomic Time (AUDITED) NTP variables: time_offset -- can adjust the clock by up to 0.5 seconds per call and also speed it up or slow down by up to about 0.05% (43 seconds per day) (AUDITED) time_freq -- can speed up or slow down by up to about 0.05% (AUDITED) time_status -- can insert/delete leap seconds and it also enables/ disables synchronization of the hardware real-time clock (AUDITED) time_maxerror, time_esterror -- change error estimates used to inform userspace applications (NOT AUDITED) time_constant -- controls the speed of the clock adjustments that are made when time_offset is set (NOT AUDITED) time_adjust -- can temporarily speed up or slow down the clock by up to 0.05% (AUDITED) tick_usec -- a more extreme version of time_freq; can speed up or slow down the clock by up to 10% (AUDITED) Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com> Reviewed-by: Richard Guy Briggs <rgb@redhat.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Paul Moore <paul@paul-moore.com>
This commit is contained in:

committed by
Paul Moore

parent
2d87a0674b
commit
7e8eda734d
@@ -86,6 +86,29 @@ struct audit_field {
|
||||
u32 op;
|
||||
};
|
||||
|
||||
enum audit_ntp_type {
|
||||
AUDIT_NTP_OFFSET,
|
||||
AUDIT_NTP_FREQ,
|
||||
AUDIT_NTP_STATUS,
|
||||
AUDIT_NTP_TAI,
|
||||
AUDIT_NTP_TICK,
|
||||
AUDIT_NTP_ADJUST,
|
||||
|
||||
AUDIT_NTP_NVALS /* count */
|
||||
};
|
||||
|
||||
#ifdef CONFIG_AUDITSYSCALL
|
||||
struct audit_ntp_val {
|
||||
long long oldval, newval;
|
||||
};
|
||||
|
||||
struct audit_ntp_data {
|
||||
struct audit_ntp_val vals[AUDIT_NTP_NVALS];
|
||||
};
|
||||
#else
|
||||
struct audit_ntp_data {};
|
||||
#endif
|
||||
|
||||
extern int is_audit_feature_set(int which);
|
||||
|
||||
extern int __init audit_register_class(int class, unsigned *list);
|
||||
@@ -366,6 +389,7 @@ extern void __audit_mmap_fd(int fd, int flags);
|
||||
extern void __audit_log_kern_module(char *name);
|
||||
extern void __audit_fanotify(unsigned int response);
|
||||
extern void __audit_tk_injoffset(struct timespec64 offset);
|
||||
extern void __audit_ntp_log(const struct audit_ntp_data *ad);
|
||||
|
||||
static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp)
|
||||
{
|
||||
@@ -478,6 +502,29 @@ static inline void audit_tk_injoffset(struct timespec64 offset)
|
||||
__audit_tk_injoffset(offset);
|
||||
}
|
||||
|
||||
static inline void audit_ntp_init(struct audit_ntp_data *ad)
|
||||
{
|
||||
memset(ad, 0, sizeof(*ad));
|
||||
}
|
||||
|
||||
static inline void audit_ntp_set_old(struct audit_ntp_data *ad,
|
||||
enum audit_ntp_type type, long long val)
|
||||
{
|
||||
ad->vals[type].oldval = val;
|
||||
}
|
||||
|
||||
static inline void audit_ntp_set_new(struct audit_ntp_data *ad,
|
||||
enum audit_ntp_type type, long long val)
|
||||
{
|
||||
ad->vals[type].newval = val;
|
||||
}
|
||||
|
||||
static inline void audit_ntp_log(const struct audit_ntp_data *ad)
|
||||
{
|
||||
if (!audit_dummy_context())
|
||||
__audit_ntp_log(ad);
|
||||
}
|
||||
|
||||
extern int audit_n_rules;
|
||||
extern int audit_signals;
|
||||
#else /* CONFIG_AUDITSYSCALL */
|
||||
@@ -594,6 +641,20 @@ static inline void audit_fanotify(unsigned int response)
|
||||
static inline void audit_tk_injoffset(struct timespec64 offset)
|
||||
{ }
|
||||
|
||||
static inline void audit_ntp_init(struct audit_ntp_data *ad)
|
||||
{ }
|
||||
|
||||
static inline void audit_ntp_set_old(struct audit_ntp_data *ad,
|
||||
enum audit_ntp_type type, long long val)
|
||||
{ }
|
||||
|
||||
static inline void audit_ntp_set_new(struct audit_ntp_data *ad,
|
||||
enum audit_ntp_type type, long long val)
|
||||
{ }
|
||||
|
||||
static inline void audit_ntp_log(const struct audit_ntp_data *ad)
|
||||
{ }
|
||||
|
||||
static inline void audit_ptrace(struct task_struct *t)
|
||||
{ }
|
||||
#define audit_n_rules 0
|
||||
|
Reference in New Issue
Block a user