diff options
author | John Johansen <john.johansen@canonical.com> | 2013-07-11 00:17:43 -0400 |
---|---|---|
committer | John Johansen <john.johansen@canonical.com> | 2013-08-14 14:42:07 -0400 |
commit | 556d0be74b19cb6288e5eb2f3216eac247d87968 (patch) | |
tree | a97b609d53713c4c2b534da7a5e1e62639939e11 /security/apparmor | |
parent | 0d259f043f5f60f74c4fd020aac190cb6450e918 (diff) |
apparmor: add an optional profile attachment string for profiles
Add the ability to take in and report a human readable profile attachment
string for profiles so that attachment specifications can be easily
inspected.
Signed-off-by: John Johansen <john.johansen@canonical.com>
Acked-by: Seth Arnold <seth.arnold@canonical.com>
Diffstat (limited to 'security/apparmor')
-rw-r--r-- | security/apparmor/apparmorfs.c | 34 | ||||
-rw-r--r-- | security/apparmor/include/apparmorfs.h | 1 | ||||
-rw-r--r-- | security/apparmor/include/policy.h | 2 | ||||
-rw-r--r-- | security/apparmor/policy_unpack.c | 3 |
4 files changed, 40 insertions, 0 deletions
diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c index 0fdd08c6ea59..d6329aa7aa98 100644 --- a/security/apparmor/apparmorfs.c +++ b/security/apparmor/apparmorfs.c | |||
@@ -290,6 +290,34 @@ static const struct file_operations aa_fs_profmode_fops = { | |||
290 | .release = aa_fs_seq_profile_release, | 290 | .release = aa_fs_seq_profile_release, |
291 | }; | 291 | }; |
292 | 292 | ||
293 | static int aa_fs_seq_profattach_show(struct seq_file *seq, void *v) | ||
294 | { | ||
295 | struct aa_replacedby *r = seq->private; | ||
296 | struct aa_profile *profile = aa_get_profile_rcu(&r->profile); | ||
297 | if (profile->attach) | ||
298 | seq_printf(seq, "%s\n", profile->attach); | ||
299 | else if (profile->xmatch) | ||
300 | seq_puts(seq, "<unknown>\n"); | ||
301 | else | ||
302 | seq_printf(seq, "%s\n", profile->base.name); | ||
303 | aa_put_profile(profile); | ||
304 | |||
305 | return 0; | ||
306 | } | ||
307 | |||
308 | static int aa_fs_seq_profattach_open(struct inode *inode, struct file *file) | ||
309 | { | ||
310 | return aa_fs_seq_profile_open(inode, file, aa_fs_seq_profattach_show); | ||
311 | } | ||
312 | |||
313 | static const struct file_operations aa_fs_profattach_fops = { | ||
314 | .owner = THIS_MODULE, | ||
315 | .open = aa_fs_seq_profattach_open, | ||
316 | .read = seq_read, | ||
317 | .llseek = seq_lseek, | ||
318 | .release = aa_fs_seq_profile_release, | ||
319 | }; | ||
320 | |||
293 | /** fns to setup dynamic per profile/namespace files **/ | 321 | /** fns to setup dynamic per profile/namespace files **/ |
294 | void __aa_fs_profile_rmdir(struct aa_profile *profile) | 322 | void __aa_fs_profile_rmdir(struct aa_profile *profile) |
295 | { | 323 | { |
@@ -385,6 +413,12 @@ int __aa_fs_profile_mkdir(struct aa_profile *profile, struct dentry *parent) | |||
385 | goto fail; | 413 | goto fail; |
386 | profile->dents[AAFS_PROF_MODE] = dent; | 414 | profile->dents[AAFS_PROF_MODE] = dent; |
387 | 415 | ||
416 | dent = create_profile_file(dir, "attach", profile, | ||
417 | &aa_fs_profattach_fops); | ||
418 | if (IS_ERR(dent)) | ||
419 | goto fail; | ||
420 | profile->dents[AAFS_PROF_ATTACH] = dent; | ||
421 | |||
388 | list_for_each_entry(child, &profile->base.profiles, base.list) { | 422 | list_for_each_entry(child, &profile->base.profiles, base.list) { |
389 | error = __aa_fs_profile_mkdir(child, prof_child_dir(profile)); | 423 | error = __aa_fs_profile_mkdir(child, prof_child_dir(profile)); |
390 | if (error) | 424 | if (error) |
diff --git a/security/apparmor/include/apparmorfs.h b/security/apparmor/include/apparmorfs.h index 2494e112f2bf..f91712cf1b30 100644 --- a/security/apparmor/include/apparmorfs.h +++ b/security/apparmor/include/apparmorfs.h | |||
@@ -81,6 +81,7 @@ enum aafs_prof_type { | |||
81 | AAFS_PROF_PROFS, | 81 | AAFS_PROF_PROFS, |
82 | AAFS_PROF_NAME, | 82 | AAFS_PROF_NAME, |
83 | AAFS_PROF_MODE, | 83 | AAFS_PROF_MODE, |
84 | AAFS_PROF_ATTACH, | ||
84 | AAFS_PROF_SIZEOF, | 85 | AAFS_PROF_SIZEOF, |
85 | }; | 86 | }; |
86 | 87 | ||
diff --git a/security/apparmor/include/policy.h b/security/apparmor/include/policy.h index 5c72231d1c42..59b36372ae40 100644 --- a/security/apparmor/include/policy.h +++ b/security/apparmor/include/policy.h | |||
@@ -165,6 +165,7 @@ struct aa_replacedby { | |||
165 | * @ns: namespace the profile is in | 165 | * @ns: namespace the profile is in |
166 | * @replacedby: is set to the profile that replaced this profile | 166 | * @replacedby: is set to the profile that replaced this profile |
167 | * @rename: optional profile name that this profile renamed | 167 | * @rename: optional profile name that this profile renamed |
168 | * @attach: human readable attachment string | ||
168 | * @xmatch: optional extended matching for unconfined executables names | 169 | * @xmatch: optional extended matching for unconfined executables names |
169 | * @xmatch_len: xmatch prefix len, used to determine xmatch priority | 170 | * @xmatch_len: xmatch prefix len, used to determine xmatch priority |
170 | * @audit: the auditing mode of the profile | 171 | * @audit: the auditing mode of the profile |
@@ -204,6 +205,7 @@ struct aa_profile { | |||
204 | struct aa_replacedby *replacedby; | 205 | struct aa_replacedby *replacedby; |
205 | const char *rename; | 206 | const char *rename; |
206 | 207 | ||
208 | const char *attach; | ||
207 | struct aa_dfa *xmatch; | 209 | struct aa_dfa *xmatch; |
208 | int xmatch_len; | 210 | int xmatch_len; |
209 | enum audit_mode audit; | 211 | enum audit_mode audit; |
diff --git a/security/apparmor/policy_unpack.c b/security/apparmor/policy_unpack.c index cac0aa075787..bdaef2e1b2a0 100644 --- a/security/apparmor/policy_unpack.c +++ b/security/apparmor/policy_unpack.c | |||
@@ -492,6 +492,9 @@ static struct aa_profile *unpack_profile(struct aa_ext *e) | |||
492 | /* profile renaming is optional */ | 492 | /* profile renaming is optional */ |
493 | (void) unpack_str(e, &profile->rename, "rename"); | 493 | (void) unpack_str(e, &profile->rename, "rename"); |
494 | 494 | ||
495 | /* attachment string is optional */ | ||
496 | (void) unpack_str(e, &profile->attach, "attach"); | ||
497 | |||
495 | /* xmatch is optional and may be NULL */ | 498 | /* xmatch is optional and may be NULL */ |
496 | profile->xmatch = unpack_dfa(e); | 499 | profile->xmatch = unpack_dfa(e); |
497 | if (IS_ERR(profile->xmatch)) { | 500 | if (IS_ERR(profile->xmatch)) { |