Re: [PATCH] shm: extend forced shm destroy to support objects from several IPC nses

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Nov 30, 2021 at 10:56:07AM +0100, Manfred Spraul wrote:
> Hi,
> 
> On 11/29/21 20:47, Alexander Mikhalitsyn wrote:
> > For 4.14.y:
> > 
> > Upstream commit 85b6d24646e4 ("shm: extend forced shm destroy to support objects from several IPC nses")
> > 
> > Currently, the exit_shm() function not designed to work properly when
> > task->sysvshm.shm_clist holds shm objects from different IPC namespaces.
> > 
> > This is a real pain when sysctl kernel.shm_rmid_forced = 1, because it
> > leads to use-after-free (reproducer exists).
> > 
> > This is an attempt to fix the problem by extending exit_shm mechanism to
> > handle shm's destroy from several IPC ns'es.
> > 
> > To achieve that we do several things:
> > 
> > 1. add a namespace (non-refcounted) pointer to the struct shmid_kernel
> > 
> > 2. during new shm object creation (newseg()/shmget syscall) we
> >     initialize this pointer by current task IPC ns
> > 
> > 3. exit_shm() fully reworked such that it traverses over all shp's in
> >     task->sysvshm.shm_clist and gets IPC namespace not from current task
> >     as it was before but from shp's object itself, then call
> >     shm_destroy(shp, ns).
> > 
> > Note: We need to be really careful here, because as it was said before
> > (1), our pointer to IPC ns non-refcnt'ed.  To be on the safe side we
> > using special helper get_ipc_ns_not_zero() which allows to get IPC ns
> > refcounter only if IPC ns not in the "state of destruction".
> > 
> > Q/A
> > 
> > Q: Why can we access shp->ns memory using non-refcounted pointer?
> > A: Because shp object lifetime is always shorther than IPC namespace
> >     lifetime, so, if we get shp object from the task->sysvshm.shm_clist
> >     while holding task_lock(task) nobody can steal our namespace.
> > 
> > Q: Does this patch change semantics of unshare/setns/clone syscalls?
> > A: No. It's just fixes non-covered case when process may leave IPC
> >     namespace without getting task->sysvshm.shm_clist list cleaned up.
> > 
> > Link: https://lkml.kernel.org/r/67bb03e5-f79c-1815-e2bf-949c67047418@xxxxxxxxxxxxxxxx
> > Link: https://lkml.kernel.org/r/20211109151501.4921-1-manfred@xxxxxxxxxxxxxxxx
> > Fixes: ab602f79915 ("shm: make exit_shm work proportional to task activity")
> > Co-developed-by: Manfred Spraul <manfred@xxxxxxxxxxxxxxxx>
> > Signed-off-by: Manfred Spraul <manfred@xxxxxxxxxxxxxxxx>
> > Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@xxxxxxxxxxxxx>
> > Cc: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx>
> > Cc: Davidlohr Bueso <dave@xxxxxxxxxxxx>
> > Cc: Greg KH <gregkh@xxxxxxxxxxxxxxxxxxx>
> > Cc: Andrei Vagin <avagin@xxxxxxxxx>
> > Cc: Pavel Tikhomirov <ptikhomirov@xxxxxxxxxxxxx>
> > Cc: Vasily Averin <vvs@xxxxxxxxxxxxx>
> > Cc: <stable@xxxxxxxxxxxxxxx>
> > Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
> > Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
> > ---
> >   include/linux/ipc_namespace.h |  15 +++
> >   include/linux/sched/task.h    |   2 +-
> >   include/linux/shm.h           |  13 ++-
> >   ipc/shm.c                     | 176 +++++++++++++++++++++++++---------
> >   4 files changed, 159 insertions(+), 47 deletions(-)
> 
> Tested ok: The crash is resolved, no observed degradations.

Now queued up, thanks.

greg k-h



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux