Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Sep 2012 07:33:43 -0700
From:      mdf@FreeBSD.org
To:        Erik Cederstrand <erik@cederstrand.dk>
Cc:        freebsd-hackers@freebsd.org, Ivan Voras <ivoras@freebsd.org>
Subject:   Re: Change vfork() to posix_spawn()?
Message-ID:  <CAMBSHm8mM21qqO3z=pFxAX%2BMB9=mrGXKyk8=CaQFGni48ssLAA@mail.gmail.com>
In-Reply-To: <52517366-C10B-4CAA-BDDF-31E2098CBDA3@cederstrand.dk>
References:  <035514CA-81D6-407F-A2C1-51A9FB0E3A74@cederstrand.dk> <k2v2te$ok1$1@ger.gmane.org> <52517366-C10B-4CAA-BDDF-31E2098CBDA3@cederstrand.dk>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Sep 14, 2012 at 4:45 AM, Erik Cederstrand <erik@cederstrand.dk> wro=
te:
> Den 14/09/2012 kl. 13.03 skrev Ivan Voras <ivoras@FreeBSD.org>:
>
>> On 14/09/2012 09:49, Erik Cederstrand wrote:
>>> Hello hackers,
>>>
>>> I'm looking through the Clang Analyzer scans on http://scan.freebsd.you=
r.org/freebsd-head looking for false positives to report back to LLVM. Ther=
e are quite a list of reports suggesting to change vfork() calls to posix_s=
pawn(). Example from /bin/rpc: http://scan.freebsd.your.org/freebsd-head/bi=
n.rcp/2012-09-12-amd64/report-nsOV80.html#EndPath
>>>
>>> I know nothing about this but I can see fork and posix_spawn have been =
discussed on this list previously. Is this a legitimate warning (in this ca=
se and in general in FreeBSD base)?
>>
>> Currently (on 9-stable at least), posix_spawn() is implemented as a
>> wrapper around vfork(), so I doubt replacing one with the other would do
>> much.
>
> The analyzer added this warning in January. The release notes link to thi=
s explanation: https://www.securecoding.cert.org/confluence/display/seccode=
/POS33-C.+Do+not+use+vfork()
>
> I guess this is the important part:
>
> "Because of the implementation of the vfork() function, the parent proces=
s is suspended while the child process executes. If a user sends a signal t=
o the child process, delaying its execution, the parent process (which is p=
rivileged) is also blocked. This means that an unprivileged process can cau=
se a privileged process to halt, which is a privilege inversion resulting i=
n a denial of service."
>

Isn't the important part the previous paragraph, which said that some
older versions of Linux had the problem?  The entire thing reads that
the issue comes from an idiom of vfork(), setuid(), then exec, which
is both undefined and would be specific to only some *uses* of
vfork(), not the implementation.

The whole thing isn't worded terribly usefully; e.g. it doesn't
explain if it was only Linux that had an issue, which version of Linux
is fixed, whether normal code that went straight from vfork() to
exec() was fine, etc.

Cheers,
matthew



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAMBSHm8mM21qqO3z=pFxAX%2BMB9=mrGXKyk8=CaQFGni48ssLAA>