Skip to content

security_baseline should accept HTTP Basic auth as a sanctioned mechanism #5042

@estofko-scope3

Description

@estofko-scope3

Summary

The security_baseline/mechanism_required storyboard fails any agent that uses HTTP Basic auth, even when the test harness can successfully authenticate against it. The current contract only credits auth_mechanism_verified from two phases — api_key_path (Bearer) or oauth_discovery (RFC 9728) — leaving Basic-auth agents non-conformant despite the harness supporting Basic since adcp-client#1318.

Current behavior

compliance/cache/<version>/universal/security.yaml:

  • api_key_path skips on !test_kit.auth.api_key
  • oauth_discovery requires /.well-known/oauth-protected-resource/<path>
  • mechanism_required/assert_mechanism fails if neither phase contributes

A Basic-auth agent (e.g. InMobi's seller agent) trips the failure even though:

  • The test runner can authenticate against it (Authorization: Basic header is supported end-to-end)
  • The agent properly rejects unauthenticated requests
  • All other security baseline probes pass

Why this matters

Basic and Bearer are semantically equivalent on the wire — single shared secret in the Authorization header. The storyboard's rejection of Basic is format prescription, not a real security stance. Forcing existing Basic-using agents to retrofit to Bearer creates adoption friction without a corresponding security benefit.

The original argument for Bearer-only ("modern API convention") doesn't hold up against the reality that several deployed adopters use Basic, the harness supports it, and the protocol-level guarantees (auth attempted on every request, valid creds accepted, invalid creds rejected) are identical.

Proposed change

Add a basic_path phase to security.yaml parallel to api_key_path:

- id: basic_path
  title: "HTTP Basic auth probe"
  skip_if: "!test_kit.auth.basic"
  branch_set:
    id: auth_mechanism_verified
    semantics: any_of
  steps:
    - id: probe_basic_valid
      # Authenticate with test_kit.auth.basic credentials → expect 200
    - id: probe_basic_invalid
      # Authenticate with random invalid Basic → expect 401 with WWW-Authenticate

Test-kit schema additions:

  • auth.basic.username / auth.basic.password (or a single auth.basic.credentials field)

assert_mechanism updates to accept contribution from any of api_key_path, basic_path, or oauth_discovery.

Open questions

  1. Should the auth_mechanism_verified flag distinguish which mechanism passed (so buyers can introspect what they're connecting to)? Or stay generic?
  2. Does the protocol/authentication doc need a corresponding section on Basic, or is "any single-shared-secret transport" sufficient framing?
  3. Any downstream impacts on the AAO Verified engine's introspection check (§6.7)?

Affected adopters

InMobi seller agent (https://adcp-nonprod.exchange.inmobi.com/mcp) — currently blocked on security_baseline/assert_mechanism despite otherwise clean 3.0.12 compliance.

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.compliance-suiteneeds-wg-reviewBlocked on a working-group decision — surface in WG meeting agendasspec / protocol

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions