added DNS spoofing test to host access control
authorAndrew Tridgell <tridge@samba.org>
Wed, 20 May 1998 00:20:12 +0000 (00:20 +0000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 20 May 1998 00:20:12 +0000 (00:20 +0000)
socket.c

index 910c2dc..acf7a1b 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -327,8 +327,10 @@ char *client_name(int fd)
        int     length = sizeof(sa);
        static char name_buf[100];
        struct hostent *hp;
+       char **p;
+       char *def = "UNKNOWN";
 
-       strcpy(name_buf,"UNKNOWN");
+       strcpy(name_buf,def);
 
        if (getpeername(fd, &sa, &length)) {
                exit_cleanup(1);
@@ -341,5 +343,23 @@ char *client_name(int fd)
                strlcpy(name_buf,(char *)hp->h_name,sizeof(name_buf) - 1);
        }
 
+
+       /* do a forward lookup as well to prevent spoofing */
+       hp = gethostbyname(name_buf);
+       if (!hp) {
+               strcpy(name_buf,def);
+               rprintf(FERROR,"reverse name lookup failed\n");
+       } else {
+               for (p=hp->h_addr_list;*p;p++) {
+                       if (memcmp(*p, &sockin->sin_addr, hp->h_length) == 0) {
+                               break;
+                       }
+               }
+               if (!*p) {
+                       strcpy(name_buf,def);
+                       rprintf(FERROR,"reverse name lookup mismatch - spoofed address?\n");
+               } 
+       }
+
        return name_buf;
 }