From cd1545acab3b0cb4238402547cde3bc496fa398e Mon Sep 17 00:00:00 2001 From: Lukas Sismis Date: Thu, 19 Sep 2024 10:47:15 +0200 Subject: [PATCH] bypass: verify bypass behavior Ticket: 6788 --- tests/bypass-depth-disabled/README.md | 13 +++++++++++++ tests/bypass-depth-disabled/input.pcap | Bin 0 -> 6722 bytes tests/bypass-depth-disabled/test.yaml | 18 ++++++++++++++++++ tests/bypass-depth-enabled/README.md | 13 +++++++++++++ tests/bypass-depth-enabled/test.yaml | 20 ++++++++++++++++++++ tests/bypass-ssh-enabled/README.md | 14 ++++++++++++++ tests/bypass-ssh-enabled/input.pcap | Bin 0 -> 9592 bytes tests/bypass-ssh-enabled/test.yaml | 18 ++++++++++++++++++ tests/bypass-tls-disabled/README.md | 13 +++++++++++++ tests/bypass-tls-disabled/test.yaml | 20 ++++++++++++++++++++ tests/bypass-tls-enabled/README.md | 14 ++++++++++++++ tests/bypass-tls-enabled/test.yaml | 20 ++++++++++++++++++++ 12 files changed, 163 insertions(+) create mode 100644 tests/bypass-depth-disabled/README.md create mode 100644 tests/bypass-depth-disabled/input.pcap create mode 100644 tests/bypass-depth-disabled/test.yaml create mode 100644 tests/bypass-depth-enabled/README.md create mode 100644 tests/bypass-depth-enabled/test.yaml create mode 100644 tests/bypass-ssh-enabled/README.md create mode 100644 tests/bypass-ssh-enabled/input.pcap create mode 100644 tests/bypass-ssh-enabled/test.yaml create mode 100644 tests/bypass-tls-disabled/README.md create mode 100644 tests/bypass-tls-disabled/test.yaml create mode 100644 tests/bypass-tls-enabled/README.md create mode 100644 tests/bypass-tls-enabled/test.yaml diff --git a/tests/bypass-depth-disabled/README.md b/tests/bypass-depth-disabled/README.md new file mode 100644 index 000000000..3d4977267 --- /dev/null +++ b/tests/bypass-depth-disabled/README.md @@ -0,0 +1,13 @@ +# Test Description + +Tests that no traffic is bypassed even with minimal reassembly depth + +## PCAP + +Source: https://wiki.wireshark.org/SampleCaptures +File: dump.pcapng + +## Related issues + +Created with a work to decouple stream.bypass setting from TLS encrypted bypass. +https://redmine.openinfosecfoundation.org/issues/6788 diff --git a/tests/bypass-depth-disabled/input.pcap b/tests/bypass-depth-disabled/input.pcap new file mode 100644 index 0000000000000000000000000000000000000000..2791053c45411ea488101f3f5c627df430987e0a GIT binary patch literal 6722 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 TpZ+Mu^3@$0=m5~^2>|~CE6FG> literal 0 Hc-jL100001 diff --git a/tests/bypass-depth-disabled/test.yaml b/tests/bypass-depth-disabled/test.yaml new file mode 100644 index 000000000..b2d87263e --- /dev/null +++ b/tests/bypass-depth-disabled/test.yaml @@ -0,0 +1,18 @@ +requires: + min-version: 7 + +args: +- -k none +- --set app-layer.protocols.tls.encryption-handling=full +- --set app-layer.protocols.ssh.encryption-handling=full +- --set stream.reassembly.depth=1 +- --set stream.bypass=false + +checks: + - filter: + count: 1 + match: + event_type: stats + - stats: + flow_bypassed.local_pkts: 0 + flow_bypassed.local_bytes: 0 diff --git a/tests/bypass-depth-enabled/README.md b/tests/bypass-depth-enabled/README.md new file mode 100644 index 000000000..b052a679a --- /dev/null +++ b/tests/bypass-depth-enabled/README.md @@ -0,0 +1,13 @@ +# Test Description + +Tests that traffic is bypassed after reaching the reassembly depth + +## PCAP + +Source: https://wiki.wireshark.org/SampleCaptures +File: dump.pcapng + +## Related issues + +Created with a work to decouple stream.bypass setting from TLS encrypted bypass. +https://redmine.openinfosecfoundation.org/issues/6788 diff --git a/tests/bypass-depth-enabled/test.yaml b/tests/bypass-depth-enabled/test.yaml new file mode 100644 index 000000000..619d18728 --- /dev/null +++ b/tests/bypass-depth-enabled/test.yaml @@ -0,0 +1,20 @@ +pcap: ../bypass-depth-disabled/input.pcap + +requires: + min-version: 7 + +args: +- -k none +- --set app-layer.protocols.tls.encryption-handling=full +- --set app-layer.protocols.ssh.encryption-handling=full +- --set stream.reassembly.depth=1 +- --set stream.bypass=true + +checks: + - filter: + count: 1 + match: + event_type: stats + - stats: + flow_bypassed.local_pkts: 11 + flow_bypassed.local_bytes: 6126 diff --git a/tests/bypass-ssh-enabled/README.md b/tests/bypass-ssh-enabled/README.md new file mode 100644 index 000000000..e2f28ad63 --- /dev/null +++ b/tests/bypass-ssh-enabled/README.md @@ -0,0 +1,14 @@ +# Test Description + +Tests that the encrypted part of the SSH traffic is bypassed but it should not +bypass based on the depth + +## PCAP + +Source: https://www.cloudshark.org/captures/9b72eb8febf9 +File: ssh-server-client.pcapng + +## Related issues + +Created with a work to decouple stream.bypass setting from TLS encrypted bypass. +https://redmine.openinfosecfoundation.org/issues/6788 diff --git a/tests/bypass-ssh-enabled/input.pcap b/tests/bypass-ssh-enabled/input.pcap new file mode 100644 index 0000000000000000000000000000000000000000..d89f3d136dafa2f07a58ee62f5baca3910ef6608 GIT binary patch literal 9592 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