Add support for runchroot and runcwd to "sudo -l" and cvtsudoers.
This commit is contained in:
7
MANIFEST
7
MANIFEST
@@ -776,6 +776,13 @@ plugins/sudoers/regress/sudoers/test23.ldif2sudo.ok
|
|||||||
plugins/sudoers/regress/sudoers/test23.out.ok
|
plugins/sudoers/regress/sudoers/test23.out.ok
|
||||||
plugins/sudoers/regress/sudoers/test23.sudo.ok
|
plugins/sudoers/regress/sudoers/test23.sudo.ok
|
||||||
plugins/sudoers/regress/sudoers/test23.toke.ok
|
plugins/sudoers/regress/sudoers/test23.toke.ok
|
||||||
|
plugins/sudoers/regress/sudoers/test24.in
|
||||||
|
plugins/sudoers/regress/sudoers/test24.json.ok
|
||||||
|
plugins/sudoers/regress/sudoers/test24.ldif.ok
|
||||||
|
plugins/sudoers/regress/sudoers/test24.ldif2sudo.ok
|
||||||
|
plugins/sudoers/regress/sudoers/test24.out.ok
|
||||||
|
plugins/sudoers/regress/sudoers/test24.sudo.ok
|
||||||
|
plugins/sudoers/regress/sudoers/test24.toke.ok
|
||||||
plugins/sudoers/regress/sudoers/test3.in
|
plugins/sudoers/regress/sudoers/test3.in
|
||||||
plugins/sudoers/regress/sudoers/test3.json.ok
|
plugins/sudoers/regress/sudoers/test3.json.ok
|
||||||
plugins/sudoers/regress/sudoers/test3.ldif.ok
|
plugins/sudoers/regress/sudoers/test3.ldif.ok
|
||||||
|
@@ -579,7 +579,7 @@ cmndspec_continues(struct cmndspec *cs, struct cmndspec *next)
|
|||||||
#ifdef HAVE_SELINUX
|
#ifdef HAVE_SELINUX
|
||||||
&& cs->role == next->role && cs->type == next->type
|
&& cs->role == next->role && cs->type == next->type
|
||||||
#endif /* HAVE_SELINUX */
|
#endif /* HAVE_SELINUX */
|
||||||
;
|
&& cs->runchroot == next->runchroot && cs->runcwd == next->runcwd;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -626,10 +626,21 @@ print_cmndspec_json(struct json_container *json,
|
|||||||
|
|
||||||
/* Print options and tags */
|
/* Print options and tags */
|
||||||
if (cs->timeout > 0 || cs->notbefore != UNSPEC || cs->notafter != UNSPEC ||
|
if (cs->timeout > 0 || cs->notbefore != UNSPEC || cs->notafter != UNSPEC ||
|
||||||
TAGS_SET(cs->tags) || !TAILQ_EMPTY(options)) {
|
cs->runchroot != NULL || cs->runcwd != NULL || TAGS_SET(cs->tags) ||
|
||||||
|
!TAILQ_EMPTY(options)) {
|
||||||
struct cmndtag tag = cs->tags;
|
struct cmndtag tag = cs->tags;
|
||||||
|
|
||||||
sudo_json_open_array(json, "Options");
|
sudo_json_open_array(json, "Options");
|
||||||
|
if (cs->runchroot != NULL) {
|
||||||
|
value.type = JSON_STRING;
|
||||||
|
value.u.string = cs->runchroot;
|
||||||
|
sudo_json_add_value(json, "runchroot", &value);
|
||||||
|
}
|
||||||
|
if (cs->runcwd != NULL) {
|
||||||
|
value.type = JSON_STRING;
|
||||||
|
value.u.string = cs->runcwd;
|
||||||
|
sudo_json_add_value(json, "runcwd", &value);
|
||||||
|
}
|
||||||
if (cs->timeout > 0) {
|
if (cs->timeout > 0) {
|
||||||
value.type = JSON_NUMBER;
|
value.type = JSON_NUMBER;
|
||||||
value.u.number = cs->timeout;
|
value.u.number = cs->timeout;
|
||||||
|
@@ -319,6 +319,7 @@ print_cmndspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree,
|
|||||||
struct cmndspec *next = *nextp;
|
struct cmndspec *next = *nextp;
|
||||||
struct member *m;
|
struct member *m;
|
||||||
struct tm *tp;
|
struct tm *tp;
|
||||||
|
char *attr_val;
|
||||||
bool last_one;
|
bool last_one;
|
||||||
char timebuf[sizeof("20120727121554Z")];
|
char timebuf[sizeof("20120727121554Z")];
|
||||||
debug_decl(print_cmndspec_ldif, SUDOERS_DEBUG_UTIL);
|
debug_decl(print_cmndspec_ldif, SUDOERS_DEBUG_UTIL);
|
||||||
@@ -365,7 +366,6 @@ print_cmndspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree,
|
|||||||
|
|
||||||
/* Print timeout as a sudoOption. */
|
/* Print timeout as a sudoOption. */
|
||||||
if (cs->timeout > 0) {
|
if (cs->timeout > 0) {
|
||||||
char *attr_val;
|
|
||||||
if (asprintf(&attr_val, "command_timeout=%d", cs->timeout) == -1) {
|
if (asprintf(&attr_val, "command_timeout=%d", cs->timeout) == -1) {
|
||||||
sudo_fatalx(U_("%s: %s"), __func__,
|
sudo_fatalx(U_("%s: %s"), __func__,
|
||||||
U_("unable to allocate memory"));
|
U_("unable to allocate memory"));
|
||||||
@@ -414,22 +414,35 @@ print_cmndspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree,
|
|||||||
}
|
}
|
||||||
print_options_ldif(fp, options);
|
print_options_ldif(fp, options);
|
||||||
|
|
||||||
|
/* Print runchroot and runcwd. */
|
||||||
|
if (cs->runchroot != NULL) {
|
||||||
|
if (asprintf(&attr_val, "runchroot=%s", cs->runchroot) == -1) {
|
||||||
|
sudo_fatalx(U_("%s: %s"), __func__,
|
||||||
|
U_("unable to allocate memory"));
|
||||||
|
}
|
||||||
|
print_attribute_ldif(fp, "sudoOption", attr_val);
|
||||||
|
free(attr_val);
|
||||||
|
}
|
||||||
|
if (cs->runcwd != NULL) {
|
||||||
|
if (asprintf(&attr_val, "runcwd=%s", cs->runcwd) == -1) {
|
||||||
|
sudo_fatalx(U_("%s: %s"), __func__,
|
||||||
|
U_("unable to allocate memory"));
|
||||||
|
}
|
||||||
|
print_attribute_ldif(fp, "sudoOption", attr_val);
|
||||||
|
free(attr_val);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SELINUX
|
#ifdef HAVE_SELINUX
|
||||||
/* Print SELinux role/type */
|
/* Print SELinux role/type */
|
||||||
if (cs->role != NULL && cs->type != NULL) {
|
if (cs->role != NULL && cs->type != NULL) {
|
||||||
char *attr_val;
|
if (asprintf(&attr_val, "role=%s", cs->role) == -1) {
|
||||||
int len;
|
|
||||||
|
|
||||||
len = asprintf(&attr_val, "role=%s", cs->role);
|
|
||||||
if (len == -1) {
|
|
||||||
sudo_fatalx(U_("%s: %s"), __func__,
|
sudo_fatalx(U_("%s: %s"), __func__,
|
||||||
U_("unable to allocate memory"));
|
U_("unable to allocate memory"));
|
||||||
}
|
}
|
||||||
print_attribute_ldif(fp, "sudoOption", attr_val);
|
print_attribute_ldif(fp, "sudoOption", attr_val);
|
||||||
free(attr_val);
|
free(attr_val);
|
||||||
|
|
||||||
len = asprintf(&attr_val, "type=%s", cs->type);
|
if (asprintf(&attr_val, "type=%s", cs->type) == -1) {
|
||||||
if (len == -1) {
|
|
||||||
sudo_fatalx(U_("%s: %s"), __func__,
|
sudo_fatalx(U_("%s: %s"), __func__,
|
||||||
U_("unable to allocate memory"));
|
U_("unable to allocate memory"));
|
||||||
}
|
}
|
||||||
@@ -441,12 +454,8 @@ print_cmndspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree,
|
|||||||
#ifdef HAVE_PRIV_SET
|
#ifdef HAVE_PRIV_SET
|
||||||
/* Print Solaris privs/limitprivs */
|
/* Print Solaris privs/limitprivs */
|
||||||
if (cs->privs != NULL || cs->limitprivs != NULL) {
|
if (cs->privs != NULL || cs->limitprivs != NULL) {
|
||||||
char *attr_val;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
if (cs->privs != NULL) {
|
if (cs->privs != NULL) {
|
||||||
len = asprintf(&attr_val, "privs=%s", cs->privs);
|
if (asprintf(&attr_val, "privs=%s", cs->privs) == -1) {
|
||||||
if (len == -1) {
|
|
||||||
sudo_fatalx(U_("%s: %s"), __func__,
|
sudo_fatalx(U_("%s: %s"), __func__,
|
||||||
U_("unable to allocate memory"));
|
U_("unable to allocate memory"));
|
||||||
}
|
}
|
||||||
@@ -454,8 +463,7 @@ print_cmndspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree,
|
|||||||
free(attr_val);
|
free(attr_val);
|
||||||
}
|
}
|
||||||
if (cs->limitprivs != NULL) {
|
if (cs->limitprivs != NULL) {
|
||||||
len = asprintf(&attr_val, "limitprivs=%s", cs->limitprivs);
|
if (asprintf(&attr_val, "limitprivs=%s", cs->limitprivs) == -1) {
|
||||||
if (len == -1) {
|
|
||||||
sudo_fatalx(U_("%s: %s"), __func__,
|
sudo_fatalx(U_("%s: %s"), __func__,
|
||||||
U_("unable to allocate memory"));
|
U_("unable to allocate memory"));
|
||||||
}
|
}
|
||||||
@@ -481,7 +489,7 @@ print_cmndspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree,
|
|||||||
#ifdef HAVE_SELINUX
|
#ifdef HAVE_SELINUX
|
||||||
|| cs->role != next->role || cs->type != next->type
|
|| cs->role != next->role || cs->type != next->type
|
||||||
#endif /* HAVE_SELINUX */
|
#endif /* HAVE_SELINUX */
|
||||||
;
|
|| cs->runchroot != next->runchroot || cs->runcwd != next->runcwd;
|
||||||
|
|
||||||
print_member_ldif(fp, parse_tree, cs->cmnd->name, cs->cmnd->type,
|
print_member_ldif(fp, parse_tree, cs->cmnd->name, cs->cmnd->type,
|
||||||
cs->cmnd->negated, CMNDALIAS, "sudoCommand");
|
cs->cmnd->negated, CMNDALIAS, "sudoCommand");
|
||||||
|
@@ -228,6 +228,10 @@ sudoers_format_cmndspec(struct sudo_lbuf *lbuf,
|
|||||||
if (cs->type != NULL && FIELD_CHANGED(prev_cs, cs, type))
|
if (cs->type != NULL && FIELD_CHANGED(prev_cs, cs, type))
|
||||||
sudo_lbuf_append(lbuf, "TYPE=%s ", cs->type);
|
sudo_lbuf_append(lbuf, "TYPE=%s ", cs->type);
|
||||||
#endif /* HAVE_SELINUX */
|
#endif /* HAVE_SELINUX */
|
||||||
|
if (cs->runchroot != NULL && FIELD_CHANGED(prev_cs, cs, runchroot))
|
||||||
|
sudo_lbuf_append(lbuf, "CHROOT=%s ", cs->runchroot);
|
||||||
|
if (cs->runcwd != NULL && FIELD_CHANGED(prev_cs, cs, runcwd))
|
||||||
|
sudo_lbuf_append(lbuf, "CWD=%s ", cs->runcwd);
|
||||||
if (cs->timeout > 0 && FIELD_CHANGED(prev_cs, cs, timeout)) {
|
if (cs->timeout > 0 && FIELD_CHANGED(prev_cs, cs, timeout)) {
|
||||||
char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2];
|
char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2];
|
||||||
(void)snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout);
|
(void)snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout);
|
||||||
|
@@ -516,6 +516,12 @@ sudo_ldap_role_to_priv(const char *cn, void *hosts, void *runasusers,
|
|||||||
op = sudo_ldap_parse_option(opt, &var, &val);
|
op = sudo_ldap_parse_option(opt, &var, &val);
|
||||||
if (strcmp(var, "command_timeout") == 0 && val != NULL) {
|
if (strcmp(var, "command_timeout") == 0 && val != NULL) {
|
||||||
cmndspec->timeout = parse_timeout(val);
|
cmndspec->timeout = parse_timeout(val);
|
||||||
|
} else if (strcmp(var, "runchroot") == 0 && val != NULL) {
|
||||||
|
if ((cmndspec->runchroot = strdup(val)) == NULL)
|
||||||
|
break;
|
||||||
|
} else if (strcmp(var, "runcwd") == 0 && val != NULL) {
|
||||||
|
if ((cmndspec->runcwd = strdup(val)) == NULL)
|
||||||
|
break;
|
||||||
#ifdef HAVE_SELINUX
|
#ifdef HAVE_SELINUX
|
||||||
} else if (strcmp(var, "role") == 0 && val != NULL) {
|
} else if (strcmp(var, "role") == 0 && val != NULL) {
|
||||||
if ((cmndspec->role = strdup(val)) == NULL)
|
if ((cmndspec->role = strdup(val)) == NULL)
|
||||||
|
@@ -426,6 +426,10 @@ new_long_entry(struct cmndspec *cs, struct cmndspec *prev_cs)
|
|||||||
if (cs->type && (!prev_cs->type || strcmp(cs->type, prev_cs->type) != 0))
|
if (cs->type && (!prev_cs->type || strcmp(cs->type, prev_cs->type) != 0))
|
||||||
debug_return_bool(true);
|
debug_return_bool(true);
|
||||||
#endif /* HAVE_SELINUX */
|
#endif /* HAVE_SELINUX */
|
||||||
|
if (cs->runchroot && (!prev_cs->runchroot || strcmp(cs->runchroot, prev_cs->runchroot) != 0))
|
||||||
|
debug_return_bool(true);
|
||||||
|
if (cs->runcwd && (!prev_cs->runcwd || strcmp(cs->runcwd, prev_cs->runcwd) != 0))
|
||||||
|
debug_return_bool(true);
|
||||||
if (cs->timeout != prev_cs->timeout)
|
if (cs->timeout != prev_cs->timeout)
|
||||||
debug_return_bool(true);
|
debug_return_bool(true);
|
||||||
if (cs->notbefore != prev_cs->notbefore)
|
if (cs->notbefore != prev_cs->notbefore)
|
||||||
@@ -520,6 +524,10 @@ display_priv_long(struct sudoers_parse_tree *parse_tree, struct passwd *pw,
|
|||||||
if (cs->type)
|
if (cs->type)
|
||||||
sudo_lbuf_append(lbuf, " Type: %s\n", cs->type);
|
sudo_lbuf_append(lbuf, " Type: %s\n", cs->type);
|
||||||
#endif /* HAVE_SELINUX */
|
#endif /* HAVE_SELINUX */
|
||||||
|
if (cs->runchroot != NULL)
|
||||||
|
sudo_lbuf_append(lbuf, " Chroot: %s\n", cs->runchroot);
|
||||||
|
if (cs->runcwd != NULL)
|
||||||
|
sudo_lbuf_append(lbuf, " Cwd: %s\n", cs->runcwd);
|
||||||
if (cs->timeout > 0) {
|
if (cs->timeout > 0) {
|
||||||
char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2];
|
char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2];
|
||||||
(void)snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout);
|
(void)snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout);
|
||||||
|
6
plugins/sudoers/regress/sudoers/test24.in
Normal file
6
plugins/sudoers/regress/sudoers/test24.in
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Test parsing of CHROOT and CWD syntax
|
||||||
|
Defaults runcwd=~
|
||||||
|
Defaults runchroot=/
|
||||||
|
#
|
||||||
|
user0 ALL = CHROOT=/var/www CWD=/htdocs /bin/ksh
|
||||||
|
user1 ALL = CWD=~root /usr/bin/id, CWD=/tmp /bin/ls
|
61
plugins/sudoers/regress/sudoers/test24.json.ok
Normal file
61
plugins/sudoers/regress/sudoers/test24.json.ok
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"Defaults": [
|
||||||
|
{
|
||||||
|
"Options": [
|
||||||
|
{ "runcwd": "~" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Options": [
|
||||||
|
{ "runchroot": "/" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"User_Specs": [
|
||||||
|
{
|
||||||
|
"User_List": [
|
||||||
|
{ "username": "user0" }
|
||||||
|
],
|
||||||
|
"Host_List": [
|
||||||
|
{ "hostname": "ALL" }
|
||||||
|
],
|
||||||
|
"Cmnd_Specs": [
|
||||||
|
{
|
||||||
|
"Options": [
|
||||||
|
"runchroot": "/var/www",
|
||||||
|
"runcwd": "/htdocs"
|
||||||
|
],
|
||||||
|
"Commands": [
|
||||||
|
{ "command": "/bin/ksh" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"User_List": [
|
||||||
|
{ "username": "user1" }
|
||||||
|
],
|
||||||
|
"Host_List": [
|
||||||
|
{ "hostname": "ALL" }
|
||||||
|
],
|
||||||
|
"Cmnd_Specs": [
|
||||||
|
{
|
||||||
|
"Options": [
|
||||||
|
"runcwd": "~root"
|
||||||
|
],
|
||||||
|
"Commands": [
|
||||||
|
{ "command": "/usr/bin/id" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Options": [
|
||||||
|
"runcwd": "/tmp"
|
||||||
|
],
|
||||||
|
"Commands": [
|
||||||
|
{ "command": "/bin/ls" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
39
plugins/sudoers/regress/sudoers/test24.ldif.ok
Normal file
39
plugins/sudoers/regress/sudoers/test24.ldif.ok
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws
|
||||||
|
objectClass: top
|
||||||
|
objectClass: sudoRole
|
||||||
|
cn: defaults
|
||||||
|
description: Default sudoOption's go here
|
||||||
|
sudoOption: runcwd=~
|
||||||
|
sudoOption: runchroot=/
|
||||||
|
|
||||||
|
dn: cn=user0,ou=SUDOers,dc=sudo,dc=ws
|
||||||
|
objectClass: top
|
||||||
|
objectClass: sudoRole
|
||||||
|
cn: user0
|
||||||
|
sudoUser: user0
|
||||||
|
sudoHost: ALL
|
||||||
|
sudoOption: runchroot=/var/www
|
||||||
|
sudoOption: runcwd=/htdocs
|
||||||
|
sudoCommand: /bin/ksh
|
||||||
|
sudoOrder: 1
|
||||||
|
|
||||||
|
dn: cn=user1,ou=SUDOers,dc=sudo,dc=ws
|
||||||
|
objectClass: top
|
||||||
|
objectClass: sudoRole
|
||||||
|
cn: user1
|
||||||
|
sudoUser: user1
|
||||||
|
sudoHost: ALL
|
||||||
|
sudoOption: runcwd=~root
|
||||||
|
sudoCommand: /usr/bin/id
|
||||||
|
sudoOrder: 2
|
||||||
|
|
||||||
|
dn: cn=user1_1,ou=SUDOers,dc=sudo,dc=ws
|
||||||
|
objectClass: top
|
||||||
|
objectClass: sudoRole
|
||||||
|
cn: user1_1
|
||||||
|
sudoUser: user1
|
||||||
|
sudoHost: ALL
|
||||||
|
sudoOption: runcwd=/tmp
|
||||||
|
sudoCommand: /bin/ls
|
||||||
|
sudoOrder: 3
|
||||||
|
|
8
plugins/sudoers/regress/sudoers/test24.ldif2sudo.ok
Normal file
8
plugins/sudoers/regress/sudoers/test24.ldif2sudo.ok
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Defaults runcwd=~
|
||||||
|
Defaults runchroot=/
|
||||||
|
|
||||||
|
# sudoRole user0
|
||||||
|
user0 ALL = CHROOT=/var/www CWD=/htdocs /bin/ksh
|
||||||
|
|
||||||
|
# sudoRole user1, user1_1
|
||||||
|
user1 ALL = CWD=~root /usr/bin/id, CWD=/tmp /bin/ls
|
7
plugins/sudoers/regress/sudoers/test24.out.ok
Normal file
7
plugins/sudoers/regress/sudoers/test24.out.ok
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Parses OK
|
||||||
|
|
||||||
|
Defaults runcwd=~
|
||||||
|
Defaults runchroot=/
|
||||||
|
|
||||||
|
user0 ALL = CHROOT=/var/www CWD=/htdocs /bin/ksh
|
||||||
|
user1 ALL = CWD=~root /usr/bin/id, CWD=/tmp /bin/ls
|
6
plugins/sudoers/regress/sudoers/test24.sudo.ok
Normal file
6
plugins/sudoers/regress/sudoers/test24.sudo.ok
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Defaults runcwd=~
|
||||||
|
Defaults runchroot=/
|
||||||
|
|
||||||
|
user0 ALL = CHROOT=/var/www CWD=/htdocs /bin/ksh
|
||||||
|
|
||||||
|
user1 ALL = CWD=~root /usr/bin/id, CWD=/tmp /bin/ls
|
6
plugins/sudoers/regress/sudoers/test24.toke.ok
Normal file
6
plugins/sudoers/regress/sudoers/test24.toke.ok
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#
|
||||||
|
DEFAULTS DEFVAR = WORD(2)
|
||||||
|
DEFAULTS DEFVAR = WORD(2)
|
||||||
|
#
|
||||||
|
WORD(6) ALL = CHROOT = WORD(5) CWD = WORD(5) COMMAND
|
||||||
|
WORD(6) ALL = CWD = WORD(5) COMMAND , CWD = WORD(5) COMMAND
|
Reference in New Issue
Block a user