Bola Idor in Cockroachdb
How Bola Idor Manifests in Cockroachdb
BOLA/IdOR (Broken Object Level Authorization / Insecure Direct Object References) vulnerabilities in Cockroachdb often emerge through improper row-level security implementations. When Cockroachdb's role-based access control (RBAC) or row-level security policies are not correctly enforced at the application layer, attackers can manipulate object identifiers to access unauthorized data.
A common Cockroachdb-specific manifestation occurs with SELECT statements using user-supplied identifiers. Consider a multi-tenant application where users retrieve their data by customer ID:
SELECT * FROM orders WHERE customer_id = $1If the application fails to verify that the authenticated user owns the requested customer_id, an attacker can enumerate IDs to access other customers' orders. This becomes particularly dangerous in Cockroachdb because of its distributed architecture—data might be spread across nodes, but the query planner will still execute unauthorized requests if the RBAC check is missing.
Another Cockroachdb-specific pattern involves the use of INTERLEAVE tables. When parent-child relationships are interleaved for performance, improper authorization checks can expose child records through parent ID manipulation:
CREATE TABLE customers (id UUID PRIMARY KEY, name STRING) INTERLEAVE IN PARENT accounts (id);If an application queries SELECT * FROM customers WHERE id = $1 without validating that the requesting user has access to the parent account, an attacker can traverse the interleaved hierarchy to access unauthorized customer records.
Cockroachdb's AS OF SYSTEM TIME clause for temporal queries introduces another attack vector. Applications might allow users to specify timestamps for historical data access:
SELECT * FROM orders WHERE customer_id = $1 AS OF SYSTEM TIME $2Without proper validation, attackers can use this to access historical data they shouldn't see, potentially exposing PII or business-sensitive information from past states.
The distributed nature of Cockroachdb also means that BOLA vulnerabilities can manifest across partitions. A query targeting data in one partition might inadvertently return results from another if the application logic doesn't properly scope the request to the user's authorized partition.
Cockroachdb-Specific Detection
Detecting BOLA/IdOR in Cockroachdb requires both static code analysis and dynamic runtime scanning. middleBrick's approach specifically targets Cockroachdb's unique patterns:
Static Analysis examines your application code for dangerous patterns. middleBrick's scanner identifies SQL queries that directly interpolate user input without proper authorization checks. For Cockroachdb specifically, it looks for:
- Queries using user-supplied IDs without ownership verification
- Missing RBAC enforcement in stored procedures
- Unsafe use of
AS OF SYSTEM TIMEwith user-controlled timestamps - Interleaved table access without parent-child authorization validation
Dynamic Runtime Scanning actively tests your Cockroachdb endpoints by manipulating object identifiers. middleBrick's black-box scanner sends requests with altered IDs to detect if unauthorized data is returned. For Cockroachdb applications, this includes:
POST /api/orders HTTP/1.1
Content-Type: application/json
{
"customerId": "00000000-0000-0000-0000-000000000001",
"orderId": "00000000-0000-0000-0000-000000000001"
}The scanner then systematically modifies these IDs to probe for BOLA vulnerabilities, testing whether the Cockroachdb backend properly enforces row-level security.
Database-Level Detection involves examining Cockroachdb's audit logs and slow query logs. Look for:
- Queries accessing rows outside expected ranges
- Unusual temporal query patterns with
AS OF SYSTEM TIME - Excessive row returns from interleaved tables
middleBrick's scanner can analyze these logs when provided access, correlating application-layer findings with database-level anomalies.
Schema Analysis is particularly important for Cockroachdb. middleBrick examines your schema to identify interleaved tables, temporal query patterns, and RBAC configurations that might be vulnerable to BOLA attacks. The scanner specifically checks for:
- Missing row-level security policies on sensitive tables
- Improper use of
AS OF SYSTEM TIMEwithout access controls - Interleaved table hierarchies without proper authorization checks
Cockroachdb-Specific Remediation
Remediating BOLA/IdOR vulnerabilities in Cockroachdb requires a defense-in-depth approach combining application-layer validation with database-level controls.
Application-Layer Fixes should be your first line of defense. Always validate that the requesting user owns or has access to the requested resource:
func getOrder(customerID uuid.UUID, orderID uuid.UUID, userID uuid.UUID) (Order, error) {
// First, verify the user owns this customer
customer, err := getCustomer(userID, customerID)
if err != nil {
return Order{}, err
}
// Then verify the order belongs to this customer
order, err := queryOrder(orderID)
if err != nil {
return Order{}, err
}
if order.CustomerID != customerID {
return Order{}, errors.New("access denied")
}
return order, nil
}Cockroachdb Row-Level Security (RLS) provides database-level enforcement. Define security policies that restrict data access based on user attributes:
CREATE TABLE orders (
id UUID PRIMARY KEY,
customer_id UUID,
user_id UUID,
amount DECIMAL,
created_at TIMESTAMP
);
-- Create a security policy that restricts access to orders belonging to the authenticated user
CREATE POLICY orders_rls_policy ON orders
FOR ALL
USING (user_id = crdb_internal.current_session_user());
-- Enable the policy
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;Interleaved Table Authorization requires careful policy design. When using INTERLEAVE IN PARENT, ensure both parent and child access is validated:
CREATE TABLE accounts (
id UUID PRIMARY KEY,
name STRING,
owner_id UUID
);
CREATE TABLE customers (
id UUID PRIMARY KEY,
account_id UUID,
name STRING,
owner_id UUID
) INTERLEAVE IN PARENT accounts (account_id);The application must validate that the requesting user owns the parent account before accessing any interleaved child records.
Temporal Query Security for AS OF SYSTEM TIME requires strict access controls:
CREATE POLICY temporal_orders_policy ON orders
FOR SELECT
USING (
user_id = crdb_internal.current_session_user()
AND created_at > NOW() - INTERVAL '30 DAYS'
);
-- Alternatively, use a stored procedure with explicit access control
CREATE PROCEDURE get_historical_order(
order_id UUID,
as_of_time TIMESTAMP
)
AS
BEGIN
-- Validate the user can access this order
IF NOT EXISTS (
SELECT 1 FROM orders
WHERE id = order_id
AND user_id = crdb_internal.current_session_user()
) THEN
RAISE EXCEPTION 'Access denied';
END IF;
-- Return the historical data
SELECT * FROM orders WHERE id = order_id AS OF SYSTEM TIME as_of_time;
END;Stored Procedure Security centralizes authorization logic. Instead of exposing direct table access, use stored procedures that enforce access controls:
CREATE PROCEDURE get_customer_orders(
customer_id UUID,
requesting_user_id UUID
)
AS
BEGIN
-- Verify the user owns this customer
IF NOT EXISTS (
SELECT 1 FROM customers
WHERE id = customer_id
AND owner_id = requesting_user_id
) THEN
RAISE EXCEPTION 'Access denied';
END IF;
-- Return only orders for this customer
SELECT * FROM orders WHERE customer_id = customer_id;
END;API Gateway Integration adds another security layer. Use your API gateway to enforce tenant isolation before requests reach Cockroachdb:
function validate_tenant_access(customer_id, user_id) {
// Check if user belongs to this tenant
const tenant = tenant_store.get_tenant_by_customer(customer_id);
if (!tenant.has_user(user_id)) {
throw new Error('Unauthorized access');
}
}Related CWEs: bolaAuthorization
| CWE ID | Name | Severity |
|---|---|---|
| CWE-250 | Execution with Unnecessary Privileges | HIGH |
| CWE-639 | Insecure Direct Object Reference | CRITICAL |
| CWE-732 | Incorrect Permission Assignment | HIGH |