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;'.

> +    }
> +  }
> +
> +  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
_______________________________________________
Libguestfs mailing list -- guestfs@lists.libguestfs.org
To unsubscribe send an email to guestfs-le...@lists.libguestfs.org

Reply via email to