On Tue, Apr 10, 2018 at 3:11 PM, Vadim Zhukov <persg...@gmail.com> wrote:

> While working on home job for students, I've come across two
> questionable thingies in ping.c:
>
> 1. It sends process PID (well, last 16 bits) to the network.
>    Maybe I'm a bit paranoid, but this looks like bad idea for me.

Well, you need a UNIQUE  ID,  because all readers of an ICMP socket are
going to see All the ICMP echo replies,  including ones that belong to other
programs  (maybe not ping),  and  possibly some unsolicited replies.

The standard convention of using the locally-significant PID should be fine.
The only thought would be that if an adversary knows your process id,
such as by running  a  "ps"  command on the host  -- since the PID is not
a secret identifier,  well.

your adversary could then construct and send  Spoofed replies to
your ping commands's ICMP ECHO request  from somewhere else on
the internet,  And knowing your PID,  they would be able to put the
correct Ident value in their spoofed ECHO REPLY packets.

However,  there's no real-world case where it's really a concern ---
unless there were some bug where ping  could misbehave on a malformed reply.

>    I understand that this worked good when PIDs were 16-bit limited,
>    because in that case you'll get 100% guarantee two different
>    ping processes won't overlap. But nowadays we have larger PID
>    space, so clashes are possible anyway. I propose to go straight
>    with arc4random().

Probably using the bottom 16 bits of the PID for most systems is ensuring
uniqueness,  and  arc4random()  is introducing  unreliability/unpredictability
in when Ident values may  overlap.....


Perhaps the ideal situation would be to use the whole  combined
Ident + Sequence    fields  for matching.

In other words:  the ICMP REPLY should be discarded unless both  Ident
 AND  Sequence bits
in the reply  are within a certain range of values    based on packets sent.

Then..... populate the whole 32-bit  PID with upper 16 bits to Ident and
Lower  16 bits  into the   Initial Sequence bits.

And for reply Match Ident,
Then  test  if the  Sequence Bits  in the response are in the valid reply range
 based on    Initial Sequence  --> Final Sequence,

Or  Initial Sequence +  The count of sent pings   where ping would increment
 Sequence for each Ping sent,   with consideration for Sequence
counter wrap/overflow.


--
-Jimmy

Reply via email to