GraphQL Debug Mode Enabled
Mode Débogage GraphQL Activé
Description
Le mode débogage GraphQL (GraphQL Debug Mode) est une fonctionnalité qui, lorsqu'elle est activée, fournit des messages d'erreur détaillés, des traces de la pile d'appels et des informations de débogage supplémentaires dans les réponses. Bien que cela soit très précieux pendant le développement, le laisser activé dans un environnement de production peut potentiellement exposer des informations sensibles sur la structure interne et les détails d'implémentation du serveur.
Dans Django Graphene, le mode de débogage est généralement contrôlé par le paramètre DEBUG de Django et par l'inclusion de DjangoDebugMiddleware dans la configuration de Graphene.
Lorsque le mode de débogage est activé, les réponses d'erreur peuvent inclure : - Des traces détaillées de la pile d'appels - Des informations sur les requêtes de base de données (y compris les requêtes SQL) - Les chemins de serveur internes et les noms de fichiers - Des détails de configuration sensibles
Exemple d'une réponse avec le mode de débogage activé dans Django Graphene :
{
"errors": [
{
"message": "Cannot query field \"nonexistentField\" on type \"Query\".",
"locations": [
{
"line": 3,
"column": 3
}
],
"path": ["nonexistentField"]
}
],
"data": null,
"extensions": {
"debug": {
"sql": [
{
"sql": "SELECT \"auth_user\".\"id\", \"auth_user\".\"password\", \"auth_user\".\"last_login\", \"auth_user\".\"is_superuser\", \"auth_user\".\"username\", \"auth_user\".\"first_name\", \"auth_user\".\"last_name\", \"auth_user\".\"email\", \"auth_user\".\"is_staff\", \"auth_user\".\"is_active\", \"auth_user\".\"date_joined\" FROM \"auth_user\" WHERE \"auth_user\".\"id\" = %s LIMIT 21",
"time": "0.000",
"params": ["1"]
}
],
"python_version": "3.8.5",
"django_version": "3.1.3",
"graphene_version": "2.1.8",
"graphql_version": "3.0.0"
}
}
}
Impact sur la sécurité du mode débogage GraphQL : - Divulgation d'informations : Les informations de débogage peuvent révéler des détails internes sur la structure du serveur GraphQL, ses dépendances et ses vulnérabilités potentielles, qui pourraient être exploités par des attaquants pour planifier des attaques plus ciblées. - Exposition de données sensibles : Les traces de la pile d'appels, les messages d'erreur et particulièrement les requêtes SQL peuvent inclure par inadvertance des informations sensibles telles que la structure de la base de données, les chemins de fichiers internes ou des variables d'environnement. - Exploitation facilitée : Les messages d'erreur détaillés et les requêtes SQL peuvent aider les attaquants à affiner leurs attaques en fournissant un retour immédiat sur ce qui a fonctionné ou n'a pas fonctionné dans leurs requêtes malveillantes. - Fuite d'informations sur les performances : Les informations de synchronisation fournies pour les requêtes SQL pourraient être utilisées par des attaquants pour déduire la structure de la base de données ou pour effectuer des attaques temporelles (timing attacks).
Recommandation
Pour atténuer les risques associés au mode débogage GraphQL, tenez compte des recommandations suivantes :
-
Désactiver le mode débogage en production : Assurez-vous que le mode débogage de GraphQL est désactivé dans les environnements de production. Les informations de débogage ne doivent être disponibles que dans les environnements de développement et de test.
-
Utiliser des paramètres spécifiques à l'environnement : Implémentez des configurations spécifiques à l'environnement pour contrôler le mode de débogage et la verbosité des erreurs.
-
Implémenter une gestion personnalisée des erreurs : Créez un mécanisme de gestion des erreurs personnalisé qui nettoie les messages d'erreur avant de les envoyer aux clients en production, en supprimant toute information sensible tout en fournissant des retours utiles.
-
Journalisation sécurisée : Implémentez des mécanismes de journalisation (logging) sécurisés qui stockent des informations détaillées sur les erreurs pour une analyse ultérieure, plutôt que de les exposer via le mode de débogage.
Exemple de contrôle du mode de débogage dans Django Graphene :
# settings.py
DEBUG = False # Set to True only in development
GRAPHENE = {
'MIDDLEWARE': [
'graphene_django.debug.DjangoDebugMiddleware',
] if DEBUG else []
}
# Gestion personnalisée des erreurs
from graphene_django.views import GraphQLView
from django.http import JsonResponse
from django.conf import settings
class CustomGraphQLView(GraphQLView):
@staticmethod
def format_error(error):
if settings.DEBUG:
return GraphQLView.format_error(error)
return {"message": "An error occurred"}
def execute_graphql_request(self, *args, **kwargs):
result = super().execute_graphql_request(*args, **kwargs)
if result.errors:
errors = [self.format_error(e) for e in result.errors]
return JsonResponse({"errors": errors})
return result
# Utiliser CustomGraphQLView dans votre urls.py
Cette configuration garantit que les informations de débogage détaillées (y compris les requêtes SQL) ne sont disponibles que dans les environnements de développement. En production, les erreurs sont nettoyées pour empêcher les fuites d'informations.
Pour d'autres implémentations de serveur GraphQL, consultez la documentation spécifique sur la façon de contrôler le mode de débogage et d'implémenter une gestion sécurisée des erreurs.
Liens
Normes
- PCI_STANDARDS:
- REQ_6_5
- REQ_11_3
- OWASP_MASVS_L2:
- MSTG_ARCH_9
- OWASP_ASVS_L3:
- V7_4_1
- SOC2_CONTROLS:
- CC_6_1
- CC_6_7
- CC_7_1
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213
- SECURITY255