AID-D-005.006: Agent Registry & Resolution Telemetry Monitoring
Pillars: infra, app
Lifecycle: operation, response
Scope boundary
Owns anomaly detection over the complete declared population of agent-registry and resolution events, including namespace churn, identity and issuer correlations, reconnaissance patterns, poisoning indicators, and outcome-rate changes. It does not authenticate the event contract, reconcile inter-agent ledger completeness, authorize registration or routing, or establish that a registry entry is trustworthy.
AID-D-011.002: AID-D-005.006 detects suspicious patterns in registry and resolution activity after events are available; AID-D-011.002 authenticates the inter-agent event contract and reconciles discovery and routing events against authoritative ledgers. A contract-valid event can still be anomalous, while a missing, forged, replayed, or misbound event is owned by AID-D-011.002 and must not be scored again as registry anomaly detection.
Implementation guidance
- AID-D-005.006-G001: Emit bounded registration telemetry and detect namespace churn without high-cardinality identity labels.
- AID-D-005.006-G002: Emit bounded resolution telemetry and detect identity-correlated reconnaissance in the event stream.
AID-D-005.006-G001
Record validated outcomes without stubs
from __future__ import annotations
# File: ans_monitor/registration_telemetry.py
import hashlib, hmac, json, os
from dataclasses import dataclass
from datetime import datetime, timezone
from prometheus_client import Counter
CORRELATION_KEY = os.environ["ANS_TELEMETRY_HMAC_KEY"].encode()
PROVIDER_CLASSES = {"internal", "partner", "public", "unknown"}
ISSUER_CLASSES = {"enterprise_ca", "partner_ca", "public_ca", "untrusted"}
OUTCOMES = {"accepted", "failed_schema", "failed_identity", "failed_signature", "conflict"}
REGISTRATIONS = Counter(
"ans_registration_results_total",
"Authoritative ANS registration outcomes",
["provider_class", "issuer_class", "outcome"],
)
@dataclass(frozen=True)
class RegistrationResult:
request_id: str
authenticated_principal: str
namespace: str
provider_class: str
issuer_id: str
issuer_class: str
outcome: str
def correlation_ref(value: str) -> str:
return hmac.new(CORRELATION_KEY, value.encode(), hashlib.sha256).hexdigest()
def record_registration(result: RegistrationResult) -> dict:
if result.provider_class not in PROVIDER_CLASSES or result.issuer_class not in ISSUER_CLASSES or result.outcome not in OUTCOMES:
raise ValueError("registration telemetry contains an unbounded enum")
if not all((result.request_id, result.authenticated_principal, result.namespace, result.issuer_id)):
raise ValueError("registration telemetry is missing authoritative fields")
REGISTRATIONS.labels(
provider_class=result.provider_class,
issuer_class=result.issuer_class,
outcome=result.outcome,
).inc()
event = {
"schema_version": "aidefend.ans_registration.v1",
"observed_at": datetime.now(timezone.utc).isoformat(),
"request_id": result.request_id,
"principal_ref": correlation_ref(result.authenticated_principal),
"namespace_ref": correlation_ref(result.namespace),
"issuer_ref": correlation_ref(result.issuer_id),
"provider_class": result.provider_class,
"issuer_class": result.issuer_class,
"outcome": result.outcome,
}
print(json.dumps(event, sort_keys=True))
return eventRender environment-specific rules from signed policy
The following is a CI template, not a universal threshold. A signed, versioned environment policy must supply window, accepted_rate_threshold, failure_rate_threshold, and for_duration. The renderer verifies the policy signature and schema, records its digest/version in the rule metadata, and fails rule publication if any value is missing or invalid.
groups:
- name: ans_registration
rules:
- alert: ANSRegistrationChurn
expr: |
sum by (provider_class, issuer_class) (
rate(ans_registration_results_total{outcome="accepted"}[{{ .window }}])
) > {{ .accepted_rate_threshold }}
for: {{ .for_duration }}
labels:
severity: warning
- alert: ANSRegistrationValidationFailures
expr: |
sum by (provider_class, issuer_class) (
rate(ans_registration_results_total{outcome=~"failed_.*|conflict"}[{{ .window }}])
) > {{ .failure_rate_threshold }}
for: {{ .for_duration }}
labels:
severity: warningEvidence: forward exact structured events to the append-only pipeline in AID-D-005.001 and retain the rendered rule, signed policy and signature, policy digest/version, renderer version, and metric rule version. An independent analyst recomputes window counts from those events. Missing authentication context or unknown enums is an instrumentation error, not a successful registration.
Verify complete coverage
The population is every registration attempt and terminal state for every applicable namespace, registrant identity, agent record, version and signed window, including denied, duplicate, expired, churned, and processing-error records.
AID-D-005.006-G002
Emit low-cardinality metrics and identity-correlatable events
from __future__ import annotations
# File: ans_monitor/resolution_telemetry.py
import hashlib, hmac, json, os
from dataclasses import dataclass
from datetime import datetime, timezone
from prometheus_client import Counter
CORRELATION_KEY = os.environ["ANS_TELEMETRY_HMAC_KEY"].encode()
CLIENT_CLASSES = {"workload", "human", "partner", "anonymous"}
RESOLVER_ZONES = {"internal", "partner", "public"}
OUTCOMES = {"success", "agent_not_found", "version_mismatch", "signature_invalid", "policy_denied"}
RESOLUTIONS = Counter(
"ans_resolution_results_total",
"Authoritative ANS resolution outcomes",
["client_class", "resolver_zone", "outcome"],
)
@dataclass(frozen=True)
class ResolutionResult:
request_id: str
authenticated_client_id: str
client_class: str
resolver_zone: str
query_name: str
requested_version_range: str
outcome: str
def ref(value: str) -> str:
return hmac.new(CORRELATION_KEY, value.encode(), hashlib.sha256).hexdigest()
def record_resolution(result: ResolutionResult) -> dict:
if result.client_class not in CLIENT_CLASSES or result.resolver_zone not in RESOLVER_ZONES or result.outcome not in OUTCOMES:
raise ValueError("resolution telemetry contains an unbounded enum")
if not all((result.request_id, result.authenticated_client_id, result.query_name)):
raise ValueError("resolution telemetry is missing authoritative fields")
RESOLUTIONS.labels(
client_class=result.client_class,
resolver_zone=result.resolver_zone,
outcome=result.outcome,
).inc()
event = {
"schema_version": "aidefend.ans_resolution.v1",
"observed_at": datetime.now(timezone.utc).isoformat(),
"request_id": result.request_id,
"client_ref": ref(result.authenticated_client_id),
"query_ref": ref(result.query_name),
"requested_version_range": result.requested_version_range,
"client_class": result.client_class,
"resolver_zone": result.resolver_zone,
"outcome": result.outcome,
}
print(json.dumps(event, sort_keys=True))
return eventIn the SIEM, compute per-client_ref failure-to-success ratio and distinct query_ref count over fixed windows; emit ANS_RESOLUTION_RECONNAISSANCE only when the minimum query count and preregistered ratio are both met. Route response to AID-I-003; this detector does not rate-limit.
Evidence: retain the authenticated resolution event, HMAC key version, window definition, rule version, counts, ratio, and finding in append-only storage. An independent analyst replays the same query over raw events. Empty windows are INSUFFICIENT_DATA, and missing identity or invalid outcome is ERROR.
Open-source tools
- Prometheus
- Grafana
- OpenSearch
- OpenSearch Dashboards
- NGINX Open Source
- Falco
Commercial / hosted tools
- Datadog
- Splunk Enterprise
- Dynatrace
- AWS CloudWatch
Threat mappings
MITRE ATLAS
- AML.T0029 Denial of AI Service
- AML.T0034 Cost Harvesting
- AML.T0073 Impersonation (Sybil-style namespace abuse is a form of impersonation)
- AML.T0125 Create Account (abnormal registration and credential churn in agent registries)
MAESTRO
- Agent Impersonation (L7)
- Malicious Agent Discovery (L7)
- Resource Hijacking (L4)
- Compromised Agent Registry (L7)
OWASP LLM Top 10 2026
- N/A
OWASP ML Top 10 2023
- N/A
OWASP Top 10 for Agentic Applications 2026
- ASI03:2026 Identity and Privilege Abuse
- ASI04:2026 Agentic Supply Chain Vulnerabilities (registry poisoning compromises agent supply chain)
- ASI07:2026 Insecure Inter-Agent Communication (resolution tampering disrupts agent communication)
- ASI10:2026 Rogue Agents (Sybil-style registration detects rogue agents)
NIST Adversarial Machine Learning 2025
- N/A
Cisco Integrated AI Security and Safety Framework
- AISubtech-3.1.1 Identity Obfuscation (registry identity failures and anomalous agent-resolution activity)
- AISubtech-4.1.1 Rogue Agent Introduction (registry identity failures and anomalous agent-resolution activity)
- AITech-3.1 Masquerading / Obfuscation / Impersonation (registry identity failures and anomalous agent-resolution activity)
- AITech-4.1 Agent Injection (registry identity failures and anomalous agent-resolution activity)
Google Secure AI Framework 2.0 - Risks
- DMS: Denial of ML Service (ANS DoS disrupts agent availability)
- IIC: Insecure Integrated Component (registry poisoning compromises agent discovery)
- RA: Rogue Actions (Sybil-style namespace abuse enables rogue agent registration)
Databricks AI Security Framework 3.0
- Agents - Core 13.9: Identity Spoofing & Impersonation
- Agents - Core 13.13: Rogue Agents in Multi-Agent Systems
- Agents - Core 13.4: Resource Overload