From: Cyrus Sh <sirus.shahini@gmail.com>
To: davem@davemloft.net
Cc: shiraz.saleem@intel.com, jgg@ziepe.ca, arnd@arndb.de,
arnd@arndb.de, netdev@vger.kernel.org, sirus@cs.utah.edu
Subject: [PATCH] Clock-independent TCP ISN generation
Date: Mon, 2 Sep 2019 23:06:05 -0600 [thread overview]
Message-ID: <70c41960-6d14-3943-31ca-75598ad3d2d7@gmail.com> (raw)
This patch addresses the privacy issue of TCP ISN generation in Linux
kernel. Currently an adversary can deanonymize a user behind an anonymity
network by inducing a load pattern on the target machine and correlating
its clock skew with the pattern. Since the kernel adds a clock-based
counter to generated ISNs, the adversary can observe SYN packets with
similar IP and port numbers to find out the clock skew of the target
machine and this can help them identify the user. To resolve this problem
I have changed the related function to generate the initial sequence
numbers randomly and independent from the cpu clock. This feature is
controlled by a new sysctl option called "tcp_random_isn" which I've added
to the kernel. Once enabled the initial sequence numbers are guaranteed to
be generated independently from each other and from the hardware clock of
the machine. If the option is off, ISNs are generated as before. To get
more information about this patch and its effectiveness you can refer to my
post here:
https://bitguard.wordpress.com/?p=982
and to see a discussion about the issue you can read this:
https://trac.torproject.org/projects/tor/ticket/16659
Signed-off-by: Sirus Shahini <sirus.shahini@gmail.com>
---
include/net/tcp.h | 1 +
include/uapi/linux/sysctl.h | 1 +
kernel/sysctl_binary.c | 1 +
net/core/secure_seq.c | 24 +++++++++++++++++++++++-
net/ipv4/sysctl_net_ipv4.c | 7 +++++++
net/ipv4/tcp_input.c | 1 +
6 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 81e8ade..4ad1bbf 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -241,6 +241,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo);
/* sysctl variables for tcp */
extern int sysctl_tcp_max_orphans;
+extern int sysctl_tcp_random_isn;
extern long sysctl_tcp_mem[3];
#define TCP_RACK_LOSS_DETECTION 0x1 /* Use RACK to detect losses */
diff --git a/include/uapi/linux/sysctl.h b/include/uapi/linux/sysctl.h
index 87aa2a6..ba8927e 100644
--- a/include/uapi/linux/sysctl.h
+++ b/include/uapi/linux/sysctl.h
@@ -426,6 +426,7 @@ enum
NET_TCP_ALLOWED_CONG_CONTROL=123,
NET_TCP_MAX_SSTHRESH=124,
NET_TCP_FRTO_RESPONSE=125,
+ NET_IPV4_TCP_RANDOM_ISN=126,
};
enum {
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
index 73c1320..0faf7d4 100644
--- a/kernel/sysctl_binary.c
+++ b/kernel/sysctl_binary.c
@@ -332,6 +332,7 @@ static const struct bin_table bin_net_ipv4_netfilter_table[] = {
};
static const struct bin_table bin_net_ipv4_table[] = {
+ {CTL_INT, NET_IPV4_TCP_RANDOM_ISN "tcp_random_isn"}
{CTL_INT, NET_IPV4_FORWARD, "ip_forward" },
{ CTL_DIR, NET_IPV4_CONF, "conf", bin_net_ipv4_conf_table },
diff --git a/net/core/secure_seq.c b/net/core/secure_seq.c
index 7b6b1d2..b644bbe 100644
--- a/net/core/secure_seq.c
+++ b/net/core/secure_seq.c
@@ -22,6 +22,7 @@
static siphash_key_t net_secret __read_mostly;
static siphash_key_t ts_secret __read_mostly;
+static siphash_key_t last_secret = {{0,0}} ;
static __always_inline void net_secret_init(void)
{
@@ -134,8 +135,29 @@ u32 secure_tcp_seq(__be32 saddr, __be32 daddr,
__be16 sport, __be16 dport)
{
u32 hash;
-
+ u32 temp;
+
net_secret_init();
+
+ if (sysctl_tcp_random_isn){
+ if (!last_secret.key[0] && !last_secret.key[1]){
+ memcpy(&last_secret,&net_secret,sizeof(last_secret));
+
+ }else{
+ temp = *((u32*)&(net_secret.key[0]));
+ temp >>= 8;
+ last_secret.key[0]+=temp;
+ temp = *((u32*)&(net_secret.key[1]));
+ temp >>= 8;
+ last_secret.key[1]+=temp;
+ }
+ hash = siphash_3u32((__force u32)saddr, (__force u32)daddr,
+ (__force u32)sport << 16 | (__force u32)dport,
+ &last_secret);
+ return hash;
+ }
+
+
hash = siphash_3u32((__force u32)saddr, (__force u32)daddr,
(__force u32)sport << 16 | (__force u32)dport,
&net_secret);
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
index 0b980e8..74b2b6a 100644
--- a/net/ipv4/sysctl_net_ipv4.c
+++ b/net/ipv4/sysctl_net_ipv4.c
@@ -479,6 +479,13 @@ static int proc_fib_multipath_hash_policy(struct ctl_table *table, int write,
static struct ctl_table ipv4_table[] = {
{
+ .procname = "tcp_random_isn",
+ .data = &sysctl_tcp_random_isn,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+ .proc_handler = proc_dointvec
+ },
+ {
.procname = "tcp_max_orphans",
.data = &sysctl_tcp_max_orphans,
.maxlen = sizeof(int),
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index c21e8a2..c6b4ebf 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -80,6 +80,7 @@
#include <linux/jump_label_ratelimit.h>
#include <net/busy_poll.h>
+int sysctl_tcp_random_isn __read_mostly = 0;
int sysctl_tcp_max_orphans __read_mostly = NR_FILE;
#define FLAG_DATA 0x01 /* Incoming frame contained data. */
--
2.7.4
next reply other threads:[~2019-09-03 5:06 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-03 5:06 Cyrus Sh [this message]
2019-09-03 7:41 ` [PATCH] Clock-independent TCP ISN generation Eric Dumazet
2019-09-03 15:39 ` Cyrus Sh
2019-09-03 15:59 ` Eric Dumazet
2019-09-03 16:06 ` Cyrus Sh
2019-09-03 16:17 ` Eric Dumazet
2019-09-03 16:27 ` Cyrus Sh
2019-09-03 16:42 ` Eric Dumazet
2019-09-03 22:45 ` David Miller
2019-09-04 0:45 ` Cyrus Sh
2019-09-03 22:43 ` David Miller
2019-09-03 16:12 ` Cyrus Sh
2019-09-03 16:16 ` Eric Dumazet
2019-09-03 7:45 ` kbuild test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=70c41960-6d14-3943-31ca-75598ad3d2d7@gmail.com \
--to=sirus.shahini@gmail.com \
--cc=arnd@arndb.de \
--cc=davem@davemloft.net \
--cc=jgg@ziepe.ca \
--cc=netdev@vger.kernel.org \
--cc=shiraz.saleem@intel.com \
--cc=sirus@cs.utah.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox