summaryrefslogtreecommitdiff
path: root/sys/secmodel/securelevel
diff options
context:
space:
mode:
authorelad <elad@NetBSD.org>2009-10-03 20:48:42 +0000
committerelad <elad@NetBSD.org>2009-10-03 20:48:42 +0000
commita39251ecc2fd3ce54166b87b21519b087b058fd3 (patch)
treec2ba6f852506658a8aab8257468dbbde14bb3b38 /sys/secmodel/securelevel
parenta611f250f563b223870b04a23a437c8fc0809eb9 (diff)
Introduce time_wraps() to check if setting the time will wrap it (or
close to it). Useful for secmodels. Replace open-coded form with it in secmodel code (securelevel, keylock). Note: I need to find a way to make secmodel_keylock.c ~<100 lines.
Diffstat (limited to 'sys/secmodel/securelevel')
-rw-r--r--sys/secmodel/securelevel/secmodel_securelevel.c19
1 files changed, 5 insertions, 14 deletions
diff --git a/sys/secmodel/securelevel/secmodel_securelevel.c b/sys/secmodel/securelevel/secmodel_securelevel.c
index f1b393da6d6..56a2e252603 100644
--- a/sys/secmodel/securelevel/secmodel_securelevel.c
+++ b/sys/secmodel/securelevel/secmodel_securelevel.c
@@ -1,4 +1,4 @@
-/* $NetBSD: secmodel_securelevel.c,v 1.15 2009/10/02 20:15:07 elad Exp $ */
+/* $NetBSD: secmodel_securelevel.c,v 1.16 2009/10/03 20:48:42 elad Exp $ */
/*-
* Copyright (c) 2006 Elad Efrat <elad@NetBSD.org>
* All rights reserved.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: secmodel_securelevel.c,v 1.15 2009/10/02 20:15:07 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: secmodel_securelevel.c,v 1.16 2009/10/03 20:48:42 elad Exp $");
#ifdef _KERNEL_OPT
#include "opt_insecure.h"
@@ -50,6 +50,7 @@ __KERNEL_RCSID(0, "$NetBSD: secmodel_securelevel.c,v 1.15 2009/10/02 20:15:07 el
#include <sys/sysctl.h>
#include <sys/vnode.h>
#include <sys/module.h>
+#include <sys/timevar.h>
#include <miscfs/specfs/specdev.h>
@@ -242,19 +243,9 @@ secmodel_securelevel_system_cb(kauth_cred_t cred,
struct timespec *ts = arg1;
struct timespec *delta = arg2;
- /*
- * Don't allow the time to be set forward so far it
- * will wrap and become negative, thus allowing an
- * attacker to bypass the next check below. The
- * cutoff is 1 year before rollover occurs, so even
- * if the attacker uses adjtime(2) to move the time
- * past the cutoff, it will take a very long time
- * to get to the wrap point.
- */
- if (securelevel > 1 &&
- ((ts->tv_sec > LLONG_MAX - 365*24*60*60) ||
- (delta->tv_sec < 0 || delta->tv_nsec < 0)))
+ if (securelevel > 1 && time_wraps(ts, delta))
result = KAUTH_RESULT_DENY;
+
break;
}