6. Security Considerations (Considérations de sécurité)
Problèmes de limite de taille
La plupart des types définis par les champs structurés n'ont pas de limite de taille ; par conséquent, des champs extrêmement grands peuvent constituer un vecteur d'attaque (par exemple, pour les attaques de consommation de ressources).
Atténuation
La plupart des implémentations HTTP limitent la taille pour atténuer ces attaques :
- Taille d'un champ individuel
- Taille de la section d'en-tête entière
- Taille de la section de pied de page entière
Pratiques recommandées
Les implémentations devraient (SHOULD) :
- Définir des limites de taille de champ raisonnables
- Surveiller la taille totale des en-têtes
- Enregistrer des alertes pour les valeurs de champ anormalement grandes
- Envisager de rejeter les requêtes/réponses trop volumineuses
Attaques par injection de champ
Une partie capable d'injecter de nouveaux champs HTTP peut modifier la signification d'un champ structuré.
Risque
Dans certains cas, cela entraînera un échec d'analyse, mais ne peut pas échouer de manière fiable dans tous les cas.
Stratégies de défense
- Contrôle d'accès strict : Limiter qui peut définir les champs HTTP
- Validation de l'intégrité des champs : Utiliser des signatures ou HMAC
- Principe du moindre privilège : Limiter la portée sémantique des champs
Signification de sécurité de la rigueur d'analyse
Pourquoi l'analyse stricte est une fonctionnalité de sécurité
Scénario : Valeur de champ construite de manière malveillante
Analyseur tolérant :
Input: key="value\x00hidden"
Peut analyser : key="value" (ignore le contenu après l'octet nul)
→ Données cachées peuvent contourner les vérifications de sécurité
Analyseur strict :
Input: key="value\x00hidden"
Résultat : Échec d'analyse, ignore le champ entier
→ Pas d'ambiguïté, limites de sécurité claires
Avantages de sécurité
- Prévention de l'injection : La validation stricte empêche les attaques par injection
- Élimination de l'ambiguïté : Toutes les implémentations se comportent de manière cohérente
- Échec précoce : Découvre les problèmes aux points de contrôle des limites
- Prévisibilité : Les attaquants ne peuvent pas exploiter les différences d'analyse
Attaques par confusion de type
Les implémentations doivent (MUST) effectuer une vérification de type stricte et ne pas tenter de convertir automatiquement les types.
// Vérification de type stricte correcte
const field = parseItem(fieldValue);
if (field.type !== 'integer') {
return null; // Ignorer le champ entier
}
Exemples d'attaques par consommation de ressources
Attaque 1 : Liste extrêmement longue
Example-List: 1, 2, 3, ..., 100000 # 100,000 membres
Défense :
const MAX_LIST_SIZE = 1024; // Exigence minimale RFC
if (list.length > MAX_LIST_SIZE) {
throw new Error('List too large');
}
Attaque 2 : Chaînes extrêmement longues
Example-String: "AAAA...AAAA" (100MB)
Défense : Limiter la longueur des chaînes à une valeur raisonnable (par exemple, 8192 caractères).
Pollution des paramètres
Les clés de paramètres doivent (MUST) être uniques dans leur portée. Les clés en double provoquent un échec d'analyse.
const params = new Map();
for (const [key, value] of parsedParams) {
if (params.has(key)) {
throw new Error('Duplicate parameter key');
}
params.set(key, value);
}
Liste de contrôle de sécurité
Lors de l'implémentation de champs structurés, assurez-vous de :
- Limiter la taille des champs
- Limiter le nombre de membres List/Dictionary
- Limiter la longueur des String/Token
- Limiter la taille des Byte Sequence
- Valider strictement tous les types
- Rejeter les clés en double
- Enregistrer les entrées anormales
- Tester les cas limites
- Ne pas essayer de "réparer" les entrées erronées
- Ignorer le champ entier en cas d'échec
Points clés
- Limites de taille : Les implémentations doivent (MUST) limiter la taille des champs
- Risque d'injection : L'injection de champ peut modifier la sémantique
- Analyse stricte : La rigueur est une fonctionnalité de sécurité
- Sécurité des types : La vérification de type stricte empêche les attaques par confusion
- Responsabilité de l'implémentation : Ajouter des limites de sécurité raisonnables
- Défense en profondeur : Combiner plusieurs mécanismes de sécurité