From 93d9f0e46322bb811dac54a062bc5c9313d4d0ae Mon Sep 17 00:00:00 2001 From: max Date: Sat, 26 Sep 2026 13:00:07 +0200 Subject: [PATCH] feat(security): apply html.escape sanitization across WebUI table rendering --- src/Server.py | 60 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/src/Server.py b/src/Server.py index 2b61184..92e627f 100644 --- a/src/Server.py +++ b/src/Server.py @@ -11,6 +11,7 @@ import secrets import hashlib import hmac import time +import html import warnings import threading from datetime import datetime, timezone, timedelta @@ -1806,24 +1807,29 @@ def serve_webui(request: Request = None): client_rows = [] for cl in clients: cid, host, ost, fp, st, first, last = cl + esc_cid = html.escape(str(cid)) + esc_host = html.escape(str(host)) + esc_ost = html.escape(str(ost)) + esc_fp = html.escape(str(fp)) + esc_st = html.escape(str(st)) badge_cls = "badge-active" if st == "active" else "badge-revoked" rel_time = format_relative_time(last) - last_display = f"
{last[:19]}
{rel_time}
" + last_display = f"
{html.escape(str(last[:19]))}
{html.escape(rel_time)}
" btn_action = ( - f'' + f'' if st == "active" else - f'' + f'' ) - btn_del = f'' + btn_del = f'' client_rows.append(f""" - {st.upper()} - {host} - {cid} - {ost.upper()} - {fp[:16]}... + {esc_st.upper()} + {esc_host} + {esc_cid} + {esc_ost.upper()} + {esc_fp[:16]}... {last_display}
@@ -1839,15 +1845,20 @@ def serve_webui(request: Request = None): anomaly_rows = [] for an in anomalies: afp, srv, sev, msg, rc, ls = an + esc_srv = html.escape(str(srv)) + esc_sev = html.escape(str(sev)) + esc_msg = html.escape(str(msg)) + esc_ls = html.escape(str(ls[:19])) sev_cls = "badge-error" if sev in ("ERROR", "CRITICAL", "FATAL") else "badge-warning" short_msg = msg[:80] + "..." if len(msg) > 80 else msg + esc_short_msg = html.escape(str(short_msg)) anomaly_rows.append(f""" - {sev} - {srv} - {rc} runs - {short_msg} - {ls[:19]} + {esc_sev} + {esc_srv} + {int(rc)} runs + {esc_short_msg} + {esc_ls} """) anomalies_html = "".join(anomaly_rows) if anomaly_rows else 'No verified anomalies currently reported.' @@ -1856,19 +1867,24 @@ def serve_webui(request: Request = None): token_rows = [] for tk in hermes_tokens: tok, tname, tcreated, tlast, tstatus = tk + esc_tok = html.escape(str(tok)) + esc_tname = html.escape(str(tname)) + esc_tstatus = html.escape(str(tstatus)) + esc_tcreated = html.escape(str(tcreated[:19])) + esc_tlast = html.escape(str(tlast[:19])) if tlast else 'Never' tbadge = "badge-active" if tstatus == "active" else "badge-revoked" - masked = tok[:10] + "••••••••" + tok[-4:] - tok_action = f'' if tstatus == "active" else f'' + masked = esc_tok[:10] + "••••••••" + esc_tok[-4:] + tok_action = f'' if tstatus == "active" else f'' token_rows.append(f""" - {tname} - {masked} - {tstatus.upper()} - {tcreated[:19]} - {tlast[:19] if tlast else 'Never'} + {esc_tname} + {masked} + {esc_tstatus.upper()} + {esc_tcreated} + {esc_tlast}
- + {tok_action}