Sec: Mem0 lernt nicht aus Bildschirm-/Web-Turns (Anti-Poisoning)

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 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-29 17:04:07 +02:00
parent b31736cde7
commit a9a26cf856
+9
View File
@@ -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: