Webhooks and insecure internal web services

原文:https://docs.gitlab.com/ee/security/webhooks.html

Webhooks and insecure internal web services

注意:在 GitLab.com 上每个项目的最大 Webhooks 数量是有限的.

如果您在 GitLab 服务器上或其本地网络中运行了非 GitLab Web 服务,则可能容易受到 Webhooks 的利用.

使用Webhooks ,您以及您的项目维护者和所有者可以设置 URL,以便在项目中发生特定更改时触发该 URL. 通常,这些请求将发送到专门为此目的设置的外部 Web 服务,该服务以某种适当的方式处理该请求及其附加数据.

但是,当 Webhook 设置的 URL 不是指向外部服务而是指向内部服务时,事情变得很麻烦,当触发 Webhook 和发送 POST 请求时,这可能会做完全不希望的事情.

Webhook 请求由 GitLab 服务器本身发出,并且每个钩子使用一个(可选)秘密令牌进行授权(而不是用户或特定于仓库的令牌). 结果,它们可能比托管 Webhook 的服务器(可能包括 GitLab 服务器或 API 本身,例如http://localhost:123 )上运行的所有对象具有更广泛的访问权限. 根据所调用的 Webhook,这也可能导致对该 Webhook 服务器的本地网络(例如, http://192.168.1.12:345 : http://192.168.1.12:345 : http://192.168.1.12:345 )内的其他服务器的网络访问,即使这些服务受到其他保护并且无法从外界访问.

如果 Web 服务不需要身份验证,则可以通过使 GitLab 服务器向诸如http://localhost:123/some-resource/delete类的端点发出 POST 请求,来使用 Webhooks 触发破坏性命令.

为了防止发生这种类型的攻击,从 GitLab 10.6 开始,默认情况下将禁止对当前 GitLab 实例服务器地址和/或专用网络中的所有 Webhook 请求. 这意味着,所有的请求作出127.0.0.1::10.0.0.0 ,以及 IPv4 的10.0.0.0/8172.16.0.0/12192.168.0.0/16和 IPv6 站点本地( ffc0::/10 )地址将不被允许.

通过在管理区域>设置/admin/application_settings/network )内“出站请求”部分中启用选项“允许从 Web 挂钩和服务到本地网络的请求”,可以覆盖此行为:

Outbound requests admin settings

注意:由于 系统挂钩是由管理员设置的,因此默认情况下启用它们来向本地网络发出请求. 但是,可以通过禁用” 允许从系统挂钩向本地网络发送请求”选项来关闭此功能.

Allowlist for local requests

Introduced in GitLab 12.2

通过将某些域和 IP 地址添加到允许列表中,即使不允许本地请求,也可以允许某些域和 IP 地址可供系统挂钩Web 挂钩访问. 导航到管理区域>设置>网络/admin/application_settings/network )并展开出站请求

Outbound local requests allowlist

允许的条目可以用分号,逗号或空格(包括换行符)分隔,并且可以采用不同的格式,例如主机名,IP 地址和/或 IP 范围. 支持 IPv6. 包含 Unicode 字符的主机名应使用 IDNA 编码.

允许列表最多可容纳 1000 个条目. 每个条目最多可以包含 255 个字符.

您可以通过在允许列表条目中指定特定端口来允许它. 例如127.0.0.1:8080将仅允许连接到127.0.0.1上的端口 8080. 如果未提及任何端口,则允许该 IP /域上的所有端口. IP 范围将允许该范围内所有 IP 上的所有端口.

Example:

  1. example.com;gitlab.example.com
  2. 127.0.0.1,1:0:0:0:0:0:0:1
  3. 127.0.0.0/8 1:0:0:0:0:0:0:0/124
  4. [1:0:0:0:0:0:0:1]:8080
  5. 127.0.0.1:8080
  6. example.com:8080

注意:当前不支持通配符( *.example.com ).