On Mon, Apr 22, 2024 at 12:53:03PM -0500, Eric Blake wrote:
> On Sun, Apr 21, 2024 at 11:03:39AM +0100, Richard W.M. Jones wrote:
> > The plugin/filter short name detection is very liberal, disallowing
> > only '.' and '/'.  Thus, at least in theory, short plugin names
> > containing almost arbitrary symbols and characters are permitted.
> > 
> > We should probably reserve more characters, but in this commit I only
> > reserve:
> > 
> >  * backslash (ie. dir separator on Windows)
> >  * ':' and ';' (common path separators)
> >  * space
> >  * non-printable ASCII characters
> > 
> > Also DIR_SEPARATOR_STR, but that's likely to be already covered by the
> > other tests so probably does nothing here.
> > 
> > This commit is mainly about tightening up corner cases with possible
> > security implications, for example if you managed to trick a program
> > to invoke 'nbdkit "plugin param"' that might have an ambiguous parsing
> > that you could use to your advantage.  It should have no effect on
> > normal, non-adversarial usage.
> > ---
> >  server/options.h | 16 +++++++++++++++-
> >  1 file changed, 15 insertions(+), 1 deletion(-)
> > 
> > diff --git a/server/options.h b/server/options.h
> > index 7d0730bae7..55e6abc28c 100644
> > --- a/server/options.h
> > +++ b/server/options.h
> > @@ -117,7 +117,21 @@ static const struct option long_options[] = {
> >  static inline bool
> >  is_short_name (const char *filename)
> >  {
> > -  return strchr (filename, '.') == NULL && strchr (filename, '/') == NULL;
> > +  const size_t n = strlen (filename);
> > +  size_t i;
> > +
> > +  for (i = 0; i < n; ++i) {
> > +    switch (filename[i]) {
> > +    case '\0'...31: case 127:   /* non-printable ASCII */
> 
> Compressed case label ranges are a gcc extension.  I guess clang has
> it too, and we already require one of those two compilers for
> __attribute__((cleanup)), so it's not necessarily fatal.  But as it
> appears to be our first use of that extension, it may be more
> conservative to instead
> 
> > +    case ' ':
> > +    case '.':
> > +    case '/': case '\\':        /* directory separators */
> > +    case ':': case ';':         /* path separators */
> > +      return false;
> 
> add 'default: if ((unsigned)filename[i] < 31) return false;'.

I'll change it as suggested, thanks.

Rich.

> > +    }
> > +  }
> > +
> > +  return strstr (filename, DIR_SEPARATOR_STR) == NULL;
> >  }
> >  
> >  #endif /* NBDKIT_OPTIONS_H */
> > -- 
> > 2.44.0
> >
> 
> Reviewed-by: Eric Blake <ebl...@redhat.com>
> 
> -- 
> Eric Blake, Principal Software Engineer
> Red Hat, Inc.
> Virtualization:  qemu.org | libguestfs.org

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v
_______________________________________________
Libguestfs mailing list -- guestfs@lists.libguestfs.org
To unsubscribe send an email to guestfs-le...@lists.libguestfs.org

Reply via email to