Harden SSH Admission And Credential Input

This commit is contained in:
2026-09-15 20:49:04 +02:00
parent 436c27adb1
commit 751dfb9ddb
32 changed files with 1751 additions and 39 deletions
+15 -3
View File
@@ -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;