Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Mar 2008 19:44:06 +0100 (CET)
From:      Martin Beran <mb@tns.cz>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   ports/122123: [patch] security/snort not working in inline mode
Message-ID:  <20080326184406.D7AD917042@mb.tns.cz>
Resent-Message-ID: <200803261900.m2QJ01v5020359@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         122123
>Category:       ports
>Synopsis:       [patch] security/snort not working in inline mode
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Mar 26 19:00:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Martin Beran
>Release:        FreeBSD 6.2-RELEASE-p4 i386
>Organization:
Trusted Network Solutions, a. s.
>Environment:
System: FreeBSD mb.tns.cz 6.2-RELEASE-p4 FreeBSD 6.2-RELEASE-p4 #0: Sun Apr 29 22:31:25 CEST 2007 root@mb.tns.cz:/usr/obj/usr/src/sys/MB i386


>Description:
The current security/snort port 
# $FreeBSD: ports/security/snort/Makefile,v 1.91 2007/10/05 01:48:34 clsung Exp $
does not support the inline (IPFW) mode of Snort operation, although the
source code seems to provide it. The alternative port security/snort_inline is
not a good alternative, because it cannot load recent rulesets from
www.snort.org.
The attached patch adds several modification to the port security/snort:
- adds INLINE option to the port configuration
- enables inline IPFW mode via CONFIGURE_ARGS in Makefile
- fixes the configure script to use libnet10-config instead of libnet-config
- fixes handling of termination signals in inline mode (original code
  terminates only after reception of the next packet)
- fixes "reject" action in inline mode (original code fails with SIGSEGV)

It may be necessary to add line:
config checksum_mode: none
to /usr/local/etc/snort/snort.conf, because divert sockets return bad checksums
for outgoing packets (as described in divert(4)).

Note: I managed to run snort in inline mode, but I have not done thorough
testing of it.

>How-To-Repeat:

>Fix:


--- patch.txt begins here ---
diff -ruN snort.orig/Makefile snort/Makefile
--- snort.orig/Makefile	Fri Oct  5 03:48:34 2007
+++ snort/Makefile	Wed Mar 26 11:14:20 2008
@@ -25,7 +25,8 @@
 		MYSQL "Enable MySQL support" off \
 		ODBC "Enable ODBC support" off \
 		POSTGRESQL "Enable PostgreSQL support" off \
-		PRELUDE "Enable Prelude NIDS integration" off
+		PRELUDE "Enable Prelude NIDS integration" off \
+		INLINE "Enable inline operation" on
 
 USE_RC_SUBR=	snort.sh
 SUB_FILES=	pkg-message
@@ -47,6 +48,14 @@
 
 .if ${OSVERSION} < 500036
 EXTRA_PATCHES+=	${FILESDIR}/extra-patch-src-sf_snort_plugin_api.h
+.endif
+
+.if !defined(WITHOUT_INLINE)
+.if defined(WITHOUT_FLEXRESP)
+.undef WITHOUT_FLEXRESP
+.endif
+WITH_FLEXRESP=		yes
+CONFIGURE_ARGS+=        --enable-inline --enable-ipfw
 .endif
 
 .if defined(WITH_FLEXRESP)
diff -ruN snort.orig/files/patch-configure snort/files/patch-configure
--- snort.orig/files/patch-configure	Thu Jan  1 01:00:00 1970
+++ snort/files/patch-configure	Wed Mar 26 11:17:53 2008
@@ -0,0 +1,87 @@
+--- configure.orig	Wed Mar 26 11:04:37 2008
++++ configure	Wed Mar 26 11:15:21 2008
+@@ -24768,8 +24768,8 @@
+    exit 1
+ 
+             fi
+-            CFLAGS="${CFLAGS} `libnet-config --defines` `libnet-config --cflags`"
+-            LIBS="${LIBS} `libnet-config --libs`"
++            CFLAGS="${CFLAGS} `libnet10-config --defines` `libnet10-config --cflags`"
++            LIBS="${LIBS} `libnet10-config --libs`"
+             CPPFLAGS="${CPPFLAGS} -I${LIBNET_INC_DIR}"
+             echo "$as_me:$LINENO: result: $i" >&5
+ echo "${ECHO_T}$i" >&6
+@@ -24793,7 +24793,7 @@
+ # Check whether --enable-flexresp or --disable-flexresp was given.
+ if test "${enable_flexresp+set}" = set; then
+   enableval="$enable_flexresp"
+-   CPPFLAGS="${CPPFLAGS} -DENABLE_RESPONSE `libnet-config --defines --cflags`" LDFLAGS="${LDFLAGS} `libnet-config --libs`"
++   CPPFLAGS="${CPPFLAGS} -DENABLE_RESPONSE `libnet10-config --defines --cflags`" LDFLAGS="${LDFLAGS} `libnet10-config --libs`"
+ fi;
+ 
+ 
+@@ -24804,14 +24804,14 @@
+     exit
+   fi
+ 
+-  if test `libnet-config --cflags | wc -c` = "1"; then
++  if test `libnet10-config --cflags | wc -c` = "1"; then
+     CPPFLAGS="${CPPFLAGS} -I/usr/local/include -I/sw/include"
+     LIBNET_CONFIG_BROKEN_CFLAGS=yes
+   fi
+ 
+-  if test `libnet-config --libs | wc -c` = "1"; then
+-    { echo "$as_me:$LINENO: WARNING: libnet-config --libs is broken on your system.  If you" >&5
+-echo "$as_me: WARNING: libnet-config --libs is broken on your system.  If you" >&2;}
++  if test `libnet10-config --libs | wc -c` = "1"; then
++    { echo "$as_me:$LINENO: WARNING: libnet10-config --libs is broken on your system.  If you" >&5
++echo "$as_me: WARNING: libnet10-config --libs is broken on your system.  If you" >&2;}
+     { echo "$as_me:$LINENO: WARNING: are using a precompiled package please notify the" >&5
+ echo "$as_me: WARNING: are using a precompiled package please notify the" >&2;}
+     { echo "$as_me:$LINENO: WARNING: maintainer." >&5
+@@ -24991,7 +24991,7 @@
+       libnet_dir="/usr/include /usr/local/include /sw/include"
+     fi
+   else
+-    libnet_dir=`libnet-config --cflags | cut -dI -f2`
++    libnet_dir=`libnet10-config --cflags | cut -dI -f2`
+   fi
+ 
+   LIBNET_INC_DIR=""
+@@ -25395,7 +25395,7 @@
+ # Check whether --enable-react or --disable-react was given.
+ if test "${enable_react+set}" = set; then
+   enableval="$enable_react"
+-   CPPFLAGS="${CPPFLAGS} -DENABLE_REACT `libnet-config --defines --cflags`" LDFLAGS="${LDFLAGS} `libnet-config --libs`"
++   CPPFLAGS="${CPPFLAGS} -DENABLE_REACT `libnet10-config --defines --cflags`" LDFLAGS="${LDFLAGS} `libnet10-config --libs`"
+ fi;
+ 
+ 
+@@ -25407,14 +25407,14 @@
+     exit
+   fi
+ 
+-  if test `libnet-config --cflags | wc -c` = "1"; then
++  if test `libnet10-config --cflags | wc -c` = "1"; then
+     CPPFLAGS="${CPPFLAGS} -I/usr/local/include -I/sw/include"
+     LIBNET_CONFIG_BROKEN_CFLAGS=yes
+   fi
+ 
+-  if test `libnet-config --libs | wc -c` = "1"; then
+-    { echo "$as_me:$LINENO: WARNING: libnet-config --libs is broken on your system.  If you" >&5
+-echo "$as_me: WARNING: libnet-config --libs is broken on your system.  If you" >&2;}
++  if test `libnet10-config --libs | wc -c` = "1"; then
++    { echo "$as_me:$LINENO: WARNING: libnet10-config --libs is broken on your system.  If you" >&5
++echo "$as_me: WARNING: libnet10-config --libs is broken on your system.  If you" >&2;}
+     { echo "$as_me:$LINENO: WARNING: are using a precompiled package please notify the" >&5
+ echo "$as_me: WARNING: are using a precompiled package please notify the" >&2;}
+     { echo "$as_me:$LINENO: WARNING: maintainer." >&5
+@@ -25594,7 +25594,7 @@
+       libnet_dir="/usr/include /usr/local/include /sw/include"
+     fi
+   else
+-    libnet_dir=`libnet-config --cflags | cut -dI -f2`
++    libnet_dir=`libnet10-config --cflags | cut -dI -f2`
+   fi
+ 
+   LIBNET_INC_DIR=""
diff -ruN snort.orig/files/patch-inline.c snort/files/patch-inline.c
--- snort.orig/files/patch-inline.c	Thu Jan  1 01:00:00 1970
+++ snort/files/patch-inline.c	Wed Mar 26 18:23:32 2008
@@ -0,0 +1,35 @@
+--- src/inline.c.orig	Wed Mar 26 13:32:12 2008
++++ src/inline.c	Wed Mar 26 13:51:47 2008
+@@ -366,8 +366,12 @@
+ 
+         if (select(32, &fdset, (fd_set *)NULL, (fd_set *)NULL, (struct timeval *)NULL) == -1)
+         {
+-            printf("select failed");
+-            continue;
++	    if (errno == EINTR)
++		sig_check();
++	    else {
++		printf("select failed\n");
++		continue;
++	    }
+         }
+ 
+         if (FD_ISSET(s, &fdset)) 
+@@ -378,7 +382,7 @@
+             {
+                 if (errno != EINTR)
+                 {
+-                     printf("IpfwLoop: read from divert socket failed");
++                     printf("IpfwLoop: read from divert socket failed\n");
+                      continue;
+                 }
+             }
+@@ -396,7 +400,7 @@
+             {
+                 if (sendto(s, pkt, pktlen, 0,(struct sockaddr *)&sin, sinlen) == -1)
+                 {
+-                    printf("IpfwLoop: write to divert socket failed");
++                    printf("IpfwLoop: write to divert socket failed\n");
+                 }
+             }
+          } /* end if */
diff -ruN snort.orig/files/patch-snort.c snort/files/patch-snort.c
--- snort.orig/files/patch-snort.c	Thu Jan  1 01:00:00 1970
+++ snort/files/patch-snort.c	Wed Mar 26 18:24:05 2008
@@ -0,0 +1,18 @@
+--- src/snort.c.orig	Wed Mar 26 18:18:36 2008
++++ src/snort.c	Wed Mar 26 18:18:40 2008
+@@ -825,7 +825,6 @@
+         SnortEventqInit();
+         
+ #ifdef GIDS
+-#ifndef IPFW
+         if (InlineMode())
+         {
+             if (!(pv.test_mode_flag && pv.disable_inline_init_flag))
+@@ -833,7 +832,6 @@
+                 InitInlinePostConfig();
+             }
+         }
+-#endif /* IPFW */
+ #endif /* GIDS */
+     }
+ 
--- patch.txt ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080326184406.D7AD917042>