3 // Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
4 // based on capchroot.cc by Jacques Gelinas
6 // This program is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 2, or (at your option)
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 This chroot command does very little. Once the chroot
22 system call is executed, it (option) remove the CAP_SYS_CHROOT
23 capability. Then it executes its argument
34 #include "linuxcaps.h"
37 static int my_chroot(const char *dir)
40 if (has_chrootsafe()){
41 ret = call_chrootsafe(dir);
43 //fprintf (stderr,"Kernel do not support chrootsafe(), using chroot()\n");
49 int main (int argc, char *argv[])
52 fprintf (stderr,"capchroot version %s\n",VERSION);
54 ,"capchroot --nochroot directory [ --suid user ] command argument\n"
56 "--nochroot remove the CAP_SYS_CHROOT capability\n"
57 " after the chroot system call.\n"
58 "--suid switch to a different user (in the vserver context)\n"
59 " before executing the command.\n");
61 const char *uid = NULL;
62 bool nochroot = false;
64 for (dir=1; dir<argc; dir++){
65 const char *arg = argv[dir];
66 if (arg[0] != '-' && arg[1] != '-'){
68 }else if (strcmp(arg,"--nochroot")==0){
70 }else if (strcmp(arg,"--suid")==0){
76 // We resolve the UID before doing the chroot.
77 // If we do the getpwnam after the chroot, we will end
78 // up loading shared object from the vserver.
79 // This is causing two kind of problem: Incompatibilities
80 // and also a security flaw. The shared objects in the vserver
81 // may be tweaked to get control of the root server ...
83 if (my_chroot (argv[dir]) == -1){
84 fprintf (stderr,"Can't chroot to directory %s (%s)\n",argv[dir]
87 struct passwd *p = NULL;
91 call_new_s_context (0,NULL,1<<CAP_SYS_CHROOT,0);
94 if (uid != NULL && strcmp(uid,"root")!=0){
97 fprintf (stderr,"User not found: %s\n",uid);
107 fprintf (stderr,"capchroot: No command to execute, do nothing\n");
109 execvp (argv[cmd],argv+cmd);
110 fprintf (stderr,"Can't execute %s (%s)\n",argv[cmd]