lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <20251028015113.34609-1-xiaopei01@kylinos.cn>
Date: Tue, 28 Oct 2025 09:51:13 +0800
From: Pei Xiao <xiaopei01@...inos.cn>
To: jic23@...nel.org
Cc: alexandre.belloni@...tlin.com,
	eugen.hristev@...aro.org,
	linux-iio@...r.kernel.org,
	linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2] iio: adc: at91-sama5d2_adc: Fix potential use-after-free in sama5d2_adc driver

> On Mon, 20 Oct 2025 15:49:25 +0800
> Pei Xiao <xiaopei01@...inos.cn> wrote:
>
> > at91_adc_interrupt can call at91_adc_touch_data_handler function
> > to start the work by schedule_work(&st->touch_st.workq).
> > 
> > If we remove the module which will call at91_adc_remove to
> > make cleanup, it will free indio_dev through iio_device_unregister
> > while the work mentioned above will be used. The sequence of operations
> > that may lead to a UAF bug is as follows:
> > 
> > CPU0                                      CPU1
> > 
> >                                      | at91_adc_workq_handler
> > at91_adc_remove                      |
> > iio_device_unregister(indio_dev)     |
> > //free indio_dev                     |
> >                                      | iio_push_to_buffers(indio_dev)
> >                                      | //use indio_dev
>
> Hi,
>
> I'm not completely following your description here.
> The free doesn't happen in iio_device_unregister() but quite a bit later.
> So either the problem you are seeing is actually devm_ tear down that
> will do the free, or it's a more specific action in iio_device_unregister()
> though I'm not sure what it might be. Possibly a specific buffer mask
> getting torn down?  I haven't analysed it closely enough to figure out if
> there is a race there but it's the only thing I can immediately spot that
> would even be of interest to a work item in a driver via some core interfaces.
>
> Other than working out exact cause for anyone looking at this later, I'm
> also not sure you don't leave a potential race where a fresh request comes in
> between that cancel_work_sync() and the iio_device_unregister() call as it
> is only when iio_device_unregister() is complete that all interfaces are torn
> down that could start a fresh capture.
>
> So were the cancel_work_sync() one line later I would have been happy but
> from your description I'm not sure that fixes the bug you are seeing!
>
> Jonathan

Hi,

  Thank you for your reply email. 

  I haven't tested this bug, but I noticed this potential issue while

reading the code. So, can I send the v3 patch and move the 

cancel_work_sync to the next line of code?

Thanks!

Pei.
>
>
>
> > 
> > Fix it by ensuring that the work is canceled before proceeding with
> > the cleanup in at91_adc_remove.
> > 
> > Fixes: 3ec2774f1cc ("iio: adc: at91-sama5d2_adc: add support for position and pressure channels")
> > Signed-off-by: Pei Xiao <xiaopei01@...inos.cn>
> > ---
> >  drivers/iio/adc/at91-sama5d2_adc.c | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
> > index b4c36e6a7490..1cd6ce61cf17 100644
> > --- a/drivers/iio/adc/at91-sama5d2_adc.c
> > +++ b/drivers/iio/adc/at91-sama5d2_adc.c
> > @@ -2480,6 +2480,7 @@ static void at91_adc_remove(struct platform_device *pdev)
> >  	struct iio_dev *indio_dev = platform_get_drvdata(pdev);
> >  	struct at91_adc_state *st = iio_priv(indio_dev);
> >  
> > +	cancel_work_sync(&st->touch_st.workq);
> >  	iio_device_unregister(indio_dev);
> >  
> >  	at91_adc_dma_disable(st);
>



Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ