Commit 03816507 authored by John Johansen's avatar John Johansen

apparmor: allow setting any profile into the unconfined state

Allow emulating the default profile behavior from boot, by allowing
loading of a profile in the unconfined state into a new NS.
Signed-off-by: default avatarJohn Johansen <john.johansen@canonical.com>
Acked-by: default avatarSeth Arnold <seth.arnold@canonical.com>
parent 8651e1d6
...@@ -371,8 +371,8 @@ int apparmor_bprm_set_creds(struct linux_binprm *bprm) ...@@ -371,8 +371,8 @@ int apparmor_bprm_set_creds(struct linux_binprm *bprm)
error = aa_path_name(&bprm->file->f_path, profile->path_flags, &buffer, error = aa_path_name(&bprm->file->f_path, profile->path_flags, &buffer,
&name, &info); &name, &info);
if (error) { if (error) {
if (profile->flags & if (unconfined(profile) ||
(PFLAG_IX_ON_NAME_ERROR | PFLAG_UNCONFINED)) (profile->flags & PFLAG_IX_ON_NAME_ERROR))
error = 0; error = 0;
name = bprm->filename; name = bprm->filename;
goto audit; goto audit;
......
...@@ -56,11 +56,11 @@ enum profile_mode { ...@@ -56,11 +56,11 @@ enum profile_mode {
APPARMOR_ENFORCE, /* enforce access rules */ APPARMOR_ENFORCE, /* enforce access rules */
APPARMOR_COMPLAIN, /* allow and log access violations */ APPARMOR_COMPLAIN, /* allow and log access violations */
APPARMOR_KILL, /* kill task on access violation */ APPARMOR_KILL, /* kill task on access violation */
APPARMOR_UNCONFINED, /* profile set to unconfined */
}; };
enum profile_flags { enum profile_flags {
PFLAG_HAT = 1, /* profile is a hat */ PFLAG_HAT = 1, /* profile is a hat */
PFLAG_UNCONFINED = 2, /* profile is an unconfined profile */
PFLAG_NULL = 4, /* profile is null learning profile */ PFLAG_NULL = 4, /* profile is null learning profile */
PFLAG_IX_ON_NAME_ERROR = 8, /* fallback to ix on name lookup fail */ PFLAG_IX_ON_NAME_ERROR = 8, /* fallback to ix on name lookup fail */
PFLAG_IMMUTABLE = 0x10, /* don't allow changes/replacement */ PFLAG_IMMUTABLE = 0x10, /* don't allow changes/replacement */
...@@ -199,7 +199,7 @@ struct aa_profile { ...@@ -199,7 +199,7 @@ struct aa_profile {
struct aa_dfa *xmatch; struct aa_dfa *xmatch;
int xmatch_len; int xmatch_len;
enum audit_mode audit; enum audit_mode audit;
enum profile_mode mode; long mode;
long flags; long flags;
u32 path_flags; u32 path_flags;
int size; int size;
...@@ -240,7 +240,7 @@ ssize_t aa_remove_profiles(char *name, size_t size); ...@@ -240,7 +240,7 @@ ssize_t aa_remove_profiles(char *name, size_t size);
#define PROF_ADD 1 #define PROF_ADD 1
#define PROF_REPLACE 0 #define PROF_REPLACE 0
#define unconfined(X) ((X)->flags & PFLAG_UNCONFINED) #define unconfined(X) ((X)->mode == APPARMOR_UNCONFINED)
/** /**
......
...@@ -27,6 +27,13 @@ struct aa_load_ent { ...@@ -27,6 +27,13 @@ struct aa_load_ent {
void aa_load_ent_free(struct aa_load_ent *ent); void aa_load_ent_free(struct aa_load_ent *ent);
struct aa_load_ent *aa_load_ent_alloc(void); struct aa_load_ent *aa_load_ent_alloc(void);
#define PACKED_FLAG_HAT 1
#define PACKED_MODE_ENFORCE 0
#define PACKED_MODE_COMPLAIN 1
#define PACKED_MODE_KILL 2
#define PACKED_MODE_UNCONFINED 3
int aa_unpack(void *udata, size_t size, struct list_head *lh, const char **ns); int aa_unpack(void *udata, size_t size, struct list_head *lh, const char **ns);
#endif /* __POLICY_INTERFACE_H */ #endif /* __POLICY_INTERFACE_H */
...@@ -96,6 +96,7 @@ const char *const profile_mode_names[] = { ...@@ -96,6 +96,7 @@ const char *const profile_mode_names[] = {
"enforce", "enforce",
"complain", "complain",
"kill", "kill",
"unconfined",
}; };
/** /**
...@@ -290,8 +291,9 @@ static struct aa_namespace *alloc_namespace(const char *prefix, ...@@ -290,8 +291,9 @@ static struct aa_namespace *alloc_namespace(const char *prefix,
if (!ns->unconfined) if (!ns->unconfined)
goto fail_unconfined; goto fail_unconfined;
ns->unconfined->flags = PFLAG_UNCONFINED | PFLAG_IX_ON_NAME_ERROR | ns->unconfined->flags = PFLAG_IX_ON_NAME_ERROR |
PFLAG_IMMUTABLE | PFLAG_NS_COUNT; PFLAG_IMMUTABLE | PFLAG_NS_COUNT;
ns->unconfined->mode = APPARMOR_UNCONFINED;
/* ns and ns->unconfined share ns->unconfined refcount */ /* ns and ns->unconfined share ns->unconfined refcount */
ns->unconfined->ns = ns; ns->unconfined->ns = ns;
......
...@@ -511,12 +511,16 @@ static struct aa_profile *unpack_profile(struct aa_ext *e) ...@@ -511,12 +511,16 @@ static struct aa_profile *unpack_profile(struct aa_ext *e)
goto fail; goto fail;
if (!unpack_u32(e, &tmp, NULL)) if (!unpack_u32(e, &tmp, NULL))
goto fail; goto fail;
if (tmp) if (tmp & PACKED_FLAG_HAT)
profile->flags |= PFLAG_HAT; profile->flags |= PFLAG_HAT;
if (!unpack_u32(e, &tmp, NULL)) if (!unpack_u32(e, &tmp, NULL))
goto fail; goto fail;
if (tmp) if (tmp == PACKED_MODE_COMPLAIN)
profile->mode = APPARMOR_COMPLAIN; profile->mode = APPARMOR_COMPLAIN;
else if (tmp == PACKED_MODE_KILL)
profile->mode = APPARMOR_KILL;
else if (tmp == PACKED_MODE_UNCONFINED)
profile->mode = APPARMOR_UNCONFINED;
if (!unpack_u32(e, &tmp, NULL)) if (!unpack_u32(e, &tmp, NULL))
goto fail; goto fail;
if (tmp) if (tmp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment