DHCPv6 client in base
Hiroki Sato
hrs at allbsd.org
Tue Oct 15 13:00:36 UTC 2019
Roy Marples <roy at marples.name> wrote
in <f3c51ba5-ebad-4f2f-2ae5-ab08055f6b6b at marples.name>:
ro> On 13/10/2019 20:32, Hiroki Sato wrote:
ro> > Ben Woods <woodsb02 at gmail.com> wrote
ro> > in
ro> > <CAOc73CBzvRD0Je5+XQJ9_UqTP2_cgJvc7_7JTU0fjKBCVnTt-w at mail.gmail.com>:
ro> > wo> On Fri, 11 Oct 2019 at 08:32, Ben Woods <woodsb02 at gmail.com>
ro> > wrote:
ro> > wo> As promised, I have completed my initial work to import dhcpcd
ro> > into FreeBSD
ro> > wo> base, and it is ready for review, testing and comment at the link
ro> > below.
ro> > wo> https://reviews.freebsd.org/D22012
ro> > wo>
ro> > wo> As per the comment from brooks@, I have opted to have it installed
ro> > in
ro> > wo> parallel with dhclient (which remains the default).
ro> > How do you want to proceed the discussion? I sent my view and made
ro> > myself clear that importing dhcpcd into the base system as-is is not
ro> > a good idea. What is your answer to my concerns? I also agree with
ro> > Brooks about a need for sandboxing before the import if it will
ro> > happen. Do you have any plan to add changes to the imported dhcpcd?
ro>
ro> Sorry if it was not clear. The discussion involves what is the
ro> required acceptance for Priviledge Seperation because this is quite
ro> new to me.
ro>
ro> My current idea is to open DHCP, IPv6RA and DHCP6 ports, chroot, drop
ro> privs and fork. This concept is pretty standard thus far. These are
ro> listening ports only and will dry-run any received message through
ro> dhcpcd's two commons paths:
ro> 1) extract address and routing information without applying it
ro> 2) environment option generation from the whole message
A typical separation is three process model which contains
processes for 1) sending/accepting packets (and parsing them), 2)
state machine for each protocol handling, and 3) global namespace
access (file, routing socket, network interface state, etc). The
superuser privilege can be dropped in 1) and 2) completely. 1) and
3) communicate with 2) on demand or event-driven basis. 1) do not
communicate directly with 3). Protocol-specific routines are in 1)
and 2)---the former handles its wire-format, and the latter deals
with protocol-specific state machines.
However, this is often an overkill for a small, single-protocol
network daemon. A two process model which contains one for 1)+2) and
another for 3) above is used in sbin/dhclient, for example. I think
this separation is the minimum level. 3) performs privileged tasks
such as ioctls for network interfaces.
I believe the three process model is appropriate for dhcpcd because
of the nature of multi-protocol support. Parsing is one of the
attack surfaces. For instances, a dhcp6_findoption() loop in
dhcp6_recv() should be in process 1 and changes of D6_STATE(ifp)
should be managed in process 2. The current dhcp6_bind() directly
uses dhcp6_findmoption() to extract options from a DHCP message on
demand and also directly accesses the global namespace by using
dhcp6_writelease(ifp). These packet inspection and file access can
be replaced with IPC requests to process 1 or 3 in the model, and it
can be realized without a big structural change to the original logic
in dhcp6.c (though it requires a certain amount of changes to the
current code).
In the ideal world everything should work fine and this kind of
separation just sounds to make the program complex unnecessary, but
an incomplete separation between the possible attack surfaces and
access to the global namespace does not provide a good security even
if the superuser privilege dropped.
Note that these are just my own view, not a requirement for something
nor feature request. I think lack of privsep must be considered if
dhclient is replaced, but I also think replacing dhclient is beyond
the discussion of DHCPv6.
Anyway, You might want to create a new email thread for sandboxing of
dhcpcd on FreeBSD if you want to continue to discuss it. Probably
developers with more expertise in security can make a comment.
-- Hiroki
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 342 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-net/attachments/20191015/207de52b/attachment.sig>
More information about the freebsd-net
mailing list