Hi,

I did some quick HMAC benchmarking on my linux box with one core of my Intel i7:

+ 300k HMAC ops/s using 1200 byte packets
+ 700k HMAC ops/s using 100 byte packets
+ 840k HMAC ops/s using 10 byte packets

This is clearly fast enough for use cases like ours where a few tens of 
customer sites with fault-tolerant primary/backup internet connections are 
connected to our backend VPN service. If openvpn can't deal with client IP 
changes in (near) real-time it makes network design much harder as problems 
with the remote site's primary internet connection will quickly affect 
end-users.

I can't antipate any major risks in integrating this patch (assuming the 
implementation is correct and secure): 

1) currently the  --float option is broken for TLS servers anyway, so hardly 
anyone should be using the option at the moment.

2) sysadmins can use their own judgement when assessing whether to enable the 
patched --float on their servers: limited scalability in terms of number of 
clients vs. improved network reliability and quality for site-to-site live 
systems. 

3) I wouldn't put too much emphasis on the number of client sessions this patch 
can handle, as the problem seems to be partially caused by openvpn's current 
inability to run multi-threaded (that will hopefully be fixed in the future?). 
If a server setup needs max scalability the --float can always be turned off. 
This is why to me this patch looks like a win-win case.

Any thoughts?

Best regards, 
Mikko

________________________________________
From: Mikko Vainikainen [mikko.vainikai...@konecranes.com]
Sent: Friday, March 08, 2013 4:41 PM
To: Joachim Schipper; openvpn-devel@lists.sourceforge.net
Subject: Re: [Openvpn-devel] [PATCH] Fix for bug #49 for openvpn 2.2.2

Hi,

it is absolutely true that it is necessary to do HMAC hash per every existing 
session, as far as I know there's no other way to tell reliably if the packet 
really belongs to an existing session... I haven't measured the HMAC 
performance myself, but I'd guess it would take a bit more than a few hundred 
packets per second to exhaust a modern CPU.

The for-loop part was originally (shamelessly) adapted from tls_pre_decrypt() @ 
ssl.c, it could have been more clear I have to admit...

I think the memcmp() is already constant-time as the HMAC hash has fixed size 
per hash algorithm (as far as I can remember, please correct me if I'm wrong). 
This was also shamelessly adopted from openvpn_decrypt() @ crypto.c.

I don't think there are any timing related attack opportunities as accepting 
the incoming packet does not trigger any immediate replies being sent back to 
anyone; the accepted packet is just processed as if it was received from the 
original address. As the data channel packet is being forwarded away from the 
original sender to the trusted side of the tunnel it should be quite hard for 
an attacker to make any timing calculations..

I wasn't aware the  --float option could be specified per client...

Best regards, and nice weekend!
Mikko




________________________________________
From: Joachim Schipper [joachim.schip...@fox-it.com]
Sent: Friday, March 08, 2013 2:58 PM
To: openvpn-devel@lists.sourceforge.net
Cc: Mikko Vainikainen; Steffan Karger
Subject: RE: [PATCH] Fix for bug #49 for openvpn 2.2.2

> Hi,
>
> our setup needs openvpn UDP/TLS tunnels with dynamic client IP addresses, so 
> I implemented a fix for the bug #49 that has been open for over two years.
>
> The patch is for version 2.2.2 as I had trouble compiling the 2.3.x tarball 
> from openvpn.net. As the solution is rather simple (just two small utility 
> functions in mudp.c) I'd guess it could be comfortambly migrated to 2.3.x.
>
> Basically what the fix does is the following: incoming data channel UDP 
> packets from an unknown IP are matched against existing UDP/TLS sessions, and 
> if the packet passes the HMAC authentication against an existing TLS context 
> we know the client IP has changed and the session state will be instantly 
> updated accordingly.
>
> I have tested this fix to some extent, and the IP handover works impressively 
> smoothly in my test setup where I randomly switch between two routes from 
> client to server.
>
> Dynamic client IP's are enabled/disabled with --float in the server side.
>
> Please feel free to contact me for any questions etc.

This is not a full review of the patch, just a few quick remarks.

This patch seems to do (number of tunnels) HMAC's for any packet received from 
an unknown IP. If this is correct, couldn't a server with a couple thousand 
tunnels be brought just by sending it a few hundred packets a second?

authenticate_tls_packet() contains a for() loop, but I see no code path that 
actually loops - everything seems to return immediately?

memcmp() should be replaced by a constant-time function to prevent timing 
attacks (probably only realistic on a server with a single tunnel); even then, 
this patch allows determining the (approximate) number of tunnels in use by 
looking at processing time.

I haven't looked at how this interacts with other features; it's at least 
noteworthy that the floating behavior can't be specified on a per-connection 
basis.

                Joachim



------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the
endpoint security space. For insight on selecting the right partner to
tackle endpoint security challenges, access the full report.
http://p.sf.net/sfu/symantec-dev2dev
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel



Reply via email to