LRN <lrn1986 <at> gmail.com>
2012-11-24 12:56:43 GMT
This is the idea that i've been thinking on.
It should be possible for GNUnet node operator to hide the fact that
his machine runs a GNUnet node.
Ways to achieve this:
1) Fake HELLO messages.
AFAIU, right now anyone can collect HELLO messages (by running a node,
or by querying a hostlist server), and then claim (with certain degree
of sureness) that GNUnet nodes run on all addresses listed in these
messages. Companies that track torrent users do this for BitTorrent.
They may then proceed to actually connect to listed addresses to
verify them, but that is quite another story.
The solution is to spread fake HELLOs with fake public keys and fake
A node should use its private key (key K) as a seed to generate a set
fake of addresses (set A). Then use K and A themselves to generate
fake public key (key F) for each A, thus getting a complete HELLO
message. The use of K as a seed ensures that the node will keep lying
about the same set of addresses (how large that set should be is an
open question) with the same keys, making the fakes more believable
(observer might think that these are real nodes, maintaining their
real HELLOs over time; failure to validate any of them might be blamed
on firewalls, etc).
Address sets will intersect (A1 and A2 generated from K1 and K2 may
share some elements), obviously, although that might not be true for
I expect that address generator will apply some rules to generate
believable addresses (i.e. don't generate invalid IP addresses, like
As an extra, a node could validate generated addresses and do
non-agressive portscanning (or something similar - we're not speaking
only of tcp) on them, to be able to add ports (or other parts of the
address) that look believable to observers.
AFAIU, right now nodes won't gossip about fake HELLOs (i.e. a node
will never tell another node about a HELLO it got, unless it validated
that HELLO). That might need to be changed to allow nodes to choose a
random subset of invalid HELLOs and gossip about them as well.
Otherwise only the node that generated them will be able to spread them.
Not sure about hostlists.
Extra yummy feature - add user-configurable fake templates, which
could have addresses only, or addresses and private keys. GNUnet node
will use templates from time to time (configurable) instead of
generated addresses, and will generate missing template elements.
It would be neat to be able to tell the world that 126.96.36.199 
runs a GNUnet http_server transport on port 80...
2) Transport disguise.
Modify the protocol to allow clients to ignore initial data sent by
the server, and require clients to be the first ones to speak GNUnet
protocol after connecting (i'm not sure how the protocol works right
now; what a GNUnet node sends to the connected party immediately after
accepting an incoming connection? Does it send anything at all?).
A node should send fake data that looks like, say, FTP greeting,
faking a real-life FTP server.
This will prevent casual observers from identifying the node as GNUnet
Non-casual observer should not follow the fake protocol, but proceed
to send a normal GNUnet handshake.
If the node doesn't get a GNUnet handshake as a reply to its fake
greeting, it might either drop the connection, or use some kind of
bogus access control error as an excuse to drop it (i.e. ask for ftp
login/password combo, and then reject all such combos and drop
"clients" that failed to "authenticate" this way).
Or a node should simply remain silent until it gets incoming handshake
3) Handshake-first protocol
Besides (2), which may or may not be implemented, don't identify
yourself as GNUnet node until incoming peer sends a handshake, then
drop it, if it doesn't match one of your friends, if you're running in
F2F-only mode. You will be able to hide the fact that you're a GNUnet
node, since only friends will get _anything_ out of you. Other
non-friend (normal or malicious) GNUnet clients will have their
connections dropped after their handshake message.
To make it work both ways, GNUnet should establish a generic session
with TLS encryption first. Again, it's not uncommon for services to
have ports on which clients are expected to connect with an SSL/TLS
session (instead of connecting normally and then issuing StartTLS).
The point here is to use common TLS certificates and TLS connections
for initial authentication (friend nodes will know TLS certificates of
each other in advance). Otherwise your node will not be able to
connect to any of your friends without revealing that it's a GNUnet
node (friend won't identify itself as a GNUnet node initially, until
you send a handshake, thus preventing you from verifying that you've
connected to your friend, not to some man in the middle; and if you
send a GNUnet handshake, you will reveal yourself as GNUnet node to
the other end of the connection, not knowing who might be there). TLS
allows authentication without revealing that nodes are using GNUnet.
And using TLS itself is, thankfully, not illegal yet (and, hopefully,
will never be).
This will have to be a separate transport, since
A) that is somewhat incompatible with existing tcp transport, which
does not rely in TLS at all, AFAIK.
B) Your friend might not be running in F2F-mode only, in which case
you will reveal that you run GNUnet by connecting to your friend on
the same port that other nodes connect to. If there's a separate port,
which only accepts TLSed sessions, and only accepts known friends on
them (at TLS level), it will be much more difficult for non-friends to
identify you. If you make a TLS connection on port A to a machine that
_also_ runs GNUnet on port B, that will not immediately prove that you
are running GNUnet in F2F-only mode.
We already discussed (3) in the past, AFAIR, just making sure that
this discussion sticks somewhere.
 That's what microsoft.com resolves to, for me.