Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 8 Apr 2008 16:43:31 +0400
From:      "Yar Tikhiy" <yar@comp.chem.msu.su>
To:        "Robert Watson" <rwatson@freebsd.org>
Cc:        freebsd-net@freebsd.org, luigi@freebsd.org, oleg@freebsd.org
Subject:   Re: ipfw uid/gid to match listening TCP sockets?
Message-ID:  <fbaf9b70804080543wf85de53hfe0f056a33f9e419@mail.gmail.com>
In-Reply-To: <20080408121535.D10870@fledge.watson.org>
References:  <20080407081400.GA78448@dg.local> <20080408121535.D10870@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Apr 8, 2008 at 3:19 PM, Robert Watson <rwatson@freebsd.org> wrote:
>
>
>  On Mon, 7 Apr 2008, Yar Tikhiy wrote:
>
>
> > Our ipfw currently doesn't seem to match this host's traffic by uid/gid if
> the traffic goes to a listening TCP socket.  E.g., if one tries to allow
> passive data connections to a local anonymous FTP server as follows, it
> won't work:
> >
> >        ipfw add 10000 allow tcp from any to me dst-port 49152-65535 uid
> ftp in keep-state
> >
> > This behaviour is obvious from ip_fw2.c:
> >
> >  2009          if (proto == IPPROTO_TCP) {
> >  2010                  wildcard = 0;
> >  2011                  pi = &tcbinfo;
> >  2012          } else if (proto == IPPROTO_UDP) {
> >  2013                  wildcard = INPLOOKUP_WILDCARD;
> >  2014                  pi = &udbinfo;
> >  2015          } else
> >  2016                  return 0;
> >
> > I.e., it is OK for UDP to match PCBs (essentially sockets) with a wildcard
> foreign (remote) address, but not for TCP.
> >
> > I wonder if there will be any security or whatever issues if the wildcard
> flag is set for TCP, too.  The only peculiarity I can see now is that
> listening sockets shouldn't generate outbound traffic; as soon a 3-way
> handshake starts, a separate PCB is created.  Thus a listening socket can
> match inbound packets only.
> >
> > Are there any other points I missed?  Thanks!
> >
>
>  None of this code really makes very much sense anyway, and is vulnerable to
> a number of races and semantic inconsistencies, not to mention application
> behavior that confuses it (such as sshd's opening forwarded sockets using a
> privileged credential).  I'm not sure I agree with your analysis that listen
> sockets don't generate packets, btw: the syncache generates packets that are
> not yet from a specific socket, so arguably they are from the listen socket.
> All that said, I don't see any reason not to match listen sockets in the pcb
> lookup here.

Thank you for these points! Matching packets from listen sockets makes
the case even simpler; then it's the matter of changing the "wildcard = 0;"
to "wildcard = INPLOOKUP_WILDCARD;". At least matching listen sockets
doesn't seem to break things not already broken.

>  Be aware that uid/gid/jail rules may become less maintainable as our TCP
> locking becomes more mature.  We already jump through some uncomfortable
> hoops to keep it working, but I'm not sure how long that can go on.

I've always viewed uid/gid rules as a hack that works for now. In the long run
we may want to consider an API allowing privileged apps to punch holes
in the firewall in a controllable manner. Of course, the API should be agnostic
of the particular firewall type. Then, e.g., ftpd(8) would be able to
open its current
passive data port only and to a single remote IP, and the whole port
range wouldn't
need to be exposed. Such holes could be handled as dynamic rules/states so that
they don't stay there forever if the app crashes.

-- 
Yar



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?fbaf9b70804080543wf85de53hfe0f056a33f9e419>