1 kumpf 1.2 /*
|
2 martin 1.8 //%LICENSE////////////////////////////////////////////////////////////////
|
3 kumpf 1.2 //
|
4 martin 1.8 // Licensed to The Open Group (TOG) under one or more contributor license
5 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
6 // this work for additional information regarding copyright ownership.
7 // Each contributor licenses this file to you under the OpenPegasus Open
8 // Source License; you may not use this file except in compliance with the
9 // License.
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining a
12 // copy of this software and associated documentation files (the "Software"),
13 // to deal in the Software without restriction, including without limitation
14 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 // and/or sell copies of the Software, and to permit persons to whom the
16 // Software is furnished to do so, subject to the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be included
19 // in all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
25 martin 1.8 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29 //////////////////////////////////////////////////////////////////////////
30 /*
31
|
32 kumpf 1.2 #include <sys/types.h>
33 #include <sys/stat.h>
34 #include <unistd.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <stdio.h>
|
38 kumpf 1.3 #include <grp.h>
|
39 kumpf 1.2 #include "Defines.h"
|
40 kumpf 1.6 #include "Globals.h"
|
41 kumpf 1.2 #include "Fatal.h"
42 #include "Path.h"
43 #include "Log.h"
44 #include "User.h"
45
46 /*
47 **==============================================================================
48 **
49 ** Child
50 **
51 ** The child process.
52 **
53 **==============================================================================
54 */
55
56 void Child(
57 int argc,
58 char** argv,
59 const char* path,
|
60 kumpf 1.3 const char* userName,
|
61 kumpf 1.2 int uid,
62 int gid,
63 int sock)
64 {
65 char sockStr[EXECUTOR_BUFFER_SIZE];
66 char** execArgv;
67
|
68 kumpf 1.6 globals.isChildProcess = 1;
69
|
70 kumpf 1.2 /* Build argument list, adding "--executor-socket <sock>" option if
71 * sock non-negative.
72 */
73
|
74 dmitry.mikulin 1.7 if ((execArgv = (char**)malloc(sizeof(char*) * (argc + 3))) == NULL)
75 {
76 Fatal(FL, "Memory allocation failed");
77 }
|
78 kumpf 1.2 memcpy(execArgv + 3, argv + 1, sizeof(char*) * argc);
79
80 sprintf(sockStr, "%d", sock);
81
82 execArgv[0] = CIMSERVERMAIN;
83 execArgv[1] = "--executor-socket";
84 execArgv[2] = strdup(sockStr);
85
86 /*
87 * Downgrade privileges by setting the UID and GID of this process. Use
88 * the owner of the CIMSERVERMAIN program obtained above.
89 */
90
91 if (uid == 0 || gid == 0)
92 {
93 Fatal(FL, "root may not own %s since the program is run as owner",
94 path);
95 }
96
97 if (setgid(gid) != 0)
98 {
99 kumpf 1.2 Fatal(FL, "Failed to set gid to %d", gid);
100 }
101
|
102 kumpf 1.3 if (initgroups(userName, gid) != 0)
103 {
104 Fatal(FL, "Failed to initialize groups for user %s", userName);
105 }
106
|
107 kumpf 1.2 if (setuid(uid) != 0)
108 {
109 Fatal(FL, "Failed to set uid to %d", uid);
110 }
111
112 if ((int)getuid() != uid ||
113 (int)geteuid() != uid ||
114 (int)getgid() != gid ||
115 (int)getegid() != gid)
116 {
117 Fatal(FL, "setuid/setgid verification failed\n");
118 }
119
120 /* Log user info. */
121
122 Log(LL_TRACE, "%s running as %s (uid=%d, gid=%d)", CIMSERVERMAIN,
|
123 kumpf 1.4 userName, uid, gid);
|
124 kumpf 1.2
|
125 kumpf 1.5 /* Exec child process. */
|
126 kumpf 1.2
127 /* Flawfinder: ignore */
|
128 kumpf 1.5 execv(path, execArgv);
|
129 kumpf 1.2
|
130 kumpf 1.5 /* If we are still here, the exec failed. */
131 Fatal(FL, "failed to exec %s", path);
|
132 kumpf 1.2 }
|