[apparmor] [PATCH] enhance aa-status to deal with lack of interface patch

Kees Cook kees at ubuntu.com
Tue Apr 24 23:59:08 UTC 2012


Handle lacking the interface patch, and examine the "enabled"
parameter for determining the state of AppArmor on the system.

Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=661153

Index: apparmor-debian/utils/aa-status
===================================================================
--- apparmor-debian.orig/utils/aa-status	2011-05-27 12:08:50.000000000 -0700
+++ apparmor-debian/utils/aa-status	2012-04-24 12:42:39.540597212 -0700
@@ -14,8 +14,7 @@
 
 def cmd_enabled():
     '''Returns error code if AppArmor is not enabled'''
-    if get_profiles() == {}:
-        sys.exit(2)
+    find_apparmorfs()
 
 def cmd_profiled():
     '''Prints the number of loaded profiles'''
@@ -72,19 +71,15 @@
     '''Fetch loaded profiles'''
 
     profiles = {}
-
-    if os.path.exists("/sys/module/apparmor"):
-        stdmsg("apparmor module is loaded.")
-    else:
-        errormsg("apparmor module is not loaded.")
-        sys.exit(1)
-
     apparmorfs = find_apparmorfs()
-    if not apparmorfs:
-        errormsg("apparmor filesystem is not mounted.")
-        sys.exit(3)
 
+    # Kernel with the stock kernel cannot read profiles, but shouldn't
+    # be considered a fatal failure mode.
     apparmor_profiles = os.path.join(apparmorfs, "profiles")
+    if not os.path.exists(apparmor_profiles):
+        errormsg("AppArmor running without interface patch -- cannot determine loaded profiles.")
+        return profiles
+
     if not os.access(apparmor_profiles, os.R_OK):
         errormsg("You do not have enough privilege to read the profile set.")
         sys.exit(4)
@@ -134,11 +129,29 @@
 
 def find_apparmorfs():
     '''Finds AppArmor mount point'''
+
+    apparmor_module = "/sys/module/apparmor"
+    if os.path.exists(apparmor_module):
+        stdmsg("AppArmor available in kernel.")
+    else:
+        errormsg("AppArmor not available in kernel.")
+        sys.exit(1)
+
+    apparmor_enabled = os.path.join(apparmor_module, "parameters", "enabled")
+    if not os.access(apparmor_enabled, os.R_OK):
+        errormsg("You do not have enough privilege to check AppArmor parameters.")
+        sys.exit(2)
+    if open(apparmor_enabled, "r").readline().strip() != "Y":
+        errormsg("AppArmor not enabled. (Kernel not booted with \"security=apparmor\"?)")
+        sys.exit(3)
+
     for p in open("/proc/mounts").readlines():
         if p.split()[2] == "securityfs" and \
            os.path.exists(os.path.join(p.split()[1], "apparmor")):
             return os.path.join(p.split()[1], "apparmor")
-    return False
+
+    errormsg("AppArmor securityfs not mounted.")
+    sys.exit(3)
 
 def errormsg(message):
     '''Prints to stderr if verbose mode is on'''

-- 
Kees Cook



More information about the AppArmor mailing list