Re: Using NFQUEUE from userspace with seteuid

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2010-03-01 at 21:10 +0100, Pablo Neira Ayuso wrote:
> backup95 wrote:
> > Hello,
> > 
> > I wrote a daemon to do packet filtering using libnetfilter-queue.
> > 
> > It works well except that I ran into problems trying to run it
> > seteuid/setegid to an unpriviliged user.
> > 
> > Setup and teardown proceeds as root but when I try running the main loop
> > seteuid/setegid to a regular user (just processing IP addresses and
> > calling nfq_set_verdict really) everything slows to a crawl. I don't get
> > any software errors (packets are apparently received and accepted/denied
> > as usual) but all my connections time out or error out (not sure which
> > yet). Like I said, works fine as root.
> > 
> > I'm at a loss to explain this because as far as I can tell the
> > underlying netlink socket mechanism should not depend on root
> > priviledges to send messages. It's strange enough that there's a
> > significant slow down but no hard errors (and by that I mean
> > nfq_set_verdict returning a negative value).
> > 
> > Can anyone at least please confirm that it should work fine and it is
> > worth investigating or else just forget it and run the whole thing as
> > root?
> > 
> > Any comments would be greatly appreciated.
> 
> Could you post the code or a sketch with the relevant section that I
> could use to reproduce the problem here?

Yes, of course, thanks. The code is now at
git://gitorious.org/bouncer/bouncer.git. I'll be glad to provide details
but after some testing I hope it won't be necessary to put you through
that trouble.

While cleaning up a few bits and pieces for a good test case I narrowed
down the problem. Seems only ports below 1024 stop working without root.
In my tests HTTP is blocked while other high ports above the 20000 range
are not. But the blocked HTTP connections don't register with the
daemon, meaning it is not receiving any netlink packets for connections
below 1024 (to be precise I have only tested port 80 so far) and those
are lost somewhere between kernel-space and user-space.

One odd thing is that my debugging logs have lines like:
bouncer-daemon: Received packet 0
bouncer-daemon: Accepted packet 0
bouncer-daemon: Received packet 1
bouncer-daemon: Accepted packet 1

etc. The integer is from struct nfqnl_msg_packet_hdr *ph->id. These ids
keep incrementing but stop at 1023 when running without root. Is there
any significance to id 1024? I don't see any connection between the id
number and the port number but it seems peculiar nonetheless. This
doesn't happen with UID 0.

Since the extra code to change effective UID is fairly trivial and the
code works otherwise I don't think that it introduced any bugs. The
problem seems to me to be about kernel permissions but my knowledge
there is lacking so I'm at a loss to explain this. 

João

--
To unsubscribe from this list: send the line "unsubscribe netfilter" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux