From a9a26cf856d9ce8a4a6daadfc23f14d57b756fa5 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Mon, 29 Jun 2026 17:04:07 +0200 Subject: [PATCH] Sec: Mem0 lernt nicht aus Bildschirm-/Web-Turns (Anti-Poisoning) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der mc2-memory-Provider überspringt das Auto-Lernen (sync_turn), wenn die User-Message den Bildschirm-Sicht-Marker trägt — on-screen-Text könnte Injection-Anweisungen enthalten, die sonst dauerhaft ins Gedächtnis wandern. Per Env MC2_MEMORY_SKIP_UNTRUSTED=0 abschaltbar. Teil von Stufe 0 (Security). Co-Authored-By: Claude Opus 4.8 --- hermes/plugins/mc2-memory/__init__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/hermes/plugins/mc2-memory/__init__.py b/hermes/plugins/mc2-memory/__init__.py index e3ee492..e19c56e 100644 --- a/hermes/plugins/mc2-memory/__init__.py +++ b/hermes/plugins/mc2-memory/__init__.py @@ -39,6 +39,12 @@ MC_TOKEN = os.environ.get("MC_TOKEN", "") RECALL_LIMIT = int(os.environ.get("MC2_MEMORY_RECALL_LIMIT", "5")) RECALL_MIN_SCORE = float(os.environ.get("MC2_MEMORY_RECALL_MIN_SCORE", "0.3")) MIN_USER_LEN = int(os.environ.get("MC2_MEMORY_MIN_USER_LEN", "12")) # zu Kurzes nicht lernen +# Anti-Memory-Poisoning (Stufe 0 Security): aus Turns mit untrusted Bildschirm-/Web-Inhalt NICHT +# auto-lernen. Lucys Bildschirm-Sicht prependet diesen Marker an die User-Message (voice.py); auf dem +# Schirm sichtbarer Text könnte Injection-Anweisungen tragen, die sonst DAUERHAFT ins Gedächtnis +# wandern und Tage später ungefragt wiederverwendet werden. +SKIP_UNTRUSTED = os.environ.get("MC2_MEMORY_SKIP_UNTRUSTED", "1") not in ("0", "false", "False", "no") +UNTRUSTED_MARKERS = ("[Bildschirm-Sicht",) def _headers() -> dict: @@ -118,6 +124,9 @@ class MC2MemoryProvider(MemoryProvider): u = (user_content or "").strip() if len(u) < MIN_USER_LEN: return + if SKIP_UNTRUSTED and any(m in u for m in UNTRUSTED_MARKERS): + log.debug("mc2-memory: Turn mit untrusted Bildschirm-/Web-Inhalt — Auto-Lernen übersprungen") + return msgs: List[Dict[str, str]] = [{"role": "user", "content": u}] a = (assistant_content or "").strip() if a: