On Tue, 1 Dec 2009, Robert N. M. Watson wrote:

On 1 Dec 2009, at 11:25, Sean C. Farley wrote:

I think it's fair to say that the POSIXization of the environment code has been an unmitigated disaster, and speaks to the necessity for careful review of those sorts of code changes.

As the author of the environment code, I agree that it has been a painful process.

Interestingly, the security issue was a combination of r169661 to rtld.c, which is a correct action, and the new environ code which was developed, as opposed to committed, at the same time. Separately, the security issue would not have existed.

One immediately pressing question is whether we can mitigate future possible problems along the same lines. The obvious thing is a further (and very careful) audit if all environmental variable use in the base system. But I wonder if there are some other things we could do, such as:

- libc environment scrubbing: try to be more robust in the presence of the unexpected (for example, if you find corrupted stuff, ignore it more robustly); another variation might be to have libc abort(2) if issetugid() and unsetenv(3) would fail.

The preliminary patch I sent earlier should at least make the calls behave more like they used to do (go through each variable even if corrupt). However, I do agree that more code (getenv.c and any code that calls into it) needs to be verified for more paranoid use of the environment.

As for abort(), I was/still am considering having that be the result of a corrupt environ array. If it is corrupt, why attempt to use it? unsetenv() may still fail, so it may not abort() for other scenarios.

- kernel environment scrubbing: the kernel is already responsible for getting those variables across the execve(2) boundary, so is already copying (and to a lesser extent, validating) it, and could learn to be a bit more rigorous in its expectations, perhaps more so for security-sensitive transitions (setuid/setgid/MAC/...)

That is a good point. I had not thought about kernel validation of the environment in addition to the validation performed in libc.

Brian's changes, although poorly timed, seem like a reasonable direction in this regard: we're stuck with unhelpful APIs, but maybe we can do a better job.

Getting rid of putenv() and especially removing direct access of environ (replaced with API call(s)) would be my favorite API changes.

Sean
--
s...@freebsd.org
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to