>While this is hardly a new bug and the dangers of not having proper
>anti-spoofing
> checks in your perimeter router/firewall has been discussed over and
>over in the
> past years I believe it might be worth a post to bugtraq.
>The following can be taken as an example of how a combination of bugs,
>protocol
>flaws and bad coding practices can bring to life new incarnations of
>ancient security
>problems.
>This was discussed months ago with Oliver Friederichs and Theo de Raadt
>over
>considerable amounts of beer, since then i didnt have time to
>investigate further till last week.
> Sebastian R. Wain <[EMAIL PROTECTED]> provided a lot of his time
>testing and
> figuring out the detailst.
Sorry for not mailing this to bugtraq earlier, but only to
Ivan Arce in private; we came to the conclusion that the outlined
attacks only work on unpatched Solaris 2.6 and before.
The relevant Sun bug is:
4070261 predictable RPC XIDs when forwarding CALLIT RPCs
The following patches that have been around for quite some time fix this
problem:
102034-05: SunOS 5.3: usr/sbin/rpcbind patch
102070-06: SunOS 5.4: usr/sbin/rpcbind patch
102071-06: SunOS 5.4_x86: usr/sbin/rpcbind patch
104331-07: SunOS 5.5.1: /usr/sbin/rpcbind patch
104332-07: SunOS 5.5.1_x86: /usr/sbin/rpcbind patch
104357-06: SunOS 5.5: usr/sbin/rpcbind patch
104358-05: SunOS 5.5_x86: usr/sbin/rpcbind patch
105216-03: SunOS 5.6: /usr/sbin/rpcbind patch
105217-03: SunOS 5.6_x86: /usr/sbin/rpcbind patch
Solaris 7 has this bug fixed.
The new code added checks that replies received not only have matching
XIDs but also have matching return address.
> 1. Attacker sends a spoofed PMAPPROC_SET call to register a service
>named
> "bogusd" on the any available port on localhost.
>
> src addr : 127.0.0.1
> dst addr : bouncing.host.com
> dst port : 111
> program : rpcbind
> procedure: PMAPPROC_SET
> data : BOGUSPROG,BOGUSVERS,BOGUS_PORT,etc
Should work and creates a UDP registration; note that it's pretty easy to
prevent spoofed 127.0.0.1 packets from coming through in Solaris:
ndd -set /dev/ip ip_strict_dst_multihoming 1
(A packet coming in with a local destination address but over the wrong
interface will be dropped)
> 5. attacker sends rpcbind a NON-spoofed CALLIT call to BOGUSPROG
>
> src addr : attacking.host.com
> dst addr : bouncing.host.com
> program : rpcbind
> procedure: PMAPPROC_CALLIT
> data : BOGUSPROG,BOGUSVERS,BOGUS_PROCFOO,etc
>
> This will generate a RPC call from rpcbind on the bouncing host
> to BOGUS_PROGRAMNUM on the bouncing host as follows:
>
> src addr : bouncing.host.com
> src port : rpcbind_forwarding_port
> dst addr : bouncing.host.com
> dst port : BOGUS_PORT
> program : BOGUSPROG
> procedure: BOGUS_PROCFOO
> XID : xid_j+1
>
> 6. attacker sends a spoofed call to mountd's RPCMNT_MOUNT procedure
> with :
>
> src addr : bouncing.host.com
> src port : rpcbind_forwarding_port
> dst addr : attacked.host.com
> dst port : MOUNTD_PORT
> program : MOUNTPROG
> procedure: MOUNT_PROCMNT
> XID : xid_j+1
With the patch, the reply to this request should now fail because
MOUNTD_PORT != BOGUS_PORT (in most cases, the rpcbind callit request will
be done using connectionless TLI; you'll be comparing a TLI address w/
an IP address and no amount of spoofing can make it match)
> 7. mountd on the attacked host replies to this request with
> the proper filehandle, rpcbind will get the reply, match it to
> a previous CALLIT request, and pass it back to the caller.
This step should fail in systems with patches later than march '98.
> The attacker has just grabbed a filehandle, bypassing the
> restrictions imposed in rpcbind for CALLIT calls.
NFS file handles as returned by mount are not as useful as before;
you will need to spoof all NFS requests through rpcbind (at least, those
you want to have a reply for)
> 1. XIDs of the forwarded calls are predictable
>
> Assuming that our RPC calls to rpcbind, PROC_CALLIT are the first
> CALLIT requests received by the bouncing host since it was booted
> (this is a fair assumption) and knowning or being able to aproximate
>
> the uptime of the target host, the XIDs that rpcbind will generate
>for
> the forwarded requests can be easily predicted.
This may still be the case.
> 2. Theres no check for the src address and port of the replies to
> forwarded calls to match the dst address and port of the original
> call.
This check has been implemented some time ago.
> rpcbind does not check that RPC reply messages, received on the
> socket used to forward CALLIT requests, have a valid source address,
>
> port, prognum, progvers, etc.
The current implentation checks the endpoint address; since the
RPC protocol replies do not include the procedure and version number,
it is impossible to check whether the proper function replied or not.
Casper