AWS - Nitro Enum
Reading time: 12 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Informações Básicas
AWS Nitro é um conjunto de tecnologias inovadoras que formam a plataforma subjacente para instâncias AWS EC2. Introduzido pela Amazon para aumentar a segurança, desempenho e confiabilidade, Nitro aproveita componentes de hardware personalizados e um hipervisor leve. Ele abstrai grande parte da funcionalidade de virtualização tradicional para hardware e software dedicados, minimizando a superfície de ataque e melhorando a eficiência dos recursos. Ao descarregar funções de virtualização, Nitro permite que as instâncias EC2 ofereçam desempenho quase bare-metal, tornando-se particularmente benéfico para aplicações que consomem muitos recursos. Além disso, o Nitro Security Chip garante especificamente a segurança do hardware e firmware, solidificando ainda mais sua arquitetura robusta.
Nitro Enclaves
AWS Nitro Enclaves fornece um ambiente de computação seguro e isolado dentro das instâncias Amazon EC2, projetado especificamente para processar dados altamente sensíveis. Aproveitando o AWS Nitro System, esses enclaves garantem isolamento e segurança robustos, ideais para manipular informações confidenciais como PII ou registros financeiros. Eles apresentam um ambiente minimalista, reduzindo significativamente o risco de exposição de dados. Além disso, Nitro Enclaves suportam atestação criptográfica, permitindo que os usuários verifiquem se apenas código autorizado está em execução, crucial para manter padrões rigorosos de conformidade e proteção de dados.
caution
As imagens do Nitro Enclave são executadas de dentro das instâncias EC2 e você não pode ver no console da web da AWS se uma instância EC2 está executando imagens no Nitro Enclave ou não.
Instalação do Nitro Enclave CLI
Siga todas as instruções da documentação. No entanto, estas são as mais importantes:
# Install tools
sudo amazon-linux-extras install aws-nitro-enclaves-cli -y
sudo yum install aws-nitro-enclaves-cli-devel -y
# Config perms
sudo usermod -aG ne $USER
sudo usermod -aG docker $USER
# Check installation
nitro-cli --version
# Start and enable the Nitro Enclaves allocator service.
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service
Imagens do Nitro Enclave
As imagens que você pode executar no Nitro Enclave são baseadas em imagens docker, então você pode criar suas imagens do Nitro Enclave a partir de imagens docker como:
# You need to have the docker image accesible in your running local registry
# Or indicate the full docker image URL to access the image
nitro-cli build-enclave --docker-uri <docker-img>:<tag> --output-file nitro-img.eif
Como você pode ver, as imagens do Nitro Enclave usam a extensão eif
(Arquivo de Imagem do Enclave).
A saída será semelhante a:
Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
Executar uma Imagem
De acordo com a documentação, para executar uma imagem de enclave, você precisa atribuir a ela uma memória de pelo menos 4 vezes o tamanho do arquivo eif
. É possível configurar os recursos padrão a serem atribuídos a ele no arquivo.
/etc/nitro_enclaves/allocator.yaml
caution
Sempre lembre-se de que você precisa reservar alguns recursos para a instância EC2 pai também!
Depois de saber os recursos a serem dados a uma imagem e mesmo tendo modificado o arquivo de configuração, é possível executar uma imagem de enclave com:
# Restart the service so the new default values apply
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service
# Indicate the CPUs and memory to give
nitro-cli run-enclave --cpu-count 2 --memory 3072 --eif-path hello.eif --debug-mode --enclave-cid 16
Enumerar Enclaves
Se você comprometer um host EC2, é possível obter uma lista de imagens de enclave em execução com:
nitro-cli describe-enclaves
Não é possível obter um shell dentro de uma imagem de enclave em execução porque esse é o principal propósito do enclave, no entanto, se você usar o parâmetro --debug-mode
, é possível obter o stdout dele com:
ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}
Encerrar Enclaves
Se um atacante comprometer uma instância EC2, por padrão, ele não conseguirá obter um shell dentro delas, mas poderá encerrá-las com:
nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}
Vsocks
A única maneira de se comunicar com uma enclave executando imagens é usando vsocks.
Virtual Socket (vsock) é uma família de sockets no Linux projetada especificamente para facilitar a comunicação entre máquinas virtuais (VMs) e seus hypervisors, ou entre as VMs entre si. Vsock permite uma comunicação eficiente e bidirecional sem depender da pilha de rede do host. Isso torna possível que as VMs se comuniquem mesmo sem configurações de rede, usando um ID de Contexto de 32 bits (CID) e números de porta para identificar e gerenciar conexões. A API vsock suporta tanto tipos de socket de stream quanto de datagrama, semelhante ao TCP e UDP, fornecendo uma ferramenta versátil para aplicações de nível de usuário em ambientes virtuais.
tip
Portanto, um endereço vsock se parece com isto: <CID>:<Port>
Para encontrar os CIDs das imagens de enclave em execução, você pode simplesmente executar o seguinte comando e obter o EnclaveCID
:
nitro-cli describe-enclaves
[
{
"EnclaveName": "secure-channel-example",
"EnclaveID": "i-0bc274f83ade02a62-enc18ef3d09c886748",
"ProcessID": 10131,
"EnclaveCID": 16,
"NumberOfCPUs": 2,
"CPUIDs": [
1,
3
],
"MemoryMiB": 1024,
"State": "RUNNING",
"Flags": "DEBUG_MODE",
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
]
warning
Note que a partir do host não há como saber se um CID está expondo alguma porta! A menos que use algum scanner de porta vsock como https://github.com/carlospolop/Vsock-scanner.
Vsock Server/Listener
Encontre aqui alguns exemplos:
Simple Python Listener
#!/usr/bin/env python3
# From
https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
import socket
CID = socket.VMADDR_CID_HOST
PORT = 9999
s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
s.bind((CID, PORT))
s.listen()
(conn, (remote_cid, remote_port)) = s.accept()
print(f"Connection opened by cid={remote_cid} port={remote_port}")
while True:
buf = conn.recv(64)
if not buf:
break
print(f"Received bytes: {buf}")
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"
Cliente Vsock
Exemplos:
Cliente Python Simples
#!/usr/bin/env python3
#From https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
import socket
CID = socket.VMADDR_CID_HOST
PORT = 9999
s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
s.connect((CID, PORT))
s.sendall(b"Hello, world!")
s.close()
# Using socat
echo "Hello, vsock!" | socat - VSOCK-CONNECT:3:5000
Vsock Proxy
A ferramenta vsock-proxy permite fazer proxy de um vsock proxy com outro endereço, por exemplo:
vsock-proxy 8001 ip-ranges.amazonaws.com 443 --config your-vsock-proxy.yaml
Isso irá encaminhar a porta local 8001 em vsock para ip-ranges.amazonaws.com:443
e o arquivo your-vsock-proxy.yaml
pode ter este conteúdo permitindo acessar ip-ranges.amazonaws.com:443
:
allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }
É possível ver os endereços vsock (<CID>:<Port>
) usados pelo host EC2 com (note o 3:8001
, 3 é o CID e 8001 a porta):
sudo ss -l -p -n | grep v_str
v_str LISTEN 0 0 3:8001 *:* users:(("vsock-proxy",pid=9458,fd=3))
Atestação do Nitro Enclave & KMS
O SDK do Nitro Enclaves permite que um enclave solicite um documento de atestação assinado criptograficamente do Hypervisor Nitro, que inclui medidas únicas específicas para aquele enclave. Essas medidas, que incluem hashes e registros de configuração da plataforma (PCRs), são usadas durante o processo de atestação para provar a identidade do enclave e construir confiança com serviços externos. O documento de atestação normalmente contém valores como PCR0, PCR1 e PCR2, que você já encontrou antes ao construir e salvar um EIF de enclave.
A partir da docs, estes são os valores de PCR:
PCR | Hash de ... | Descrição |
---|---|---|
PCR0 | Arquivo de imagem do enclave | Uma medida contígua do conteúdo do arquivo de imagem, sem os dados da seção. |
PCR1 | Kernel Linux e bootstrap | Uma medida contígua dos dados do kernel e do ramfs de inicialização. |
PCR2 | Aplicação | Uma medida contígua e em ordem das aplicações do usuário, sem o ramfs de inicialização. |
PCR3 | Função IAM atribuída à instância pai | Uma medida contígua da função IAM atribuída à instância pai. Garante que o processo de atestação seja bem-sucedido apenas quando a instância pai tiver a função IAM correta. |
PCR4 | ID da instância da instância pai | Uma medida contígua do ID da instância pai. Garante que o processo de atestação seja bem-sucedido apenas quando a instância pai tiver um ID de instância específico. |
PCR8 | Certificado de assinatura do arquivo de imagem do enclave | Uma medida do certificado de assinatura especificado para o arquivo de imagem do enclave. Garante que o processo de atestação seja bem-sucedido apenas quando o enclave foi inicializado a partir de um arquivo de imagem de enclave assinado por um certificado específico. |
Você pode integrar atestação criptográfica em suas aplicações e aproveitar integrações pré-construídas com serviços como AWS KMS. O AWS KMS pode validar atestações de enclave e oferece chaves de condição baseadas em atestação (kms:RecipientAttestation:ImageSha384
e kms:RecipientAttestation:PCR
) em suas políticas de chave. Essas políticas garantem que o AWS KMS permita operações usando a chave KMS somente se o documento de atestação do enclave for válido e atender às condições especificadas.
tip
Note que Enclaves no modo de depuração (--debug) geram documentos de atestação com PCRs que são compostos por zeros (000000000000000000000000000000000000000000000000
). Portanto, as políticas do KMS que verificam esses valores falharão.
Bypass de PCR
Do ponto de vista de um atacante, observe que alguns PCRs permitiriam modificar algumas partes ou toda a imagem do enclave e ainda seriam válidos (por exemplo, o PCR4 apenas verifica o ID da instância pai, então executar qualquer imagem de enclave naquela EC2 permitirá cumprir esse potencial requisito de PCR).
Portanto, um atacante que comprometer a instância EC2 pode ser capaz de executar outras imagens de enclave para contornar essas proteções.
A pesquisa sobre como modificar/criar novas imagens para contornar cada proteção (especialmente as que não são tão óbvias) ainda está em TODO.
Referências
- https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
- Todas as partes do tutorial Nitro da AWS: https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.