Hi Daniel,
On Wed, Dec 14, 2016 at 6:36 PM, Daniel Wagner <wagi(a)monom.org> wrote:
Hi Shrikant,
On 12/09/2016 02:37 PM, Shrikant Bobade wrote:
> Getting connman waiting/stuck at /getrandom
> (_rnd_get_system_entropy_getrandom) (by default gnutls enabled)
>
Hmm, getrandom is part of gnutls? Maybe post the stack trace, that would
help to understand the situation better.
using connman with gnutls
ref:
http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/
recipes-connectivity/connman/connman.inc?h=morty#n33
Reading symbols from /usr/sbin/connmand...Reading symbols from
/usr/sbin/.debug/connmand...done.
done.
(gdb) r -d -n
Starting program: /usr/sbin/connmand -d -n
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
^C
Program received signal SIGINT, Interrupt.
0x76c3193c in syscall () from /lib/libc.so.6
(gdb) bt
#0 0x76c3193c in syscall () from /lib/libc.so.6
#1 0x76e272a8 in force_getrandom (flags=0, buflen=<optimized out>,
buf=<optimized out>) at
../../../gnutls-3.5.3/lib/nettle/rnd-linux.c:80
#2 _rnd_get_system_entropy_getrandom (_rnd=<optimized out>,
size=<optimized out>) at
../../../gnutls-3.5.3/lib/nettle/rnd-linux.c:98
#3 0x76e24344 in do_device_source (init=init@entry=1,
event=event@entry=0x7efffcdc, ctx=0x76e62a38 <rnd_ctx>) at
../../../gnutls-3.5.3/lib/nettle/rnd.c:132
#4 0x76e244ac in wrap_nettle_rnd_init (ctx=<optimized out>) at
../../../gnutls-3.5.3/lib/nettle/rnd.c:234
#5 0x76d72a28 in _gnutls_rnd_init () at ../../gnutls-3.5.3/lib/random.c:49
#6 0x76d64dfc in _gnutls_global_init
(constructor=constructor@entry=1) at
../../gnutls-3.5.3/lib/global.c:307
#7 0x76d3d948 in lib_init () at ../../gnutls-3.5.3/lib/global.c:504
#8 0x76fdf2dc in call_init.part () from /lib/ld-linux-armhf.so.3
#9 0x76fdf438 in _dl_init () from /lib/ld-linux-armhf.so.3
#10 0x76fcfac4 in _dl_start_user () from /lib/ld-linux-armhf.so.3
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)
So tried to increase entropy with help of /dev/urandom & and with
> sufficient ~3k+ entropy count observed the getrandom call completed
> successfully.
> Is this know behaviour Or experienced by anyone.. ?
>
Haven't seen this problem before but that doesn't mean it doesn't exists.
:~# rngd -r /dev/urandom -o
> /dev/random
>
> :~# cat /proc/sys/kernel/random/entropy_avail
> 3087
>
>
> Please advise, we suppose to use only /dev/random for better security
> reasons and not /dev/urandom ? thoughts if any for other ways to deal
> with less/no entropy available with /dev/random?
>
http://security.stackexchange.com/questions/122155/how-bad-i
> t-is-to-feed-dev-random-with-dev-urandom
>
http://stackoverflow.com/questions/3690273/did-i-understand-
> dev-urandom#comment30985465_3709644
>
I had to read up on the random and urandom. I also checked if any of our
calls to __connman_util_get_random() is a problem (see below [1]).
It looks like that our code base is using urandom correctly. So
it is how we use gnutls. I wonder how this could be a problem in assigning
IP addresses. Could you past a complete log?
Thanks for the consolidate shared urandom details, agreed that we can use
urandom..
So using rngd
http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/recipes-support/...
to get the enough entropy available.
The particular delay of assigning IP addresses was in term of getrandom
hang,
when connmon.service get multiple attempts...during these attempts minimal
entropy available ranging from 10 to 30.. to moved ahead of getrandom..
So once 3-4k entropy available not facing this issue.
Thanks,
Daniel
Thanks for the response.
-thanks
Shrikant
[1]
** src/config.c: __connman_util_get_random(&rand);
generate_random_string(rstr, 11);
vfile = g_strdup_printf("service_mutable_%s.config", rstr);
** src/dhcpv6.c: __connman_util_get_random(&rand);
/* Initial timeout, RFC 3315, 18.1.5 */
__connman_util_get_random(&rand);
delay = rand % 1000;
RFC 3314 chapter 18.1.5
"""
The first Confirm message from the client on the interface MUST be
delayed by a random amount of time between 0 and CNF_MAX_DELAY.
"""
** src/dhcpv6.c: __connman_util_get_random(&rand);
/* Initial timeout, RFC 3315, 17.1.2 */
__connman_util_get_random(&rand);
delay = rand % 1000;
RFC 3314 chapter 17.1.2
"""
The first Solicit message from the client on the interface MUST be
delayed by a random amount of time between 0 and SOL_MAX_DELAY. In
the case of a Solicit message transmitted when DHCP is initiated by
IPv6 Neighbor Discovery, the delay gives the amount of time to wait
after IPv6 Neighbor Discovery causes the client to invoke the
stateful address autoconfiguration protocol (see section 5.5.3 of RFC
2462). This random delay desynchronizes clients which start at the
same time (for example, after a power outage).
"""
** src/dhcpv6.c: __connman_util_get_random(&rand);
static guint compute_random(guint val)
{
uint64_t rand;
__connman_util_get_random(&rand);
return val - val / 10 +
((guint) rand % (2 * 1000)) * val / 10 / 1000;
}
/* Calculate a random delay, RFC 3315 chapter 14 */
/* RT and MRT are milliseconds */
static guint calc_delay(guint RT, guint MRT)
{
if (MRT && (RT > MRT / 2))
RT = compute_random(MRT);
else
RT += compute_random(RT);
return RT;
}
RFC 3315 chapter 14
"""
Each of the computations of a new RT include a randomization factor
(RAND), which is a random number chosen with a uniform distribution
between -0.1 and +0.1. The randomization factor is included to
minimize synchronization of messages transmitted by DHCP clients.
The algorithm for choosing a random number does not need to be
cryptographically sound. The algorithm SHOULD produce a different
sequence of random numbers from each invocation of the DHCP client.
"""
** src/dnsproxy.c: __connman_util_get_random(&rand);
req->dstid = get_id();
req->altid = get_id();
RFC 5625 chapter 6.1
"""
It has been standard guidance for many years that each DNS query
should use a randomly generated Query ID. However, many proxies have
been observed picking sequential Query IDs for successive requests.
It is strongly RECOMMENDED that DNS proxies follow the relevant
recommendations in [RFC5452], particularly those in Section 9.2
relating to randomisation of Query IDs and source ports. This also
applies to source port selection within any NAT function
"""
RFC 5452 chapter 9.2. Extending the Q-ID Space by Using Ports and Addresses
"""
Resolver implementations MUST:
o Use an unpredictable source port for outgoing queries from the
range of available ports (53, or 1024 and above) that is as large
as possible and practicable;
o Use multiple different source ports simultaneously in case of
multiple outstanding queries;
o Use an unpredictable query ID for outgoing queries, utilizing the
full range available (0-65535).
Resolvers that have multiple IP addresses SHOULD use them in an
unpredictable manner for outgoing queries.
Resolver implementations SHOULD provide means to avoid usage of
certain ports.
Resolvers SHOULD favor authoritative nameservers with which a trust
relation has been established; stub-resolvers SHOULD be able to use
Transaction Signature (TSIG) ([RFC2845]) or IPsec ([RFC4301]) when
communicating with their recursive resolver.
In case a cryptographic verification of response validity is
available (TSIG, SIG(0)), resolver implementations MAY waive above
rules, and rely on this guarantee instead.
Proper unpredictability can be achieved by employing a high quality
(pseudo-)random generator, as described in [RFC4086].
"""
RFC 4086 chapter 7. Randomness Generation Examples and Standards
"""
Several public standards and widely deployed examples are now in
place for the generation of keys or other cryptographically random
quantities. Some, in section 7.1, include an entropy source.
Others, described in section 7.2, provide the pseudo-random number
strong-sequence generator but assume the input of a random seed or
input from a source of entropy.
"""
RFC 4086 chapter 7.1.2. The /dev/random Device
"""
Several versions of the UNIX operating system provide a kernel-
resident random number generator. Some of these generators use
events captured by the Kernel during normal system operation.
For example, on some versions of Linux, the generator consists of a
random pool of 512 bytes represented as 128 words of 4 bytes each.
When an event occurs, such as a disk drive interrupt, the time of the
event is XOR'ed into the pool, and the pool is stirred via a
primitive polynomial of degree 128. The pool itself is treated as a
ring buffer, with new data being XOR'ed (after stirring with the
polynomial) across the entire pool.
Each call that adds entropy to the pool estimates the amount of
likely true entropy the input contains. The pool itself contains a
accumulator that estimates the total over all entropy of the pool.
Input events come from several sources, as listed below.
Unfortunately, for server machines without human operators, the first
and third are not available, and entropy may be added slowly in that
case.
1. Keyboard interrupts. The time of the interrupt and the scan code
are added to the pool. This in effect adds entropy from the human
operator by measuring inter-keystroke arrival times.
2. Disk completion and other interrupts. A system being used by a
person will likely have a hard-to-predict pattern of disk
accesses. (But not all disk drivers support capturing this timing
information with sufficient accuracy to be useful.)
3. Mouse motion. The timing and mouse position are added in.
When random bytes are required, the pool is hashed with SHA-1 [SHA*]
to yield the returned bytes of randomness. If more bytes are
required than the output of SHA-1 (20 bytes), then the hashed output
is stirred back into the pool and a new hash is performed to obtain
the next 20 bytes. As bytes are removed from the pool, the estimate
of entropy is correspondingly decremented.
To ensure a reasonably random pool upon system startup, the standard
startup and shutdown scripts save the pool to a disk file at shutdown
and read this file at system startup.
There are two user-exported interfaces. /dev/random returns bytes
from the pool but blocks when the estimated entropy drops to zero.
As entropy is added to the pool from events, more data becomes
available via /dev/random. Random data obtained from such a
/dev/random device is suitable for key generation for long term keys,
if enough random bits are in the pool or are added in a reasonable
amount of time.
/dev/urandom works like /dev/random; however, it provides data even
when the entropy estimate for the random pool drops to zero. This
may be adequate for session keys or for other key generation tasks
for which blocking to await more random bits is not acceptable. The
risk of continuing to take data even when the pool's entropy estimate
is small in that past output may be computable from current output,
provided that an attacker can reverse SHA-1. Given that SHA-1 is
designed to be non-invertible, this is a reasonable risk.
To obtain random numbers under Linux, Solaris, or other UNIX systems
equipped with code as described above, all an application has to do
is open either /dev/random or /dev/urandom and read the desired
number of bytes.
(The Linux Random device was written by Theodore Ts'o. It was based
loosely on the random number generator in PGP 2.X and PGP 3.0 (aka
PGP 5.0).)
"""
man page on urandom:
A read from the /dev/urandom device will not block waiting
for more entropy. If there is not sufficient entropy, a
pseudorandom number generator is used to create the
requested bytes. As a result, in this case the returned
values are theoretically vulnerable to a cryptographic
attack on the algorithms used by the driver. Knowledge of
how to do this is not available in the current unclassified
literature, but it is theoretically possible that such an
attack may exist. If this is a concern in your application,
use /dev/random instead. O_NONBLOCK has no effect when
opening /dev/urandom. When calling read(2) for the device
/dev/urandom, signals will not be handled until after the
requested random bytes have been generated.