rsync 2.5.1 server - strange logs

Dave Dykstra dwd at bell-labs.com
Sat Jan 12 07:30:03 EST 2002


On Fri, Jan 11, 2002 at 08:14:23AM +0100, Laurent CREPET wrote:
> I've just upgraded my rsync server to 2.5.1 (before, I was using 2.4.6),
> without changing anything in /etc/rsyncd.conf, and now, I have this logs
> each time a client connect to server:
> 
> 2002/01/07 18:33:03 [10432] rsync: reverse name lookup mismatch on fd3 - spoofed address?
> 2002/01/07 18:33:03 [10432] rsync on admin/sbin/padmin_update.sh from UNKNOWN (172.16.65.14)
> 2002/01/07 18:33:03 [10432] wrote 79 bytes  read 88 bytes  total size 1494
> 
> The server configuration has not changed since upgrading to rsync 2.5.1.
> No noticed network configuration problem.


I'm seeing the same problem on Linux 2.2.18 kernel.  Attached are patches
against 2.5.1 and the current CVS that fixes it, although I don't know if
it the best way.  The code was comparing two socket addresses which are
apparently not in the same format somehow; I convert them to IP address
strings and then compare them.  Does anybody have a better way?

- Dave Dykstra
-------------- next part --------------
--- socket.c.O	Fri Jan 11 14:21:10 2002
+++ socket.c	Fri Jan 11 14:25:50 2002
@@ -598,6 +598,8 @@
 	int     length = sizeof(ss);
 	static char name_buf[100];
 	static char port_buf[100];
+	char addr_buf[100];
+	char *clientaddr;
 	char *def = "UNKNOWN";
 	static int initialised;
 	struct addrinfo hints, *res, *res0;
@@ -659,23 +661,24 @@
 		return name_buf;
 	}
 
+	clientaddr = client_addr(fd);
 	/* XXX sin6_flowinfo and other fields */
 	for (res = res0; res; res = res->ai_next) {
 		if (res->ai_family != get_sockaddr_family(&ss))
 			continue;
 		if (res->ai_addrlen != length)
 			continue;
-		if (memcmp(res->ai_addr, &ss, res->ai_addrlen) == 0)
+		getnameinfo(res->ai_addr, res->ai_addrlen,
+			addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST);
+		if (strcmp(clientaddr, addr_buf) == 0)
 			break;
 	}
 
-	/* TODO: Do a  forward lookup as well to prevent spoofing */
-
 	if (res == NULL) {
+		rprintf(FERROR,
+			"reverse+forward lookup for %s (%s) mismatched - spoofed address? \n",
+			clientaddr, name_buf);
 		strcpy(name_buf, def);
-		rprintf(FERROR, RSYNC_NAME ": "
-			"reverse name lookup mismatch on fd%d - spoofed address?\n",
-			fd);
 	}
 
 	freeaddrinfo(res0);
-------------- next part --------------
--- socket.c.O	Fri Jan 11 14:18:20 2002
+++ socket.c	Fri Jan 11 14:24:28 2002
@@ -603,6 +603,8 @@
 	int     length = sizeof(ss);
 	static char name_buf[100];
 	static char port_buf[100];
+	char addr_buf[100];
+	char *clientaddr;
 	char *def = "UNKNOWN";
 	static int initialised;
 	struct addrinfo hints, *res, *res0;
@@ -673,21 +675,24 @@
 		return name_buf;
 	}
 
+	clientaddr = client_addr(fd);
 	/* XXX sin6_flowinfo and other fields */
 	for (res = res0; res; res = res->ai_next) {
 		if (res->ai_family != get_sockaddr_family(&ss))
 			continue;
 		if (res->ai_addrlen != length)
 			continue;
-		if (memcmp(res->ai_addr, &ss, res->ai_addrlen) == 0)
+		getnameinfo(res->ai_addr, res->ai_addrlen,
+			addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST);
+		if (strcmp(clientaddr, addr_buf) == 0)
 			break;
 	}
 
 	if (res == NULL) {
+		rprintf(FERROR,
+			"reverse+forward lookup for %s (%s) mismatched - spoofed address? \n",
+			clientaddr, name_buf);
 		strcpy(name_buf, def);
-		rprintf(FERROR, RSYNC_NAME ": "
-			"reverse name lookup for \"%s\" failed on fd%d - spoofed address? \n",
-			name_buf, fd);
 	}
 
 	freeaddrinfo(res0);


More information about the rsync mailing list