Aller au contenu principal

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

  1. Contrôle d'accès strict : Limiter qui peut définir les champs HTTP
  2. Validation de l'intégrité des champs : Utiliser des signatures ou HMAC
  3. 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é

  1. Prévention de l'injection : La validation stricte empêche les attaques par injection
  2. Élimination de l'ambiguïté : Toutes les implémentations se comportent de manière cohérente
  3. Échec précoce : Découvre les problèmes aux points de contrôle des limites
  4. 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

  1. Limites de taille : Les implémentations doivent (MUST) limiter la taille des champs
  2. Risque d'injection : L'injection de champ peut modifier la sémantique
  3. Analyse stricte : La rigueur est une fonctionnalité de sécurité
  4. Sécurité des types : La vérification de type stricte empêche les attaques par confusion
  5. Responsabilité de l'implémentation : Ajouter des limites de sécurité raisonnables
  6. Défense en profondeur : Combiner plusieurs mécanismes de sécurité