On Tue, Oct 29, 2013 at 02:06:48PM -0400, Gabriel Guzman wrote:
> On 10/29, Theo de Raadt wrote:
<snip>
> > The /dev/*random nodes are not specified in any standard, furthermore
> > once you get into chroot all bets are off (like you discovered).
> > 
> > >This allows the program to work, but I'm wondering if there is a better
> > >way to do this that doesn't involve removing the nodev setting from
> > >/var.  
> > 
> > Rewrite it so that it uses other ways to get randomness.  The arc4random
> > API is exposed in various programming layers.
> > 
> > >Would it be preferable to use a language function for getting pseudo 
> > >random bytes instead of relying on the device?
> > 
> > Yes.  Definately.
> 
> Great, thanks for confirmation on that, I'll fix the program so I don't
> need to make devices inside my cozy chroot and push the changes upstream.  
> 

FWIW, on Linux there is also a way to access kernel randomness without using
a device file:

        int mib[3] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID };
        uint32_t uuid[4];
        sysctl(mib, 3, uuid, &(size_t){ sizeof uuid }, (void *)0, 0);

You can just feed this into a simple KDF construction using a
cryptographically strong hash function, or feed it into OpenSSL's PRNG.
Caveat emptor: add appropriate error checking so you know if and when this
fails. I've never seen it fail, but the API is undocumented because Linux
eschews sysctl in favor of /proc and /dev, and theoretically it could
disappear.

Unfortunately, on OS X and FreeBSD arc4random(3) reads from /dev/random.
What a shame. Somebody was asleep at the wheel.

The safest behavior is to arrange to acquire randomness resources at startup
before chroot'ing, but obviously this is difficult to do in a self-contained
library.

Reply via email to