Webhookと安全でない内部Webサービス
GitLabサーバー上やそのローカルネットワーク内でGitLab以外のWebサービスを実行している場合、これらはWebhookを経由して悪用される脆弱性があります。
Webhooksを使うと、プロジェクトのメンテナーやオーナーは、プロジェクトに特定の変更が発生したときにトリガーされる URL を設定することができます。 通常、これらのリクエストは、この目的のために特別に設定された外部の Web サービスに送信され、リクエストとそれに添付されたデータを適切な方法で処理します。
しかし、Webhookが外部を指すURLではなく、内部サービスを指すURLで設定されている場合、Webhookがトリガーされ、POSTリクエストが送信されたときに、全く意図しない動作をする可能性があります。
Webhook リクエストは GitLab サーバー自身によって作成され、(ユーザーやリポジトリ固有のトークンの代わりに)フックごとに単一の(オプションの)シークレットトークンを使って作成されます。 その結果、Webhook をホストしているサーバー上で実行されているすべてのもの(GitLab サーバーや API 自体が含まれる場合もあります、例えばhttp://localhost:123
)に対して、意図したよりも広範なアクセスが行われる可能性があります。 呼び出された Webhook によっては、その Webhook サーバーのローカルネットワーク内の他のサーバー(例えばhttp://192.168.1.12:345
)へのネットワークアクセスも行われる可能性があります。たとえこれらのサービスが保護されていて外部からアクセスできないとしてもです。
Web サービスが認証を必要としない場合、Webhook を使って GitLab サーバーからhttp://localhost:123/some-resource/delete
のようなエンドポイントに POST リクエストを行うことで、破壊的コマンドをトリガーすることができます。
このような悪用が起こらないように、GitLab 10.6からは、現在のGitLabインスタンスサーバアドレスおよび/または非公開ネットワーク内のすべてのWebhookリクエストがデフォルトで禁止されます。 つまり、127.0.0.1
、::1
、0.0.0.0
、IPv410.0.0.0/8
、172.16.0.0/12
、192.168.0.0/16
、IPv6サイトローカル(ffc0::/10
)アドレスへのすべてのリクエストが許可されません。
この動作は、管理エリア > 設定(/admin/application_settings/network
) 内の「送信リクエスト」セクションで「ウェブフックとサービスからのローカルネットワークへのリクエストを許可する」オプションを有効にすることでオーバーライドできます:
ローカルリクエストの許可リスト
GitLab 12.2 で導入されました。
許可リストに追加することで、内部リクエストが許可されていない場合でも、特定のドメインと IP アドレスがシステムフックとWebhookの両方にアクセスできるようにすることができます。管理エリア > 設定 > ネットワーク(/admin/application_settings/network
) に移動し、[送信リクエスト] を展開します:
許可されるエントリは、セミコロン、カンマ、または空白 (改行を含む) で区切ることができ、ホスト名、IPアドレス、および/またはIP範囲のような異なる形式であることができます。 IPv6がサポートされています。 Unicode文字を含むホスト名は、IDNAエンコーディングを使用する必要があります。
allowlistは最大1000個のエントリーを保持でき、各エントリーは最大255文字です。
例えば、127.0.0.1:8080
は、127.0.0.1
上のポート8080 への接続のみを許可します。 ポートが指定されていない場合、そのIP/ドメイン上のすべてのポートが許可されます。 IP範囲は、その範囲内のすべてのIP上のすべてのポートを許可します。
使用例:
example.com;gitlab.example.com
127.0.0.1,1:0:0:0:0:0:0:1
127.0.0.0/8 1:0:0:0:0:0:0:0/124
[1:0:0:0:0:0:0:1]:8080
127.0.0.1:8080
example.com:8080
*.example.com
) は現在サポートされていません。