Ethereal-dev: [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: Sun, 28 Sep 2003 11:34:45 +0200
Hi! I've made this patch to allow suid installation for ethereal and tethereal, and works for me ( Linux 2.4.x ), but should works also for 2.2.x.. Simply add #define ENABLE_LINUX_CAPABILITIES 1 in config.h and in the Makefile: add capab.c to ETHEREAL_COMMON_SRC and capab.$(OBJEXT) to ethereal_optional_objects and apply the patch priv.diff. The patch add the CAP_NET_ADMIN and CAP_NET_RAW to the allowed set and drop everything else.. To see the capabilities set before and after the drop, define DEBUG_CAPABILITIES in capab.c. On the todo list I've to change drop_priv to use the libcap packaged instead of capget/capset.. Comments are welcome..;) -- Ciao, Emanuele
/* for setresuid declaration */
#define _GNU_SOURCE
#include <sys/prctl.h>
#include <linux/capability.h>
int capget(cap_user_header_t, cap_user_data_t);
int capset(cap_user_header_t, cap_user_data_t);
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/* #define DEBUG_CAPABILITIES */
#ifdef DEBUG_CAPABILITIES
void
print_priv()
{
struct __user_cap_header_struct hdr;
struct __user_cap_data_struct data;
int p;
int uid,euid,suid;
int gid,egid,sgid;
getresuid( &uid, &euid, &suid );
getresgid( &gid, &egid, &sgid );
hdr.version = _LINUX_CAPABILITY_VERSION;
hdr.pid = 0;
if( ( p=prctl( PR_GET_KEEPCAPS, 0,0,0,0 ) ) < 0 )
perror( "prctl:" );
else
printf("KEEPCAPS: %d\n",p );
if (capget(&hdr, &data))
perror("capget");
printf
("uid: %d, euid: %d, suid: %d\ngid: %d. egid: %d, sgid: %d\n"
" effective = 0x%08x, permitted = 0x%08x, inheritable = 0x%08x\n",
uid,euid,suid, gid,egid,sgid,
data.effective, data.permitted, data.inheritable);
}
#endif /* DEBUG_CAPABILITIES */
void
drop_priv()
{
uid_t euid, uid;
struct __user_cap_header_struct hdr;
struct __user_cap_data_struct data;
euid = geteuid();
uid = getuid();
#ifdef DEBUG_CAPABILITIES
printf("Before:\n");
print_priv();
#endif
if (euid != 0)
return;
hdr.version = _LINUX_CAPABILITY_VERSION;
hdr.pid = 0;
if( prctl( PR_SET_KEEPCAPS, 1,0,0,0 ) < 0 )
perror( "prctl:" );
if (capget(&hdr, &data)) {
perror("capget");
exit(1);
}
data.permitted = (1UL << CAP_NET_ADMIN) | (1UL << CAP_NET_RAW);
data.effective = data.inheritable = data.permitted ;
if (capset(&hdr, &data) != 0) {
perror("capset");
}
if (euid != uid) {
if (setresuid(uid,uid,uid) < 0) {
perror("setresuid()");
exit(1);
}
}
capget(&hdr, &data);
data.permitted = (1UL << CAP_NET_ADMIN) | (1UL << CAP_NET_RAW);
data.effective = data.inheritable = data.permitted ;
if (capset(&hdr, &data) != 0) {
perror("capset");
}
#ifdef DEBUG_CAPABILITIES
printf("After:\n");
print_priv();
#endif
}
--- /.1/build/ethereal/ethereal-0.9.15.orig/tethereal.c 2003-09-08 05:11:33.000000000 +0200
+++ tethereal.c 2003-09-27 11:38:03.000000000 +0200
@@ -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
--- /.1/build/ethereal/ethereal-0.9.15.orig/gtk/main.c 2003-09-05 04:10:25.000000000 +0200
+++ gtk/main.c 2003-09-27 11:39:01.000000000 +0200
@@ -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
- Follow-Ups:
- Re: [Ethereal-dev] Patch for Linux Capabilities
- From: Richard Urwin
- Re: [Ethereal-dev] Patch for Linux Capabilities
- Prev by Date: Re: RE : [Ethereal-dev] Re: Building Etheral with MSVC++ 7
- Next by Date: Re: [Ethereal-dev] Tacacs Dissector for 0.9.15
- Previous by thread: Re: [Ethereal-dev] [packet-dcerpc-wkssvc.c] wkssvc operations names
- Next by thread: Re: [Ethereal-dev] Patch for Linux Capabilities
- Index(es):





