restrict reading from /proc/<pid>/maps to those who share ->mm or can ptrace pid
Subsystems (3)
PATCH 1/1 restrict reading from /proc/<pid>/maps to those who share ->mm or can ptrace pid
Contents of /proc/*/maps is sensitive and may become sensitive
after open() (e.g. if target originally shares our ->mm and later does exec on suid-root binary).
Check at read() (actually, ->start() of iterator) time that
mm_struct we'd grabbed and locked is
* still the ->mm of target
* equal to reader's ->mm or the target is ptracable by reader.
---
fs/proc/base.c +20 -0
@@ -202,6 +202,26 @@ static int proc_root_link(struct inode *inode, struct dentry **dentry, struct vf (task->state == TASK_STOPPED || task->state == TASK_TRACED) && \ security_ptrace(current,task) == 0)) +struct mm_struct *mm_for_maps (struct task_struct *task) +{ +struct mm_struct *mm =get_task_mm (task); +if (!mm) +return NULL ; +down_read (&mm->mmap_sem); +task_lock (task); +if (task->mm != mm) + goto out; +if (task->mm != current->mm &&__ptrace_may_attach (task) <0 ) + goto out; +task_unlock (task); +return mm; +out: +task_unlock (task); +up_read (&mm->mmap_sem); +mmput (mm); +return NULL ; +} +static int proc_pid_cmdline (struct task_struct *task,char * buffer) {int res =0 ;
fs/proc/internal.h +2 -0
@@ -27,6 +27,8 @@ struct vmalloc_info {unsigned long largest_chunk; }; +extern struct mm_struct *mm_for_maps (struct task_struct *); +#ifdef CONFIG_MMU #define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START)extern void get_vmalloc_info (struct vmalloc_info *vmi);
fs/proc/task_mmu.c +1 -2
@@ -397,12 +397,11 @@ static void *m_start(struct seq_file *m, loff_t *pos)if (!priv->task)return NULL ; - mm =get_task_mm (priv->task); + mm =mm_for_maps (priv->task);if (!mm)return NULL ; priv->tail_vma = tail_vma =get_gate_vma (priv->task); -down_read (&mm->mmap_sem);/* Start with last addr hint */ if (last_addr && (vma =find_vma (mm, last_addr))) {
fs/proc/task_nommu.c +1 -3
@@ -165,15 +165,13 @@ static void *m_start(struct seq_file *m, loff_t *pos)if (!priv->task)return NULL ; - mm =get_task_mm (priv->task); + mm =mm_for_maps (priv->task);if (!mm) {put_task_struct (priv->task); priv->task =NULL ;return NULL ; } -down_read (&mm->mmap_sem); -/* start from the Nth VMA */ for (vml = mm->context.vmlist; vml; vml = vml->next)if (n-- ==0 )
include/linux/ptrace.h +1 -0
@@ -97,6 +97,7 @@ extern void __ptrace_link(struct task_struct *child,extern void __ptrace_unlink (struct task_struct *child);extern void ptrace_untrace (struct task_struct *child);extern int ptrace_may_attach (struct task_struct *task); +extern int __ptrace_may_attach (struct task_struct *task);static inline void ptrace_link (struct task_struct *child,struct task_struct *new_parent)
kernel/ptrace.c +2 -2
@@ -120,7 +120,7 @@ int ptrace_check_attach(struct task_struct *child, int kill)return ret; } -static int may_attach (struct task_struct *task) +int __ptrace_may_attach (struct task_struct *task) {/* May we inspect the given task? * This check is used both for attaching with ptrace
@@ -154,7 +154,7 @@ int ptrace_may_attach(struct task_struct *task) {int err;task_lock (task); - err =may_attach (task); + err =__ptrace_may_attach (task);task_unlock (task);return !err; }
Quoted 9 lines · On Wed, 2 Jan 2008 14:09:57 +0000 Al Viro <[email protected]> wrote:
Contents of
/proc/*/mapsis sensitive and may become sensitive
afteropen()(e.g. if target originally shares our ->mm and later does exec on suid-root binary).Check at read() (actually, ->start() of iterator) time that
mm_structwe'd grabbed and locked is
* still the ->mm of target
* equal to reader's ->mm or the target is ptracable by reader.Signed-off-by Al Viro <[email protected]>
Signature · 1 line
All rights reversed.
Andrew Morton
maintainerQuoted 3 lines · On Wed, 2 Jan 2008 14:09:57 +0000 Al Viro <[email protected]> wrote:
Contents of
/proc/*/mapsis sensitive and may become sensitive
afteropen()(e.g. if target originally shares our ->mm and later does exec on suid-root binary).
um, which contents?
Quoted 5 lines
Check at read() (actually, ->start() of iterator) time that
mm_structwe'd grabbed and locked is
* still the ->mm of target
* equal to reader's ->mm or the target is ptracable by reader.
Specifically, do /proc/pid/smaps and the maps4 goodies in -mm need similar treatment?
Quoted 7 lines · Andrew Morton
Quoted 3 lines · On Wed, 2 Jan 2008 14:09:57 +0000 Al Viro <[email protected]> wrote:
Contents of
/proc/*/mapsis sensitive and may become sensitive
afteropen()(e.g. if target originally shares our ->mm and later does exec on suid-root binary).um, which contents?
Information about the addresses where libraries, etc. got mapped, to start with - if you have that randomized, you don't want it seen by attacker who tries to escalate...
Quoted 8 lines
Quoted 5 lines
Check at read() (actually, ->start() of iterator) time that
mm_structwe'd grabbed and locked is
* still the ->mm of target
* equal to reader's ->mm or the target is ptracable by reader.Specifically, do
/proc/pid/smapsand the maps4 goodies in -mm need similar treatment?
They differ only in ->show(), so this patch takes care of them as well...