Harden SSH Admission And Credential Input
This commit is contained in:
+15
-3
@@ -69,6 +69,7 @@ typedef struct {
|
||||
bool discard_next_lf;
|
||||
admin_prompt_state_t prompt_state;
|
||||
bool prompt_hidden;
|
||||
bool prompt_rejected;
|
||||
size_t prompt_capacity;
|
||||
size_t prompt_length;
|
||||
uint8_t prompt_input[ADMIN_SSH_CONSOLE_COMMAND_LINE_CAPACITY + 1U];
|
||||
@@ -385,6 +386,7 @@ esp_err_t admin_ssh_console_dispatch_read_input(
|
||||
session->prompt_length = 0U;
|
||||
session->prompt_capacity = capacity;
|
||||
session->prompt_hidden = hidden;
|
||||
session->prompt_rejected = false;
|
||||
session->prompt_state = ADMIN_PROMPT_WAITING;
|
||||
bool published = append_output_locked(session, (const uint8_t *)prompt, strlen(prompt));
|
||||
if (!published) {
|
||||
@@ -413,14 +415,19 @@ esp_err_t admin_ssh_console_dispatch_read_input(
|
||||
if (!current || !session->active || session->prompt_state == ADMIN_PROMPT_DISCONNECTED) {
|
||||
result = ESP_ERR_NOT_FOUND;
|
||||
} else if (session->prompt_state == ADMIN_PROMPT_SUBMITTED) {
|
||||
memcpy(output, session->prompt_input, session->prompt_length);
|
||||
*output_length = session->prompt_length;
|
||||
result = ESP_OK;
|
||||
if (session->prompt_rejected) {
|
||||
result = ESP_ERR_INVALID_SIZE;
|
||||
} else {
|
||||
memcpy(output, session->prompt_input, session->prompt_length);
|
||||
*output_length = session->prompt_length;
|
||||
result = ESP_OK;
|
||||
}
|
||||
}
|
||||
secure_wipe(session->prompt_input, sizeof(session->prompt_input));
|
||||
session->prompt_length = 0U;
|
||||
session->prompt_capacity = 0U;
|
||||
session->prompt_hidden = false;
|
||||
session->prompt_rejected = false;
|
||||
session->prompt_state = ADMIN_PROMPT_NONE;
|
||||
taskEXIT_CRITICAL(&s_lock);
|
||||
return result;
|
||||
@@ -1209,9 +1216,14 @@ bool admin_ssh_console_feed_input(const admin_ssh_console_token_t *token,
|
||||
if (!session->prompt_hidden) {
|
||||
(void)append_output_locked(session, &value, 1U);
|
||||
}
|
||||
} else if (session->prompt_hidden) {
|
||||
session->prompt_rejected = true;
|
||||
} else {
|
||||
(void)append_output_locked(session, (const uint8_t *)"\a", 1U);
|
||||
}
|
||||
} else if (session->prompt_hidden) {
|
||||
/* Do not silently normalize unrepresentable credential bytes. */
|
||||
session->prompt_rejected = true;
|
||||
}
|
||||
}
|
||||
++*consumed;
|
||||
|
||||
Reference in New Issue
Block a user