
CVE-2023-44487에 대한 서버의 취약성을 확인하기 위해 HEADERS 및 RST_STREAM 프레임을 신속하게 전송하고 서버의 응답을 기록하는 고도로 구성 가능한 도구입니다.
CVE-2023-44487은 HTTP2 프로토콜 자체를 대상으로 하는 익스플로잇입니다. HTTP2에서 데이터 요청은 HEADERS 프레임을 전송하여 시작됩니다. 서버는 이 프레임을 수신한 후 요청 처리를 시작하고, 모든 데이터가 전송될 때까지 DATA 프레임을 연속으로 보냅니다. HTTP2는 또한 스트림을 언제든지 닫는 데 사용할 수 있는 RST_STREAM 프레임을 정의합니다. 공격을 방지하기 위해 서버는 일반적으로 동시에 열리는 스트림 수를 제한합니다(기본값 100). 클라이언트가 실제로 모든 리소스가 소비될 때까지 기다린다면 이 제한에 도달하는 경우는 드뭅니다.
이 공격은 단순한 이유로 작동합니다. 클라이언트는 어느 시점에든 RST_STREAM 프레임을 보낼 수 있습니다. RST_STREAM 프레임은 스트림을 닫으며, 닫힌 스트림은 동시 스트림 수에 포함되지 않습니다. 즉, 클라이언트는 요청을 보낸 직후 연결을 닫기만 하면 이 제한에 걸리지 않고 요청을 빠르게 전송할 수 있습니다. 공격 대상 서버는 경우에 따라 여전히 데이터 로딩을 시작하므로 과도한 부하가 발생합니다.
이 도구는 이 공격에 대한 서버의 취약성을 확인하는 것을 목표로 합니다. 하나 이상의 동시 HTTP2 연결을 설정한 다음 지정된 수의 HEADER 프레임을 보내고 이어서 RST_STREAM 프레임을 보냅니다.
또한 HEADERS 프레임과 RST_STREAM 프레임 사이의 지연, 열 스트림 수, 스트림당 전송할 프레임 수 등 다양한 기타 구성 옵션을 제공합니다. 공격이 완료되면 수신된 프레임 수와 오류 및 GOAWAY 프레임 수신 횟수에 대한 정보가 포함된 요약을 출력합니다. 이를 통해 서비스가 CVE-2023-44487에 취약한지 여부를 식별하는 데 도움을 받을 수 있습니다.
현재 이 도구는 소스 코드로만 배포되므로 go install이 필요합니다. 도구는 go run main.go <options> 명령으로 실행할 수 있습니다. 또한 monitor.log 파일에 기록된 지연 시간 정보를 플로팅하는 데 사용할 수 있는 python 스크립트도 있습니다.
또한 더 정확하고 광범위한 측정을 위해 새로운 python 도구를 만들었습니다. tooling 폴더에 있는 runner.py 파일은 config.py에 정의된 값(자세한 내용은 config-sample.py 참조)을 읽고 정의된 모든 docker 컨테이너에 대해 모든 테스트를 실행합니다. 그런 다음 paths 배열에 정의된 모든 경로에 대해 가장 성공적인 테스트(중앙값 + 평균 지연 시간이 가장 높은 테스트)를 실행합니다. 실행된 각 테스트에 대한 플롯과 로그 파일을 출력합니다.
이 도구는 아직 개발 중입니다. 연구 논문을 위해 이러한 모든 테스트를 수동으로 실행하기가 너무 귀찮아서 만들었을 뿐입니다. 정리하거나 우리의 사용 사례 외에도 실제로 사용할 수 있게 만들려면 PR을 자유롭게 제출하세요.
현재 다음 CLI 옵션이 구현되어 있습니다:
이 도구는 요약과 함께 많은 디버그 정보를 출력합니다. 디버그 정보에는 연결이 설정된 방식, 현재 진행 상황 및 현재 전송 중인 프레임 유형에 대한 정보가 포함됩니다.
요약은 다음과 같은 형태입니다(구성에 따라 다름)
####################SUMMARY####################
Packet types received:
PING: 2
HEADERS: 12
SETTINGS: 0
DATA: 11
GOAWAY: 3
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Attack ending reasons (per receiving thread):
GoAway events: 3
Timeout events: 0
Error events: 0
Summary for connection 2
PING: 1
HEADERS: 9
SETTINGS: 0
DATA: 6
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Summary for connection 1
PING: 1
HEADERS: 3
SETTINGS: 0
DATA: 5
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Summary for connection 0
PING: 0
HEADERS: 0
SETTINGS: 0
DATA: 0
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
수집해야 할 다른 통계가 있다고 생각되면 주저하지 말고 연락하거나 이슈를 생성하세요!
이 도구는 연구 목적으로만 사용됩니다. 본인이 소유하거나 관리하지 않는 서버에 대한 공격을 실행하기 위한 것이 아닙니다. 제공되는 통계의 정확성이나 공격 및 이로 인한 서버와 서비스에 대한 결과에 대해 어떠한 책임도 지지 않습니다.
| Flag | Default | 의미 |
|---|
| frames | 1 | 모든 스트림에서 전송할 HEADERS 및 RST_STREAM 프레임 수 |
| connections | 1 | 공격을 실행할 TLS 연결 수(동시에) |
| consecutiveSends | 1 | RST_STREAM 프레임을 보내기 전에 전송할 HEADERS 프레임 수(흐름당) |
| connectAttempts | 1 | 테스트를 실행할 연속 연결 수(연결 루틴당) |
| delay | 0 | HEADERS 프레임과 RST_STREAM 프레임을 보내는 사이에 대기할 시간(ms) |
| ignoreGoAway | false | true이면 GOAWAY 스트림으로 인해 수신 루틴이 종료되지 않습니다. 대신 10초 이상 프레임을 수신하지 못할 때까지 대기합니다. |
| monitor | false | 성능 모니터링 활성화 |
| monitorDelay | 100 | 응답 지연 시간 테스트 사이에 대기할 시간(ms) |
| monitorLog | ./monitor.log | 모니터 지연 로그를 기록할 파일 |
| routines | 1 | 공격할 스트림 수 |
| skipValidation | true | true이면 서버 인증서를 검증하지 않습니다(기본값 - 어차피 공격자이므로 보안은 신경 쓰지 않습니다) |
| timeout | 1000 | 연결 시도를 무효로 간주하고 중지하기 전에 새 프레임을 기다리는 시간 |
| url | https://localhost:433/ | 공격을 실행할 url |