Possible issue with stdio forwarding

Damien Miller djm at mindrot.org
Fri Jan 29 13:01:08 EST 2010


On Thu, 28 Jan 2010, Iain Morgan wrote:

> Greetings,
> 
> I've been doing a little testing with the stdio forwarding support added
> in recent snapshots and have encountered one possible issue. First, I
> should say that this feature generally seems to work. However, I haven't
> been able to get it to work when connecting to a server running
> SSH.COM's product.
> 
> The config file I am using is fairly simple:
> 
> Host sfe1
> 	LogLevel		debug3
> 
> Host cfe?
> 	ProxyCommand		ssh -W %h:%p sfe1
> 
> Host *
> 	HostbasedAuthentication	no
> 
> If I connect to the bastion, sfe1, and request TCP port forwarding a la
> -L 2122:cfe1:22, I am able to successfully connect to cfe1 via the
> forwarded port. However, if I use stdio forwarding as indicated in the
> config file above, the connection fails.
> 
> Given that the server allows TCP forwarding of the desired port, I had
> expected that stdio forwarding would likewise work. The stdio forwarding
> apporach does work if the intermediate server is running OpenSSH, even a
> somewhat dated version. So I'm suspecting it is a quirk with the SSH.COM
> server.
> 
> Here's the debug3 output from the proxy command attempting to do the
> stdio forwarding.
...
> debug3: client_setup_stdio_fwd cfe1:22
> debug1: channel_connect_stdio_fwd cfe1:22
> debug1: channel 0: new [stdio-forward]
> debug2: fd 4 setting O_NONBLOCK
> debug2: fd 5 setting O_NONBLOCK
> debug1: getpeername failed: Bad file descriptor
> debug1: Entering interactive session.
> debug3: Received SSH2_MSG_IGNORE
> channel 0: open failed: connect failed: No description

I think this is the culprit. From session.c:

  1366  static void
  1367  port_open_helper(Channel *c, char *rtype)
  1368  {
  1369          int direct;
  1370          char buf[1024];
  1371          char *remote_ipaddr = get_peer_ipaddr(c->sock);
  1372          int remote_port = get_peer_port(c->sock);
...
  1386                  packet_start(SSH2_MSG_CHANNEL_OPEN);
  1387                  packet_put_cstring(rtype);
  1388                  packet_put_int(c->self);
  1389                  packet_put_int(c->local_window_max);
  1390                  packet_put_int(c->local_maxpacket);
...
  1400                  /* originator host and port */
  1401                  packet_put_cstring(remote_ipaddr);
  1402                  packet_put_int((u_int)remote_port);
  1403                  packet_send();

get_peer_ipaddr() will return "UNKNOWN" for stdio connections and 
get_peer_port() will return -1. OpenSSH just logs these values (they
are client supplied, so untrustworthy for any serious use), but Tectia
is probably sanity checking them. Could you try this diff?

Index: channels.c
===================================================================
RCS file: /cvs/src/usr.bin/ssh/channels.c,v
retrieving revision 1.302
diff -u -p -r1.302 channels.c
--- channels.c	26 Jan 2010 01:28:35 -0000	1.302
+++ channels.c	29 Jan 2010 01:59:34 -0000
@@ -1371,6 +1371,13 @@ port_open_helper(Channel *c, char *rtype
 	char *remote_ipaddr = get_peer_ipaddr(c->sock);
 	int remote_port = get_peer_port(c->sock);
 
+	if (remote_port == -1) {
+		/* Fake something */
+		xfree(remote_ipaddr);
+		remote_ipaddr = xstrdup("127.0.0.1");
+		remote_port = 1;
+	}
+
 	direct = (strcmp(rtype, "direct-tcpip") == 0);
 
 	snprintf(buf, sizeof buf,

I'm not sure this is the right solution. E.g. it doesn't try to match
the AF of the target forward, but maybe it doesn't matter.

-d


More information about the openssh-unix-dev mailing list