blackbull.fault_injection.catalogue.h2_client¶
blackbull.fault_injection.catalogue.h2_client
¶
Named HTTP/2 client-side misbehaviour cases.
Each entry is one thing a real client does wrong to a server, named so a
suite can parametrize over the set and report which case broke it.
The HTTP/2 rows of the attack-surface audit are what this set is drawn
from, so the names line up with the defences on the other side: if
rapid_reset_burst stops failing, the meter that answers it changed.
abort_mid_header_block()
¶
Open a header block, then RST the transport rather than the stream.
data_frame_lies_about_length()
¶
A frame header declaring 100 payload bytes, carrying 2.
empty_continuation_flood()
¶
CVE-2024-27983 shape — a header block extended by zero-length frames.
No byte budget can see these: they add nothing to the block, so the defence has to count them.
header_block_never_finished()
¶
HEADERS without END_HEADERS, then silence.
HPACK state is connection-wide, so the server cannot abandon this per-stream — the reason its answer is a connection error.
ping_flood()
¶
CVE-2019-9512 — every PING obliges an ACK write, at no byte cost.
preface_never_arrives()
¶
Connect, send nothing, hold the connection open.
What BB_HEADER_TIMEOUT and the connection-detect deadline answer.
preface_trickled()
¶
The preface, one byte every 100 ms — legal bytes, hostile pacing.
rapid_reset_burst()
¶
CVE-2023-44487 — open streams and reset them immediately.
Each HEADERS costs the server a stream; each RST_STREAM frees it before
SETTINGS_MAX_CONCURRENT_STREAMS ever bites, so the cost is unbounded
without a rate meter.
settings_ack_with_payload()
¶
§6.5 — a SETTINGS frame with ACK set MUST have an empty payload.
settings_flood()
¶
CVE-2019-9515 — same shape, SETTINGS instead of PING.
unknown_frame_type()
¶
RFC 9113 §4.1 — an unregistered type MUST be ignored, not fatal.