[libvirt] [PATCH v2 2/3] hyperv: Escape WQL queries
John Ferlan
jferlan at redhat.com
Mon Oct 16 13:58:49 UTC 2017
On 10/06/2017 02:47 AM, Ladi Prosek wrote:
> The code was vulnerable to SQL injection. Likely not a security issue due to
> WMI SQL and other constraints but still lame. For example:
>
> virsh # dominfo \"
> error: failed to get domain '"'
> error: internal error: SOAP fault during enumeration: code 's:Sender', subcode
> 'n:CannotProcessFilter', reason 'The data source could not process the filter.
> The filter might be missing or it might be invalid. Change the filter and try
> the request again. ', detail 'The WS-Management service cannot process the
> request. The WQL query is invalid. '
>
> This commit fixes the Hyper-V driver by escaping all WMI SQL string parameters.
>
> The same command with the fix:
>
> virsh # dominfo \"
> error: failed to get domain '"'
> error: Domain not found: No domain with name "
>
> Signed-off-by: Ladi Prosek <lprosek at redhat.com>
> ---
> src/hyperv/hyperv_driver.c | 96 +++++++++++++++++++++++-----------------------
> src/hyperv/hyperv_wmi.c | 2 +-
> src/util/virbuffer.c | 18 +++++++++
> src/util/virbuffer.h | 3 ++
> 4 files changed, 70 insertions(+), 49 deletions(-)
>
Surprised to a degree this worked correctly without adding
'virBufferEscapeSQL' to src/libvirt_private.syms
In any case, I'll add before pushing...
[...]
> diff --git a/src/util/virbuffer.c b/src/util/virbuffer.c
> index 28a291bb0..15f6e21fb 100644
> --- a/src/util/virbuffer.c
> +++ b/src/util/virbuffer.c
> @@ -575,6 +575,24 @@ virBufferEscapeRegex(virBufferPtr buf,
> }
>
FYI: More recently we've been using 2 blank lines between functions -
I'll adjust that here too.
Reviewed-by: John Ferlan <jferlan at redhat.com>
John
> /**
> + * virBufferEscapeSQL:
> + * @buf: the buffer to append to
> + * @format: a printf like format string but with only one %s parameter
> + * @str: the string argument which needs to be escaped
> + *
> + * Do a formatted print with a single string to a buffer. The @str is
> + * escaped to prevent SQL injection (format is expected to contain \"%s\").
> + * Auto indentation may be applied.
> + */
> +void
> +virBufferEscapeSQL(virBufferPtr buf,
> + const char *format,
> + const char *str)
> +{
> + virBufferEscape(buf, '\\', "'\"\\", format, str);
> +}
> +
> +/**
> * virBufferEscape:
> * @buf: the buffer to append to
> * @escape: the escape character to inject
> diff --git a/src/util/virbuffer.h b/src/util/virbuffer.h
> index 3211c07b0..4f5ed162f 100644
> --- a/src/util/virbuffer.h
> +++ b/src/util/virbuffer.h
> @@ -93,6 +93,9 @@ void virBufferEscapeSexpr(virBufferPtr buf, const char *format,
> void virBufferEscapeRegex(virBufferPtr buf,
> const char *format,
> const char *str);
> +void virBufferEscapeSQL(virBufferPtr buf,
> + const char *format,
> + const char *str);
> void virBufferEscapeShell(virBufferPtr buf, const char *str);
> void virBufferURIEncodeString(virBufferPtr buf, const char *str);
>
>
More information about the libvir-list
mailing list