[augeas-devel] escaping special characters in the path sent to aug_get()
David Lutterkort
lutter at watzmann.net
Wed Jan 21 23:45:32 UTC 2015
On Wed, Jan 21, 2015 at 1:15 PM, Richard W.M. Jones <rjones at redhat.com>
wrote:
> On Wed, Jan 21, 2015 at 12:59:40PM -0800, David Lutterkort wrote:
> > The thing that makes me nervous the most about this change is that
> > it changes the paths that people get back from Augeas, especially
> > from aug_match.
>
> [I think the first thing to say is that we only care about the API, not
> about augtool.]
>
> I've probably not understood the full implications of this.
>
> Programs like libvirt and virt-v2v use the aug_match a lot, and in
> some cases pass those strings back to aug_get, aug_set, aug_rm. There
> are many examples of this in the following file (search for
> "aug_match"):
>
With this change, taking paths returned from aug_match and feeding them
into aug_get, aug_set, aug_rm etc. now actually becomes safe: before,
aug_match would return paths that really needed escaping, but weren't so
that passing them to aug_get could fail. This will no longer be an issue.
https://github.com/libguestfs/libguestfs/blob/master/v2v/convert_linux.ml
>
> For example:
>
> let expr =
> sprintf "/file/etc/sysconfig/kernel/%s/value[. = '%s']"
> var xen_mod in
> let entries = g#aug_match expr in
> let entries = Array.to_list entries in
> if entries <> [] then (
> List.iter (fun e -> ignore (g#aug_rm e)) entries;
> modified := true
> )
>
Yes, this will now work, assuming you replace 'var' in there with
'(g#aug_escape_name var)'
> Our real concern is where strings get interpolated into an Augeas
> expression, especially if those string come from untrusted user input
> (which is not the case in that file, but could be in general).
>
As long as these strings go through aug_escape_name before sticking them
into a path, all should be well.
> > While those can now be directly fed to aug_get, they can no longer
> > be used to find the underlying file directly. Not sure if that will
> > cause problems for anybody.
>
> I'm not really sure what this means. What is "underlying file" in
> this context? Would it affect code like the above? Can you give an
> example of a problem case?
Sorry, this was a bit obtuse: before this change, you could take a path
returned by aug_match, strip off '/files' from the beginning and use the
rest as the path to the actual file in the filesystem. After this change,
that's no longer the case. If you have a file '/etc/weird-[a]' in the
filesystem, an aug_match for something in that file will return
'/files/etc/weird-\[a\]' - you can now pass that back to aug_get, but you
can't use that to open the actual file (because of the extra '\' in there).
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/augeas-devel/attachments/20150121/fdf5ffac/attachment.htm>
More information about the augeas-devel
mailing list