コンテンツにスキップ

HTTP Method Manipulation in GraphQL

GraphQLにおけるHTTPメソッドの操作

説明

HTTPメソッドの操作(HTTP Method Manipulation)とは、GraphQLサーバーがHTTPメソッドを処理する方法の矛盾を悪用することを含みます。GraphQLでは、サーバーがGETリクエストを使用したミューテーションの実行を誤って許可した場合、機密データがURLで露出する可能性があり、セキュリティ脆弱性につながります。

リクエストをルーティングするためにプロキシが使用されている場合、プロキシがこれらのURLをログに記録し、意図せず機密情報(APIキーやユーザーデータなど)を保存する可能性があるため、リスクが高まります。これらのログにアクセスされた場合、情報が侵害される可能性があります。

GraphQLにおけるHTTPメソッド操作のセキュリティへの影響は以下の通りです:

  • 機密データの露出: 機密情報(例:ミューテーションパラメータ)がURLに含まれている場合、ログや意図しない第三者に露出する可能性があります。
  • プロキシのリスク: プロキシがリクエストのURLをログに記録すると、GETリクエストに埋め込まれた機密データが保存され、後で許可されていない個人によってアクセスされる可能性があります。
  • 不適切なアクセス制御: GETリクエストを介したミューテーションを許可すると、適切な保護措置なしに安全でない操作が実行される可能性があります。

GraphQL APIがこの脆弱性の影響を受けるかどうかを確認するには、GETリクエストを使用してミューテーションの実行を試みることができます:

import requests

response = requests.get("https://your-graphql-endpoint.com/graphql", 
    params={
        'query': 'mutation { MutationName(input: { yourField: "value" }) { resultField } }'
    })
fetch('https://your-graphql-endpoint.com/graphql?query=mutation%20{updateUser(id:%201,name:%20%22Malicious%22)}', {
  method: 'GET'
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

GETを介してミューテーションが許可されている場合、対処が必要な潜在的な脆弱性があることを示しています。

推奨事項

GraphQLにおけるHTTPメソッドの操作に関連するリスクを軽減するために、以下のセキュリティプラクティスに従ってください:

  1. POSTのみのミューテーションを強制する: ミューテーションがPOSTメソッドを介してのみ実行できるようにします。機密情報がURLで渡されるのを防ぐために、GETを使用したミューテーションリクエストをすべて拒否します。

  2. ミューテーションに対してGETを無効にする: GETリクエストを介したミューテーションを明示的に許可しないようにサーバー設定を更新します。これにより、URLを介してデータ変更操作が実行されないようになります。

from flask import request, jsonify
from flask_graphql import GraphQLView

@app.route('/graphql', methods=['POST'])
def graphql():
    return GraphQLView.as_view('graphql')()

```javascript // Example of setting method restrictions in Express.js app.post('/graphql', (req, res) => { // Handle GraphQL mutations here });

app.get('/graphql', (req, res) => { res.status(405).send('Method Not Allowed'); // Reject GET requests }); ```

リンク

基準

  • OWASP_ASVS_L1:
    • V4_1_3
    • V5_3_3
  • OWASP_ASVS_L2:
    • V4_1_3
    • V4_1_5
    • V5_3_3
    • V9_1_2
  • OWASP_ASVS_L3:
    • V4_1_3
    • V4_1_5
    • V5_3_3
    • V9_1_2
    • V12_1_1
    • V13_4_1
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_4
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
    • CC_9_1
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213