☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]
[ VENDOR STATS ]
CVSS: 2.7 🐛 CWE-770
👁️
Common Weakness Enumeration - Identifies the specific category of software weakness or flaw.

CVE-2025-64529

CVE-2025-64529 Unauthorized Access in Spicedb
📅 PUBLISHED: 2025-11-10 22:28 UTC 🔄 UPDATED: 2026-09-23 20:37 UTC
[ OFFICIAL PATCH DEPLOYED ↓ ] FIX: LIKELY — 2 independent sources confirm fix
[ DEFENSE PATCH ↓ ]
💣 PoC: None
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.25%
👁️
0.25% probability
6.1× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
Patch available — upgrade to latest release
CVSS SEVERITY SCALE
9.0–10.0 CRITICAL
7.0–8.9 HIGH
4.0–6.9 MEDIUM
0.1–3.9 LOW
0.0 NONE
2.7
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-64529 is a high-severity vulnerability in SpiceDB, an open-source database system for managing security-critical application permissions. The flaw allows a successful response to be returned for a WriteRelationships call that actually failed due to payload size exceeding the datastore limit. This leads to incorrect permission check results, potentially granting unauthorized access or denying legitimate access. The vulnerability affects versions prior to 1.45.2 and requires specific conditions: use of the exclusion operator in the authorization schema, a --write-relationships-max-updates-per-call value greater than 6500, and a large enough number of updates in a single call. The CVSS score is 0.0 due to incomplete NVD data, but the actual impact is significant for integrity.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

Supply Chain & Package Security

SpiceDB is a Go-based application. The vulnerability is in the core server logic, not in a package dependency. However, organizations using SpiceDB as a dependency in their Go projects should ensure they are using version 1.45.2 or later. The fix is a server-side patch, so updating the SpiceDB binary or container image is sufficient.

CVSS Breakdown & Threat Level

While the NVD reports a CVSS score of 0.0, a more accurate assessment based on the vulnerability details is:

  • Attack Vector (AV): Network (N) – The attack is performed over the network via API calls.
  • Attack Complexity (AC): Low (L) – No special conditions beyond the configuration requirements.
  • Privileges Required (PR): Low (L) – An attacker needs valid credentials to call WriteRelationships.
  • User Interaction (UI): None (N) – No user interaction required.
  • Scope (S): Unchanged (U) – The vulnerability does not affect other components.
  • Confidentiality (C): None (N) – No data disclosure.
  • Integrity (I): High (H) – Incorrect permission checks can lead to unauthorized access.
  • Availability (A): None (N) – No denial of service.

CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N
Base Score: 6.5 (Medium)

The threat level is Medium due to the requirement for valid credentials and specific configuration conditions.

Deep Dive & Mechanics

The vulnerability lies in the WriteRelationships API endpoint. When a large number of updates are sent in a single call, the payload may exceed the datastore's maximum allowed size. Instead of returning an error, the server incorrectly returns a success response. This silent failure means the relationships are not written, but the caller believes they were.

If the exclusion operator is used in the authorization schema, the missing relationships can lead to incorrect permission checks. For example, if a relationship that should exclude a user from a group is not written, the user may retain access they should not have.

The root cause is a lack of proper error handling when the datastore rejects the write due to payload size. The server should check the datastore's response and return an error to the client.

Vulnerable vs. Patched Code

The vulnerable code path is in the WriteRelationships handler. The patch in version 1.45.2 adds a check for the datastore error and returns a proper error response.

Vulnerable Code (simplified):

func (s *Server) WriteRelationships(ctx context.Context, req *pb.WriteRelationshipsRequest) (*pb.WriteRelationshipsResponse, error) {
    // ... validation ...
    err := s.datastore.WriteRelationships(ctx, req.Updates)
    if err != nil {
        // Missing: check for payload size error
        return nil, err
    }
    return &pb.WriteRelationshipsResponse{}, nil
}

Patched Code (simplified):

func (s *Server) WriteRelationships(ctx context.Context, req *pb.WriteRelationshipsRequest) (*pb.WriteRelationshipsResponse, error) {
    // ... validation ...
    err := s.datastore.WriteRelationships(ctx, req.Updates)
    if err != nil {
        if isPayloadTooLarge(err) {
            return nil, status.Errorf(codes.InvalidArgument, "payload too large")
        }
        return nil, err
    }
    return &pb.WriteRelationshipsResponse{}, nil
}

The patch ensures that any datastore error, including payload size errors, is properly propagated to the client.

Exploitation & Lab Setup

Red Team

Prerequisites:

  • Access to a SpiceDB instance with version < 1.45.2.
  • Valid credentials with permission to call WriteRelationships.
  • The authorization schema must use the exclusion operator.
  • The server must be configured with --write-relationships-max-updates-per-call > 6500.

Exploitation Steps:

  1. Craft a WriteRelationships request with a large number of updates (e.g., 10,000) that exceeds the datastore's payload limit.
  2. Send the request to the SpiceDB API.
  3. Observe that the server returns a success response, but the relationships are not actually written.
  4. If the missing relationships involve exclusion, the attacker can gain unauthorized access.

Example Request (using grpcurl):

grpcurl -plaintext -d '{
  "updates": [
    {"relationship": {"resource": {"object_type": "user", "object_id": "attacker"}, "relation": "member", "subject": {"object": {"object_type": "group", "object_id": "admin"}}}},
    // ... repeat 10,000 times with different relationships
  ]
}' localhost:50051 authzed.api.v1.PermissionsService/WriteRelationships

Blue Team

Detection:

  • Monitor for WriteRelationships calls with an unusually high number of updates (e.g., > 5000).
  • Alert on successful WriteRelationships responses that are followed by permission check anomalies.
  • Review server logs for datastore errors that are not propagated to the client.

Mitigation:

  • Immediately upgrade to SpiceDB version 1.45.2 or later.
  • As a workaround, set --write-relationships-max-updates-per-call to 1000.
  • Implement network segmentation to limit access to the SpiceDB API.
  • Use API rate limiting to prevent large payloads.

Indicators of Compromise (IOCs)

  • Network: Unusually large WriteRelationships requests (payload size > 1 MB).
  • Logs: Server logs showing datastore errors (e.g., "payload too large") without corresponding client errors.
  • Behavior: Permission check results that contradict expected access controls, especially involving exclusion operators.

Detection Engineering

YARA Rule

rule CVE_2025_64529_SpiceDB_Silent_WriteFailure {
    meta:
        description = "Detects SpiceDB WriteRelationships calls with large payloads that may trigger CVE-2025-64529"
        author = "Valters IT"
        date = "2025-04-10"
        reference = "CVE-2025-64529"
    strings:
        $api_call = "WriteRelationships" nocase
        $large_payload = /updates.{5000,}/  // Matches payloads with many updates
    condition:
        $api_call and $large_payload
}

Sigma Rule

title: SpiceDB Large WriteRelationships Payload
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects WriteRelationships calls with a large number of updates, indicating potential exploitation of CVE-2025-64529
author: Valters IT
date: 2025-04-10
logsource:
    category: application
    product: spicedb
detection:
    selection:
        api: "WriteRelationships"
        updates_count: > 5000
    condition: selection
falsepositives:
    - Legitimate bulk operations
level: high

Suricata Rule

alert tcp any any -> any 50051 (msg:"CVE-2025-64529 SpiceDB Large WriteRelationships Payload"; flow:to_server; content:"WriteRelationships"; nocase; pcre:"/updates.{5000,}/"; sid:1000001; rev:1;)

Remediation & Mitigation

Immediate:

  • Upgrade to SpiceDB version 1.45.2 or later.
  • If upgrade is not possible, set --write-relationships-max-updates-per-call to 1000.

Long-term:

  • Implement input validation to reject payloads exceeding the datastore limit.
  • Add monitoring for silent failures in critical API endpoints.
  • Conduct a security review of all API error handling.

Workaround:

  • Reduce the maximum updates per call to 1000 to prevent payloads from exceeding the datastore limit.

Valters IT
Securing Digital Frontiers

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2025-64529/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.