AWS - Nitro Enum

Support HackTricks

基本情報

AWS Nitroは、AWS EC2インスタンスの基盤となる革新的な技術のスイートです。Amazonによってセキュリティ、パフォーマンス、信頼性を向上させるために導入され、Nitroはカスタムハードウェアコンポーネントと軽量ハイパーバイザーを活用しています。従来の仮想化機能の多くを専用のハードウェアとソフトウェアに抽象化し、攻撃面を最小限に抑え、リソース効率を向上させます。仮想化機能をオフロードすることで、NitroはEC2インスタンスにほぼベアメタルのパフォーマンスを提供し、リソース集約型アプリケーションに特に有益です。さらに、Nitroセキュリティチップはハードウェアとファームウェアのセキュリティを確保し、その堅牢なアーキテクチャをさらに強化します。

Nitro Enclaves

AWS Nitro Enclavesは、Amazon EC2インスタンス内にある安全で隔離されたコンピューティング環境を提供し、特に高度に機密性の高いデータの処理のために設計されています。AWS Nitroシステムを活用し、これらのエンクレーブは堅牢な隔離とセキュリティを確保し、PIIや財務記録などの機密情報を扱うのに理想的です。ミニマリスト環境を特徴としており、データ露出のリスクを大幅に低減します。さらに、Nitro Enclavesは暗号的証明をサポートし、ユーザーが認可されたコードのみが実行されていることを確認できるため、厳格なコンプライアンスとデータ保護基準を維持するために重要です。

Nitro EnclaveイメージはEC2インスタンス内から実行され、AWSウェブコンソールからはEC2インスタンスがNitro Enclaveでイメージを実行しているかどうかは確認できません。

Nitro Enclave CLIのインストール

すべての指示に従ってくださいドキュメントから。ただし、最も重要なものは次のとおりです:

# 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

Nitro Enclave Images

Nitro Enclaveで実行できるイメージは、dockerイメージに基づいているため、次のようなdockerイメージからNitro Enclaveイメージを作成できます:

# 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

Nitro Enclave イメージは、拡張子 eif (Enclave Image File) を使用しています。

出力は次のようになります:

Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}

イメージを実行する

ドキュメントによると、エンクレーブイメージを実行するには、eifファイルのサイズの少なくとも4倍のメモリを割り当てる必要があります。ファイル内でそれに与えるデフォルトリソースを構成することが可能です。

/etc/nitro_enclaves/allocator.yaml

常に親EC2インスタンスのためにいくつかのリソースを予約する必要があることを忘れないでください!

イメージに与えるリソースを知り、設定ファイルを変更した後、次のコマンドでエンクレーブイメージを実行することが可能です:

# 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

エンクレーブの列挙

EC2ホストを侵害した場合、次のコマンドで実行中のエンクレーブイメージのリストを取得することができます:

nitro-cli describe-enclaves

それは実行中のエンクレーブイメージ内でシェルを取得することは不可能です。なぜなら、それがエンクレーブの主な目的だからです。しかし、--debug-modeパラメータを使用した場合、次のコマンドでstdoutを取得することが可能です:

ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}

Terminate Enclaves

攻撃者がEC2インスタンスを侵害した場合、デフォルトではその中にシェルを取得することはできませんが、次のコマンドで終了させることができます:

nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}

Vsocks

エンクレーブで実行されているイメージと通信する唯一の方法は、vsocksを使用することです。

Virtual Socket (vsock)は、Linuxで特に設計されたソケットファミリーで、仮想マシン(VMs)とそのハイパーバイザー、またはVM同士の通信を促進します。Vsockは、ホストのネットワーキングスタックに依存せずに効率的な双方向通信を可能にします。これにより、ネットワーク構成がなくてもVM同士が通信でき、32ビットのコンテキストID(CID)とポート番号を使用して接続を識別および管理します。vsock APIは、TCPおよびUDPに似たストリームおよびデータグラムソケットタイプの両方をサポートし、仮想環境におけるユーザーレベルのアプリケーションにとって多用途なツールを提供します。

したがって、vsockアドレスは次のようになります:<CID>:<Port>

エンクレーブで実行されているイメージのCIDsを見つけるには、次のコマンドを実行して**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"
}
}
]

ホストからは、CIDがポートを公開しているかどうかを知る方法はありません!一部のvsockポートスキャナーを使用しない限り、https://github.com/carlospolop/Vsock-scannerのような。

Vsock Server/Listener

ここにいくつかの例があります:

シンプルなPythonリスナー

```python #!/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}")

</details>
```bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"

Vsock クライアント

例:

Last updated