APPLIED: [hardy CVE 1/1] close races in /proc/*/{environ, auxv}, CVE-2011-1020

Tim Gardner tim.gardner at canonical.com
Thu Jul 21 17:50:13 UTC 2011


On 07/21/2011 06:13 AM, Andy Whitcroft wrote:
> Equivalent to:
> 	commit ec6fd8a4355cda81cd9f06bebc048e83eb514ac7
> 	commit d6f64b89d7ff22ce05896ab4a93a653e8d0b123d
> 	commit 2fadaef41283aad7100fa73f01998cddaca25833
>
> Note that the locking is looser than that in upstream this may leaves
> a small window which may be exploitable, that said the locks which are
> used to ensure there is no window are not in existance back in hardy.
> Indeed the races in exec which they are introduced to fix are also present.
>
> CVE-2011-1020
> BugLink: http://bugs.launchpad.net/bugs/813026
> Signed-off-by: Andy Whitcroft<apw at canonical.com>
> ---
>   fs/proc/base.c |   25 ++++++++++++++++++++-----
>   1 files changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/fs/proc/base.c b/fs/proc/base.c
> index 338097a..a68a4ba 100644
> --- a/fs/proc/base.c
> +++ b/fs/proc/base.c
> @@ -222,6 +222,24 @@ out:
>   	return NULL;
>   }
>
> +struct mm_struct *mm_for_maps2(struct task_struct *task)
> +{
> +	struct mm_struct *mm = get_task_mm(task);
> +	if (!mm)
> +		return NULL;
> +	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);
> +	mmput(mm);
> +	return NULL;
> +}
> +
>   static int proc_pid_cmdline(struct task_struct *task, char * buffer)
>   {
>   	int res = 0;
> @@ -262,7 +280,7 @@ out:
>   static int proc_pid_auxv(struct task_struct *task, char *buffer)
>   {
>   	int res = 0;
> -	struct mm_struct *mm = get_task_mm(task);
> +	struct mm_struct *mm = mm_for_maps2(task);
>   	if (mm) {
>   		unsigned int nwords = 0;
>   		do
> @@ -827,9 +845,6 @@ static ssize_t environ_read(struct file *file, char __user *buf,
>   	if (!task)
>   		goto out_no_task;
>
> -	if (!ptrace_may_attach(task))
> -		goto out;
> -
>   	ret = -ENOMEM;
>   	page = (char *)__get_free_page(GFP_TEMPORARY);
>   	if (!page)
> @@ -837,7 +852,7 @@ static ssize_t environ_read(struct file *file, char __user *buf,
>
>   	ret = 0;
>
> -	mm = get_task_mm(task);
> +	mm = mm_for_maps2(task);
>   	if (!mm)
>   		goto out_free;
>


-- 
Tim Gardner tim.gardner at canonical.com




More information about the kernel-team mailing list