All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] pktcdvd: Fix possible Spectre-v1 for pkt_devs
@ 2018-07-28  1:31 Jinbum Park
  2018-07-28  1:47 ` Gustavo A. R. Silva
  0 siblings, 1 reply; 2+ messages in thread
From: Jinbum Park @ 2018-07-28  1:31 UTC (permalink / raw)
  To: axboe, bart.vanassche, jiufei.xue; +Cc: linux-block, linux-kernel

User controls @dev_minor which to be used as index of pkt_devs.
So, It can be exploited via Spectre-like attack. (speculative execution)

This kind of attack leaks address of pkt_devs, [1]
It leads an attacker to bypass security mechanism such as KASLR.

So sanitize @dev_minor before using it to prevent attack.

[1] https://github.com/jinb-park/linux-exploit/
tree/master/exploit-remaining-spectre-gadget/leak_pkt_devs.c

Signed-off-by: Jinbum Park <jinb.park7@gmail.com>
---
 drivers/block/pktcdvd.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index c61d20c..665760d 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -67,8 +67,8 @@
 #include <scsi/scsi.h>
 #include <linux/debugfs.h>
 #include <linux/device.h>
-
 #include <linux/uaccess.h>
+#include <linux/nospec.h>
 
 #define DRIVER_NAME	"pktcdvd"
 
@@ -2229,9 +2229,13 @@ static void pkt_release_dev(struct pktcdvd_device *pd, int flush)
 
 static struct pktcdvd_device *pkt_find_dev_from_minor(unsigned int dev_minor)
 {
+	unsigned int idx = 0;
+
 	if (dev_minor >= MAX_WRITERS)
 		return NULL;
-	return pkt_devs[dev_minor];
+
+	idx = array_index_nospec(dev_minor, MAX_WRITERS);
+	return pkt_devs[idx];
 }
 
 static int pkt_open(struct block_device *bdev, fmode_t mode)
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] pktcdvd: Fix possible Spectre-v1 for pkt_devs
  2018-07-28  1:31 [PATCH] pktcdvd: Fix possible Spectre-v1 for pkt_devs Jinbum Park
@ 2018-07-28  1:47 ` Gustavo A. R. Silva
  0 siblings, 0 replies; 2+ messages in thread
From: Gustavo A. R. Silva @ 2018-07-28  1:47 UTC (permalink / raw)
  To: Jinbum Park, axboe, bart.vanassche, jiufei.xue; +Cc: linux-block, linux-kernel

Hi Jinbum,

Thanks for working on this.

Please, see some comments below.

On 07/27/2018 08:31 PM, Jinbum Park wrote:
> User controls @dev_minor which to be used as index of pkt_devs.
> So, It can be exploited via Spectre-like attack. (speculative execution)
> 
> This kind of attack leaks address of pkt_devs, [1]
> It leads an attacker to bypass security mechanism such as KASLR.
> 
> So sanitize @dev_minor before using it to prevent attack.
> 
> [1] https://github.com/jinb-park/linux-exploit/
> tree/master/exploit-remaining-spectre-gadget/leak_pkt_devs.c
> 
> Signed-off-by: Jinbum Park <jinb.park7@gmail.com>
> ---
>  drivers/block/pktcdvd.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
> index c61d20c..665760d 100644
> --- a/drivers/block/pktcdvd.c
> +++ b/drivers/block/pktcdvd.c
> @@ -67,8 +67,8 @@
>  #include <scsi/scsi.h>
>  #include <linux/debugfs.h>
>  #include <linux/device.h>
> -
>  #include <linux/uaccess.h>
> +#include <linux/nospec.h>
>  
>  #define DRIVER_NAME	"pktcdvd"
>  
> @@ -2229,9 +2229,13 @@ static void pkt_release_dev(struct pktcdvd_device *pd, int flush)
>  
>  static struct pktcdvd_device *pkt_find_dev_from_minor(unsigned int dev_minor)
>  {
> +	unsigned int idx = 0;
> +

There is no need for a new variable in this case.

>  	if (dev_minor >= MAX_WRITERS)
>  		return NULL;
> -	return pkt_devs[dev_minor];
> +
> +	idx = array_index_nospec(dev_minor, MAX_WRITERS);
> +	return pkt_devs[idx];

Also, the following style is preferred:

if (dev_minor >= MAX_WRITERS)
	return NULL;
dev_minor = array_index_nospec(dev_minor, MAX_WRITERS);


Thanks
--
Gustavo

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-07-28  1:47 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-28  1:31 [PATCH] pktcdvd: Fix possible Spectre-v1 for pkt_devs Jinbum Park
2018-07-28  1:47 ` Gustavo A. R. Silva

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.