T02 · Agent Memory Poisoning
- Location
SKILL.md:73- Finding
Untrusted Behavioral Data Can Become Persistent Runtime Instructions
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md:35, 61, 69, 73-79;references/data_model.md:8-16;references/runtime_rules.md:3-10
Vulnerability Type: Persistent behavioral instruction injection
Risk Level: HighVulnerable Code Snippets
SKILL.md:35markdown Praxis receives BehavioralSignal files from Corvus. Praxis decides whether to act on each signal.SKILL.md:57-61markdown - No autonomous identity rewriting - No silent safety boundary changes - No unlimited behavior rule accumulation - Only active shifts influence runtime - Maximum 12 active shifts (configurable) - Every shift must trace to recorded eventsSKILL.md:67-69markdown ## Runtime injection rules The runtime brief is a compact list of active shifts only. Target: 3-12 items. Imperative, behavior-facing, free of historical clutter. Not a narrative log.SKILL.md:71-79markdown ## Inter-skill interfaces Praxis receives BehavioralSignal files from Corvus at: `~/openclaw/data/ocas-praxis/intake/{signal_id}.json` Praxis checks its intake directory during `praxis.event.record` and during any scheduled pass. Praxis decides whether to record each signal as an event and extract a lesson. It is not obligated to act on every signal. After processing each file, move to `intake/processed/`. See `spec-ocas-interfaces.md` for the BehavioralSignal schema and handoff contract.references/data_model.md:8-16markdown ## MicroLesson ```json {"id":"string","event_ids":["string"],"lesson_text":"string","confidence":"string — high|med|low","scope":"string","status":"string — proposed|accepted|rejected"}BehaviorShift
json {"id":"string","source_lesson_ids":["string"],"shift_text":"string","status":"string — proposed|active|merged|expired|rejected","activation_reason":"string","created_at":"string","last_reviewed_at":"string","expiry_condition":"string|null","priority":"number"}text `references/runtime_rules.md:3-10` ```markd ...[truncated 3879 chars]- Remediation
View remediation
Remediation Suggestions
-
Authenticate signal producers
- Require signed signals or a message authentication code tied to an explicitly trusted Corvus identity.
- Verify ownership and restrictive permissions on the intake directory and every file before processing.
- Reject symbolic links, unexpected file types, oversized files, duplicate identifiers, and files whose ownership or integrity cannot be established.
-
Replace unrestricted shifts with a constrained schema
- Do not store arbitrary imperative text as an active shift.
- Define an allowlisted set of behavioral controls, parameters, scopes, and conditions.
- Generate runtime wording only from trusted templates and validated enum values.
-
Apply semantic validation
- Reject shifts that mention instruction precedence, system or developer prompts, safety-policy changes, credentials, secrets, external destinations, shell commands, tool invocation, file access, or network actions.
- Treat event summaries, evidence, lessons, and external signals strictly as untrusted data, never as executable instructions.
-
Require explicit approval
- Keep automatically derived shifts in
proposedstatus. - Require informed human approval before activation, presenting the source events, exact generated shift, expected effect, scope, and expiry condition.
- Require elevated review for any shift that can affect tools, communications, privacy, or authorization decisions.
- Keep automatically derived shifts in
-
Enforce instruction precedence
- State and enforce that active shifts are lower priority than system, developer, safety, current-user, and tool authorization requirements.
- Ensure runtime briefs cannot modify permissions, disable safeguards, or authorize actions independently.
- Delimit the brief as non-authoritative behavioral guidance rather than general instructions.
-
Improve lifecycle controls
- Add mandatory expiration dates, periodic review, rollback, revocation, and a comp ...[truncated 629 chars]
-
