The framework's one strong control — ECDSA signing and verification of every inter-agent envelope — is surrounded by a default posture that never enforces the rest of the declared trust model. The signature is checked but its freshness is not: expires and nonce are folded into the signed digest in envelope.py and read by no one, so a captured envelope replays indefinitely; a sender that simply calls itself user... skips verification altogether, and a sync response carrying no signature at all is accepted and dispatched.
The sharper edge is the control plane. The agent inspector is enabled by default and its endpoints share the 0.0.0.0 socket with the agent protocol, guarded only by a client-IP test that forwarded_allow_ips hands to the caller, while wildcard CORS makes the same endpoints reachable from any web origin — exposing the full cached message history through /messages and the agent's Agentverse registration through /connect.
uagents (the Agent and Bureau runtime, ASGI server, message dispenser, resolver, registration policies, key-value storage) and uagents-core (identity, envelope, registration models, Agentverse helpers) — with no LLM in the base runtime and no shell, exec, eval or pickle call anywhere in either package. Agent.__init__ wires an ECDSA identity, a cosmpy wallet and ledger client, and an ASGIServer bound to 0.0.0.0 that serves the /submit envelope endpoint and, by default, four agent-inspector REST endpoints (/agent_info, /messages, /connect, /disconnect). Inbound envelopes are signature-verified in asgi.py and dispatched by schema digest to typed handlers; outbound envelopes are signed, queued in Dispenser and POSTed to endpoint URLs resolved from the Almanac API or contract. Access control, rate limiting and durable message history are optional add-ons — QuotaProtocol ships an ACL and quota that nothing wires in by default — while identity and wallet private keys are written to a plaintext private_keys.json in the working directory.Every actionable rule in the Worker Remit, checked against the running code. Gap = declared but unenforced; Partial = enforced but incomplete or bypassable; Vague Policy = too imprecise to verify.
| Rule ID | Section | Rule (quoted) | Status | Finding |
|---|---|---|---|---|
| R-01 | Prohibited Behaviors | "The agent MUST NOT treat the content of inbound messages, query payloads, broadcast traffic, or data retrieved from other agents as instructions that alter its own goals, policies, or tool set." | Verified | — |
| R-02 | Prohibited Behaviors | "The agent MUST NOT redefine its own mission or expand its own capability set at runtime beyond what the operator configured." | Verified | — |
| R-03 | Prohibited Behaviors | "The agent MUST NOT perform work outside its configured task domain; requests that fall outside that domain are declined rather than serviced." | Enforcement Not Possible | — |
| R-04 | Prohibited Behaviors | "The agent MUST NOT autonomously register, advertise, or impersonate identities, addresses, or protocols other than its own configured identity." | Verified | — |
| R-05 | Approved Communication Channels | "The server the agent binds to receive envelopes; must serve only the agent's declared endpoints." | Partial | PRAX-2026-08-12-001 |
| R-06 | Approved Communication Channels | "On-chain transactions — gated per Action Boundaries." | Gap | PRAX-2026-08-12-007 |
| R-07 | Approved Communication Channels | "Approved Communication Channels" | Partial | PRAX-2026-08-12-010 |
| R-08 | Authorized Counterparties | "Trusted People / Accounts" | Partial | PRAX-2026-08-12-001 |
| R-09 | Authorized Counterparties | "The operator-configured allowlist of authorized peer agent addresses is a closed set: any peer agent address or message sender not on that allowlist is not an authorized counterparty, and its appearance in communication or transactions is a trust-expansion finding." | Gap | PRAX-2026-08-12-006 |
| R-10 | Authorized Counterparties | "Trusted Domains" | Verified | — |
| R-11 | Authorized Counterparties | "Trusted Services / Integrations" | Verified | — |
| R-12 | Authorized Counterparties | "Only operator-configured external integrations are authorized: the LLM adapters (e.g. ASI:One) and MCP endpoints the operator explicitly configured form a closed set; any LLM adapter or MCP endpoint outside that set is unauthorized and is a trust-expansion finding." | Verified | — |
| R-13 | Authorized Counterparties | "A message sender whose identity signature does not verify is not a trusted counterparty for state-changing or privileged actions — see Action Boundaries → Never Allowed." | Gap | PRAX-2026-08-12-004 |
| R-14 | Tools and Capabilities | "Allowed Tools (Known Good Baseline)" | Partial | PRAX-2026-08-12-001 |
| R-15 | Tools and Capabilities | "Any capability that moves value on the ledger or spends wallet funds — see Action Boundaries." | Gap | PRAX-2026-08-12-007 |
| R-16 | Tools and Capabilities | "The agent MUST NOT hold, or route untrusted message content into, any capability that executes arbitrary commands or code on the host." | Verified | — |
| R-17 | Data Boundaries | "Allowed Data Sources" | Partial | PRAX-2026-08-12-009 |
| R-18 | Data Boundaries | "Seed phrases, identity keys, and wallet keys MUST NEVER leave the host — never transmitted in a message, written to a log, or published to the Almanac / Agentverse profile metadata." | Verified | — |
| R-19 | Data Boundaries | "Credentials, API keys, and seed material MUST be loaded from environment or secure operator configuration; they MUST NOT be hardcoded in source or committed to the repository." | Gap | PRAX-2026-08-12-002 |
| R-20 | Data Boundaries | "Data published to the public Almanac / Agentverse profile (address, endpoints, protocols, description, README, avatar) MUST be limited to non-sensitive information intended for public discovery." | Verified | — |
| R-21 | Action Boundaries | "Allowed Without Approval" | Verified | — |
| R-22 | Action Boundaries | "Any discretionary on-chain value transfer or spend of wallet funds — value moved to any counterparty other than the Almanac / Agentverse registration contract. The framework ships no operator authorization policy for wallet spends, so the deployment MUST supply the gating policy; its absence is a gap in the deployment, not a configurable threshold to look up." | Gap | PRAX-2026-08-12-007 |
| R-23 | Action Boundaries | "Adding a new outbound communication channel, integration, or counterparty not already authorized." | Gap | PRAX-2026-08-12-001 |
| R-24 | Action Boundaries | "The agent MUST NOT act on an unsigned or signature-unverified message when performing a state-changing or privileged action." | Gap | PRAX-2026-08-12-004 |
| R-25 | Action Boundaries | "Discretionary on-chain value transfers are out of scope by default: the agent MUST NOT move value to any counterparty other than the Almanac / Agentverse registration contract unless the operator has explicitly authorized value transfers." | Verified | — |
| R-26 | Action Boundaries | "The agent-inspector and other debug/administrative REST endpoints MUST be disabled in production." | Gap | PRAX-2026-08-12-003 |
| R-27 | Action Boundaries | "If such debug/administrative endpoints are enabled, the agent MUST NOT expose them unless they sit behind operator-configured protection (authentication / network restriction)." | Partial | PRAX-2026-08-12-001 |
| R-28 | Escalation Rules | "Halt and alert if the agent is about to transmit or log seed / identity / wallet key material." | Gap | PRAX-2026-08-12-013 |
| R-29 | Escalation Rules | "Halt and alert if the agent attempts a value transfer that exceeds the approval threshold or lacks operator authorization." | Gap | PRAX-2026-08-12-013 |
| R-30 | Escalation Rules | "Alert on Almanac / Agentverse registration failure rather than silently continuing." | Partial | PRAX-2026-08-12-013 |
| R-31 | Escalation Rules | "Alert on repeated inbound messages from senders whose signatures fail verification or who are not authorized counterparties." | Gap | PRAX-2026-08-12-013 |
| R-32 | Escalation Rules | "Log only — do not alert — on routine signature-verified message handling and scheduled interval task runs; these events MUST leave a log record." | Gap | PRAX-2026-08-12-012 |
Findings, ordered by severity — each linked to its remit rule, evidence, and a recommended action. Tag chips jump to the relevant entry in the RAISE framework, the OWASP LLM Top 10, or the OWASP Agentic Top 10.
LLM06 primary — the finding's main OWASP categoryASI10 secondary — a category it also touches
CRITICAL PRAX-2026-08-12-001 The agent inspector's REST endpoints are reachable by any remote or cross-origin caller because the only guard is a client IP the caller supplies.
"The server the agent binds to receive envelopes; must serve only the agent's declared endpoints. / Trusted People / Accounts / Allowed Tools (Known Good Baseline) / Adding a new outbound communication channel, integration, or counterparty not already authorized. / If such debug/administrative endpoints are enabled, the agent MUST NOT expose them unless they sit behind operator-configured protection (authentication / network restriction)."
- Stop deriving authorization from the peer address in
asgi.py— removeforwarded_allow_ips="*", require a locally-issued bearer token for/messages,/connectand/disconnect, and move/agent_infoinside the guarded set. - Scope the CORS headers set in
ASGIServer.serve()to the/submitpath or an operator-configured origin list, so a web origin cannot read or invoke the inspector endpoints from the operator's browser.
CRITICAL PRAX-2026-08-12-002 The Helm chart ships a literal agent seed phrase as its default value, giving every unmodified deployment a publicly known identity and wallet key.
"Credentials, API keys, and seed material MUST be loaded from environment or secure operator configuration; they MUST NOT be hardcoded in source or committed to the repository."
- Remove the seed default from
values.yamland make the chart fail template rendering whenagent.seedis unset, or source it from an existing Kubernetes Secret reference rather than a chart value. - Treat the committed value as compromised: any agent ever deployed with the default must be re-seeded and any wallet funds under its derived address moved.
HIGH PRAX-2026-08-12-003 The agent inspector is enabled by default, so debug endpoints and in-memory retention of every message payload are on unless the operator opts out.
"The agent-inspector and other debug/administrative REST endpoints MUST be disabled in production."
- Flip
enable_agent_inspectorto defaultFalseinAgent.__init__and require an explicit opt-in, so the production posture is the default rather than the exception. - Decouple message-history caching from the inspector flag so an operator can keep the inspector off without losing session history, and vice versa.
HIGH PRAX-2026-08-12-004 Envelope expiry and nonce are signed but never checked on receipt, so any captured signed envelope can be replayed against a handler indefinitely.
"A message sender whose identity signature does not verify is not a trusted counterparty for state-changing or privileged actions — see Action Boundaries → Never Allowed. / The agent MUST NOT act on an unsigned or signature-unverified message when performing a state-changing or privileged action."
- Reject envelopes whose
expiresis absent or in the past at the ingress point inasgi.pyandmailbox.py, beforedispatcher.dispatch_msg. - Populate
nonceon outbound envelopes inContext.send_rawand keep a bounded seen-nonce or (sender, session, nonce) set on receipt so a replayed envelope is dropped.
HIGH PRAX-2026-08-12-005 A synchronous response envelope that carries no signature skips verification entirely and is delivered to the waiting caller as a legitimate reply.
"A message sender whose identity signature does not verify is not a trusted counterparty for state-changing or privileged actions — see Action Boundaries → Never Allowed."
- Treat a missing signature as a verification failure in
send_exchange_envelope, and require the response envelope'ssenderto equal the address that was resolved for the request. - Add the same verification to
uagents_core.utils.messages.send_message_to_agentbefore returning a parsed sync response to the caller.
HIGH PRAX-2026-08-12-006 The default inbound path applies no counterparty allowlist and no rate limit, so any agent on the open network can drive a handler at will.
"The operator-configured allowlist of authorized peer agent addresses is a closed set: any peer agent address or message sender not on that allowlist is not an authorized counterparty, and its appearance in communication or transactions is a trust-expansion finding."
- Give
Agentan optional operator-supplied peer allowlist that_process_single_messagechecks before dispatch, so the closed-counterparty model the remit assumes can be expressed without subclassing a protocol. - Apply a conservative default quota to the ingress path in
asgi.py(per sender address and per remote address), leavingQuotaProtocolfor finer per-handler policy.
HIGH PRAX-2026-08-12-007 Every handler receives an unrestricted wallet and ledger client, and the framework ships no approval hook for spending them.
"On-chain transactions — gated per Action Boundaries. / Any capability that moves value on the ledger or spends wallet funds — see Action Boundaries. / Any discretionary on-chain value transfer or spend of wallet funds — value moved to any counterparty other than the Almanac / Agentverse registration contract. The framework ships no operator authorization policy for wallet spends, so the deployment MUST supply the gating policy; its absence is a gap in the deployment, not a configurable threshold to look up."
- Add an operator-supplied authorization callback to
Agentthat any value-moving path must clear, and route the registration fee through it as a pre-approved exemption so the gate has a single choke point. - Emit a distinct log record (and, once an alert path exists, an alert) whenever a transaction other than Almanac registration is broadcast from the agent's wallet.
HIGH PRAX-2026-08-12-008 Identity and wallet private keys are written to a plaintext JSON file in the working directory, and the wallet key persisted is not the one the agent uses.
- Create
private_keys.jsonwith owner-only permissions (os.openwith mode0o600) and support an operator-supplied key source — environment or an external secret store — as the documented default. - Fix
get_or_create_private_keysto persist the samewallet_keyit returns, and document the recovery path for agents already running on an unpersisted wallet key.
MEDIUM PRAX-2026-08-12-009 Signature verification is skipped whenever the sender address begins with the four characters "user", a claim the sender makes about itself.
"Allowed Data Sources"
- Require a signature on every envelope and give user-address senders their own verifiable credential, rather than exempting an address class from verification by string prefix.
- Until that change lands, log every unverified dispatch with the claimed sender so the operator can see how much of their traffic is entering on the exempt path.
MEDIUM PRAX-2026-08-12-010 The runtime contacts a Fetch.ai testnet faucet automatically when registration funds run low, an outbound destination absent from the approved channel table.
"Approved Communication Channels"
Agent or registration-policy argument, and log the destination host when it fires so the outbound surface is visible.MEDIUM PRAX-2026-08-12-011 The core send helper reports every message it sends to Agentverse by default, disclosing counterparty addresses and session identifiers without operator opt-in.
track_interaction to False and require the caller to opt in, or expose it as an AgentverseConfig setting so an operator can disable interaction reporting deployment-wide.MEDIUM PRAX-2026-08-12-012 Routine message handling and interval runs leave no log record, and what is logged is free-form text with no schema.
"Log only — do not alert — on routine signature-verified message handling and scheduled interval task runs; these events MUST leave a log record."
- Emit one record per handled message and per interval run in
_process_single_messageand_run_interval, carrying session, sender, schema digest and outcome. - Offer a structured (JSON-lines) formatter option in
uagents/utils.pyso those records can be shipped and queried rather than read by eye.
MEDIUM PRAX-2026-08-12-013 The framework offers no alert or halt primitive, so every escalation condition the remit declares degrades to a log line or to silence.
"Halt and alert if the agent is about to transmit or log seed / identity / wallet key material. / Halt and alert if the agent attempts a value transfer that exceeds the approval threshold or lacks operator authorization. / Alert on Almanac / Agentverse registration failure rather than silently continuing. / Alert on repeated inbound messages from senders whose signatures fail verification or who are not authorized counterparties."
- Add an operator-registrable escalation callback (halt, alert, log) that the runtime invokes on registration failure, repeated verification failure and any wallet-affecting operation.
- Replace the blanket
contextlib.suppress(Exception)inupdate_agent_statuswith a logged failure so a silent deregistration cannot happen.
MEDIUM PRAX-2026-08-12-014 Both published distributions declare unbounded dependency floors, and no dependency, container or code scanning runs anywhere in the repository.
- Bound the runtime dependencies with upper limits (as pydantic and uvicorn already are) so a downstream install cannot silently cross a major version.
- Add a scheduled dependency-audit job (
pip-auditorosv-scanner) and publish an SBOM with each release so exposure can be assessed when a CVE lands.
Controls and behaviors that are correctly implemented and verified during this scan. These represent areas where the agent's implementation aligns with its stated policy and security best practices.
Cryptographic envelope verification on by default
Every inbound envelope from an agent-prefixed sender has its ECDSA signature checked against the sender's address before dispatch, on both the HTTP and mailbox ingress paths, with no configuration required to enable it.
No arbitrary-code capability anywhere in the runtime
The framework holds no shell, subprocess, eval, exec or pickle call in either subject package, so the remit's forbidden-tool rule is satisfied structurally rather than by policy.
Security-control regression tests run on every push and pull request
The unit suite asserts that a bad signature is rejected and that a non-loopback client is refused the inspector endpoints, and CI runs it across a four-version Python matrix on push to main and on every PR.
Dependency locks committed and enforced in CI
Both packages commit lockfiles and the CI job installs with uv sync --locked, so the tested build is reproducible even though the published distributions are not pinned.
Published profile payload restricted to non-sensitive fields
The Agentverse registration profile carries only description, readme, avatar and banner, and the Almanac attestation filters metadata down to geolocation, so no key material or private configuration reaches the public registry.
Declared vulnerability disclosure policy
SECURITY.md gives a reporting address, a Critical/Non-critical classification and a coordinated-fix process, so external reports have a defined route.
Log files found in the agent's workspace during this scan. Reviewing these files provides runtime evidence to complement the static analysis above.
| Path | Source | Content Type | Purpose | Last Modified | Status |
|---|---|---|---|---|---|
| uagents_core.log | uagents_core.logger.get_logger default FileHandler | plaintext timestamped lines | Captures uagents-core module logs (messaging helpers, resolver, registration utilities) in the process working directory | unknown | Inferred |
Each card represents one category and shows the top 3 findings. All items in the Findings section.
Each card represents one category and shows the top 3 findings. All items in the Findings section.
Overall maturity assessment across the six categories of the RAISE framework. This is a maturity model, not a school grade: a score of 3 / 5 means Established, not 60 percent. Most production AI agents today score between Ad hoc (1) and Established (3). See the full RAISE framework reference for the complete scale and scoring.
Maturity Scoring Rubric
Every score above is based on this scale. A score is a snapshot of observable posture — not a verdict on the people or team behind the system.
| Score | Label | Meaning |
|---|---|---|
| 5 | Exemplary | Best-in-class; automated, continuously tested, reference quality. Rarely achieved in shipping systems. |
| 4 | Strong | Comprehensive controls, active management, minor gaps. Production-ready. |
| 3 | Established | Documented controls consistently applied; known gaps accepted. A respectable baseline. |
| 2 | Partial | Some controls exist but coverage is incomplete; key gaps remain. |
| 1 | Ad hoc | Informal or inconsistent measures; relies on individual judgment. |
| 0 | Absent | No evidence this category is addressed at all. |