Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

http2: event on mismatch between authority and host #9770

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions rules/http2-events.rules
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ alert http2 any any -> any any (msg:"SURICATA HTTP2 too long frame data"; flow:e
alert http2 any any -> any any (msg:"SURICATA HTTP2 stream identifier reuse"; flow:established; app-layer-event:http2.stream_id_reuse; classtype:protocol-command-decode; sid:2290007; rev:1;)
alert http2 any any -> any any (msg:"SURICATA HTTP2 invalid HTTP1 settings during upgrade"; flow:established; app-layer-event:http2.invalid_http1_settings; classtype:protocol-command-decode; sid:2290008; rev:1;)
alert http2 any any -> any any (msg:"SURICATA HTTP2 failed decompression"; flow:established; app-layer-event:http2.failed_decompression; classtype:protocol-command-decode; sid:2290009; rev:1;)
alert http2 any any -> any any (msg:"SURICATA HTTP2 authority host mismatch"; flow:established,to_server; app-layer-event:http2.authority_host_mismatch; classtype:protocol-command-decode; sid:2290013; rev:1;)
36 changes: 29 additions & 7 deletions rust/src/http2/http2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -175,14 +175,32 @@ impl HTTP2Transaction {
}
}

#[cfg(not(feature = "decompression"))]
fn handle_headers(&mut self, _blocks: &Vec<parser::HTTP2FrameHeaderBlock>, _dir: u8) {}
pub fn set_event(&mut self, event: HTTP2Event) {
let ev = event as u8;
core::sc_app_layer_decoder_events_set_event_raw(&mut self.events, ev);
}

#[cfg(feature = "decompression")]
fn handle_headers(&mut self, blocks: &Vec<parser::HTTP2FrameHeaderBlock>, dir: u8) {
for i in 0..blocks.len() {
if blocks[i].name == b"content-encoding" {
self.decoder.http2_encoding_fromvec(&blocks[i].value, dir);
fn handle_headers(&mut self, blocks: &[parser::HTTP2FrameHeaderBlock], _dir: u8) {
let mut authority = None;
let mut host = None;
for block in blocks {
if block.name == b"content-encoding" {
#[cfg(feature = "decompression")]
self.decoder.http2_encoding_fromvec(&block.value, _dir);
} else if block.name.eq_ignore_ascii_case(b":authority") {
authority = Some(&block.value);
} else if block.name.eq_ignore_ascii_case(b"host") {
host = Some(&block.value);
}
}
if let Some(a) = authority {
if let Some(h) = host {
if !a.eq_ignore_ascii_case(h) {
// The event is triggered only if both headers
// are in the same frame to avoid excessive
// complexity at runtime.
self.set_event(HTTP2Event::AuthorityHostMismatch);
}
}
}
}
Expand Down Expand Up @@ -336,6 +354,7 @@ pub enum HTTP2Event {
StreamIdReuse,
InvalidHTTP1Settings,
FailedDecompression,
AuthorityHostMismatch,
}

impl HTTP2Event {
Expand All @@ -351,6 +370,7 @@ impl HTTP2Event {
7 => Some(HTTP2Event::StreamIdReuse),
8 => Some(HTTP2Event::InvalidHTTP1Settings),
9 => Some(HTTP2Event::FailedDecompression),
10 => Some(HTTP2Event::AuthorityHostMismatch),
_ => None,
}
}
Expand Down Expand Up @@ -1146,6 +1166,7 @@ pub extern "C" fn rs_http2_state_get_event_info(
"stream_id_reuse" => HTTP2Event::StreamIdReuse as i32,
"invalid_http1_settings" => HTTP2Event::InvalidHTTP1Settings as i32,
"failed_decompression" => HTTP2Event::FailedDecompression as i32,
"authority_host_mismatch" => HTTP2Event::AuthorityHostMismatch as i32,
_ => -1, // unknown event
}
}
Expand Down Expand Up @@ -1175,6 +1196,7 @@ pub extern "C" fn rs_http2_state_get_event_info_by_id(
HTTP2Event::StreamIdReuse => "stream_id_reuse\0",
HTTP2Event::InvalidHTTP1Settings => "invalid_http1_settings\0",
HTTP2Event::FailedDecompression => "failed_decompression\0",
HTTP2Event::AuthorityHostMismatch => "authority_host_mismatch\0",
};
unsafe {
*event_name = estr.as_ptr() as *const std::os::raw::c_char;
Expand Down
Loading