fix(svc): rdpdr channel fuzzing harness and associated issues (#408)

This commit is contained in:
Norbert Szetei 2024-03-11 11:28:27 +01:00 committed by GitHub
parent e92d8c3e17
commit c4193371bd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 41 additions and 7 deletions

View file

@ -41,7 +41,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
target: [ pdu_decoding, rle_decompression, bitmap_stream, cliprdr_format ] target: [ pdu_decoding, rle_decompression, bitmap_stream, cliprdr_format, channel_processing ]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3

1
Cargo.lock generated
View file

@ -1806,6 +1806,7 @@ dependencies = [
"ironrdp-graphics", "ironrdp-graphics",
"ironrdp-pdu", "ironrdp-pdu",
"ironrdp-rdpdr", "ironrdp-rdpdr",
"ironrdp-svc",
] ]
[[package]] [[package]]

View file

@ -16,4 +16,5 @@ ironrdp-pdu.workspace = true
ironrdp-cliprdr.workspace = true ironrdp-cliprdr.workspace = true
ironrdp-rdpdr.workspace = true ironrdp-rdpdr.workspace = true
ironrdp-cliprdr-format.workspace = true ironrdp-cliprdr-format.workspace = true
ironrdp-displaycontrol.workspace = true ironrdp-displaycontrol.workspace = true
ironrdp-svc.workspace = true

View file

@ -136,3 +136,13 @@ pub fn cliprdr_format(input: &[u8]) {
let _ = plain_html_to_cf_html(input); let _ = plain_html_to_cf_html(input);
} }
} }
pub fn channel_process(input: &[u8]) {
use ironrdp_svc::SvcProcessor;
let mut rdpdr = ironrdp_rdpdr::Rdpdr::new(Box::new(ironrdp_rdpdr::NoopRdpdrBackend), "Backend".to_owned())
.with_smartcard(1)
.with_drives(None);
let _ = rdpdr.process(input);
}

View file

@ -1214,12 +1214,13 @@ impl<T: IoCtlCode> DeviceControlRequest<T>
where where
T::Error: ironrdp_error::Source, T::Error: ironrdp_error::Source,
{ {
fn headerless_size() -> usize { const HEADERLESS_SIZE: usize = 4 // OutputBufferLength
size_of::<u32>() * 3 // OutputBufferLength, InputBufferLength, IoControlCode + 4 // InputBufferLength
} + 4 // IoControlCode
+ 20; // Additional 20 bytes for padding
pub fn decode(header: DeviceIoRequest, src: &mut ReadCursor<'_>) -> PduResult<Self> { pub fn decode(header: DeviceIoRequest, src: &mut ReadCursor<'_>) -> PduResult<Self> {
ensure_size!(ctx: "DeviceControlRequest", in: src, size: Self::headerless_size()); ensure_size!(ctx: "DeviceControlRequest", in: src, size: Self::HEADERLESS_SIZE);
let output_buffer_length = src.read_u32(); let output_buffer_length = src.read_u32();
let input_buffer_length = src.read_u32(); let input_buffer_length = src.read_u32();
let io_control_code = T::try_from(src.read_u32()).map_err(|e| { let io_control_code = T::try_from(src.read_u32()).map_err(|e| {

1
fuzz/Cargo.lock generated
View file

@ -321,6 +321,7 @@ dependencies = [
"ironrdp-graphics", "ironrdp-graphics",
"ironrdp-pdu", "ironrdp-pdu",
"ironrdp-rdpdr", "ironrdp-rdpdr",
"ironrdp-svc",
] ]
[[package]] [[package]]

View file

@ -40,3 +40,10 @@ name = "cliprdr_format"
path = "fuzz_targets/cliprdr_format.rs" path = "fuzz_targets/cliprdr_format.rs"
test = false test = false
doc = false doc = false
[[bin]]
name = "channel_processing"
path = "fuzz_targets/channel_processing.rs"
test = false
doc = false
bench = false

View file

@ -0,0 +1,7 @@
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
ironrdp_fuzzing::oracles::channel_process(data);
});

View file

@ -33,7 +33,13 @@ pub const CARGO: &str = env!("CARGO");
pub const WASM_PACKAGES: &[&str] = &["ironrdp-web"]; pub const WASM_PACKAGES: &[&str] = &["ironrdp-web"];
pub const FUZZ_TARGETS: &[&str] = &["pdu_decoding", "rle_decompression", "bitmap_stream", "cliprdr_format"]; pub const FUZZ_TARGETS: &[&str] = &[
"pdu_decoding",
"rle_decompression",
"bitmap_stream",
"cliprdr_format",
"channel_processing",
];
fn main() -> anyhow::Result<()> { fn main() -> anyhow::Result<()> {
let args = match cli::parse_args() { let args = match cli::parse_args() {