如何安全地将Github应用程序安装ID与集成GitHub应用程序的网站帐户关联起来?

net*_*sto 9 authorization github github-api github-app

我正在构建一个围绕我的 GitHub 应用程序集成的网站。

该网站有自己的用户(来自 Google oAuth),他们可以通过安装我的 GitHub 应用程序将他们的帐户连接到他们的 GitHub 帐户。

GitHub 应用程序安装过程中有些事情我无法理解:

用户在 GitHub 上安装我的应用程序后:

  • 他们的浏览器被重定向到 URL(“安装后设置 URL”),并且 URL 中包含安装 ID。

  • GitHub 调用我的 webhook 来声明安装

安装 ID 是一个明智的信息,就好像我的网站的恶意用户(攻击者)可以欺骗我的网站将他们的帐户与其他人(受害者)的 GitHub 安装 ID 关联起来,我的网站将在 GitHub API 上运行受害者代表攻击者(这很糟糕!)。

现在,我的目标是将此安装 ID 安全地绑定到我网站的用户。所谓安全,是指我的网站不可能向攻击者授予对受害者 GitHub 安装我的应用程序的权限。

使用“安装后设置 URL”中提供的 GitHub 安装 ID 将此安装绑定到我的网站帐户是不安全的,因为我无法验证此安装 ID“属于”我的网站的用户,因为知道受害者的有效安装 ID 的攻击者可以伪造 URL。

不完善的缓解措施:

  • 断言安装 ID 未绑定到我网站的任何其他用户帐户

    • 不好的是,如果由于某种原因,合法用户从未使用“安装后设置 URL”将此 GitHub 安装 ID 绑定到他的帐户重定向到我的网站,则可以绕过它

    • 无论如何,这很容易受到确认时的“竞赛”(或计时?)攻击(如果攻击者设法在受害者之前确认有效的安装 ID)

  • 与 Webhook 上收到的 GitHub API Event 事件结合使用

    • webhook是由Github后端触发的,因此无法识别登录的网站用户,这无法帮助我们将github安装ID绑定到正确的网站用户。

我是否遗漏了什么,或者这是应用程序授权模型的缺陷?

net*_*sto 6

找到了答案:

我需要激活“安装期间请求用户授权(OAuth)”。这样,GitHub 就会使用一个安全令牌进行应答,我可以用它来验证安装,而不仅仅是安装 ID。

文档:https://docs.github.com/en/free-pro-team@latest/developers/apps/identifying-and-authorizing-users-for-github-apps#web-application-flow