コンテンツにスキップ

Mayhem での Docker エントリポイントのサポート

環境変数に基づいて構成アイテムをセットアップするなど、コンテナー化されたアプリケーションを実行する前に 1 回限りの初期化プロセスを実行するために、開発者が Docker イメージにエントリポイント スクリプトを含めることがよくあります。

Note

Docker エントリポイント スクリプトには docker-entrypoint.sh という名前が付けられるのが一般的ですが、このような命名は必須ではありません (スクリプトである必要もなく、単なるコマンドにすることもできます)。ENTRYPOINT の詳細については、Docker の公式ドキュメントを参照してください。

そのため、Mayhem は Docker イメージのエントリポイントとして指定されたコマンドの実行をサポートしており、Mayhem ランでファジングを実行する前に初期化プロセスを実行することができます。

Mayhem での Docker エントリポイントの有効化

Docker イメージの利用可能なエントリポイントを実行するよう Mayhem に指示するには、まず、次の操作を実行する必要があります。

  1. 次のコマンドを実行して、ターゲットの Docker イメージにエントリポイントがあることを確認します。

    docker image inspect <IMAGE_NAME>
    

    コマンドは次のような出力を返すはずです。

    ...
    "Entrypoint": [
        "docker-entrypoint.sh"
    ]
    ...
    

    ヒント

    • Docker イメージの検査に関する詳細については、docker image inspect コマンドの公式ドキュメントを参照してください。
    • Docker イメージがまだセットアップされておらず、現在 Dockerfile を使用してイメージを構築している場合、 ENTRYPOINT および CMD をセットアップする方法および、これら 2 つの 相互作用 (少なくとも 1 つは必要です) について確認してください。
  2. Docker イメージの Mayhemfile の env セクションに MFUZZ_DOCKER_ENTRYPOINT: “1” を追加します。

  3. Mayhemfile の cmd がテストしたい実際のターゲット (ELF バイナリ) を指していることを確認します。

たとえば、redis Docker イメージをテストする場合、 MFUZZ_DOCKER_ENTRYPOINT: “1”を指定し、Mayhemfile の cmdredis が指定されていることを確認します。これにより、実際の redis バイナリをテストする前にエントリポイント スクリプト内のコマンドが実行されます。

Warning

現時点では、インストルメントされていないターゲットだけがサポートされています。ターゲットがルート ユーザーでの実行を許可していない場合 (redis の場合のように)、現時点ではエントリポイント スクリプトからの権限のドロップはサポートされていないため、Mayhemfile 内で uid および gid が適切に設定されていることを確認してください。方法については、次のサンプルで説明します。

Docker エントリポイントを有効化した redis のテスト

Redis は、オープン ソースのインメモリ データ構造ストアであり、データベース、キャッシュ、メッセージ ブローカーとして使用できます。redis Docker イメージのテストを開始するには、以下を実行する必要があります。

docker pull redis

Note

この操作は Docker Hub パブリック レジストリにある最新の redis Docker イメージをプルします。

ダウンロードが終了したら、次のコマンドを実行して redis Docker イメージの詳細を表示します。

docker image inspect redis

Entrypoint 構成を探し、redis Docker イメージに docker-entrypoint.sh が設定されていることを確認します。コマンドの出力は次のようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[
    {
        "Id": "sha256:eb0ab2d55fdfc3ba4226348749a2f34af13a280a44c8045aefd9506fe064b297",
        "RepoTags": [
            "redis:latest"
        ],
        "RepoDigests": [
            "redis@sha256:f29bcfb891678a0c6a0fc5da0b32ce1ac685af87c0f3aa9327e562da8d3f3b88"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-02-09T17:03:48.239304262Z",
        "Container": "215801b81e7e9e85da0ef895c44ccb19d9358a81281ab5eb9901734426ddf918",
        "ContainerConfig": {
            "Hostname": "215801b81e7e",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "REDIS_VERSION=6.0.10",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.0.10.tar.gz",
                "REDIS_DOWNLOAD_SHA=79bbb894f9dceb33ca699ee3ca4a4e1228be7fb5547aeb2f99d921e86c1285bd"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"redis-server\"]"
            ],
            "Image": "sha256:4f476f1fb03679874507de714684b729cec4f5084b1d6ea9084ee352a23512cf",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            ...

すばらしい! redis Docker イメージにエントリポイントが設定されていることが確認できたので、Mayhemfile を作成して次のパラメーターを設定します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
project: redis
target: redis-entrypoint
image: redis
advanced_triage: false
uid: 999
gid: 999
cmds:
  - cmd: redis-server
    env:
      MFUZZ_DOCKER_ENTRYPOINT: "1"
    network:
      url: tcp://localhost:6379
      client: false
      timeout: 5.0

Note

上で説明したとおり、ルート権限を保存するために uid および gid パラメーターの設定が必要です。

最後に、上で説明した Mayhemfile と同じディレクトリで次のコマンドを実行して、redis Docker イメージの Mayhem ランを実行します。

mayhem run .

Important

Mayhemランを実行する前に、mayhem login を実行して Mayhem インスタンスで認証情報を検証する必要があります。

これで終わりです。redis Docker イメージの Mayhem ランが開始され、実行されているはずです。よくできました!

redis-entrypoint

まとめ

Mayhem でエントリポイントのサポートを有効化する方法を理解すると、より効果的に Docker イメージおよびコンテナー化されたアプリケーションをファジングできます。