On Thu, 7 Sep 2000, Warner Losh wrote:
> In message <[EMAIL PROTECTED]> Kris
>Kennaway writes:
> : gettext() doesnt take any additional arguments, AFAIK it just munges the
> : string. The argument substitution was being done by printf() in the
> : example given.
>
> Right. You know how many args are expected, since you know printf.
>
> : The only possibilities I immediately see are:
> :
> : 1) Don't do that (look up in untrusted catalogs)
> :
> : 2) Write a vgettext(char *buf, int size, const char *fmt...) which a)
> : looks up the message in the catalog, b) verifies the returned string has
> : the same number and type of format strings, and c) substitutes the
> : arguments passed to it using vsnprintf() into the passed buffer. The
> : resulting string should then be handled using function("%s", buf) to deal
> : with escaped format strings ("%%s" which would be parsed to %s by the
> : vsnprintf()). I don't think you can do it securely otherwise, unless I'm
> : missing something.
> :
> : The problem is that you want gettext to substitute arguments into the
> : string, but it doesn't do that, and the string it returns has an unknown
> : number of format strings so it's not safe to use in a varargs function.
>
> 3) figure out how many args a string needs and forbid strings with
> more than that in them. It knows from the original number of
> % args, can apply the printf rules. It would be trivial to write
> one function to do must of this. You get the number of args in the
> key, you get the number of args in the new string using the same
> routine. If the two numbers aren't equal, you return the original
> key string, or abort.
It also needs to check they are all of the same type, as changing a %d to
a %s for example could conceivably be exploitable. And you would have to
forbid escaped % characters as well. Yeah, I think that would be
doable. We probably should talk to the gnu gettext guys.
Kris
--
In God we Trust -- all others must submit an X.509 certificate.
-- Charles Forsythe <[EMAIL PROTECTED]>
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message