diff options
| -rw-r--r-- | include/linux/audit.h | 26 | ||||
| -rw-r--r-- | ipc/mqueue.c | 2 | ||||
| -rw-r--r-- | kernel/audit.h | 1 | ||||
| -rw-r--r-- | kernel/auditsc.c | 12 |
4 files changed, 34 insertions, 7 deletions
diff --git a/include/linux/audit.h b/include/linux/audit.h index b20b03852f21..729a4d165bcc 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
| @@ -103,8 +103,11 @@ extern void __audit_syscall_exit(int ret_success, long ret_value); | |||
| 103 | extern struct filename *__audit_reusename(const __user char *uptr); | 103 | extern struct filename *__audit_reusename(const __user char *uptr); |
| 104 | extern void __audit_getname(struct filename *name); | 104 | extern void __audit_getname(struct filename *name); |
| 105 | extern void audit_putname(struct filename *name); | 105 | extern void audit_putname(struct filename *name); |
| 106 | |||
| 107 | #define AUDIT_INODE_PARENT 1 /* dentry represents the parent */ | ||
| 108 | #define AUDIT_INODE_HIDDEN 2 /* audit record should be hidden */ | ||
| 106 | extern void __audit_inode(struct filename *name, const struct dentry *dentry, | 109 | extern void __audit_inode(struct filename *name, const struct dentry *dentry, |
| 107 | unsigned int parent); | 110 | unsigned int flags); |
| 108 | extern void __audit_inode_child(const struct inode *parent, | 111 | extern void __audit_inode_child(const struct inode *parent, |
| 109 | const struct dentry *dentry, | 112 | const struct dentry *dentry, |
| 110 | const unsigned char type); | 113 | const unsigned char type); |
| @@ -148,10 +151,22 @@ static inline void audit_getname(struct filename *name) | |||
| 148 | if (unlikely(!audit_dummy_context())) | 151 | if (unlikely(!audit_dummy_context())) |
| 149 | __audit_getname(name); | 152 | __audit_getname(name); |
| 150 | } | 153 | } |
| 151 | static inline void audit_inode(struct filename *name, const struct dentry *dentry, | 154 | static inline void audit_inode(struct filename *name, |
| 155 | const struct dentry *dentry, | ||
| 152 | unsigned int parent) { | 156 | unsigned int parent) { |
| 157 | if (unlikely(!audit_dummy_context())) { | ||
| 158 | unsigned int flags = 0; | ||
| 159 | if (parent) | ||
| 160 | flags |= AUDIT_INODE_PARENT; | ||
| 161 | __audit_inode(name, dentry, flags); | ||
| 162 | } | ||
| 163 | } | ||
| 164 | static inline void audit_inode_parent_hidden(struct filename *name, | ||
| 165 | const struct dentry *dentry) | ||
| 166 | { | ||
| 153 | if (unlikely(!audit_dummy_context())) | 167 | if (unlikely(!audit_dummy_context())) |
| 154 | __audit_inode(name, dentry, parent); | 168 | __audit_inode(name, dentry, |
| 169 | AUDIT_INODE_PARENT | AUDIT_INODE_HIDDEN); | ||
| 155 | } | 170 | } |
| 156 | static inline void audit_inode_child(const struct inode *parent, | 171 | static inline void audit_inode_child(const struct inode *parent, |
| 157 | const struct dentry *dentry, | 172 | const struct dentry *dentry, |
| @@ -311,7 +326,7 @@ static inline void audit_putname(struct filename *name) | |||
| 311 | { } | 326 | { } |
| 312 | static inline void __audit_inode(struct filename *name, | 327 | static inline void __audit_inode(struct filename *name, |
| 313 | const struct dentry *dentry, | 328 | const struct dentry *dentry, |
| 314 | unsigned int parent) | 329 | unsigned int flags) |
| 315 | { } | 330 | { } |
| 316 | static inline void __audit_inode_child(const struct inode *parent, | 331 | static inline void __audit_inode_child(const struct inode *parent, |
| 317 | const struct dentry *dentry, | 332 | const struct dentry *dentry, |
| @@ -321,6 +336,9 @@ static inline void audit_inode(struct filename *name, | |||
| 321 | const struct dentry *dentry, | 336 | const struct dentry *dentry, |
| 322 | unsigned int parent) | 337 | unsigned int parent) |
| 323 | { } | 338 | { } |
| 339 | static inline void audit_inode_parent_hidden(struct filename *name, | ||
| 340 | const struct dentry *dentry) | ||
| 341 | { } | ||
| 324 | static inline void audit_inode_child(const struct inode *parent, | 342 | static inline void audit_inode_child(const struct inode *parent, |
| 325 | const struct dentry *dentry, | 343 | const struct dentry *dentry, |
| 326 | const unsigned char type) | 344 | const unsigned char type) |
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index e4e47f647446..ae1996d3c539 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
| @@ -823,6 +823,7 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, umode_t, mode, | |||
| 823 | error = ro; | 823 | error = ro; |
| 824 | goto out; | 824 | goto out; |
| 825 | } | 825 | } |
| 826 | audit_inode_parent_hidden(name, root); | ||
| 826 | filp = do_create(ipc_ns, root->d_inode, | 827 | filp = do_create(ipc_ns, root->d_inode, |
| 827 | &path, oflag, mode, | 828 | &path, oflag, mode, |
| 828 | u_attr ? &attr : NULL); | 829 | u_attr ? &attr : NULL); |
| @@ -868,6 +869,7 @@ SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name) | |||
| 868 | if (IS_ERR(name)) | 869 | if (IS_ERR(name)) |
| 869 | return PTR_ERR(name); | 870 | return PTR_ERR(name); |
| 870 | 871 | ||
| 872 | audit_inode_parent_hidden(name, mnt->mnt_root); | ||
| 871 | err = mnt_want_write(mnt); | 873 | err = mnt_want_write(mnt); |
| 872 | if (err) | 874 | if (err) |
| 873 | goto out_name; | 875 | goto out_name; |
diff --git a/kernel/audit.h b/kernel/audit.h index 1c95131ef760..123c9b7c3979 100644 --- a/kernel/audit.h +++ b/kernel/audit.h | |||
| @@ -85,6 +85,7 @@ struct audit_names { | |||
| 85 | 85 | ||
| 86 | struct filename *name; | 86 | struct filename *name; |
| 87 | int name_len; /* number of chars to log */ | 87 | int name_len; /* number of chars to log */ |
| 88 | bool hidden; /* don't log this record */ | ||
| 88 | bool name_put; /* call __putname()? */ | 89 | bool name_put; /* call __putname()? */ |
| 89 | 90 | ||
| 90 | unsigned long ino; | 91 | unsigned long ino; |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 3c8a601324a2..9845cb32b60a 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
| @@ -1399,8 +1399,11 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts | |||
| 1399 | } | 1399 | } |
| 1400 | 1400 | ||
| 1401 | i = 0; | 1401 | i = 0; |
| 1402 | list_for_each_entry(n, &context->names_list, list) | 1402 | list_for_each_entry(n, &context->names_list, list) { |
| 1403 | if (n->hidden) | ||
| 1404 | continue; | ||
| 1403 | audit_log_name(context, n, NULL, i++, &call_panic); | 1405 | audit_log_name(context, n, NULL, i++, &call_panic); |
| 1406 | } | ||
| 1404 | 1407 | ||
| 1405 | /* Send end of event record to help user space know we are finished */ | 1408 | /* Send end of event record to help user space know we are finished */ |
| 1406 | ab = audit_log_start(context, GFP_KERNEL, AUDIT_EOE); | 1409 | ab = audit_log_start(context, GFP_KERNEL, AUDIT_EOE); |
| @@ -1769,14 +1772,15 @@ void audit_putname(struct filename *name) | |||
| 1769 | * __audit_inode - store the inode and device from a lookup | 1772 | * __audit_inode - store the inode and device from a lookup |
| 1770 | * @name: name being audited | 1773 | * @name: name being audited |
| 1771 | * @dentry: dentry being audited | 1774 | * @dentry: dentry being audited |
| 1772 | * @parent: does this dentry represent the parent? | 1775 | * @flags: attributes for this particular entry |
| 1773 | */ | 1776 | */ |
| 1774 | void __audit_inode(struct filename *name, const struct dentry *dentry, | 1777 | void __audit_inode(struct filename *name, const struct dentry *dentry, |
| 1775 | unsigned int parent) | 1778 | unsigned int flags) |
| 1776 | { | 1779 | { |
| 1777 | struct audit_context *context = current->audit_context; | 1780 | struct audit_context *context = current->audit_context; |
| 1778 | const struct inode *inode = dentry->d_inode; | 1781 | const struct inode *inode = dentry->d_inode; |
| 1779 | struct audit_names *n; | 1782 | struct audit_names *n; |
| 1783 | bool parent = flags & AUDIT_INODE_PARENT; | ||
| 1780 | 1784 | ||
| 1781 | if (!context->in_syscall) | 1785 | if (!context->in_syscall) |
| 1782 | return; | 1786 | return; |
| @@ -1831,6 +1835,8 @@ out: | |||
| 1831 | if (parent) { | 1835 | if (parent) { |
| 1832 | n->name_len = n->name ? parent_len(n->name->name) : AUDIT_NAME_FULL; | 1836 | n->name_len = n->name ? parent_len(n->name->name) : AUDIT_NAME_FULL; |
| 1833 | n->type = AUDIT_TYPE_PARENT; | 1837 | n->type = AUDIT_TYPE_PARENT; |
| 1838 | if (flags & AUDIT_INODE_HIDDEN) | ||
| 1839 | n->hidden = true; | ||
| 1834 | } else { | 1840 | } else { |
| 1835 | n->name_len = AUDIT_NAME_FULL; | 1841 | n->name_len = AUDIT_NAME_FULL; |
| 1836 | n->type = AUDIT_TYPE_NORMAL; | 1842 | n->type = AUDIT_TYPE_NORMAL; |
