From bd1e853c199149bcb2a123d87b8f5340834c4ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= <ibc@aliax.net> Date: Thu, 7 Mar 2024 13:54:40 +0100 Subject: [PATCH 1/9] Fuzzer codecs ### Details - Add fuzzer for audio and video codecs (for those we can parse). --- doc/Fuzzer.md | 7 ++++ .../include/RTC/Codecs/FuzzerCodecs.hpp | 17 +++++++++ ...k-492806f087e0c9fe99127b57f379ba946befc35c | 1 + ...k-d54bc342b7d2ee881a9ba853289e831b93375e2d | Bin 0 -> 4 bytes worker/fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp | 15 ++++++++ worker/fuzzer/src/fuzzer.cpp | 34 ++++++++++++------ worker/meson.build | 1 + 7 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 worker/fuzzer/include/RTC/Codecs/FuzzerCodecs.hpp create mode 100644 worker/fuzzer/reports/leak-492806f087e0c9fe99127b57f379ba946befc35c create mode 100644 worker/fuzzer/reports/leak-d54bc342b7d2ee881a9ba853289e831b93375e2d create mode 100644 worker/fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp diff --git a/doc/Fuzzer.md b/doc/Fuzzer.md index 0e94468faa..9514743f42 100644 --- a/doc/Fuzzer.md +++ b/doc/Fuzzer.md @@ -43,6 +43,7 @@ The mediasoup-worker fuzzer reads some custom environment variables to decide wh - `MS_FUZZ_DTLS=1`: Enable DTLS fuzzer. - `MS_FUZZ_RTP=1`: Enable RTP fuzzer. - `MS_FUZZ_RTCP=1`: Enable RTCP fuzzer. +- `MS_FUZZ_CODECS=1`: Enable audio/video codecs fuzzer. - `MS_FUZZ_UTILS=1`: Enable C++ utils fuzzer. - If none of them is given, then **all** fuzzers are enabled. @@ -74,6 +75,12 @@ MS_FUZZ_RTP=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-wor MS_FUZZ_RTCP=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=1400 fuzzer/new-corpus deps/webrtc-fuzzer-corpora/corpora/rtcp-corpus ``` +- Detect memory leaks and just fuzz audio/video codecs: + +```bash +MS_FUZZ_CODECS=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./out/Release/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=1400 fuzzer/new-corpus +``` + - Detect memory leaks and just fuzz mediasoup-worker C++ utils: ```bash diff --git a/worker/fuzzer/include/RTC/Codecs/FuzzerCodecs.hpp b/worker/fuzzer/include/RTC/Codecs/FuzzerCodecs.hpp new file mode 100644 index 0000000000..456f5803d7 --- /dev/null +++ b/worker/fuzzer/include/RTC/Codecs/FuzzerCodecs.hpp @@ -0,0 +1,17 @@ +#ifndef MS_FUZZER_RTC_CODECS_HPP +#define MS_FUZZER_RTC_CODECS_HPP + +#include "common.hpp" + +namespace Fuzzer +{ + namespace RTC + { + namespace Codecs + { + void Fuzz(const uint8_t* data, size_t len); + } // namespace Codecs + } // namespace RTC +} // namespace Fuzzer + +#endif diff --git a/worker/fuzzer/reports/leak-492806f087e0c9fe99127b57f379ba946befc35c b/worker/fuzzer/reports/leak-492806f087e0c9fe99127b57f379ba946befc35c new file mode 100644 index 0000000000..a7f01535ab --- /dev/null +++ b/worker/fuzzer/reports/leak-492806f087e0c9fe99127b57f379ba946befc35c @@ -0,0 +1 @@ +�� \ No newline at end of file diff --git a/worker/fuzzer/reports/leak-d54bc342b7d2ee881a9ba853289e831b93375e2d b/worker/fuzzer/reports/leak-d54bc342b7d2ee881a9ba853289e831b93375e2d new file mode 100644 index 0000000000000000000000000000000000000000..943cf8d7dfd854bb291e0d81dbb826b6fd7c63aa GIT binary patch literal 4 LcmZoU$G`vp1bzWi literal 0 HcmV?d00001 diff --git a/worker/fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp b/worker/fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp new file mode 100644 index 0000000000..1d950a4786 --- /dev/null +++ b/worker/fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp @@ -0,0 +1,15 @@ +#include "RTC/Codecs/FuzzerCodecs.hpp" +#include "RTC/Codecs/Opus.hpp" +#include "RTC/Codecs/VP8.hpp" +#include "RTC/Codecs/VP9.hpp" +#include "RTC/Codecs/H264.hpp" +#include "RTC/Codecs/H264_SVC.hpp" + +void Fuzzer::RTC::Codecs::Fuzz(const uint8_t* data, size_t len) +{ + ::RTC::Codecs::Opus::Parse(data, len); + ::RTC::Codecs::VP8::Parse(data, len); + ::RTC::Codecs::VP9::Parse(data, len); + ::RTC::Codecs::H264::Parse(data, len); + ::RTC::Codecs::H264_SVC::Parse(data, len); +} diff --git a/worker/fuzzer/src/fuzzer.cpp b/worker/fuzzer/src/fuzzer.cpp index 403ef2c417..e8e2b24d4d 100644 --- a/worker/fuzzer/src/fuzzer.cpp +++ b/worker/fuzzer/src/fuzzer.cpp @@ -9,6 +9,7 @@ #include "LogLevel.hpp" #include "Settings.hpp" #include "Utils.hpp" +#include "RTC/Codecs/FuzzerCodecs.hpp" #include "RTC/DtlsTransport.hpp" #include "RTC/FuzzerDtlsTransport.hpp" #include "RTC/FuzzerRtpPacket.hpp" @@ -23,11 +24,12 @@ #include <stddef.h> #include <stdint.h> -bool fuzzStun = false; -bool fuzzDtls = false; -bool fuzzRtp = false; -bool fuzzRtcp = false; -bool fuzzUtils = false; +bool fuzzStun = false; +bool fuzzDtls = false; +bool fuzzRtp = false; +bool fuzzRtcp = false; +bool fuzzCodecs = false; +bool fuzzUtils = false; int Init(); @@ -62,6 +64,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t len) Fuzzer::RTC::RTCP::Packet::Fuzz(data, len); } + if (fuzzCodecs) + { + Fuzzer::RTC::Codecs::Fuzz(data, len); + } + if (fuzzUtils) { Fuzzer::Utils::Fuzz(data, len); @@ -118,6 +125,12 @@ int Init() fuzzRtcp = true; } + if (std::getenv("MS_FUZZ_CODECS") && std::string(std::getenv("MS_FUZZ_CODECS")) == "1") + { + std::cout << "[fuzzer] codecs fuzzer enabled" << std::endl; + + fuzzCodecs = true; + } if (std::getenv("MS_FUZZ_UTILS") && std::string(std::getenv("MS_FUZZ_UTILS")) == "1") { std::cout << "[fuzzer] Utils fuzzer enabled" << std::endl; @@ -128,11 +141,12 @@ int Init() { std::cout << "[fuzzer] all fuzzers enabled" << std::endl; - fuzzStun = true; - fuzzDtls = true; - fuzzRtp = true; - fuzzRtcp = true; - fuzzUtils = true; + fuzzStun = true; + fuzzDtls = true; + fuzzRtp = true; + fuzzRtcp = true; + fuzzCodecs = true; + fuzzUtils = true; } Settings::configuration.logLevel = logLevel; diff --git a/worker/meson.build b/worker/meson.build index bc4ff9eb00..cb7ccc7e56 100644 --- a/worker/meson.build +++ b/worker/meson.build @@ -438,6 +438,7 @@ executable( 'fuzzer/src/RTC/FuzzerSeqManager.cpp', 'fuzzer/src/RTC/FuzzerStunPacket.cpp', 'fuzzer/src/RTC/FuzzerTrendCalculator.cpp', + 'fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp', 'fuzzer/src/RTC/RTCP/FuzzerBye.cpp', 'fuzzer/src/RTC/RTCP/FuzzerFeedbackPs.cpp', 'fuzzer/src/RTC/RTCP/FuzzerFeedbackPsAfb.cpp', From 1395ee311a0abc562ce69d84209f387f0eb4ad17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= <ibc@aliax.net> Date: Thu, 7 Mar 2024 13:57:56 +0100 Subject: [PATCH 2/9] add new fuzzer reports --- .../fuzzer/reports/leak-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b | 1 + .../fuzzer/reports/leak-b6589fc6ab0dc82cf12099d1c2d40ab994e8410c | 1 + 2 files changed, 2 insertions(+) create mode 100644 worker/fuzzer/reports/leak-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b create mode 100644 worker/fuzzer/reports/leak-b6589fc6ab0dc82cf12099d1c2d40ab994e8410c diff --git a/worker/fuzzer/reports/leak-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b b/worker/fuzzer/reports/leak-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b new file mode 100644 index 0000000000..8c7e5a667f --- /dev/null +++ b/worker/fuzzer/reports/leak-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/worker/fuzzer/reports/leak-b6589fc6ab0dc82cf12099d1c2d40ab994e8410c b/worker/fuzzer/reports/leak-b6589fc6ab0dc82cf12099d1c2d40ab994e8410c new file mode 100644 index 0000000000..c227083464 --- /dev/null +++ b/worker/fuzzer/reports/leak-b6589fc6ab0dc82cf12099d1c2d40ab994e8410c @@ -0,0 +1 @@ +0 \ No newline at end of file From c23c1acb72247e0c579673fbc8cef3a6bd50ed1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= <ibc@aliax.net> Date: Thu, 7 Mar 2024 13:59:26 +0100 Subject: [PATCH 3/9] more reports --- .../fuzzer/reports/leak-da4b9237bacccdf19c0760cab7aec4a8359010b0 | 1 + 1 file changed, 1 insertion(+) create mode 100644 worker/fuzzer/reports/leak-da4b9237bacccdf19c0760cab7aec4a8359010b0 diff --git a/worker/fuzzer/reports/leak-da4b9237bacccdf19c0760cab7aec4a8359010b0 b/worker/fuzzer/reports/leak-da4b9237bacccdf19c0760cab7aec4a8359010b0 new file mode 100644 index 0000000000..d8263ee986 --- /dev/null +++ b/worker/fuzzer/reports/leak-da4b9237bacccdf19c0760cab7aec4a8359010b0 @@ -0,0 +1 @@ +2 \ No newline at end of file From 960a9d7f770087138723fde0216cdae0a8d7e2bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= <ibc@aliax.net> Date: Thu, 7 Mar 2024 15:51:33 +0100 Subject: [PATCH 4/9] a separate fuzzer for each codec --- .../fuzzer/include/RTC/Codecs/FuzzerH264.hpp | 20 ++++++++++++++++++ .../include/RTC/Codecs/FuzzerH264_SVC.hpp | 20 ++++++++++++++++++ .../fuzzer/include/RTC/Codecs/FuzzerOpus.hpp | 20 ++++++++++++++++++ .../{FuzzerCodecs.hpp => FuzzerVP8.hpp} | 9 +++++--- .../fuzzer/include/RTC/Codecs/FuzzerVP9.hpp | 20 ++++++++++++++++++ ...h-7e7caf72377ad55d353719f28febb5238eadfc9e | 1 + ...k-492806f087e0c9fe99127b57f379ba946befc35c | 1 - ...k-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b | 1 - ...k-b6589fc6ab0dc82cf12099d1c2d40ab994e8410c | 1 - ...k-d54bc342b7d2ee881a9ba853289e831b93375e2d | Bin 4 -> 0 bytes ...k-da4b9237bacccdf19c0760cab7aec4a8359010b0 | 1 - worker/fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp | 15 ------------- worker/fuzzer/src/RTC/Codecs/FuzzerH264.cpp | 14 ++++++++++++ .../fuzzer/src/RTC/Codecs/FuzzerH264_SVC.cpp | 14 ++++++++++++ worker/fuzzer/src/RTC/Codecs/FuzzerOpus.cpp | 14 ++++++++++++ worker/fuzzer/src/RTC/Codecs/FuzzerVP8.cpp | 14 ++++++++++++ worker/fuzzer/src/RTC/Codecs/FuzzerVP9.cpp | 14 ++++++++++++ worker/fuzzer/src/fuzzer.cpp | 14 +++++++++--- worker/meson.build | 6 +++++- 19 files changed, 173 insertions(+), 26 deletions(-) create mode 100644 worker/fuzzer/include/RTC/Codecs/FuzzerH264.hpp create mode 100644 worker/fuzzer/include/RTC/Codecs/FuzzerH264_SVC.hpp create mode 100644 worker/fuzzer/include/RTC/Codecs/FuzzerOpus.hpp rename worker/fuzzer/include/RTC/Codecs/{FuzzerCodecs.hpp => FuzzerVP8.hpp} (51%) create mode 100644 worker/fuzzer/include/RTC/Codecs/FuzzerVP9.hpp create mode 100644 worker/fuzzer/reports/crash-7e7caf72377ad55d353719f28febb5238eadfc9e delete mode 100644 worker/fuzzer/reports/leak-492806f087e0c9fe99127b57f379ba946befc35c delete mode 100644 worker/fuzzer/reports/leak-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b delete mode 100644 worker/fuzzer/reports/leak-b6589fc6ab0dc82cf12099d1c2d40ab994e8410c delete mode 100644 worker/fuzzer/reports/leak-d54bc342b7d2ee881a9ba853289e831b93375e2d delete mode 100644 worker/fuzzer/reports/leak-da4b9237bacccdf19c0760cab7aec4a8359010b0 delete mode 100644 worker/fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp create mode 100644 worker/fuzzer/src/RTC/Codecs/FuzzerH264.cpp create mode 100644 worker/fuzzer/src/RTC/Codecs/FuzzerH264_SVC.cpp create mode 100644 worker/fuzzer/src/RTC/Codecs/FuzzerOpus.cpp create mode 100644 worker/fuzzer/src/RTC/Codecs/FuzzerVP8.cpp create mode 100644 worker/fuzzer/src/RTC/Codecs/FuzzerVP9.cpp diff --git a/worker/fuzzer/include/RTC/Codecs/FuzzerH264.hpp b/worker/fuzzer/include/RTC/Codecs/FuzzerH264.hpp new file mode 100644 index 0000000000..21a2364365 --- /dev/null +++ b/worker/fuzzer/include/RTC/Codecs/FuzzerH264.hpp @@ -0,0 +1,20 @@ +#ifndef MS_FUZZER_RTC_CODECS_H264_HPP +#define MS_FUZZER_RTC_CODECS_H264_HPP + +#include "common.hpp" + +namespace Fuzzer +{ + namespace RTC + { + namespace Codecs + { + namespace H264 + { + void Fuzz(const uint8_t* data, size_t len); + } + } // namespace Codecs + } // namespace RTC +} // namespace Fuzzer + +#endif diff --git a/worker/fuzzer/include/RTC/Codecs/FuzzerH264_SVC.hpp b/worker/fuzzer/include/RTC/Codecs/FuzzerH264_SVC.hpp new file mode 100644 index 0000000000..d72125dc5d --- /dev/null +++ b/worker/fuzzer/include/RTC/Codecs/FuzzerH264_SVC.hpp @@ -0,0 +1,20 @@ +#ifndef MS_FUZZER_RTC_CODECS_H264_SVC_HPP +#define MS_FUZZER_RTC_CODECS_H264_SVC_HPP + +#include "common.hpp" + +namespace Fuzzer +{ + namespace RTC + { + namespace Codecs + { + namespace H264_SVC + { + void Fuzz(const uint8_t* data, size_t len); + } + } // namespace Codecs + } // namespace RTC +} // namespace Fuzzer + +#endif diff --git a/worker/fuzzer/include/RTC/Codecs/FuzzerOpus.hpp b/worker/fuzzer/include/RTC/Codecs/FuzzerOpus.hpp new file mode 100644 index 0000000000..2e52616600 --- /dev/null +++ b/worker/fuzzer/include/RTC/Codecs/FuzzerOpus.hpp @@ -0,0 +1,20 @@ +#ifndef MS_FUZZER_RTC_CODECS_OPUS_HPP +#define MS_FUZZER_RTC_CODECS_OPUS_HPP + +#include "common.hpp" + +namespace Fuzzer +{ + namespace RTC + { + namespace Codecs + { + namespace Opus + { + void Fuzz(const uint8_t* data, size_t len); + } + } // namespace Codecs + } // namespace RTC +} // namespace Fuzzer + +#endif diff --git a/worker/fuzzer/include/RTC/Codecs/FuzzerCodecs.hpp b/worker/fuzzer/include/RTC/Codecs/FuzzerVP8.hpp similarity index 51% rename from worker/fuzzer/include/RTC/Codecs/FuzzerCodecs.hpp rename to worker/fuzzer/include/RTC/Codecs/FuzzerVP8.hpp index 456f5803d7..dfa87efec8 100644 --- a/worker/fuzzer/include/RTC/Codecs/FuzzerCodecs.hpp +++ b/worker/fuzzer/include/RTC/Codecs/FuzzerVP8.hpp @@ -1,5 +1,5 @@ -#ifndef MS_FUZZER_RTC_CODECS_HPP -#define MS_FUZZER_RTC_CODECS_HPP +#ifndef MS_FUZZER_RTC_CODECS_VP8_HPP +#define MS_FUZZER_RTC_CODECS_VP8_HPP #include "common.hpp" @@ -9,7 +9,10 @@ namespace Fuzzer { namespace Codecs { - void Fuzz(const uint8_t* data, size_t len); + namespace VP8 + { + void Fuzz(const uint8_t* data, size_t len); + } } // namespace Codecs } // namespace RTC } // namespace Fuzzer diff --git a/worker/fuzzer/include/RTC/Codecs/FuzzerVP9.hpp b/worker/fuzzer/include/RTC/Codecs/FuzzerVP9.hpp new file mode 100644 index 0000000000..93743cbeae --- /dev/null +++ b/worker/fuzzer/include/RTC/Codecs/FuzzerVP9.hpp @@ -0,0 +1,20 @@ +#ifndef MS_FUZZER_RTC_CODECS_VP9_HPP +#define MS_FUZZER_RTC_CODECS_VP9_HPP + +#include "common.hpp" + +namespace Fuzzer +{ + namespace RTC + { + namespace Codecs + { + namespace VP9 + { + void Fuzz(const uint8_t* data, size_t len); + } + } // namespace Codecs + } // namespace RTC +} // namespace Fuzzer + +#endif diff --git a/worker/fuzzer/reports/crash-7e7caf72377ad55d353719f28febb5238eadfc9e b/worker/fuzzer/reports/crash-7e7caf72377ad55d353719f28febb5238eadfc9e new file mode 100644 index 0000000000..e570989278 --- /dev/null +++ b/worker/fuzzer/reports/crash-7e7caf72377ad55d353719f28febb5238eadfc9e @@ -0,0 +1 @@ +88t \ No newline at end of file diff --git a/worker/fuzzer/reports/leak-492806f087e0c9fe99127b57f379ba946befc35c b/worker/fuzzer/reports/leak-492806f087e0c9fe99127b57f379ba946befc35c deleted file mode 100644 index a7f01535ab..0000000000 --- a/worker/fuzzer/reports/leak-492806f087e0c9fe99127b57f379ba946befc35c +++ /dev/null @@ -1 +0,0 @@ -�� \ No newline at end of file diff --git a/worker/fuzzer/reports/leak-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b b/worker/fuzzer/reports/leak-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b deleted file mode 100644 index 8c7e5a667f..0000000000 --- a/worker/fuzzer/reports/leak-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/worker/fuzzer/reports/leak-b6589fc6ab0dc82cf12099d1c2d40ab994e8410c b/worker/fuzzer/reports/leak-b6589fc6ab0dc82cf12099d1c2d40ab994e8410c deleted file mode 100644 index c227083464..0000000000 --- a/worker/fuzzer/reports/leak-b6589fc6ab0dc82cf12099d1c2d40ab994e8410c +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/worker/fuzzer/reports/leak-d54bc342b7d2ee881a9ba853289e831b93375e2d b/worker/fuzzer/reports/leak-d54bc342b7d2ee881a9ba853289e831b93375e2d deleted file mode 100644 index 943cf8d7dfd854bb291e0d81dbb826b6fd7c63aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZoU$G`vp1bzWi diff --git a/worker/fuzzer/reports/leak-da4b9237bacccdf19c0760cab7aec4a8359010b0 b/worker/fuzzer/reports/leak-da4b9237bacccdf19c0760cab7aec4a8359010b0 deleted file mode 100644 index d8263ee986..0000000000 --- a/worker/fuzzer/reports/leak-da4b9237bacccdf19c0760cab7aec4a8359010b0 +++ /dev/null @@ -1 +0,0 @@ -2 \ No newline at end of file diff --git a/worker/fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp b/worker/fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp deleted file mode 100644 index 1d950a4786..0000000000 --- a/worker/fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "RTC/Codecs/FuzzerCodecs.hpp" -#include "RTC/Codecs/Opus.hpp" -#include "RTC/Codecs/VP8.hpp" -#include "RTC/Codecs/VP9.hpp" -#include "RTC/Codecs/H264.hpp" -#include "RTC/Codecs/H264_SVC.hpp" - -void Fuzzer::RTC::Codecs::Fuzz(const uint8_t* data, size_t len) -{ - ::RTC::Codecs::Opus::Parse(data, len); - ::RTC::Codecs::VP8::Parse(data, len); - ::RTC::Codecs::VP9::Parse(data, len); - ::RTC::Codecs::H264::Parse(data, len); - ::RTC::Codecs::H264_SVC::Parse(data, len); -} diff --git a/worker/fuzzer/src/RTC/Codecs/FuzzerH264.cpp b/worker/fuzzer/src/RTC/Codecs/FuzzerH264.cpp new file mode 100644 index 0000000000..48404e41e8 --- /dev/null +++ b/worker/fuzzer/src/RTC/Codecs/FuzzerH264.cpp @@ -0,0 +1,14 @@ +#include "RTC/Codecs/FuzzerH264.hpp" +#include "RTC/Codecs/H264.hpp" + +void Fuzzer::RTC::Codecs::H264::Fuzz(const uint8_t* data, size_t len) +{ + ::RTC::Codecs::H264::PayloadDescriptor* descriptor = ::RTC::Codecs::H264::Parse(data, len); + + if (!descriptor) + { + return; + } + + delete descriptor; +} diff --git a/worker/fuzzer/src/RTC/Codecs/FuzzerH264_SVC.cpp b/worker/fuzzer/src/RTC/Codecs/FuzzerH264_SVC.cpp new file mode 100644 index 0000000000..b0af2e6012 --- /dev/null +++ b/worker/fuzzer/src/RTC/Codecs/FuzzerH264_SVC.cpp @@ -0,0 +1,14 @@ +#include "RTC/Codecs/FuzzerH264_SVC.hpp" +#include "RTC/Codecs/H264_SVC.hpp" + +void Fuzzer::RTC::Codecs::H264_SVC::Fuzz(const uint8_t* data, size_t len) +{ + ::RTC::Codecs::H264_SVC::PayloadDescriptor* descriptor = ::RTC::Codecs::H264_SVC::Parse(data, len); + + if (!descriptor) + { + return; + } + + delete descriptor; +} diff --git a/worker/fuzzer/src/RTC/Codecs/FuzzerOpus.cpp b/worker/fuzzer/src/RTC/Codecs/FuzzerOpus.cpp new file mode 100644 index 0000000000..188762c8b8 --- /dev/null +++ b/worker/fuzzer/src/RTC/Codecs/FuzzerOpus.cpp @@ -0,0 +1,14 @@ +#include "RTC/Codecs/FuzzerOpus.hpp" +#include "RTC/Codecs/Opus.hpp" + +void Fuzzer::RTC::Codecs::Opus::Fuzz(const uint8_t* data, size_t len) +{ + ::RTC::Codecs::Opus::PayloadDescriptor* descriptor = ::RTC::Codecs::Opus::Parse(data, len); + + if (!descriptor) + { + return; + } + + delete descriptor; +} diff --git a/worker/fuzzer/src/RTC/Codecs/FuzzerVP8.cpp b/worker/fuzzer/src/RTC/Codecs/FuzzerVP8.cpp new file mode 100644 index 0000000000..a628bd5e11 --- /dev/null +++ b/worker/fuzzer/src/RTC/Codecs/FuzzerVP8.cpp @@ -0,0 +1,14 @@ +#include "RTC/Codecs/FuzzerVP8.hpp" +#include "RTC/Codecs/VP8.hpp" + +void Fuzzer::RTC::Codecs::VP8::Fuzz(const uint8_t* data, size_t len) +{ + ::RTC::Codecs::VP8::PayloadDescriptor* descriptor = ::RTC::Codecs::VP8::Parse(data, len); + + if (!descriptor) + { + return; + } + + delete descriptor; +} diff --git a/worker/fuzzer/src/RTC/Codecs/FuzzerVP9.cpp b/worker/fuzzer/src/RTC/Codecs/FuzzerVP9.cpp new file mode 100644 index 0000000000..c10a177a79 --- /dev/null +++ b/worker/fuzzer/src/RTC/Codecs/FuzzerVP9.cpp @@ -0,0 +1,14 @@ +#include "RTC/Codecs/FuzzerVP9.hpp" +#include "RTC/Codecs/VP9.hpp" + +void Fuzzer::RTC::Codecs::VP9::Fuzz(const uint8_t* data, size_t len) +{ + ::RTC::Codecs::VP9::PayloadDescriptor* descriptor = ::RTC::Codecs::VP9::Parse(data, len); + + if (!descriptor) + { + return; + } + + delete descriptor; +} diff --git a/worker/fuzzer/src/fuzzer.cpp b/worker/fuzzer/src/fuzzer.cpp index e8e2b24d4d..d51422b103 100644 --- a/worker/fuzzer/src/fuzzer.cpp +++ b/worker/fuzzer/src/fuzzer.cpp @@ -9,7 +9,11 @@ #include "LogLevel.hpp" #include "Settings.hpp" #include "Utils.hpp" -#include "RTC/Codecs/FuzzerCodecs.hpp" +#include "RTC/Codecs/FuzzerH264.hpp" +#include "RTC/Codecs/FuzzerH264_SVC.hpp" +#include "RTC/Codecs/FuzzerOpus.hpp" +#include "RTC/Codecs/FuzzerVP8.hpp" +#include "RTC/Codecs/FuzzerVP9.hpp" #include "RTC/DtlsTransport.hpp" #include "RTC/FuzzerDtlsTransport.hpp" #include "RTC/FuzzerRtpPacket.hpp" @@ -66,7 +70,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t len) if (fuzzCodecs) { - Fuzzer::RTC::Codecs::Fuzz(data, len); + Fuzzer::RTC::Codecs::Opus::Fuzz(data, len); + Fuzzer::RTC::Codecs::VP8::Fuzz(data, len); + Fuzzer::RTC::Codecs::VP9::Fuzz(data, len); + Fuzzer::RTC::Codecs::H264::Fuzz(data, len); + Fuzzer::RTC::Codecs::H264_SVC::Fuzz(data, len); } if (fuzzUtils) @@ -137,7 +145,7 @@ int Init() fuzzUtils = true; } - if (!fuzzStun && !fuzzDtls && !fuzzRtcp && !fuzzRtp && !fuzzUtils) + if (!fuzzStun && !fuzzDtls && !fuzzRtp && !fuzzRtcp && !fuzzCodecs && !fuzzUtils) { std::cout << "[fuzzer] all fuzzers enabled" << std::endl; diff --git a/worker/meson.build b/worker/meson.build index cb7ccc7e56..f4d24f5958 100644 --- a/worker/meson.build +++ b/worker/meson.build @@ -438,7 +438,11 @@ executable( 'fuzzer/src/RTC/FuzzerSeqManager.cpp', 'fuzzer/src/RTC/FuzzerStunPacket.cpp', 'fuzzer/src/RTC/FuzzerTrendCalculator.cpp', - 'fuzzer/src/RTC/Codecs/FuzzerCodecs.cpp', + 'fuzzer/src/RTC/Codecs/FuzzerOpus.cpp', + 'fuzzer/src/RTC/Codecs/FuzzerVP8.cpp', + 'fuzzer/src/RTC/Codecs/FuzzerVP9.cpp', + 'fuzzer/src/RTC/Codecs/FuzzerH264.cpp', + 'fuzzer/src/RTC/Codecs/FuzzerH264_SVC.cpp', 'fuzzer/src/RTC/RTCP/FuzzerBye.cpp', 'fuzzer/src/RTC/RTCP/FuzzerFeedbackPs.cpp', 'fuzzer/src/RTC/RTCP/FuzzerFeedbackPsAfb.cpp', From d203472da7a256cda49b1423317fdf87689f1221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= <ibc@aliax.net> Date: Thu, 7 Mar 2024 15:58:36 +0100 Subject: [PATCH 5/9] add report crash --- .../crash-9cc885b84ba02d766f422c6512ead3808ded0189 | Bin 0 -> 4 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 worker/fuzzer/reports/crash-9cc885b84ba02d766f422c6512ead3808ded0189 diff --git a/worker/fuzzer/reports/crash-9cc885b84ba02d766f422c6512ead3808ded0189 b/worker/fuzzer/reports/crash-9cc885b84ba02d766f422c6512ead3808ded0189 new file mode 100644 index 0000000000000000000000000000000000000000..e450f03ee831d124112a2d8b13460847777e845a GIT binary patch literal 4 LcmcCuVK4yz0VDu% literal 0 HcmV?d00001 From e7757ee47d4a1f2b24f048860eab5855efe3d0eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= <ibc@aliax.net> Date: Thu, 7 Mar 2024 16:02:09 +0100 Subject: [PATCH 6/9] cosmetic --- worker/src/RTC/Codecs/H264_SVC.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/worker/src/RTC/Codecs/H264_SVC.cpp b/worker/src/RTC/Codecs/H264_SVC.cpp index f67b1fae86..bb9065b704 100644 --- a/worker/src/RTC/Codecs/H264_SVC.cpp +++ b/worker/src/RTC/Codecs/H264_SVC.cpp @@ -166,7 +166,10 @@ namespace RTC // Single NAL unit packet. // IDR (instantaneous decoding picture). case 5: + { payloadDescriptor->isKeyFrame = true; + } + case 1: { payloadDescriptor->slIndex = 0; @@ -177,6 +180,7 @@ namespace RTC break; } + case 14: case 20: { @@ -210,6 +214,7 @@ namespace RTC break; } + case 7: { payloadDescriptor->isKeyFrame = isStartBit ? true : false; From 532274fc050411eec5a3f8b0ae6625bf1d0c8f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= <ibc@aliax.net> Date: Thu, 7 Mar 2024 16:55:12 +0100 Subject: [PATCH 7/9] cosmetic --- worker/include/RTC/Codecs/H264.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/worker/include/RTC/Codecs/H264.hpp b/worker/include/RTC/Codecs/H264.hpp index 788c86aa0e..8fda3227de 100644 --- a/worker/include/RTC/Codecs/H264.hpp +++ b/worker/include/RTC/Codecs/H264.hpp @@ -28,6 +28,7 @@ namespace RTC uint8_t tid{ 0 }; // Temporal layer id. uint8_t lid{ 0 }; // Spatial layer id. uint8_t tl0picidx{ 0 }; // TL0PICIDX + // Parsed values. bool hasLid{ false }; bool hasTid{ false }; From dd0136fce3f99806c161dae3783dce174dd876c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= <ibc@aliax.net> Date: Thu, 7 Mar 2024 17:12:53 +0100 Subject: [PATCH 8/9] Fix AddressSanitizer: heap-buffer-overflow in H264_SVC --- worker/src/RTC/Codecs/H264_SVC.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/worker/src/RTC/Codecs/H264_SVC.cpp b/worker/src/RTC/Codecs/H264_SVC.cpp index bb9065b704..199efec1ad 100644 --- a/worker/src/RTC/Codecs/H264_SVC.cpp +++ b/worker/src/RTC/Codecs/H264_SVC.cpp @@ -184,6 +184,11 @@ namespace RTC case 14: case 20: { + if (len <= 1) + { + return nullptr; + } + size_t offset{ 1 }; uint8_t byte = data[offset]; From fe406b92e51176abe9348cb1c125ddd730c4d20c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= <ibc@aliax.net> Date: Thu, 7 Mar 2024 17:25:02 +0100 Subject: [PATCH 9/9] cosmetic --- worker/src/RTC/Codecs/H264_SVC.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/worker/src/RTC/Codecs/H264_SVC.cpp b/worker/src/RTC/Codecs/H264_SVC.cpp index 199efec1ad..05e43ec318 100644 --- a/worker/src/RTC/Codecs/H264_SVC.cpp +++ b/worker/src/RTC/Codecs/H264_SVC.cpp @@ -227,6 +227,7 @@ namespace RTC break; } } + return payloadDescriptor; }