Changeset 511 for trunk


Ignore:
Timestamp:
Oct 15, 2016, 10:00:38 PM (8 years ago)
Author:
katerina
Message:

New option PortCheckDevice =... (ticket #404).

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/config.h.in

    r491 r511  
    606606/* Define to 1 if you have the `hasmntopt' function. */
    607607#undef HAVE_HASMNTOPT
     608
     609/* Define to 1 if you have the <ifaddrs.h> header file. */
     610#undef HAVE_IFADDRS_H
    608611
    609612/* Define to 1 if you have the `inet_aton' function. */
  • trunk/configure.ac

    r509 r511  
    1212dnl start
    1313dnl
    14 AM_INIT_AUTOMAKE(samhain, 4.1.5)
     14AM_INIT_AUTOMAKE(samhain, 4.1.6)
    1515AC_DEFINE([SAMHAIN], 1, [Application is samhain])
    1616AC_CANONICAL_HOST
     
    245245        sys/mman.h sys/param.h sys/inotify.h \
    246246        sys/vfs.h mntent.h \
    247         sys/select.h sys/socket.h netinet/in.h \
     247        sys/select.h sys/socket.h netinet/in.h ifaddrs.h \
    248248        regex.h glob.h fnmatch.h \
    249249        linux/ext2_fs.h linux/fs.h ext2fs/ext2_fs.h asm/segment.h \
  • trunk/docs/Changelog

    r509 r511  
     14.1.6:
     2        * add portcheck option 'PortCheckDevice = device' to monitor a
     3        device regardless of address assigned to it (patch by Anton H., plus
     4        some additions)
     5        * fix case sensitivity of severity/class options (issue raised by
     6        Anton H.).
     7        * clarify restrictions for ProcessCheckPSArg (user manual)
     8
    194.1.5:
    210        * fix memory leak in server (reported by C. Doerr).
  • trunk/src/samhain.c

    r496 r511  
    13751375      else
    13761376        {
    1377           sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_MOD_OK,
     1377          sh_error_handle ((-1), FIL__, __LINE__, status, MSG_MOD_OK,
    13781378                           _(modList[modnum].name));
    13791379          modList[modnum].initval = status;
  • trunk/src/sh_portcheck.c

    r498 r511  
    3333#include <stdio.h>
    3434#include <string.h>
     35#include <stdlib.h>
    3536#include <sys/types.h>
    3637#include <sys/socket.h>
    3738#include <netinet/in.h>
    3839#include <arpa/inet.h>
     40#ifdef HAVE_IFADDRS_H
     41#include <ifaddrs.h>
     42#include <netdb.h>
     43#endif
    3944#include <errno.h>
    4045#include <unistd.h>
     
    182187static int sh_portchk_add_interface (const char * str);
    183188
     189#if defined(HAVE_IFADDRS_H)
     190/* Exported interface to add an ethernet device
     191 */
     192static int sh_portchk_add_device (const char * str);
     193#endif
     194
    184195/* verify whether port/interface is blacklisted (do not check)
    185196 */
     
    286297        sh_portchk_set_active,
    287298    },
     299#if defined(HAVE_IFADDRS_H)
     300    {
     301        N_("portcheckdevice"),
     302        sh_portchk_add_device,
     303    },
     304#endif
    288305    {
    289306        N_("portcheckinterface"),
     
    11191136 */
    11201137
    1121 #define SH_IFACE_MAX 16
     1138#define SH_IFACE_MAX 64
     1139#define SH_IFACE_ADDR 0
     1140#define SH_IFACE_DEV  1
    11221141
    11231142struct portchk_interfaces {
    1124   struct sh_sockaddr iface[SH_IFACE_MAX];
    1125   int            used;
     1143  struct sh_sockaddr iface;
     1144  int            type;
    11261145};
    11271146
    1128 static struct portchk_interfaces iface_list;
     1147static struct portchk_interfaces iface_list[SH_IFACE_MAX];
     1148static int iface_list_used   = 0;
    11291149static int iface_initialized = 0;
    11301150
     
    11591179  if (iface_initialized == 0)
    11601180    {
    1161       iface_list.used   = 0;
     1181      iface_list_used   = 0;
    11621182      iface_initialized = 1;
    11631183    }
     
    11671187  hent = sh_gethostbyname(portchk_hostname);
    11681188  i = 0;
    1169   while (hent && hent->h_addr_list[i] && (iface_list.used < SH_IFACE_MAX))
     1189  while (hent && hent->h_addr_list[i] && (iface_list_used < SH_IFACE_MAX))
    11701190    {
    11711191      struct sockaddr_in sin;
     
    11751195      sh_ipvx_save(&iface_tmp, AF_INET, (struct sockaddr *)&sin);
    11761196
    1177       for (j = 0; j < iface_list.used; ++j)
    1178         {
    1179           if (0 == sh_ipvx_cmp(&iface_tmp, &(iface_list.iface[j])))
     1197      for (j = 0; j < iface_list_used; ++j)
     1198        {
     1199          if (0 == sh_ipvx_cmp(&iface_tmp, &(iface_list[j].iface)))
    11801200            {
    11811201              goto next_iface;
     
    11831203        }
    11841204
    1185       sh_ipvx_save(&(iface_list.iface[iface_list.used]),
     1205      sh_ipvx_save(&(iface_list[iface_list_used].iface),
    11861206                   AF_INET, (struct sockaddr *)&sin);
     1207      iface_list[iface_list_used].type = SH_IFACE_ADDR;
    11871208     
    11881209      if (portchk_debug)
    11891210        {
    11901211          char buf[256];
    1191           sh_ipvx_ntoa(buf, sizeof(buf), &(iface_list.iface[iface_list.used]));
     1212          sh_ipvx_ntoa(buf, sizeof(buf), &(iface_list[iface_list_used].iface));
    11921213          fprintf(stderr, _("added interface[%d]: %s\n"), i, buf);
    11931214        }
    1194       ++iface_list.used;
     1215      ++iface_list_used;
    11951216
    11961217    next_iface:
     
    12081229      struct sh_sockaddr iface_tmp;
    12091230
    1210       while ((p != NULL) && (iface_list.used < SH_IFACE_MAX))
     1231      while ((p != NULL) && (iface_list_used < SH_IFACE_MAX))
    12111232        {
    12121233          sh_ipvx_save(&iface_tmp, p->ai_family, p->ai_addr);
    12131234
    1214           for (j = 0; j < iface_list.used; ++j)
     1235          for (j = 0; j < iface_list_used; ++j)
    12151236            {
    12161237              if (portchk_debug)
    12171238                {
    12181239                  char buf1[256], buf2[256];
    1219                   sh_ipvx_ntoa(buf1, sizeof(buf1), &(iface_list.iface[j]));
     1240                  sh_ipvx_ntoa(buf1, sizeof(buf1), &(iface_list[j].iface));
    12201241                  sh_ipvx_ntoa(buf2, sizeof(buf2), &iface_tmp);
    12211242                  fprintf(stderr, _("check interface[%d]: %s vs %s\n"), j, buf1, buf2);
    12221243                }
    1223               if (0 == sh_ipvx_cmp(&iface_tmp, &(iface_list.iface[j])))
     1244              if (0 == sh_ipvx_cmp(&iface_tmp, &(iface_list[j].iface)))
    12241245                {
    12251246                  if (portchk_debug)
     
    12281249                }
    12291250            }
    1230           sh_ipvx_save(&(iface_list.iface[iface_list.used]),
     1251          sh_ipvx_save(&(iface_list[iface_list_used].iface),
    12311252                       p->ai_family, p->ai_addr);
    1232 
     1253          iface_list[iface_list_used].type = SH_IFACE_ADDR;
    12331254          if (portchk_debug)
    12341255            {
    12351256              char buf[256];
    1236               sh_ipvx_ntoa(buf, sizeof(buf), &(iface_list.iface[iface_list.used]));
    1237               fprintf(stderr, _("added interface[%d]: %s\n"), iface_list.used, buf);
     1257              sh_ipvx_ntoa(buf, sizeof(buf), &(iface_list[iface_list_used].iface));
     1258              fprintf(stderr, _("added interface[%d]: %s\n"), iface_list_used, buf);
    12381259            }
    12391260
    1240           ++iface_list.used;
     1261          ++iface_list_used;
    12411262
    12421263        next_iface:
     
    12471268#endif
    12481269
    1249   for (i = 0; i < iface_list.used; ++i)
    1250     {
    1251       sh_ipvx_ntoa(ipbuf, sizeof(ipbuf), &(iface_list.iface[i]));
     1270  for (i = 0; i < iface_list_used; ++i)
     1271    {
     1272      sh_ipvx_ntoa(ipbuf, sizeof(ipbuf), &(iface_list[i].iface));
    12521273      sl_snprintf(errbuf, sizeof(errbuf), _("added interface: %s"), ipbuf);
    12531274
     
    12851306           (sh.flag.isdaemon == S_TRUE || sh.flag.loop == S_TRUE))
    12861307    {
     1308      (void) sh_portchk_init_internal();
    12871309      return SH_MOD_THREAD;
    12881310    }
     
    12911313}
    12921314
    1293 
     1315static void dev_list_kill();
    12941316
    12951317#if !defined(TEST_ONLY)
     
    13051327  sh_portchk_maxport = -1;
    13061328
     1329  dev_list_kill();
     1330 
    13071331  portlist_udp = sh_portchk_kill_list (portlist_udp);
    13081332  portlist_tcp = sh_portchk_kill_list (portlist_tcp);
     
    13451369  /* Check all interfaces for this host
    13461370   */
    1347   while (i < iface_list.used)
    1348     {
    1349       memcpy(&paddr, &(iface_list.iface[i]), sizeof(paddr));
     1371  while (i < iface_list_used)
     1372    {
     1373      memcpy(&paddr, &(iface_list[i].iface), sizeof(paddr));
    13501374
    13511375      if (paddr.ss_family != domain)
     
    15771601void * sh_dummy_1564_str    = NULL; /* fix clobbered by.. warning */
    15781602
    1579 static int sh_portchk_add_interface (const char * str)
     1603static int sh_portchk_add_interface_int (const char * str, int type)
    15801604{
    15811605  struct sh_sockaddr saddr;
     
    15871611  if (iface_initialized == 0)
    15881612    {
    1589       iface_list.used   = 0;
     1613      iface_list_used   = 0;
    15901614      iface_initialized = 1;
    15911615    }
     
    16091633          return -1;
    16101634
    1611         if (iface_list.used == SH_IFACE_MAX)
     1635        if (iface_list_used == SH_IFACE_MAX)
    16121636          return -1;
    16131637
     
    16191643        SH_MUTEX_UNLOCK(mutex_thread_nolog);
    16201644       
    1621         memcpy (&(iface_list.iface[iface_list.used]), &(saddr), sizeof(saddr));
    1622         ++iface_list.used;
     1645        memcpy (&(iface_list[iface_list_used].iface), &(saddr), sizeof(saddr));
     1646        iface_list[iface_list_used].type = type;
     1647        ++iface_list_used;
    16231648      }
    16241649  } while (*str);
     
    16271652  return 0;
    16281653}
     1654
     1655static int sh_portchk_add_interface (const char * str)
     1656{
     1657  return sh_portchk_add_interface_int (str, SH_IFACE_ADDR);
     1658}
     1659
     1660#if defined(HAVE_IFADDRS_H)
     1661/*
     1662 * subroutines to add a device
     1663 */
     1664void * sh_dummy_1651_ifa    = NULL; /* fix clobbered by.. warning */
     1665
     1666static int portchk_add_device_int (const char * buf)
     1667{
     1668  struct ifaddrs *ifaddr, *ifa;
     1669  int family;
     1670#ifndef NI_MAXHOST
     1671#define NI_MAXHOST 1025
     1672#endif
     1673  char host[NI_MAXHOST];
     1674
     1675  sh_dummy_1651_ifa = (void*) &ifa;
     1676 
     1677  if (getifaddrs(&ifaddr) == -1)
     1678    {
     1679      volatile int nerr = errno;
     1680      char errbuf[SH_ERRBUF_SIZE];
     1681      sh_error_message(errno, errbuf, sizeof(errbuf));
     1682      SH_MUTEX_LOCK(mutex_thread_nolog);
     1683      sh_error_handle((-1), FIL__, __LINE__, nerr, MSG_E_SUBGEN,
     1684                      errbuf, _("getifaddrs"));
     1685      SH_MUTEX_UNLOCK(mutex_thread_nolog);
     1686      return -1;
     1687    }
     1688
     1689  for ( ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
     1690    {
     1691      if (ifa->ifa_addr == NULL)
     1692        continue;
     1693     
     1694      if (strcmp(ifa->ifa_name, buf) == 0)
     1695        {
     1696          volatile int s = 0;
     1697          family = ifa->ifa_addr->sa_family;
     1698         
     1699          if (family == AF_INET)
     1700            {
     1701              s = getnameinfo( ifa->ifa_addr, sizeof(struct sockaddr_in),
     1702                               host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST );
     1703             
     1704              if (s == 0)
     1705                {
     1706                  if (sh_portchk_add_interface_int(host, SH_IFACE_DEV) < 0)
     1707                    {
     1708                      freeifaddrs(ifaddr);
     1709                      return -1;
     1710                    }
     1711                }
     1712            }
     1713         
     1714#if defined(USE_IPVX)
     1715          if (family == AF_INET6)
     1716            {
     1717              s = getnameinfo( ifa->ifa_addr, sizeof(struct sockaddr_in6),
     1718                               host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST );
     1719             
     1720              if (s == 0)
     1721                {
     1722                  if (sh_portchk_add_interface_int(host, SH_IFACE_DEV) < 0)
     1723                    {
     1724                      freeifaddrs(ifaddr);
     1725                      return -1;
     1726                    }
     1727                }
     1728            }
     1729#endif
     1730         
     1731          if (s != 0)
     1732            {
     1733              char errbuf[SH_ERRBUF_SIZE];
     1734              sl_strlcpy(errbuf, buf,             sizeof(errbuf));
     1735              sl_strlcat(errbuf, ": ",            sizeof(errbuf));
     1736              sl_strlcat(errbuf, gai_strerror(s), sizeof(errbuf));
     1737              SH_MUTEX_LOCK(mutex_thread_nolog);
     1738              sh_error_handle((-1), FIL__, __LINE__, s, MSG_E_SUBGEN,
     1739                              errbuf, _("getnameinfo"));
     1740              SH_MUTEX_UNLOCK(mutex_thread_nolog);
     1741            }
     1742         
     1743        }
     1744    }
     1745
     1746  freeifaddrs(ifaddr);
     1747  return 0;
     1748}
     1749
     1750struct added_dev {
     1751  char dev[64];
     1752  struct added_dev * next;
     1753};
     1754
     1755static struct added_dev * dev_list = NULL;
     1756
     1757static void dev_list_add (char * buf)
     1758{
     1759  struct added_dev * new = SH_ALLOC(sizeof(struct added_dev));
     1760  sl_strlcpy(new->dev, buf, 64);
     1761  new->next = dev_list;
     1762  dev_list  = new;
     1763  return;
     1764}
     1765
     1766static void dev_list_kill ()
     1767{
     1768  struct added_dev * old;
     1769  struct added_dev * new = dev_list;
     1770  dev_list = NULL;
     1771
     1772  while (new)
     1773    {
     1774      old = new;
     1775      new = new->next;
     1776      SH_FREE(old);
     1777    }
     1778  return;
     1779}
     1780 
     1781static int sh_portchk_add_device (const char * str)
     1782{
     1783  char buf[64];
     1784               
     1785  do {
     1786
     1787    while (*str == ',' || *str == ' ' || *str == '\t') ++str;
     1788
     1789    if (*str)
     1790      {
     1791        unsigned int i = 0;
     1792        while (*str && i < (sizeof(buf)-1) &&
     1793               *str != ',' && *str != ' ' && *str != '\t') {
     1794          buf[i] = *str; ++str; ++i;
     1795        }
     1796        buf[i] = '\0';
     1797       
     1798        if (portchk_add_device_int (buf) < 0)
     1799          return -1;
     1800       
     1801        dev_list_add(buf);
     1802      }
     1803  } while (*str);
     1804
     1805  return 0;
     1806}
     1807
     1808static int iface_comp (const void *a, const void *b)
     1809{
     1810  const struct portchk_interfaces * aa = (struct portchk_interfaces *) a;
     1811  const struct portchk_interfaces * bb = (struct portchk_interfaces *) b;
     1812  return (aa->type - bb->type);
     1813}
     1814
     1815static void iface_qsort()
     1816{
     1817  qsort(&iface_list[0], iface_list_used, sizeof(struct portchk_interfaces),
     1818        iface_comp);
     1819  return;
     1820}
     1821
     1822static void recheck_devices()
     1823{
     1824  if (dev_list)
     1825    {
     1826      struct added_dev * dev = dev_list;
     1827      int i, j;
     1828
     1829      if (portchk_debug)
     1830        {
     1831          for (j = 0; j < iface_list_used; ++j)
     1832            {
     1833              char buf[SH_IP_BUF];
     1834              struct portchk_interfaces * aa = &(iface_list[j]);
     1835              sh_ipvx_ntoa(buf, sizeof(buf), &(aa->iface));
     1836              fprintf(stderr, _("presort: iface[%d] type(%d) %s\n"), j, iface_list[j].type, buf);
     1837            }
     1838        }
     1839
     1840      iface_qsort();
     1841     
     1842      if (portchk_debug)
     1843        {
     1844          for (j = 0; j < iface_list_used; ++j)
     1845            {
     1846              char buf[SH_IP_BUF];
     1847              struct portchk_interfaces * aa = &(iface_list[j]);
     1848              sh_ipvx_ntoa(buf, sizeof(buf), &(aa->iface));
     1849              fprintf(stderr, _("postsor: iface[%d] type(%d) %s\n"), j, iface_list[j].type, buf);
     1850            }
     1851        }
     1852
     1853      i = 0;
     1854      for (j = 0; j < iface_list_used; ++j)
     1855        if (iface_list[j].type == SH_IFACE_DEV) ++i;
     1856      iface_list_used -= i;
     1857
     1858      if (portchk_debug)
     1859        {
     1860          for (j = 0; j < iface_list_used; ++j)
     1861            {
     1862              char buf[SH_IP_BUF];
     1863              struct portchk_interfaces * aa = &(iface_list[j]);
     1864              sh_ipvx_ntoa(buf, sizeof(buf), &(aa->iface));
     1865              fprintf(stderr, _("postdel: iface[%d] type(%d) %s\n"), j, iface_list[j].type, buf);
     1866            }
     1867        }
     1868
     1869      while (dev)
     1870        {
     1871          portchk_add_device_int (dev->dev);
     1872          dev = dev->next;
     1873        }
     1874    }
     1875  return;
     1876}
     1877#endif
    16291878
    16301879/* verify whether port/interface is blacklisted (do not check)
     
    19282177
    19292178      sh_portchk_reset_lists();
     2179
     2180#if defined(HAVE_IFADDRS_H)
     2181      recheck_devices();
     2182#endif
     2183
    19302184      if ((0 != geteuid()) && (min_port < 1024))
    19312185        {
Note: See TracChangeset for help on using the changeset viewer.