Denial Of Service in Aspnet with Dynamodb
Denial Of Service in Aspnet with Dynamodb — how this specific combination creates or exposes the vulnerability
When an ASP.NET application interacts with Amazon DynamoDB, DoS risks arise from unbounded requests, inefficient query patterns, and missing infrastructure protections. A common pattern is a controller that scans a table without pagination, fan-out, or cost controls, which can generate heavy DynamoDB consumed capacity and amplify latency under load.
For example, a GET endpoint that queries an entire partition without a limit or index can trigger hot partitions and prolonged read activity. If the ASP.NET service does not enforce per-request timeouts or retry budgets, client retries can compound load on the table, increasing error rates and response times. This is especially risky when the endpoint is public facing or lacks rate limiting, because an attacker can send many requests that each trigger expensive scans or queries.
Another vector involves large batch operations without request sizing controls. A POST endpoint that accepts an array and writes each item individually can saturate provisioned capacity or on-demand throughput, and long-running loops in ASP.NET can block threads and exhaust connection pools. Without proper validation of payload size and concurrency limits, the service can become unresponsive to legitimate traffic.
DynamoDB-specific error handling also matters. If exceptions such as ProvisionedThroughputExceededException or ResourceNotFoundException are surfaced directly to callers or retried aggressively, clients may amplify traffic. Insecure default configurations, such as disabling adaptive capacity or not using DynamoDB Accelerator (DAX) where appropriate, can further increase tail latencies under contention.
During a middleBrick scan of an ASP.NET endpoint that interacts with DynamoDB, checks include input validation, rate limiting, authentication, and unsafe consumption patterns. The scanner correlates runtime behavior with the OpenAPI spec and DynamoDB request patterns to highlight high-severity findings like missing timeouts, missing pagination, and missing backpressure controls.
Dynamodb-Specific Remediation in Aspnet — concrete code fixes
Apply defensive coding practices and infrastructure-aware patterns to reduce DoS impact when ASP.NET uses DynamoDB.
- Use pagination and limit result set size
// Good: query with pagination and explicit limit
var request = new QueryRequest
{
TableName = "Products",
KeyConditionExpression = "PartitionKey = :pk",
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{ ":pk", new AttributeValue { S = "user#123" } }
},
Limit = 50
};
var response = await _dynamo.QueryAsync(request);
- Set command timeouts and cancellation tokens
// Good: configure timeout and token to avoid hung requests
var config = new AmazonDynamoDBConfig
{
RequestTimeout = TimeSpan.FromSeconds(5)
};
var client = new AmazonDynamoDBClient(config);
var request = new ScanRequest { TableName = "Logs" };
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(8));
try
{
var response = await client.ScanAsync(request, cts.Token);
}
catch (TaskCanceledException)
{
// handle timeout gracefully
}
- Validate and bound input sizes and concurrency
// Good: validate batch size and process with controlled concurrency
var items = requestBody.Items;
if (items.Count > 25)
{
throw new ArgumentException("Batch size exceeds limit of 25");
}
var throttler = new SemaphoreSlim(initialCount: 10);
var tasks = items.Select(async item =>
{
await throttler.WaitAsync();
try
{
await _dynamo.PutItemAsync(new PutItemRequest { TableName = "Orders", Item = item });
}
finally
{
throttler.Release();
}
});
await Task.WhenAll(tasks);
- Use exponential backoff and handle provisioned throughput exceptions
// Good: backoff on throughput exceptions
var retryPolicy = Policy
.Handle<ProvisionedThroughputExceededException>()
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
await retryPolicy.ExecuteAsync(async () =>
{
await _dynamo.PutItemAsync(new PutItemRequest { TableName = "Metrics", Item = new Item { Id = "x" } });
});
- Leverage DynamoDB condition expressions and avoid expensive scans
// Good: use query over scan with GSI when possible
var request = new QueryRequest
{
TableName = "Orders",
IndexName = "StatusIndex",
KeyConditionExpression = "Status = :status AND BeginsWith(OrderId, :prefix)",
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{ ":status", new AttributeValue { S = "shipped" } },
{ ":prefix", new AttributeValue { S = "ORD" } }
}
};
var response = await _dynamo.QueryAsync(request);
- Enable adaptive capacity and monitor consumed capacity
// Good: request metrics to inform scaling
var request = new DescribeTableRequest { TableName = "Payments" };
var table = await _dynamo.DescribeTableAsync(request);
Console.WriteLine(table.Table.TableDetails.TableStatus);
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 |