Ethereal-dev: Re: [Ethereal-dev] Patch for Linux Capabilities
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Emanuele Caratti <wiz@xxxxxxxxx>
Date: Sat, 1 Nov 2003 16:33:51 +0100
On Wed, Oct 29, 2003 at 06:24:35PM -0800, Guy Harris wrote: > >On the todo list I've to change drop_priv to use the libcap packaged > >instead of capget/capset.. > > ...and update the configure scripts so that it'll automatically figure > out whether to use the capability bits - "config.h" and "Makefile" are > files generated by the configure script. Ok... Now I've a patch also for configure.in and Makefile.am. The capability support is by default off. If enabled, via configure command line --enable-linux-capab, the sys/capability.h must exist. The capab.c now use the library libcap, so it not tied to a specific kernel. If needed I can put back the code to use the non portable capset/capget, and add a configure switch or something similar.... ....comments are welcome! :) -- Ciao, Emanuele
Index: configure.in =================================================================== RCS file: /usr/src/build/cvsroot/ethereal/configure.in,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.2.3 diff -u -u -r1.1.1.1 -r1.1.1.1.2.3 --- configure.in 8 Sep 2003 03:13:14 -0000 1.1.1.1 +++ configure.in 1 Nov 2003 15:07:46 -0000 1.1.1.1.2.3 @@ -525,6 +525,26 @@ AM_CONDITIONAL(SETUID_INSTALL, test x$enable_setuid_install = xyes) +dnl Linux Capabilities +AC_ARG_ENABLE(linux-capab, +[ --enable-linux-capab [default=no (Needs libcap!)]],enable_linux_capab=$enableval,enable_linux_capab=no) + +AC_MSG_CHECKING(whether to use linux capability ) +if test "x$enable_linux_capab" = "xno" ; then + AC_MSG_RESULT(no) +else + AC_MSG_RESULT(yes) + AC_CHECK_HEADERS(sys/capability.h) + if test "x$ac_cv_header_sys_capability_h" = "xyes" ; then + AC_DEFINE(ENABLE_LINUX_CAPABILITIES, 1, [Define to use Linux Capabilities ] ) + LIBS="$LIBS -lcap" + else + enable_linux_capab=no + fi +fi +AM_CONDITIONAL(ENABLE_LINUX_CAPABILITIES, test x$enable_linux_capab = xyes) + + dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(fcntl.h sys/ioctl.h sys/time.h unistd.h stdarg.h netdb.h) @@ -853,6 +873,7 @@ echo " Build dftest : $enable_dftest" echo "" echo " Install setuid : $setuid_message" +echo " Linux capabilities: $enable_linux_capab" echo " Use plugins : $have_plugins" echo " Use GTK+ v2 library : $enable_gtk2" if test "x$enable_gtk2" = "xyes" ; then Index: Makefile.am =================================================================== RCS file: /usr/src/build/cvsroot/ethereal/Makefile.am,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.2.1 diff -u -u -r1.1.1.1 -r1.1.1.1.2.1 --- Makefile.am 6 Sep 2003 23:22:34 -0000 1.1.1.1 +++ Makefile.am 1 Nov 2003 08:26:50 -0000 1.1.1.1.2.1 @@ -806,6 +806,10 @@ summary.h \ ui_util.h +if ENABLE_LINUX_CAPABILITIES +ethereal_SOURCES+= capab.c +endif + EXTRA_ethereal_SOURCES = \ snprintf.c \ snprintf.h \ @@ -888,6 +892,10 @@ tethereal-tap-register.c \ register.c \ tethereal.c + +if ENABLE_LINUX_CAPABILITIES +tethereal_SOURCES+= capab.c +endif # Additional libs that I know how to build. These will be # linked into the tethereal executable. Index: tethereal.c =================================================================== RCS file: /usr/src/build/cvsroot/ethereal/tethereal.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.2.1 diff -u -u -r1.1.1.1 -r1.1.1.1.2.1 --- tethereal.c 8 Sep 2003 03:11:33 -0000 1.1.1.1 +++ tethereal.c 1 Nov 2003 08:26:51 -0000 1.1.1.1.2.1 @@ -68,6 +68,10 @@ #include "getopt.h" #endif +#ifdef ENABLE_LINUX_CAPABILITIES +void drop_priv(); +#endif + #include <glib.h> #include <epan/epan.h> #include <epan/filesystem.h> @@ -798,6 +802,9 @@ char badopt; ethereal_tap_list *tli; +#ifdef ENABLE_LINUX_CAPABILITIES + drop_priv(); +#endif /* Register all dissectors; we must do this before checking for the "-G" flag, as the "-G" flag dumps information registered by the dissectors, and we must do it before we read the preferences, in Index: gtk/main.c =================================================================== RCS file: /usr/src/build/cvsroot/ethereal/gtk/main.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.2.1 diff -u -u -r1.1.1.1 -r1.1.1.1.2.1 --- gtk/main.c 5 Sep 2003 02:10:25 -0000 1.1.1.1 +++ gtk/main.c 1 Nov 2003 08:26:55 -0000 1.1.1.1.2.1 @@ -68,6 +68,10 @@ #include "getopt.h" #endif +#ifdef ENABLE_LINUX_CAPABILITIES +void drop_priv(); +#endif + #ifdef WIN32 /* Needed for console I/O */ #include <fcntl.h> #include <conio.h> @@ -1546,6 +1550,9 @@ char optstring[sizeof(OPTSTRING_INIT) + sizeof(OPTSTRING_CHILD) - 1] = OPTSTRING_INIT; +#ifdef ENABLE_LINUX_CAPABILITIES + drop_priv(); +#endif ethereal_path = argv[0]; #ifdef WIN32
/* capab.c * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/capability.h> #include <sys/prctl.h> /* #define DEBUG_CAPABILITIES */ #ifdef DEBUG_CAPABILITIES struct _cap_struct { struct __user_cap_header_struct head; struct __user_cap_data_struct set; }; void debug_print_priv(char *text) { cap_t cap; struct _cap_struct *c; char *s; int p; int uid,euid,suid; int gid,egid,sgid; getresuid( &uid, &euid, &suid ); getresgid( &gid, &egid, &sgid ); printf("===\n%s\n",text); if( (cap = cap_get_proc()) == NULL ) { perror("cap_get_proc():"); exit(1); } c = cap; s=cap_to_text(cap, NULL ); if( ( p=prctl( PR_GET_KEEPCAPS, 0,0,0,0 ) ) < 0 ) perror( "prctl:" ); else printf("KEEPCAPS: %d\n",p ); printf("uid: %d, euid: %d, suid: %d\ngid: %d. egid: %d, sgid: %d\n", uid,euid,suid, gid,egid,sgid ); printf("Caps: %s\n", s ); printf(" effective = 0x%08x, permitted = 0x%08x, inheritable = 0x%08x\n", c->set.effective, c->set.permitted, c->set.inheritable); cap_free(s); printf("===\n\n"); } #else #define debug_print_priv( x ) #endif /* DEBUG_CAPABILITIES */ void drop_priv() { uid_t euid, uid; cap_t cap; euid = geteuid(); uid = getuid(); debug_print_priv("Before:"); if (euid != 0) return; if( prctl( PR_SET_KEEPCAPS, 1,0,0,0 ) < 0 ) perror( "prctl:" ); cap=cap_from_text( "cap_net_admin,cap_net_raw=pi" ); if( cap_set_proc( cap ) < 0 ){ perror("cap_set_proc(): "); } debug_print_priv("After cap_set_proc:"); if (euid != uid) { if (setresuid(uid,uid,uid) < 0) { perror("setresuid()"); exit(1); } } debug_print_priv("After setresuid:"); cap=cap_from_text( "cap_net_admin,cap_net_raw=epi" ); if( cap_set_proc( cap ) < 0 ){ perror("cap_set_proc(): "); } debug_print_priv("After cap_set:"); }
- Prev by Date: RE: [Ethereal-dev] GTK2 window resize bug with cygwin
- Next by Date: [Ethereal-dev] [Patch] asn1 plugin
- Previous by thread: RE: [Ethereal-dev] GTK2 window resize bug with cygwin
- Next by thread: [Ethereal-dev] [Patch] asn1 plugin
- Index(es):