7 votes

Pourquoi modsecurity exige-t-il Content-Length dans les requêtes POST ?

J'ai un service web RESTful qui accepte une requête POST vers une ressource sans corps d'entité, par exemple une requête POST vide. La configuration par défaut de modsecurity exige que toutes les requêtes POST aient un Content-Length :

# Require Content-Length to be provided with every POST request
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"

La console modsecurity signale cette situation comme une PROTOCOL_VIOLATION/EVASION. Cependant, ce n'est pas ce que je constate en lisant le document HTTP/1.1 RFC . Un serveur est autorisé à exiger Content-Length (en retournant soit 400 soit 411), mais je ne vois rien qui indique qu'un serveur doit (ou une recommandation qu'il devrait) se comporter de cette manière.

Cela peut varier selon le navigateur, mais les clients Flash qui effectuent des requêtes POST sans corps d'entité n'envoient pas d'en-tête de requête. Curl ne le fait pas non plus lorsque vous faites 'curl -XPOST ...'. Pour ces raisons, et parce que je pense que la règle de modsecurity est une mauvaise interprétation de la spécification HTTP, j'envisage de supprimer l'exigence d'un en-tête Content-Length pour les requêtes POST dans notre configuration.

Quelqu'un sait-il s'il y a un exploit spécifique pour lequel cette règle a été créée ? J'ai effectué de nombreuses recherches sur Google et je n'ai trouvé que des références au fait que cela faisait partie de la configuration de base de modsecurity.

8voto

Ivan Ristic Points 146

Tout d'abord, vous devez savoir que vous utilisez une version obsolète de ModSecurity (branche 1.x). Si vous utilisez Apache 2.0.x, vous devez mettre à jour vers ModSecurity 2.x. Si vous utilisez toujours Apache 1.3.x, je crains que vous n'ayez pas le choix puisque ModSecurity 2.x ne fonctionnera pas avec lui. ModSecurity 1.x lui-même n'est pas connu pour être vulnérable, mais son moteur de règles est trop peu flexible pour les exigences actuelles.

Si je me souviens bien, ModSecurity 1.x exigeait que les requêtes POST spécifient la longueur du contenu uniquement parce qu'il ne supportait pas les corps de requête en morceaux (l'autre façon de soumettre les corps de requête, dans laquelle la longueur totale n'est pas connue avant la fin). Les corps de requête fragmentés étaient incroyablement rares à l'époque (nous parlons des années 2003, 2004) et le sont toujours (bien que certains appareils mobiles les utilisent).

Il n'y a pas de telles restrictions dans ModSecurity 2.x.

Si vous supprimez cette règle, vous créez une grande brèche par laquelle quelqu'un pourrait introduire une attaque sans être détecté. D'un autre côté, je peux faire valoir que, comme vous utilisez ModSecurity 1.x, il existe d'autres moyens de faire la même chose. Sinon, modifiez la règle pour refuser les requêtes dont l'en-tête Transfer-Encoding est défini. Vous devriez être en sécurité avec cela.

Divulgation : J'ai écrit ModSecurity.

0 votes

@Ivan, merci pour l'explication détaillée. Je transmets à mon équipe d'exploitation. Je voterais bien pour mais je n'ai pas encore assez de réputation.

0voto

phoebus Points 8330

Je crois que cette exigence fait partie de la spécification xml-rpc, plutôt que de la spécification http. Si vous ne recherchez pas xml-rpc, je pense que c'est une chose acceptable à omettre.

Je ne connais pas bien les raisons de son inclusion générale dans le module mod_security, à moins qu'il n'ait été prévu à l'origine pour empêcher une sorte de dépassement ésotérique de la mémoire tampon.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X