On 4 Apr 2015, at 16:59, Hans Petter Selasky <h...@selasky.org> wrote:

> I think you confuse what I'm trying to explain to you from the responses I 
> get. I'm not talking about putting data into the IP ID field or other IP 
> fields, which then someone at the receiving end picks out and stores. This is 
> well known.
> 
> I'm talking about sampling the IP ID value you get in return from a PING 
> response. A firewall typically has multiple ports. If pinging the gateway 
> from any of these ports cause an increment of a shared IP ID value, then 
> anyone that can ping the common firewall will see the IP ID updates the other 
> parties are doing. This can be used for RX and TX communication. Can you 
> confirm that you understand? I have a feeling we are talking about completely 
> different ways of side channel communication.

I entirely understood, and have entirely understood throughout the thread, what 
you were describing, but you appear to be confused about the terminology. 
Normally, 'covert channel' and 'side channel' are used in the following senses:

A 'covert channel' is a mechanism by which two collaborating (and, arguably, 
colluding) parties are able to communicate data despite it not being an 
intentional communications channel. It is widely recognised that covert 
channels are effectively impossible to eliminate when a resource is shared by 
two potentially colluding parties -- e.g., a common processor, cache, bus, etc. 
A global IP ID counter is a potential covert channel because two parties can 
modulate a signal, with a variable amount of noise, but it's far from the only 
one -- signals can be modulated onto a variety of protocol IDs (e.g., TCP and 
UDP port-number allocation) but also timing information (e.g., ICMP and TCP 
rate limiters that also exist in the stack and can also be used for 
signalling). One particularly neat covert channel, published by Steven Murdoch, 
is using CPU load to trigger clock drift, on which a signal can be modulated 
quite effectively -- albeit slowly -- which will be visible via TCP 
timestamping.

A 'side channel' is a mechanism by which an attacking party (the 'spy') can 
extract information about an (unwilling) target process without their 
collaboration or collusion, despite an assumed isolation policy. It is widely 
recognised that side channels are difficult to eliminate while maintaining 
efficient sharing of an underlying resource -- e.g., a common processor, cache, 
bus, etc -- and almost impossible if the shared medium isn't fully understood. 
The IP ID counter can also be a side channel as it can reveal information about 
the global IP transmission rate of a host, for example. Another recent example 
is that of the cache side-channel attack, in which the effectiveness of process 
isolation is greatly limited by hyperthreaded processors.

During the 1980s and 1990s, covert channels were studied heavily in the 
security literature, especially in the context of secure operating systems. It 
was common to try to both measure the effective bandwidth of covert channels 
(e.g., how fast a signal could be modulated onto CPU utilisation between 'high' 
and 'low' processes in an MLS system). By the early 1990s, it had been 
demonstrated that covert channels were almost impossible to control in practice 
for general-purpose systems, even using very restrictive kernel designs and 
real-time scheduling policies -- today, some systems do effectively accomplish 
this (e.g., MILS systems) but only through very restrictive policies and 
simplistic designs. By the late 1990s, the topic of covert-channel analysis had 
become extremely niche due to broad recognition that trying to solve the 
problem was effectively pointless. The topic has seen some recent resurgence in 
large part because covert channels can be used to attack anonymity systems suc
 h as Tor -- e.g., causing hidden services reached via Tor's overlay network to 
reveal themselves via the Internet.

Where we can limit or close covert channels efficiently, reliably, and without 
disrupting underlying functionality, it doesn't hurt to do so. However, 
limiting covert channels as a primary design concern -- and in particular, 
suggesting that we can do so in a strong way -- is simply setting ourselves up 
for failure, as shown by a long research literature. For the IP ID field, a far 
more pressing problem is to ensure maximum robustness for high packet rates. 
The technique you've proposed -- simple cryptographic randomness of a global 
field -- can substantially damage robustness by reduce the reuse period for IP 
IDs, increasing the chances of data corruption when, for example, using >MTU 
UDP frames at a significant rate. The good news is that addressing that problem 
also reduces the degree to which covert channels can be utilised, since 
maintaining the IP ID at greater 2-tuple granularity reduces the degree to 
which shared channels exist at all. More mature mechanisms can help reduce t
 he reuse period for pseudo-random sequences as well (e.g., dedicating a few 
MSB or LSB to ensuring a minimum reuse period).

As Gleb and I have both pointed out, there are extensive covert channels in the 
design of the TCP/IP protocol suite and its practical implementations, and 
given the 'weakest link' nature of covert channel defence (any channel is 
sufficient), it is wise to be extremely sceptical of claims that these can be 
resolved in a way that provides any benefit at all to our users. A more 
reasonable conclusion is that firewall consumers should not make incorrect 
assumptions about defence against colluding parties, as there are countless 
means of signalling information across a shared resource such as a firewall. 
This is especially true as firewalls are frequently configured to allow 
intentional communication, and almost any type of communication taking place at 
higher layers in the stack will allow signalling at vast bandwidths -- e.g., 
via DNS query content and rates, VPN packet rates, etc.

If you want to make covert-channel prevention a primary design goal if the 
FreeBSD stack, a vast amount of work will be required -- you've spotted just 
one instance of many possible covert channels -- and it's not clear it will 
offer practical benefit nor allow the implementation to be at all efficient -- 
which is far more important to most FreeBSD users. Being alarmist about just 
one of many covert channels has little actual benefit, and is leading you to 
propose design solutions that may substantially damage real network-stack 
functionality. If you want to pursue a goal of covert-channel reduction, you 
need to be far more systematic in analysing the potential channels, rather than 
just hacking on the one you happen to have observed. If you aren't systematic, 
there's actually no benefit to changing the system to address just one channel! 
But, more generally, trying to limit covert channels is something you need to 
seek a broad architectural consensus on from the network-stack develo
 per community, and make a primary review goal for all existing, and all 
future, code. This will mean new coding standards, testing tools, etc. The 
reason I say this is that prior work in this area -- in particular relating to 
trusted-system design as captured in first the Orange Book and later Common 
Criteria Protection Profiles -- has provided clear evidence that this is a 
vastly difficult undertaking, which has been effectively abandoned for all but 
the highest-security of system designs.

Robert
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to