Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 Oct 2004 15:21:16 -0400 (EDT)
From:      Robert Watson <rwatson@freebsd.org>
To:        swp@swp.pp.ru
Cc:        csjp@freebsd.org
Subject:   IP options broken for raw sockets on cred downgrade (was: Re: why required root privileges to set multicast options now?)
Message-ID:  <Pine.NEB.3.96L.1041011151504.31040X-100000@fledge.watson.org>
In-Reply-To: <Pine.NEB.3.96L.1041010110526.26690C-100000@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help

On Sun, 10 Oct 2004, Robert Watson wrote:

> On Sun, 10 Oct 2004 swp@swp.pp.ru wrote:
> 
> > FreeBSD 5.3-BETA7 Sun Oct 10 18:50:14 OMSST 2004
> > 
> > ospfd (net/quagga from ports) run with credentials of quagga:quagga and
> > unable to set multicast options now.
> > 
> > OSPF: can't setsockopt IP_ADD_MEMBERSHIP (AllSPFRouters): \
> >                                         Operation not permitted
> > OSPF: can't setsockopt IP_MULTICAST_LOOP(0): Operation not permitted
> > OSPF: can't setsockopt IP_MULTICAST_TTL(1): Operation not permitted
> > OSPF: can't setsockopt IP_MULTICAST_IF: Operation not permitted
> > 
> > 5.2-CURRENT and 5.2.1 have no problem.
> 
> This appears to have been introduced as a result of changes to permit
> root to bind raw sockets in jail.  In particular, the likely control
> flow path to get the above errors was to perform setsockopt() on a UDP
> socket, which probaly works its way down to in_control() to
> ip_ctloutput().  This would also explain why sdr stopped working for me
> a little while ago (I figured it was a bad package build).  I've CC'd
> Christian as he might have some insight into how to clean this up. 

The bug is now neatly illustrated by the ipsockopt regression test:

6.x:

paprika# ./ipsockopt 
Running tests with ruid 0 euid 0 sock uid 0
Running tests with ruid 0 euid 65534 sock uid 65534
Running tests with ruid 0 euid 65534 sock uid 0
ipsockopt: test_ip_uchar(SOCK_RAW, IP_TOS): initial getsockopt(): Operation not permitted

5.x:
Running tests with ruid 0 euid 0 sock uid 0
Running tests with ruid 0 euid 65534 sock uid 65534
Running tests with ruid 0 euid 65534 sock uid 0
PASS

The socket option operation works fine except in the case where a raw
socket was created as root, and then privilege was downgraded to the
normal user, at which point the process tries a socket option operation
(apparently of any sort, not just multicast).  I'm surprised more things
haven't broken, such as aspects of ping(8).  Maybe they have and nobody
has noticed :-). 

Robert N M Watson             FreeBSD Core Team, TrustedBSD Projects
robert@fledge.watson.org      Principal Research Scientist, McAfee Research



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.NEB.3.96L.1041011151504.31040X-100000>