Ticket #4806: 20120823_check_ipv6_tempaddr.patch

File 20120823_check_ipv6_tempaddr.patch, 3.0 KB (added by cypherpunks, 7 years ago)

Enables IPv6 tempaddr checking

  • configure.in

    diff --git a/configure.in b/configure.in
    index 1c342c5..23187b2 100644
    a b AC_CHECK_HEADERS( 
    687687        sys/utime.h \
    688688        sys/wait.h \
    689689        syslog.h \
    690         utime.h
     690        utime.h \
     691        dirent.h
    691692)
    692693
    693694AC_CHECK_HEADERS(sys/param.h)
  • src/or/main.c

    diff --git a/src/or/main.c b/src/or/main.c
    index 20a1e08..d76cb40 100644
    a b  
    6363#include <event2/bufferevent.h>
    6464#endif
    6565
     66#ifdef HAVE_DIRENT_H
     67#include <dirent.h>
     68#endif
     69
    6670void evdns_shutdown(int);
    6771
    6872/********* PROTOTYPES **********/
    do_hup(void) 
    18431847  return 0;
    18441848}
    18451849
     1850#ifndef _WIN32
     1851#ifdef HAVE_DIRENT_H
     1852void
     1853check_ipv6_tempaddr(void)
     1854{
     1855  struct stat buf;
     1856  DIR *dir;
     1857  struct dirent *ent;
     1858
     1859  /* check for proc access */
     1860  if (stat("/proc/sys/net/ipv6", &buf) == -1)
     1861  {
     1862    return; /* no ipv6 enabled, or no proc fs */
     1863  }
     1864
     1865  /* then we check the interfaces */
     1866  dir = opendir("/proc/sys/net/ipv6/conf");
     1867  if (dir == NULL)
     1868  {
     1869    log_warn(LD_GENERAL, "Could not open /proc/sys/net/ipv6/conf");
     1870    return;
     1871  }
     1872
     1873  while((ent = readdir(dir)) != NULL)
     1874  {
     1875     char fname[1024] = {0};
     1876     if (ent->d_name[0] == '.') continue;
     1877     if (!strncmp(ent->d_name, "all", 3) || /* not an interface */
     1878         !strncmp(ent->d_name, "default", 7) || /* not an interface */
     1879         !strncmp(ent->d_name, "lo", 2)) continue;  /* localhost is not outbound */
     1880
     1881     snprintf(fname, sizeof fname, "%s/%s", "/proc/sys/net/ipv6/conf", ent->d_name);
     1882     if (stat(fname, &buf) == 0)
     1883     {
     1884       if (!S_ISDIR(buf.st_mode)) continue; /* not a directory */
     1885     }
     1886     else
     1887     {
     1888       continue; /* not accessible */
     1889     }
     1890     snprintf(fname, sizeof fname, "%s/%s/use_tempaddr", "/proc/sys/net/ipv6/conf", ent->d_name);
     1891     if (stat(fname, &buf) == 0)
     1892     {
     1893        int state;
     1894        FILE *f;
     1895        /* read the value */
     1896        f = fopen(fname, "r");
     1897        if ( f == NULL )
     1898        {
     1899           log_warn(LD_GENERAL, "Cannot check use_tempaddr for interface %s", ent->d_name);
     1900        }
     1901        state = 0;
     1902        if (fscanf(f, "%d", &state) == 1)
     1903        {
     1904           if (state != 2)
     1905           {
     1906             log_warn(LD_GENERAL, "Interface %s might expose your MAC address to world, you can fix this with sysctl -p net.ipv6.conf.%s.use_tempaddr=2", ent->d_name, ent->d_name);
     1907           }
     1908        }
     1909        else
     1910        {
     1911            log_warn(LD_GENERAL, "Cannot check use_tempaddr for interface %s", ent->d_name);
     1912        }
     1913        fclose(f);
     1914     }
     1915  }
     1916  closedir(dir);
     1917}
     1918#endif
     1919#endif
     1920
    18461921/** Tor main loop. */
    18471922/* static */ int
    18481923do_main_loop(void)
    do_main_loop(void) 
    18501925  int loop_result;
    18511926  time_t now;
    18521927
     1928#ifndef _WIN32
     1929#ifdef HAVE_DIRENT_H
     1930  /* check for IPv6 tempaddr use */
     1931  check_ipv6_tempaddr();
     1932#endif
     1933#endif
     1934
    18531935  /* initialize dns resolve map, spawn workers if needed */
    18541936  if (dns_init() < 0) {
    18551937    if (get_options()->ServerDNSAllowBrokenConfig)