[Devel] [PATCH rh7 05/38] ploop: prevent disclosure 4 bytes of the stack kernel

Andrey Smetanin asmetanin at virtuozzo.com
Fri May 15 09:48:06 PDT 2015


     Memory leak (4 bytes) in the ploop_getdevice_ioc function.

          217401 +static int ploop_getdevice_ioc(unsigned long arg)
          217402 +{
          217403 +       int err;
          217404 +       int index = 0;
          217405 +       struct rb_node *n;
          217406 +       struct ploop_getdevice_ctl ctl;
          217407 +
          217408 +       mutex_lock(&ploop_devices_mutex);
          217409 +       for (n = rb_first(&ploop_devices_tree); n; n = rb_next(n), index++) {
          217410 +               struct ploop_device *plo;
          217411 +               plo = rb_entry(n, struct ploop_device, link);
          217412 +               if (plo->index != index || list_empty(&plo->map.delta_list))
          217413 +                       break;
          217414 +       }
          217415 +       mutex_unlock(&ploop_devices_mutex);
          217416 +
          217417 +       ctl.minor = index << PLOOP_PART_SHIFT;
          217418 +       if (ctl.minor & ~MINORMASK)
          217419 +               return -ERANGE;
          217420 +       err = copy_to_user((void*)arg, &ctl, sizeof(ctl));
          217421 +       return err;
          217422 +}

     The ploop_getdevice_ioc() function copy to user the
ploop_getdevice_ctl structure but it initialize juste the 'minor'
attribute. It's possible to disclosure 4 bytes of the stack kernel via
the '__mbz1' attribute.

     Below the 'ploop_getdevice_ctl' structure :

         3772915 +struct ploop_getdevice_ctl
         3772916 +{
         3772917 +       __u32   minor;
         3772918 +       __u32   __mbz1;
         3772919 +} __attribute__ ((aligned (8)));

Signed-off-by: Andrey Vagin <avagin at openvz.org>
Reported-by: Jonathan Salwan (Sysdream Security Laboratory) <jonathan.salwan at gmail.com>
---
 drivers/block/ploop/dev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c
index 2f4928d..8556af2 100644
--- a/drivers/block/ploop/dev.c
+++ b/drivers/block/ploop/dev.c
@@ -4277,7 +4277,7 @@ static int ploop_getdevice_ioc(unsigned long arg)
 	int err;
 	int index = 0;
 	struct rb_node *n;
-	struct ploop_getdevice_ctl ctl;
+	struct ploop_getdevice_ctl ctl = {};
 
 	mutex_lock(&ploop_devices_mutex);
 	for (n = rb_first(&ploop_devices_tree); n; n = rb_next(n), index++) {
-- 
1.9.3




More information about the Devel mailing list