Skip to content

Commit 7eaa526

Browse files
committed
Pass explicit reason to fmt_alert_message() and fmt_reject_message()
In intercept mode, when a sub-command is rejected by policy we need to pass in the explicit reason for the failure and not rely on the reason in the closure (which will be NULL). Recent changes to sudo_logsrvd require a reason for the RejectMessage. Found by the ZeroPath AI Security Engineer <https://zeropath.com>
1 parent db82b90 commit 7eaa526

File tree

3 files changed

+13
-10
lines changed

3 files changed

+13
-10
lines changed

plugins/sudoers/log_client.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,7 @@ fmt_accept_message(struct client_closure *closure, const struct eventlog *evlog)
10481048
* Returns true on success, false on failure.
10491049
*/
10501050
bool
1051-
fmt_reject_message(struct client_closure *closure, const struct eventlog *evlog)
1051+
fmt_reject_message(struct client_closure *closure, const struct eventlog *evlog, const char *reason)
10521052
{
10531053
ClientMessage client_msg = CLIENT_MESSAGE__INIT;
10541054
RejectMessage reject_msg = REJECT_MESSAGE__INIT;
@@ -1072,7 +1072,7 @@ fmt_reject_message(struct client_closure *closure, const struct eventlog *evlog)
10721072
reject_msg.submit_time = &ts;
10731073

10741074
/* Reason for rejecting the request. */
1075-
reject_msg.reason = (char *)closure->reason;
1075+
reject_msg.reason = (char *)reason;
10761076

10771077
reject_msg.info_msgs = fmt_info_messages(closure, evlog,
10781078
&reject_msg.n_info_msgs);
@@ -1100,7 +1100,8 @@ fmt_reject_message(struct client_closure *closure, const struct eventlog *evlog)
11001100
* Returns true on success, false on failure.
11011101
*/
11021102
bool
1103-
fmt_alert_message(struct client_closure *closure, const struct eventlog *evlog)
1103+
fmt_alert_message(struct client_closure *closure, const struct eventlog *evlog,
1104+
const char *reason)
11041105
{
11051106
ClientMessage client_msg = CLIENT_MESSAGE__INIT;
11061107
AlertMessage alert_msg = ALERT_MESSAGE__INIT;
@@ -1125,7 +1126,7 @@ fmt_alert_message(struct client_closure *closure, const struct eventlog *evlog)
11251126
alert_msg.alert_time = &ts;
11261127

11271128
/* Reason for the alert. */
1128-
alert_msg.reason = (char *)closure->reason;
1129+
alert_msg.reason = (char *)reason;
11291130

11301131
alert_msg.info_msgs = fmt_info_messages(closure, evlog,
11311132
&alert_msg.n_info_msgs);
@@ -1179,11 +1180,13 @@ fmt_initial_message(struct client_closure *closure)
11791180
break;
11801181
case SEND_REJECT:
11811182
/* Format and schedule RejectMessage. */
1182-
ret = fmt_reject_message(closure, closure->log_details->evlog);
1183+
ret = fmt_reject_message(closure, closure->log_details->evlog,
1184+
closure->reason);
11831185
break;
11841186
case SEND_ALERT:
11851187
/* Format and schedule AlertMessage. */
1186-
ret = fmt_alert_message(closure, closure->log_details->evlog);
1188+
ret = fmt_alert_message(closure, closure->log_details->evlog,
1189+
closure->reason);
11871190
break;
11881191
default:
11891192
sudo_warnx(U_("%s: unexpected state %d"), __func__, closure->state);

plugins/sudoers/log_client.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ struct client_closure {
109109
struct client_closure *log_server_open(struct log_details *details, struct timespec *start_time, bool log_io, enum client_state initial_state, const char *reason);
110110
bool log_server_close(struct client_closure *closure, int exit_status, int error);
111111
bool fmt_accept_message(struct client_closure *closure, const struct eventlog *evlog);
112-
bool fmt_reject_message(struct client_closure *closure, const struct eventlog *evlog);
113-
bool fmt_alert_message(struct client_closure *closure, const struct eventlog *evlog);
112+
bool fmt_reject_message(struct client_closure *closure, const struct eventlog *evlog, const char *reason);
113+
bool fmt_alert_message(struct client_closure *closure, const struct eventlog *evlog, const char *reason);
114114
bool fmt_io_buf(struct client_closure *closure, int type, const char *buf, unsigned int len, const struct timespec *delay);
115115
bool fmt_suspend(struct client_closure *closure, const char *signame, const struct timespec *delay);
116116
bool fmt_winsize(struct client_closure *closure, unsigned int lines, unsigned int cols, const struct timespec *delay);

plugins/sudoers/logging.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ log_server_reject(const struct sudoers_context *ctx, struct eventlog *evlog,
137137
debug_return_bool(true);
138138

139139
/* Use existing client closure. */
140-
if (fmt_reject_message(client_closure, evlog)) {
140+
if (fmt_reject_message(client_closure, evlog, message)) {
141141
if (client_closure->write_ev->add(client_closure->write_ev,
142142
&client_closure->log_details->server_timeout) == -1) {
143143
sudo_warn("%s", U_("unable to add event to queue"));
@@ -195,7 +195,7 @@ log_server_alert(const struct sudoers_context *ctx, struct eventlog *evlog,
195195
}
196196

197197
/* Use existing client closure. */
198-
if (fmt_alert_message(client_closure, evlog)) {
198+
if (fmt_alert_message(client_closure, evlog, emessage ? emessage : message)) {
199199
if (client_closure->write_ev->add(client_closure->write_ev,
200200
&client_closure->log_details->server_timeout) == -1) {
201201
sudo_warn("%s", U_("unable to add event to queue"));

0 commit comments

Comments
 (0)