[patch] RFC: put server tunnel name in environment
Alex Bligh
alex at alex.org.uk
Wed Sep 23 07:07:31 EST 2009
Peter,
--On 21 September 2009 20:44:56 +0100 Alex Bligh <alex at alex.org.uk> wrote:
>> Alex Bligh wrote:
>>> Trying again, with the patch attached as text/plain
>>
>> The patch seems racy. What if a second tunnel request comes in
>> between the set_tunnel() and get_tunnel() for the first request?
>
> Is it possible to have more than one tunnel request per forked
> child?
I've been thinking some more about this.
I think it depends what you mean by "racy". There is no traditional
code race whereby the allocated string can be freed, as the
code concerned is one single-threaded process (as per the
reasons I explained before).
What can happen is the string could have the wrong content if the following
code flows were to happen:
1. Environment is set up (and interactive / non-interactive setup
launched) before SSH_MSG_CHANNEL_OPEN / tun at openssh.com is received.
Here do_setup_env() is called before server_request_tun(), and
the environment string will be empty.
Firstly, this doesn't happen in practice, at least when openssh
is the client (and the tunnel extension seems to be openssh only),
because the sessions are first sent up, then no-more-sessions comes
in, then the interactive session / whatever launches.
Secondly, once the interactive session is running, clearly its
environment can't be altered by its parent anyway. So if SSH_TUNNEL
is documented as "the tunnel opened prior to the / at the time of
the start of the session", this would be accurate.
2. Multiple calls to server_request_tun() before the call to do_setup_env()
call (i.e. requests to open multiple tunnels).
This can't happen with an openssh client because the client does not
support opening multiple tunnels, even when their IDs are specified.
EG
machine1# ssh -w 0:0 -w 1:1 machine2
will not do what you might have thought. It will in fact only set up
tun1 devices at either end (and not tun0 devices).
Now the protocol definition says:
OpenSSH supports layer 2 and layer 3 tunnelling via the
"tun at openssh.com" channel type. This channel type supports
forwarding of network packets with datagram boundaries intact
between endpoints equipped with interfaces like the BSD tun(4)
device. Tunnel forwarding channels are requested by the client with
the following packet:
It's unclear to me whether that last plural is implying more than one
tunnel can be set up (in theory), or is merely talking in generic terms.
My reading of the code suggests that the server would seem to support
this, but the client doesn't.
One fix for this problem would be merely to describe the environment
variable as "the last tunnel set up prior to the interactive session".
A better approach, I think, would be simply to concatenate tunnel names
onto the string. This would also handle closures, as the client knows
exactly how many tunnels it has successfully opened and closed, and
if the server never removes any from the string, the client can simply
count through open requests to reliably get the ID of the n'th tunnel
that it opened. This would would be a simple change to tun_setname()
in the patch to concatenate, rather than free.
Does that address your raciness concerns?
--
Alex Bligh
More information about the openssh-unix-dev
mailing list