危険なデフォルト設定の使用

危険なデフォルト設定の使用 #

概要 #

GraphQLライブラリには、デフォルトで開発者向け機能が有効になっている場合があります。
前述のIntrospection機能が代表例ですが、ほかにもエラーメッセージ中に不必要な情報が出力されることもあります。
具体的には、Introspection機能がOffであってもSchemaを推測されたり、特定のURLで情報を受け取るがためにEndPointを推測されやすいといった問題が挙げられます。

影響 #

攻撃者にとって有用なシステムに関する情報を取得される恐れがあります。
ただちに攻撃にはつながらないものの、ほかの攻撃の起点となる恐れがあります。

検証方法 #

以下のように存在しないクエリを送信した際に、レスポンスエラー中に存在するクエリの情報が出力された場合は、対策が必要です。

{"query":"query\n{\nsysytem\n}"}

{
   "errors": [
      {
         "message": "Cannot query field \"system\" on type \"Query\". Did you mean \"pastes\", \"paste\", \"systemUpdate\" or \"systemHealth\"?",
         "locations": [
            {
               "line": 2,
               "column": 2
            }
         ]
      }
   ]
}

エラーメッセージの出力に起因する問題は、GraphQLのエラーだけではなく、データベースで生じたエラーの情報等も含まれます。 そのため、バックエンドのシステム全体についてエラーメッセージから有用な情報が得られないか検証する必要があります。このような検証には、ファジングやツールによるスキャンが有用です。

また、直接コードを閲覧できる場合は、GraphQLライブラリの設定や受け渡している引数が公式ドキュメントやWebページ等で推奨されている方式であるか確認することも有力な検証方法の1つです。

対策 #

本番環境ではデバッグモードを有効にしないでください。
また、エラーメッセージは極力画面上には出力せず、ファイルやデータベース等に書き出してください。

EndPoint URLはユーザーにアクセスされるため、一般的にはユーザーに向けて開示されている情報です。しかしながら、ユーザーに広く開示していない場合は単純な機械的アクセスによってEndPointを探索されることを避けるため、変更することを推奨します。

これらの設定が適切に行えないライブラリを利用する場合は、直接ユーザーがGraphQLサーバに対してアクセスできないように制限してください。対策の例として、ユーザーからの入力情報に応じてGraphQL EndPointに中継するサーバサイドのプログラムで、ユーザーのアクセス制御を行うことが挙げられます。
なお、必要な設定はライブラリによって異なるため、使用しているライブラリのドキュメントに従って本番環境向けの設定にする必要があります。