HIGH cryptographic failurescockroachdb

Cryptographic Failures in Cockroachdb

How Cryptographic Failures Manifests in CockroachDB

CockroachDB's distributed SQL architecture introduces unique cryptographic failure patterns distinct from traditional databases. The primary risk surfaces are: (1) insecure inter-node communication, (2) weak TLS configurations in client connections, and (3) improper implementation of column-level encryption.

Inter-Node Communication: CockroachDB nodes communicate over the network using RPC. If TLS is misconfigured or disabled (via --certs-dir flag omission or weak cipher suites), traffic between nodes is vulnerable to interception and modification. Attackers on the same network segment could perform man-in-the-middle attacks, potentially altering replicated data or stealing gossip information. The crdb_internal.gossip_network table exposes network details if accessible.

Client Connection TLS: The SQL interface (port 26257) and HTTP admin UI (port 8080) must enforce TLS. A common failure is using self-signed certificates without proper validation (e.g., sslmode=disable in connection strings) or supporting TLS 1.0/1.1. This exposes SQL traffic and admin credentials. For example, a connection string like postgresql://user@host:26257/db?sslmode=disable sends all queries in plaintext.

Column-Level Encryption Misuse: CockroachDB supports pgcrypto functions for application-level encryption. Failures occur when: (a) deterministic encryption is used for sensitive data (enabling frequency analysis), (b) encryption keys are hard-coded in SQL functions or stored in plaintext configs, or (c) the crypt() function is used with weak algorithms (e.g., bf for Blowfish with insufficient rounds). An example vulnerability: CREATE FUNCTION get_ssn() RETURNS TEXT AS $$ SELECT pgp_sym_decrypt(ssn_enc, 'hardcoded_key') FROM users; $$ LANGUAGE SQL; exposes the key in function definition.

Default Certificates: Out-of-the-box CockroachDB generates self-signed certificates. If operators fail to replace these with enterprise-signed certificates without also adjusting --cacert validation settings, clients may accept any certificate, enabling spoofing.

CockroachDB-Specific Detection

Detecting cryptographic failures in CockroachDB requires examining both its API endpoints and configuration exposure. middleBrick's scanning approach targets the unauthenticated attack surface:

  • Admin UI Endpoint Analysis: Scans the HTTP admin interface (typically http://host:8080) for TLS status. A response with Strict-Transport-Security header missing or a redirect from HTTP to HTTPS indicates misconfiguration. The scanner also probes /api/v2/nodes or /_admin/v1/status for network encryption status fields like "tls_enabled": false in JSON responses.
  • SQL Interface Probing: Attempts a non-TLS connection to port 26257. If the server responds with a PostgreSQL startup packet without requiring SSL, it confirms sslmode=disable is possible. middleBrick also checks supported SSL/TLS versions via cipher suite negotiation.
  • Cryptographic Function Discovery: Parses the database schema through any exposed GraphQL or REST endpoints (if enabled) or via error-based inference. It searches for usage of pgp_sym_encrypt, pgp_sym_decrypt, crypt, and gen_random_bytes in function definitions. Hard-coded keys are detected by matching common patterns like '[A-Za-z0-9]{32}' within function bodies.
  • Certificate Validation: Fetches the server certificate from the SQL or HTTP port. It checks for: (a) self-signed certificates (issuer == subject), (b) weak signature algorithms (e.g., SHA-1), (c) short key lengths (<2048 bits for RSA), and (d) expired certificates.

Example middleBrick CLI scan targeting a CockroachDB node:

middlebrick scan http://cockroachdb.example.com:8080

The resulting report will flag: "TLS 1.0/1.1 supported," "No HSTS header on admin UI," or "Deterministic encryption detected on column 'ssn' in table 'users'."

CockroachDB-Specific Remediation

Remediation must address each failure vector with CockroachDB-native features. All fixes assume cluster admin access.

1. Enforce TLS for Inter-Node and Client Communication:

  • Generate proper certificates using cockroach cert create-ca, cockroach cert create-node, and cockroach cert create-client with at least RSA 2048-bit keys and SHA-256 signatures.
  • Start each node with:
    cockroach start --certs-dir=/certs --listen-addr=host:26257 --http-addr=host:8080 --join=host1,host2,host3
    Ensure --certs-dir contains ca.crt, node.crt, node.key, and client.root.crt.
  • For client connections, enforce sslmode=verify-full in connection strings. Example in an application:
    conn = psycopg2.connect(
        "host=cockroachdb.example.com port=26257 user=root dbname=defaultdb sslmode=verify-full sslrootcert=/certs/ca.crt"
    )
  • Disable weak TLS versions by setting --tls-min-version=1.2 in node startup flags (CockroachDB v22.2+).

2. Secure Column-Level Encryption:

  • Avoid deterministic encryption for high-cardinality data. Use pgp_sym_encrypt(data, key, 'compress-algo=1, cipher=aes256') with a strong, randomly generated key per column.
  • Never hard-code keys. Store them in a secrets manager (e.g., HashiCorp Vault) and inject at runtime. Example using environment variables in a SQL function:
    CREATE FUNCTION encrypt_ssn(ssn TEXT) RETURNS BYTEA AS $$
      SELECT pgp_sym_encrypt(
        ssn,
        current_setting('app.encryption_key'),
        'cipher=aes256'
      );
    $$ LANGUAGE SQL;
    Set the key via SET app.encryption_key = 'your-secret-key'; per session from the application.
  • Rotate keys periodically. CockroachDB does not support automatic key rotation; you must decrypt and re-encrypt data with a new key:
    UPDATE users SET ssn_enc = pgp_sym_encrypt(ssn, 'new_key', 'cipher=aes256');
    Perform during maintenance windows.

3. Harden Admin UI:

  • Bind the HTTP admin interface to localhost or a private network interface using --http-addr=127.0.0.1:8080.
  • Place a reverse proxy (e.g., Nginx) in front with TLS termination and HTTP Strict Transport Security (HSTS):
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

Verification: After remediation, re-scan with middleBrick to confirm TLS 1.2+ only, HSTS header presence, and absence of deterministic encryption patterns.

Compliance and Continuous Monitoring

Cryptographic failures map directly to OWASP API Security Top 10 A02:2021, PCI-DSS Requirement 4 (encryption of cardholder data), and HIPAA §164.312(a)(2)(iv) (transmission security). middleBrick's scoring weights these checks heavily; a failure in CockroachDB's TLS configuration typically yields a critical finding.

For continuous assurance, integrate middleBrick into your CI/CD pipeline using the GitHub Action. Configure it to scan your CockroachDB connection strings or admin URLs in staging environments before production deploy. Example workflow snippet:

name: API Security Scan
on: [pull_request]
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: middlebrick/github-action@v1
        with:
          url: ${{ secrets.COCKROACHDB_STAGING_URL }}
          threshold: 'B'

This fails the PR if cryptographic issues drop the score below A. The Pro plan's scheduled scanning can monitor production endpoints daily, alerting via Slack if TLS certificates expire or weak ciphers are re-introduced.

Frequently Asked Questions

How can I tell if my CockroachDB cluster's TLS is properly configured without credentials?
middleBrick's scan checks the TLS handshake and certificate details when connecting to the SQL port (26257) or HTTP admin port (8080). It reports on protocol versions supported, certificate validity, and whether the server enforces certificate validation. For example, if the scan shows 'TLS 1.0 supported' or 'Self-signed certificate accepted without validation,' those are cryptographic failures.
Does CockroachDB's built-in encryption (e.g., storage encryption) count as a remediation for cryptographic failures?
No. Storage-level encryption (encryption-at-rest) is orthogonal to the failures middleBrick detects, which focus on data in transit (TLS) and application-layer encryption (column-level). middleBrick checks that client connections use TLS and that any application-managed encryption (via pgcrypto) uses strong algorithms and proper key management. You must still configure node-to-node TLS and client TLS separately.