coredump: remove redundant defines for dumpable states
The existing SUID_DUMP_* defines duplicate the newer SUID_DUMPABLE_* defines introduced in 54b501992dd2 ("coredump: warn about unsafe suid_dumpable / core_pattern combo"). Remove the new ones, and use the prior values instead. Signed-off-by: Kees Cook <keescook@chromium.org> Reported-by: Chen Gang <gang.chen@asianux.com> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Alan Cox <alan@linux.intel.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Doug Ledford <dledford@redhat.com> Cc: Serge Hallyn <serge.hallyn@canonical.com> Cc: James Morris <james.l.morris@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
5d1fadc147
commit
e579d2c259
@ -501,7 +501,7 @@ void do_coredump(siginfo_t *siginfo)
|
|||||||
* so we dump it as root in mode 2, and only into a controlled
|
* so we dump it as root in mode 2, and only into a controlled
|
||||||
* environment (pipe handler or fully qualified path).
|
* environment (pipe handler or fully qualified path).
|
||||||
*/
|
*/
|
||||||
if (__get_dumpable(cprm.mm_flags) == SUID_DUMPABLE_SAFE) {
|
if (__get_dumpable(cprm.mm_flags) == SUID_DUMP_ROOT) {
|
||||||
/* Setuid core dump mode */
|
/* Setuid core dump mode */
|
||||||
flag = O_EXCL; /* Stop rewrite attacks */
|
flag = O_EXCL; /* Stop rewrite attacks */
|
||||||
cred->fsuid = GLOBAL_ROOT_UID; /* Dump root private */
|
cred->fsuid = GLOBAL_ROOT_UID; /* Dump root private */
|
||||||
|
10
fs/exec.c
10
fs/exec.c
@ -1111,7 +1111,7 @@ void setup_new_exec(struct linux_binprm * bprm)
|
|||||||
current->sas_ss_sp = current->sas_ss_size = 0;
|
current->sas_ss_sp = current->sas_ss_size = 0;
|
||||||
|
|
||||||
if (uid_eq(current_euid(), current_uid()) && gid_eq(current_egid(), current_gid()))
|
if (uid_eq(current_euid(), current_uid()) && gid_eq(current_egid(), current_gid()))
|
||||||
set_dumpable(current->mm, SUID_DUMPABLE_ENABLED);
|
set_dumpable(current->mm, SUID_DUMP_USER);
|
||||||
else
|
else
|
||||||
set_dumpable(current->mm, suid_dumpable);
|
set_dumpable(current->mm, suid_dumpable);
|
||||||
|
|
||||||
@ -1639,17 +1639,17 @@ EXPORT_SYMBOL(set_binfmt);
|
|||||||
void set_dumpable(struct mm_struct *mm, int value)
|
void set_dumpable(struct mm_struct *mm, int value)
|
||||||
{
|
{
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case SUID_DUMPABLE_DISABLED:
|
case SUID_DUMP_DISABLE:
|
||||||
clear_bit(MMF_DUMPABLE, &mm->flags);
|
clear_bit(MMF_DUMPABLE, &mm->flags);
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
clear_bit(MMF_DUMP_SECURELY, &mm->flags);
|
clear_bit(MMF_DUMP_SECURELY, &mm->flags);
|
||||||
break;
|
break;
|
||||||
case SUID_DUMPABLE_ENABLED:
|
case SUID_DUMP_USER:
|
||||||
set_bit(MMF_DUMPABLE, &mm->flags);
|
set_bit(MMF_DUMPABLE, &mm->flags);
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
clear_bit(MMF_DUMP_SECURELY, &mm->flags);
|
clear_bit(MMF_DUMP_SECURELY, &mm->flags);
|
||||||
break;
|
break;
|
||||||
case SUID_DUMPABLE_SAFE:
|
case SUID_DUMP_ROOT:
|
||||||
set_bit(MMF_DUMP_SECURELY, &mm->flags);
|
set_bit(MMF_DUMP_SECURELY, &mm->flags);
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
set_bit(MMF_DUMPABLE, &mm->flags);
|
set_bit(MMF_DUMPABLE, &mm->flags);
|
||||||
@ -1662,7 +1662,7 @@ int __get_dumpable(unsigned long mm_flags)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = mm_flags & MMF_DUMPABLE_MASK;
|
ret = mm_flags & MMF_DUMPABLE_MASK;
|
||||||
return (ret > SUID_DUMPABLE_ENABLED) ? SUID_DUMPABLE_SAFE : ret;
|
return (ret > SUID_DUMP_USER) ? SUID_DUMP_ROOT : ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_dumpable(struct mm_struct *mm)
|
int get_dumpable(struct mm_struct *mm)
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
|
#include <linux/binfmts.h>
|
||||||
struct ctl_table_header;
|
struct ctl_table_header;
|
||||||
struct mempolicy;
|
struct mempolicy;
|
||||||
|
|
||||||
@ -108,7 +109,7 @@ static inline int task_dumpable(struct task_struct *task)
|
|||||||
if (mm)
|
if (mm)
|
||||||
dumpable = get_dumpable(mm);
|
dumpable = get_dumpable(mm);
|
||||||
task_unlock(task);
|
task_unlock(task);
|
||||||
if (dumpable == SUID_DUMPABLE_ENABLED)
|
if (dumpable == SUID_DUMP_USER)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -346,11 +346,6 @@ static inline void arch_pick_mmap_layout(struct mm_struct *mm) {}
|
|||||||
extern void set_dumpable(struct mm_struct *mm, int value);
|
extern void set_dumpable(struct mm_struct *mm, int value);
|
||||||
extern int get_dumpable(struct mm_struct *mm);
|
extern int get_dumpable(struct mm_struct *mm);
|
||||||
|
|
||||||
/* get/set_dumpable() values */
|
|
||||||
#define SUID_DUMPABLE_DISABLED 0
|
|
||||||
#define SUID_DUMPABLE_ENABLED 1
|
|
||||||
#define SUID_DUMPABLE_SAFE 2
|
|
||||||
|
|
||||||
/* mm flags */
|
/* mm flags */
|
||||||
/* dumpable bits */
|
/* dumpable bits */
|
||||||
#define MMF_DUMPABLE 0 /* core dump is permitted */
|
#define MMF_DUMPABLE 0 /* core dump is permitted */
|
||||||
|
@ -2095,7 +2095,7 @@ int proc_dointvec_minmax(struct ctl_table *table, int write,
|
|||||||
static void validate_coredump_safety(void)
|
static void validate_coredump_safety(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_COREDUMP
|
#ifdef CONFIG_COREDUMP
|
||||||
if (suid_dumpable == SUID_DUMPABLE_SAFE &&
|
if (suid_dumpable == SUID_DUMP_ROOT &&
|
||||||
core_pattern[0] != '/' && core_pattern[0] != '|') {
|
core_pattern[0] != '/' && core_pattern[0] != '|') {
|
||||||
printk(KERN_WARNING "Unsafe core_pattern used with "\
|
printk(KERN_WARNING "Unsafe core_pattern used with "\
|
||||||
"suid_dumpable=2. Pipe handler or fully qualified "\
|
"suid_dumpable=2. Pipe handler or fully qualified "\
|
||||||
|
Loading…
x
Reference in New Issue
Block a user