[PATCH] Rework of IPC auditing
1) The audit_ipc_perms() function has been split into two different functions: - audit_ipc_obj() - audit_ipc_set_perm() There's a key shift here... The audit_ipc_obj() collects the uid, gid, mode, and SElinux context label of the current ipc object. This audit_ipc_obj() hook is now found in several places. Most notably, it is hooked in ipcperms(), which is called in various places around the ipc code permforming a MAC check. Additionally there are several places where *checkid() is used to validate that an operation is being performed on a valid object while not necessarily having a nearby ipcperms() call. In these locations, audit_ipc_obj() is called to ensure that the information is captured by the audit system. The audit_set_new_perm() function is called any time the permissions on the ipc object changes. In this case, the NEW permissions are recorded (and note that an audit_ipc_obj() call exists just a few lines before each instance). 2) Support for an AUDIT_IPC_SET_PERM audit message type. This allows for separate auxiliary audit records for normal operations on an IPC object and permissions changes. Note that the same struct audit_aux_data_ipcctl is used and populated, however there are separate audit_log_format statements based on the type of the message. Finally, the AUDIT_IPC block of code in audit_free_aux() was extended to handle aux messages of this new type. No more mem leaks I hope ;-) Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
19
ipc/shm.c
19
ipc/shm.c
@@ -13,6 +13,8 @@
|
||||
* Shared /dev/zero support, Kanoj Sarcar <kanoj@sgi.com>
|
||||
* Move the mm functionality over to mm/shmem.c, Christoph Rohland <cr@sap.com>
|
||||
*
|
||||
* support for audit of ipc object properties and permission changes
|
||||
* Dustin Kirkland <dustin.kirkland@us.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
@@ -542,6 +544,10 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds __user *buf)
|
||||
if(err)
|
||||
goto out_unlock;
|
||||
|
||||
err = audit_ipc_obj(&(shp->shm_perm));
|
||||
if (err)
|
||||
goto out_unlock;
|
||||
|
||||
if (!capable(CAP_IPC_LOCK)) {
|
||||
err = -EPERM;
|
||||
if (current->euid != shp->shm_perm.uid &&
|
||||
@@ -594,6 +600,10 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds __user *buf)
|
||||
if(err)
|
||||
goto out_unlock_up;
|
||||
|
||||
err = audit_ipc_obj(&(shp->shm_perm));
|
||||
if (err)
|
||||
goto out_unlock_up;
|
||||
|
||||
if (current->euid != shp->shm_perm.uid &&
|
||||
current->euid != shp->shm_perm.cuid &&
|
||||
!capable(CAP_SYS_ADMIN)) {
|
||||
@@ -627,12 +637,15 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds __user *buf)
|
||||
err=-EINVAL;
|
||||
if(shp==NULL)
|
||||
goto out_up;
|
||||
if ((err = audit_ipc_perms(0, setbuf.uid, setbuf.gid,
|
||||
setbuf.mode, &(shp->shm_perm))))
|
||||
goto out_unlock_up;
|
||||
err = shm_checkid(shp,shmid);
|
||||
if(err)
|
||||
goto out_unlock_up;
|
||||
err = audit_ipc_obj(&(shp->shm_perm));
|
||||
if (err)
|
||||
goto out_unlock_up;
|
||||
err = audit_ipc_set_perm(0, setbuf.uid, setbuf.gid, setbuf.mode, &(shp->shm_perm));
|
||||
if (err)
|
||||
goto out_unlock_up;
|
||||
err=-EPERM;
|
||||
if (current->euid != shp->shm_perm.uid &&
|
||||
current->euid != shp->shm_perm.cuid &&
|
||||
|
Reference in New Issue
Block a user