[PATCH 3] utrace: introduce ENGINE_LSM_ flags

Oleg Nesterov oleg at redhat.com
Wed Jul 7 18:13:42 UTC 2010


Introduce ENGINE_LSM_TRACE and ENGINE_LSM_TRACE_CAP bits for
utrace_unsafe_exec(). These bit should be set when we attach the
new engine by user request.

Note: we use engine->flags and task->utrace_flags, this doesn't
really matter. The only important point is: somehow utrace_engine
should have the security info which we do not currently have.

Note!!!!!! The next patches try to convert ptrace-utrace, but
ptrace is only used for example. gdbstub or whatever has the same
security problems and needs.

---

 kernel/utrace.c |   16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

--- RHEL6/kernel/utrace.c~3_ENGINE_LSM_FLAGS	2010-07-06 23:55:14.000000000 +0200
+++ RHEL6/kernel/utrace.c	2010-07-07 00:48:09.000000000 +0200
@@ -460,7 +460,11 @@ static void put_detached_list(struct lis
  */
 #define ENGINE_STOP		(1UL << _UTRACE_NEVENTS)
 
-#define ENGINE_EXTRA_FLAGS	(ENGINE_STOP)
+#define ENGINE_LSM_TRACE	(1UL << (_UTRACE_NEVENTS + 1))
+#define ENGINE_LSM_TRACE_CAP	(1UL << (_UTRACE_NEVENTS + 2))
+#define ENGINE_LSM_MASK		(ENGINE_LSM_TRACE | ENGINE_LSM_TRACE_CAP)
+
+#define ENGINE_EXTRA_FLAGS	(ENGINE_STOP | ENGINE_LSM_MASK)
 
 static void mark_engine_wants_stop(struct task_struct *task,
 				   struct utrace_engine *engine)
@@ -2457,9 +2461,15 @@ int utrace_unsafe_exec(struct task_struc
 {
 	int unsafe = 0;
 
-	if (task->ptrace & PT_PTRACE_CAP)
+	if (task->utrace_flags & ENGINE_LSM_TRACE)
+		unsafe = LSM_UNSAFE_PTRACE;
+	else if (task->utrace_flags & ENGINE_LSM_TRACE_CAP)
 		unsafe = LSM_UNSAFE_PTRACE_CAP;
-	else if (task->ptrace)
+
+	if (task->ptrace & PT_PTRACE_CAP) {
+		if (!unsafe)
+			unsafe = LSM_UNSAFE_PTRACE_CAP;
+	} else if (task->ptrace)
 		unsafe = LSM_UNSAFE_PTRACE;
 
 	return unsafe;




More information about the utrace-devel mailing list