diff options
author | csjp <csjp@FreeBSD.org> | 2007-10-26 01:23:07 +0000 |
---|---|---|
committer | csjp <csjp@FreeBSD.org> | 2007-10-26 01:23:07 +0000 |
commit | a16bb8381db4aec49650ac2d3da3ea686ba74d42 (patch) | |
tree | 7d368f5fbf689769a57d382da467cdf9405088ad /sys/kern | |
parent | bf5c2ef02d1494f1190fcdba11368c04b9a89442 (diff) | |
download | FreeBSD-src-a16bb8381db4aec49650ac2d3da3ea686ba74d42.zip FreeBSD-src-a16bb8381db4aec49650ac2d3da3ea686ba74d42.tar.gz |
Implement AUE_CORE, which adds process core dump support into the kernel.
This change introduces audit_proc_coredump() which is called by coredump(9)
to create an audit record for the coredump event. When a process
dumps a core, it could be security relevant. It could be an indicator that
a stack within the process has been overflowed with an incorrectly constructed
malicious payload or a number of other events.
The record that is generated looks like this:
header,111,10,process dumped core,0,Thu Oct 25 19:36:29 2007, + 179 msec
argument,0,0xb,signal
path,/usr/home/csjp/test.core
subject,csjp,csjp,staff,csjp,staff,1101,1095,50457,10.37.129.2
return,success,1
trailer,111
- We allocate a completely new record to make sure we arent clobbering
the audit data associated with the syscall that produced the core
(assuming the core is being generated in response to SIGABRT and not
an invalid memory access).
- Shuffle around expand_name() so we can use the coredump name at the very
beginning of the coredump call. Make sure we free the storage referenced
by "name" if we need to bail out early.
- Audit both successful and failed coredump creation efforts
Obtained from: TrustedBSD Project
Reviewed by: rwatson
MFC after: 1 month
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_sig.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 694d145..3b213a6 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -3058,8 +3058,19 @@ coredump(struct thread *td) MPASS((p->p_flag & P_HADTHREADS) == 0 || p->p_singlethread == td); _STOPEVENT(p, S_CORE, 0); + name = expand_name(p->p_comm, td->td_ucred->cr_uid, p->p_pid); + if (name == NULL) { +#ifdef AUDIT + audit_proc_coredump(td, NULL, EINVAL); +#endif + return (EINVAL); + } if (((sugid_coredump == 0) && p->p_flag & P_SUGID) || do_coredump == 0) { PROC_UNLOCK(p); +#ifdef AUDIT + audit_proc_coredump(td, name, EFAULT); +#endif + free(name, M_TEMP); return (EFAULT); } @@ -3073,19 +3084,25 @@ coredump(struct thread *td) */ limit = (off_t)lim_cur(p, RLIMIT_CORE); PROC_UNLOCK(p); - if (limit == 0) + if (limit == 0) { +#ifdef AUDIT + audit_proc_coredump(td, name, EFBIG); +#endif + free(name, M_TEMP); return (EFBIG); + } restart: - name = expand_name(p->p_comm, td->td_ucred->cr_uid, p->p_pid); - if (name == NULL) - return (EINVAL); NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, name, td); flags = O_CREAT | FWRITE | O_NOFOLLOW; error = vn_open(&nd, &flags, S_IRUSR | S_IWUSR, NULL); - free(name, M_TEMP); - if (error) + if (error) { +#ifdef AUDIT + audit_proc_coredump(td, name, error); +#endif + free(name, M_TEMP); return (error); + } vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; @@ -3143,6 +3160,10 @@ close: if (error == 0) error = error1; out: +#ifdef AUDIT + audit_proc_coredump(td, name, error); +#endif + free(name, M_TEMP); VFS_UNLOCK_GIANT(vfslocked); return (error); } |