Webhookと安全でない内部Webサービス

注:GitLab.comでは、プロジェクトごとのwebhookの最大数に制限があります。

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::10.0.0.0、IPv410.0.0.0/8172.16.0.0/12192.168.0.0/16 、IPv6サイトローカル(ffc0::/10)アドレスへのすべてのリクエストが許可されません。

この動作は、管理エリア > 設定(/admin/application_settings/network) 内の「送信リクエスト」セクションで「ウェブフックとサービスからのローカルネットワークへのリクエストを許可する」オプションを有効にすることでオーバーライドできます:

Outbound requests admin settings

注意:システムフックは管理者によって設定されるため、デフォルトではローカルネットワークへのリクエストが有効になっています。 しかし、システムフックからのローカルネットワークへのリクエストを許可するオプションを無効にすることで、これをオフにすることができます。

ローカルリクエストの許可リスト

GitLab 12.2 で導入されました

許可リストに追加することで、内部リクエストが許可されていない場合でも、特定のドメインと IP アドレスがシステムフックとWebhook両方にアクセスできるようにすることができます。管理エリア > 設定 > ネットワーク(/admin/application_settings/network) に移動し、[送信リクエスト] を展開します:

Outbound local requests allowlist

許可されるエントリは、セミコロン、カンマ、または空白 (改行を含む) で区切ることができ、ホスト名、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) は現在サポートされていません。