Your country

Tools that support it use your country for local currency, number formats, units and paper size. Your choice is saved only in this browser.

Type a name or a two-letter code. Use the up and down arrow keys to move through the countries, Enter to choose one and Escape to close.

AWS IAM Policy Analyzer (Explain, Wildcards and Escalation Risks)

Each statement in plain English, wildcards expanded, risky permissions found.

Free preview, no sign-upIncluded in your pass Pro tool Pro pass: ₹179 / $5.99 for 30 days On this device: nothing is sent
+3 +1 more details No uploadWorks offline once opened Developer

Free preview: every count, the first statements and findings (up to 10 each), and the first lines of the rewrite and of a built policy (up to 20). Locked until you unlock it: download and copy.

Pro pass ₹179 for 30 days or ₹79 for 1 week, one‑time. Pro pass $5.99 for 30 days or $2.99 for 1 week, one‑time. How to unlock

Try before you buy.

  • Free preview: every count, the first statements and findings (up to 10 each), and the first lines of the rewrite and of a built policy (up to 20).
  • Locked until you unlock it: download and copy.
  • Unlock: Pro pass, ₹179 for 30 days or ₹79 for 1 week, a one-time payment that never renews. Unlock: Pro pass, $5.99 for 30 days or $2.99 for 1 week, a one-time payment that never renews.

Ways to unlock shows how to get the full result.

See passes (opens in a new tab)

Printing this result is locked in the free preview.

A policy, or the output of aws iam get-policy-version, get-role, get-role-policy or aws s3api get-bucket-policy. Checked as you type; it stays in your browser.

Next steps Done. What next?

Start over

A Pro pass unlocks the full result. See passes

All developer tools

About the AWS IAM Policy Analyzer (Explain, Wildcards and Escalation Risks)

Paste an AWS IAM policy — an identity-based policy, a resource-based policy such as a bucket or key policy, a role trust policy or a service control policy — and read what it really allows:

  • Every statement in plain English: “Allows s3:GetObject (Read) on arn:aws:s3:::example-assets/*, when the request uses HTTPS.” Wildcards such as s3:Get* or iam:*AccessKey* are expanded to the real actions with their access levels (List, Read, Write, Permissions management, Tagging), taken from AWS’s machine-readable Service Authorization Reference; NotAction is counted as everything it does not exclude.
  • Findings in the four kinds IAM Access Analyzer uses — errors, security warnings, warnings and suggestions: full administrator access, NotAction, NotResource or NotPrincipal in an Allow, iam:PassRole on every role, the published privilege-escalation combinations, policies and trust policies open to "Principal": "*", trust in a shared OIDC provider (GitHub Actions, GitLab, HCP Terraform, Buildkite, Pulumi and the others IAM lists) without the claim that names your organization, service principals without aws:SourceArn, unknown actions and condition keys, wrong operators and values, actions that can never match the resources listed (s3:ListBucket on …/*), and policies over the size limit.
  • A least-privilege rewrite for review: wildcards narrowed to the access levels you keep, and actions that support only "Resource": "*" moved to a statement of their own.
  • A policy builder: choose a service, access levels or single actions, resources and conditions (MFA, HTTPS, source IP, organization, Region).

IAM Access Analyzer in your AWS account remains the authority: it checks a policy against your own account, resources and organization, which no page outside AWS can see. Everything here runs in your browser. Without a pass the analysis is a free preview: every count with the first statements and findings, and the first lines of the rewrite and of a built policy; the rest, the copies and the downloads unlock with a Pro pass.

How to use it

  1. Paste a policy, open a .json file, or choose an example. The output of aws iam get-policy-version, get-role, get-role-policy and aws s3api get-bucket-policy works as it is.
  2. Check the Policy type: it is detected from the statements, but a service control policy looks like an identity-based policy, so choose SCP for one.
  3. Read the findings first, then each statement in plain English. Show selects the part of the policy a finding is about.
  4. Choose the access levels to keep and read the least-privilege rewrite and its notes; or switch to Build a policy to write one from scratch.
  5. With a Pro pass, or once the result is unlocked, copy or download the report, the rewrite and the built policy; the free preview shows their first parts and locks the copies and downloads.

Examples

A wildcard that includes permission changes
Input
{"Effect": "Allow", "Action": "s3:*", "Resource": "*"}
Result
Warning: s3:* on every resource — it allows every s3 action, including its permission-management actions such as s3:PutBucketPolicy. The rewrite keeps the List, Read and Write actions.
The bucket ARN that is missing
Input
{"Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": "arn:aws:s3:::example-assets/*"}
Result
Warning: s3:ListBucket applies to buckets, not objects. Every resource here is an object ARN, so ListBucket is never allowed: add arn:aws:s3:::example-assets.
A GitHub Actions role open to every repository
Input
Trust policy: Principal Federated …/token.actions.githubusercontent.com, Condition StringEquals token.actions.githubusercontent.com:aud = sts.amazonaws.com
Result
Security warning: GitHub Actions trust without a condition on token.actions.githubusercontent.com:sub or token.actions.githubusercontent.com:job_workflow_ref — workflows of other GitHub customers could assume the role. Limit it to your own, for example "repo:my-org/my-repo:ref:refs/heads/main".

IAM also refuses to save such a trust policy, as the IAM User Guide explains. A sub value such as "repo:*" is accepted by IAM, but it matches every organization: the page reports that too.

A privilege-escalation path
Input
lambda:CreateFunction, lambda:InvokeFunction and iam:PassRole on "Resource": "*"
Result
Security warning: Can raise its own access: iam:PassRole + lambda:CreateFunction + lambda:InvokeFunction — create a Lambda function with a more privileged role and run it.

Common uses

  • Reviewing a policy in a pull request before it reaches an account.
  • Finding out what a managed or vendor policy with many wildcards really allows.
  • Checking a bucket, queue or key policy for public access, and a trust policy for who can assume the role.
  • Writing a first least-privilege policy for a workload, then tightening it with IAM Access Analyzer’s policy generation.

How the access levels and actions are known

The page carries a snapshot of AWS’s machine-readable service reference: every service prefix, every action, the resource types each action supports with their ARN formats, and each service’s condition keys. AWS publishes four properties per action; the level shown follows them: Permissions management when an action changes permissions or credentials, Tagging when it only changes tags, Write when it changes resources, List when it lists them, and Read otherwise. An action that AWS added after the snapshot is reported as unknown — check its name in the Service Authorization Reference before you remove it.

What the checks follow

  • Grammar: the IAM JSON policy element reference — Version, Statement, Sid, Effect, Action and NotAction, Resource and NotResource, Principal and NotPrincipal, Condition — and the SCP syntax, in which Allow statements take only "Resource": "*" and no Principal.
  • Conditions: the condition operators and the global condition keys with their data types and whether they hold several values (ForAllValues with a missing key is true, so an Allow should add a Null check).
  • Sizes: IAM quotas — 6,144 characters without white space for a managed policy, 2,048 for a role trust policy by default — and 10,240 for an SCP (AWS Organizations quotas).
  • Finding kinds and names follow IAM Access Analyzer’s policy check reference; trust in shared OIDC providers follows IAM’s identity-provider controls: for GitHub Actions a condition on sub or job_workflow_ref, for GitLab, HCP Terraform, Buildkite and most others on sub, for Pulumi Cloud, Vercel and Amazon Cognito on aud, which IAM requires before it saves a new or changed trust policy; a wildcard where your organization’s name belongs is reported too.
  • Privilege escalation: the permission combinations published by Rhino Security Labs, such as iam:CreatePolicyVersion alone, or iam:PassRole with ec2:RunInstances.

Reading a least-privilege rewrite

The rewrite changes only what the snapshot can prove: a wildcard is replaced by the actions of the levels you keep — written as verb wildcards such as s3:Get* where every action they match is kept, and by name otherwise — and an action that supports only "Resource": "*" leaves a statement that names ARNs, where it never matched. It never narrows a Deny (that would allow more), never rewrites NotAction or "Action": "*", and never invents ARNs: the notes say where your resource names belong. Check the result with IAM Access Analyzer before you use it.

Limitations

  • The page knows the policy, not your account: it cannot tell whether a role or bucket exists, whether another policy grants or denies the same thing, or whether an account ID is yours. IAM Access Analyzer in your account remains the authority.
  • Actions, resource types and condition keys come from a snapshot of the Service Authorization Reference; ones added since are reported as unknown.
  • Privilege-escalation checks look at the permissions this one policy allows, not at what the principal’s other policies, permission boundaries or SCPs allow.
  • Condition keys of individual services are checked by name only; their data types are not.

Privacy

On this device: nothing is sent

Everything happens in your browser. What you enter or open here is not uploaded or stored by MySmartCoPilot.

Frequently asked questions

What do I get without a pass?

Without a pass, AWS IAM Policy Analyzer (Explain, Wildcards and Escalation Risks) shows every count, the first statements and findings (up to 10 each), and the first lines of the rewrite and of a built policy (up to 20). Until you unlock it, the result can’t be downloaded or copied. A Pro, Premium or Ultimate pass, a one-time payment that never renews, unlocks the full result. The pricing page lists the passes and their prices.

Is my policy uploaded?

No. The list of AWS actions is part of the page (it loads the first time you analyze a policy), and the analysis, the rewrite and the builder run in your browser.

How is this different from IAM Access Analyzer?

Access Analyzer runs inside your AWS account, so it can check a policy against your real resources and organization and find external access. This page needs no account: it explains each statement, expands wildcards with their access levels and points out risky patterns, which helps you understand and review a policy before it reaches Access Analyzer.

Why is an action I use reported as unknown?

Either the name is misspelled (actions are case-insensitive, but every letter counts), the permission is named differently from the API operation, or AWS added it after the page’s snapshot. Check the service’s page in the Service Authorization Reference.

Why does it detect my SCP as an identity-based policy?

An SCP looks exactly like an identity-based policy without a Principal. Choose “Service control policy (SCP)” in Policy type: the SCP rules then apply, for example that an Allow statement can name only "Resource": "*".

What does “Can raise its own access” mean?

The policy allows a combination of permissions that lets whoever has it grant themselves more access — for example iam:AttachUserPolicy (attach AdministratorAccess to yourself) or iam:PassRole with ec2:RunInstances (start an instance with a more privileged role). Limit those actions to resources that cannot lead to more access, or remove them.

Quick answers and tool search

Type to search tools or to get a quick answer, for example 18% of 2500. Use the up and down arrow keys to move through the results, Enter to choose, and Escape to close.