T02 · Agent Memory Poisoning
- Location
src/dashboard.js:43- Finding
Unauthenticated Persistent Memory Poisoning Enables Cross-Session Prompt Injection
- Content
View full analysis
{ try { const { agent_wallet, content, type, importance, session_id } = req.body; if (!agent_wallet) { return res.status(400).json({ error: 'agent_wallet is required' }); } if (!content || typeof content !== 'string') { return res.status(400).json({ error: 'content is required and must be a string' }); } const manager = getMemoryManager(); const memory = await manager.storeMemory( agent_wallet, content, type || 'fact', importance || 0.5, session_id ); ``` ```js // hooks/request-before.js:32-54 const memories = await manager.retriever.retrieveRelevant(query, { agent_wallet: agentWallet, limit: 5, // Top 5 most relevant memories min_score: 0.7 // Minimum similarity threshold }); // Inject memories into request context if (memories && memories.length > 0) { // Format memories for injection const memoryContext = memories.map(m => ({ type: m.memory_type, content: m.content, importance: m.importance_score, timestamp: m.timestamp })); // Add to request data requestData.context = requestData.context || {}; requestData.context.memories = memoryContext; // Also format as text for prompt injection const memoryText = memories .map(m => `[${m.memory_type}] ${m.content}`) .join('\n'); requestData.context.memory_text = memoryText; ``` ```js // src/dashboard.js:405-410 app.listen(port, () => { console.log(`\n${'='.repeat(70)}`); console.log(` OpenClaw Memory System - REST API Dashboard`); console.log(`${'='.repeat(70)}`); console.log(` Status: Running`); console.log(` URL: http://localhost:${port}`); ``` ...[truncated 2642 chars]- Remediation
View remediation
