Denial Of Service in Chi with Dynamodb
Denial Of Service in Chi with Dynamodb — how this specific combination creates or exposes the vulnerability
In Chi, a Denial of Service (DoS) against an Amazon DynamoDB backend often stems from unbounded request rates or poorly designed access patterns that amplify pressure on provisioned capacity. When a Chi service directly exposes DynamoDB operations without adequate client-side controls, a high volume of synchronous requests can exhaust provisioned read/write capacity units, trigger throttling, and cause latency spikes that degrade or block legitimate traffic. This is especially relevant when using on-demand capacity mode: while it removes explicit provisioning, bursts of expensive queries or scans can still lead to elevated costs and contention, effectively creating a self-inflicted denial condition.
The risk is compounded when Chi routes requests through lightweight endpoints that perform inefficient scans or queries without filtering, pagination, or backpressure. For example, repeatedly scanning large tables or querying with non-partition-key filters forces DynamoDB to consume significantly more read capacity than a targeted query, increasing the likelihood of throttling under load. Because DynamoDB does not queue requests, excess demand manifests as provisioned-throughput-exceeded exceptions, which Chi applications might not handle gracefully, resulting in 5xx responses and service disruption. Attackers can weaponize this by generating high request rates or malformed queries that maximize resource consumption, effectively achieving a DoS without needing authentication.
middleBrick identifies this class of risk through its Rate Limiting and Input Validation checks, correlating runtime behavior with the OpenAPI definition of your Chi endpoints. It flags operations such as unkeyed scans, missing pagination tokens, and missing rate-limit headers, and maps findings to the OWASP API Top 10 and relevant compliance frameworks. The scanner runs in 5–15 seconds, testing the unauthenticated attack surface to highlight how an unoptimized DynamoDB integration in Chi can be leveraged to degrade availability.
Dynamodb-Specific Remediation in Chi — concrete code fixes
To mitigate DoS risks when using DynamoDB from Chi, apply defensive coding patterns that bound resource usage, reduce load on provisioned capacity, and fail gracefully. Use strongly-typed models, limit result sets, and enforce pagination. Implement client-side rate limiting and exponential backoff to avoid overwhelming the backend. The following examples assume a Chi route handler written in TypeScript using the AWS SDK for JavaScript v3.
1. Query with Key Condition and Pagination
Always prefer query over scan, and enforce pagination to avoid reading excessive items. Use a reasonable limit and exclusive start key to page safely.
import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient({ region: "us-east-1" });
export async function GET(request: Request) {
const url = new URL(request.url);
const partitionKey = url.searchParams.get("pk") ?? "default_pk";
const limit = Math.min(parseInt(url.searchParams.get("limit") ?? "20"), 50);
const exclusiveKey = url.searchParams.get("lastEvaluatedKey");
const params = {
TableName: "Widgets",
KeyConditionExpression: "pk = :pk",
ExpressionAttributeValues: {
":pk": { S: partitionKey },
},
Limit: limit,
};
if (exclusiveKey) {
params.ExclusiveStartKey = JSON.parse(exclusiveKey);
}
const command = new QueryCommand(params);
const response = await client.send(command);
const lastEvaluatedKey = response.LastEvaluatedKey
? JSON.stringify(response.LastEvaluatedKey)
: null;
return Response.json({
items: response.Items,
lastEvaluatedKey,
});
}
2. Conditional Writes and Capacity-Aware Handling
Use ConditionExpression to avoid overwrites that could trigger repeated writes, and handle ProvisionedThroughputExceededException with exponential backoff.
import {
DynamoDBClient,
PutItemCommand,
ConditionalCheckFailedException,
ThrottlingException,
} from "@aws-sdk/client-dynamodb";
import { backoff } from "exponential-backoff";
const client = new DynamoDBClient({ region: "us-east-1" });
async function putItemWithBackoff(tableName: string, item: any) {
const command = new PutItemCommand({
TableName: tableName,
Item: item,
ConditionExpression: "attribute_not_exists(id)",
});
return backoff(() => client.send(command), {
numOfAttempts: 5,
timeMultiple: 2,
retryOnException: (e) =>
e.name === "ProvisionedThroughputExceededException" ||
e.name === "ThrottlingException",
});
}
3. Protect Against Costly Operations
Avoid operations that consume disproportionate capacity. If scans are necessary, restrict them to administrative endpoints with strict rate limits and require explicit confirmation.
import { ScanCommand } from "@aws-sdk/client-dynamodb";
export async function adminScan(request: Request) {
const apiKey = request.headers.get("x-admin-key");
if (apiKey !== process.env.ADMIN_SCAN_KEY) {
return new Response(null, { status: 403 });
}
const command = new ScanCommand({
TableName: "Widgets",
Limit: 100,
});
const response = await client.send(command);
return Response.json(response.Items);
}
4. Use DAX or Caching to Reduce Repeated Load
For read-heavy Chi endpoints, offload repeated queries by using Amazon DAX or an external cache. This reduces the number of requests hitting DynamoDB and lowers the chance of throttling under sustained load.
5. Enforce Global Rate Limits at the Edge
In Chi, apply per-client rate limiting before requests reach DynamoDB. Use fixed-window or token-bucket algorithms in your Chi middleware to protect downstream capacity. Combine this with DynamoDB auto scaling where appropriate to adapt to legitimate traffic growth while preventing abusive bursts.
By combining tightly-scoped queries, pagination, conditional writes, exponential backoff, and edge-level rate limiting, you reduce the surface area for DoS against DynamoDB-backed Chi services. middleBrick can validate these mitigations by scanning your OpenAPI spec and runtime endpoints for missing rate limits, unsafe operations like scans, and missing pagination, providing prioritized remediation guidance.
Related CWEs: resourceConsumption
| CWE ID | Name | Severity |
|---|---|---|
| CWE-400 | Uncontrolled Resource Consumption | HIGH |
| CWE-770 | Allocation of Resources Without Limits | MEDIUM |
| CWE-799 | Improper Control of Interaction Frequency | MEDIUM |
| CWE-835 | Infinite Loop | HIGH |
| CWE-1050 | Excessive Platform Resource Consumption | MEDIUM |