diff --git a/fuzzing/packet/.gitignore b/fuzzing/packet/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..caa15264d86c49b6614d36db1444140617445726 --- /dev/null +++ b/fuzzing/packet/.gitignore @@ -0,0 +1,3 @@ +packet-fuzz.zip +crashers +suppressions diff --git a/fuzzing/packet/Makefile b/fuzzing/packet/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..c4b419aee951dc61b5d91037828ac177735b2234 --- /dev/null +++ b/fuzzing/packet/Makefile @@ -0,0 +1,16 @@ + +$(GOPATH)/bin/go-fuzz-build: + go get -u github.com/dvyukov/go-fuzz/... + +$(GOPATH)/bin/go-fuzz: + go get -u github.com/dvyukov/go-fuzz/... + +packet-fuzz.zip: $(GOPATH)/bin/go-fuzz-build + $(GOPATH)/bin/go-fuzz-build github.com/bio-routing/bio-rd/protocols/bgp/packet + +corpus: + mkdir -p corpus + go run gen_initial_corpus.go + +fuzz: packet-fuzz.zip corpus $(GOPATH)/bin/go-fuzz + $(GOPATH)/bin/go-fuzz -bin=./packet-fuzz.zip -workdir=. diff --git a/fuzzing/packet/README.md b/fuzzing/packet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b7f396f1a377c3bf8437fe26dc04cb3e1216572f --- /dev/null +++ b/fuzzing/packet/README.md @@ -0,0 +1,8 @@ +# Fuzzing + +To start a new fuzzing run, execute: +```bash +make fuzz +``` +This will create an initial corpus if there is no corpus, download the fuzzing tool and build all required +assets. \ No newline at end of file diff --git a/fuzzing/packet/corpus/0.bytes b/fuzzing/packet/corpus/0.bytes new file mode 100644 index 0000000000000000000000000000000000000000..78ebde2e66d5283d5601ba30a9cd3ebb3f054081 Binary files /dev/null and b/fuzzing/packet/corpus/0.bytes differ diff --git a/fuzzing/packet/corpus/0157cd8525a62f2930fa2231f77a6e82daf84144-4 b/fuzzing/packet/corpus/0157cd8525a62f2930fa2231f77a6e82daf84144-4 new file mode 100644 index 0000000000000000000000000000000000000000..fcc54e44eb93269d878fe4d0993a6d42a48cf9e4 Binary files /dev/null and b/fuzzing/packet/corpus/0157cd8525a62f2930fa2231f77a6e82daf84144-4 differ diff --git a/fuzzing/packet/corpus/015c42a3fb61be0244e05a16922602dbf2fe05f0-5 b/fuzzing/packet/corpus/015c42a3fb61be0244e05a16922602dbf2fe05f0-5 new file mode 100644 index 0000000000000000000000000000000000000000..78a6f3afd603cc0c1d2ca59b1ad65718925099f5 Binary files /dev/null and b/fuzzing/packet/corpus/015c42a3fb61be0244e05a16922602dbf2fe05f0-5 differ diff --git a/fuzzing/packet/corpus/060a1ddeabb5354f79c43182a6d0f9252ddb7db8-1 b/fuzzing/packet/corpus/060a1ddeabb5354f79c43182a6d0f9252ddb7db8-1 new file mode 100644 index 0000000000000000000000000000000000000000..08dc6dddb954f97714f7dc009aed3130e5efd9c7 Binary files /dev/null and b/fuzzing/packet/corpus/060a1ddeabb5354f79c43182a6d0f9252ddb7db8-1 differ diff --git a/fuzzing/packet/corpus/0a8e36b04544c744cf7915e2d85bf93c1dae13d0-4 b/fuzzing/packet/corpus/0a8e36b04544c744cf7915e2d85bf93c1dae13d0-4 new file mode 100644 index 0000000000000000000000000000000000000000..9694ef60b9f7abbade8a07127e047742cfcb7364 Binary files /dev/null and b/fuzzing/packet/corpus/0a8e36b04544c744cf7915e2d85bf93c1dae13d0-4 differ diff --git a/fuzzing/packet/corpus/0ace70936b8b67cfeeed133ff8f281b00d502e1b-1 b/fuzzing/packet/corpus/0ace70936b8b67cfeeed133ff8f281b00d502e1b-1 new file mode 100644 index 0000000000000000000000000000000000000000..fca5e54c0c0b31138223cac205cc5d2eec19dab6 Binary files /dev/null and b/fuzzing/packet/corpus/0ace70936b8b67cfeeed133ff8f281b00d502e1b-1 differ diff --git a/fuzzing/packet/corpus/0ba3ebb1b2a1029e09c1cb83bc1b09762f231cd8-1 b/fuzzing/packet/corpus/0ba3ebb1b2a1029e09c1cb83bc1b09762f231cd8-1 new file mode 100644 index 0000000000000000000000000000000000000000..4ebdac5e15dc9c6190df6e8730e626b6d389fecf Binary files /dev/null and b/fuzzing/packet/corpus/0ba3ebb1b2a1029e09c1cb83bc1b09762f231cd8-1 differ diff --git a/fuzzing/packet/corpus/0df74acbb6cdec38f5849c0e49f4cacdf1dac629-5 b/fuzzing/packet/corpus/0df74acbb6cdec38f5849c0e49f4cacdf1dac629-5 new file mode 100644 index 0000000000000000000000000000000000000000..1e1eda6a2120468d20537d993740fb29b567237e Binary files /dev/null and b/fuzzing/packet/corpus/0df74acbb6cdec38f5849c0e49f4cacdf1dac629-5 differ diff --git a/fuzzing/packet/corpus/1.bytes b/fuzzing/packet/corpus/1.bytes new file mode 100644 index 0000000000000000000000000000000000000000..04273bea1f62cdd2a9296e73e70d9b6623b5172c Binary files /dev/null and b/fuzzing/packet/corpus/1.bytes differ diff --git a/fuzzing/packet/corpus/11f3430fd4d0e65e44a6e401bd08e312512c7940-10 b/fuzzing/packet/corpus/11f3430fd4d0e65e44a6e401bd08e312512c7940-10 new file mode 100644 index 0000000000000000000000000000000000000000..6360ddac79ce4d1eaa8c50b3b6f81bd7e04076f9 Binary files /dev/null and b/fuzzing/packet/corpus/11f3430fd4d0e65e44a6e401bd08e312512c7940-10 differ diff --git a/fuzzing/packet/corpus/17e6634985d31dbeaf2043b77a1e69ba45a02fa3-9 b/fuzzing/packet/corpus/17e6634985d31dbeaf2043b77a1e69ba45a02fa3-9 new file mode 100644 index 0000000000000000000000000000000000000000..2a5dacba3c5838bc8c24e218a6ba509a546dc580 Binary files /dev/null and b/fuzzing/packet/corpus/17e6634985d31dbeaf2043b77a1e69ba45a02fa3-9 differ diff --git a/fuzzing/packet/corpus/1aae43a31211124ffd7c24147cd0112e788d5aae-11 b/fuzzing/packet/corpus/1aae43a31211124ffd7c24147cd0112e788d5aae-11 new file mode 100644 index 0000000000000000000000000000000000000000..3cbff3cb4764b6c040c9e393355da55b2ea90da6 Binary files /dev/null and b/fuzzing/packet/corpus/1aae43a31211124ffd7c24147cd0112e788d5aae-11 differ diff --git a/fuzzing/packet/corpus/1b0227c44ad735c7e2c9467cd3ad72ae73b41a8d b/fuzzing/packet/corpus/1b0227c44ad735c7e2c9467cd3ad72ae73b41a8d new file mode 100644 index 0000000000000000000000000000000000000000..cd42ccf2e75eac44cdddaf0f89b19c4875a84cd9 Binary files /dev/null and b/fuzzing/packet/corpus/1b0227c44ad735c7e2c9467cd3ad72ae73b41a8d differ diff --git a/fuzzing/packet/corpus/2.bytes b/fuzzing/packet/corpus/2.bytes new file mode 100644 index 0000000000000000000000000000000000000000..1e1a88bf442e0b13f058e7acf0460c1b703b9073 Binary files /dev/null and b/fuzzing/packet/corpus/2.bytes differ diff --git a/fuzzing/packet/corpus/246d9b10f27ea92b3318a513ea1223c1dff40be3-7 b/fuzzing/packet/corpus/246d9b10f27ea92b3318a513ea1223c1dff40be3-7 new file mode 100644 index 0000000000000000000000000000000000000000..3fdac995b8aad35e3e2d027813fbadec3ee9c6f7 Binary files /dev/null and b/fuzzing/packet/corpus/246d9b10f27ea92b3318a513ea1223c1dff40be3-7 differ diff --git a/fuzzing/packet/corpus/257d2fe4f97aa4541ded8b1a41d6a65ef53d06f1-11 b/fuzzing/packet/corpus/257d2fe4f97aa4541ded8b1a41d6a65ef53d06f1-11 new file mode 100644 index 0000000000000000000000000000000000000000..f678e21962289f0b8d8f786baeb1d647472f92c1 Binary files /dev/null and b/fuzzing/packet/corpus/257d2fe4f97aa4541ded8b1a41d6a65ef53d06f1-11 differ diff --git a/fuzzing/packet/corpus/25e08ee00ac1320e41d90fa58d3149b3733448a6-8 b/fuzzing/packet/corpus/25e08ee00ac1320e41d90fa58d3149b3733448a6-8 new file mode 100644 index 0000000000000000000000000000000000000000..fa25df350a0a887488fcabd5fa90a5109e03e16a Binary files /dev/null and b/fuzzing/packet/corpus/25e08ee00ac1320e41d90fa58d3149b3733448a6-8 differ diff --git a/fuzzing/packet/corpus/3.bytes b/fuzzing/packet/corpus/3.bytes new file mode 100644 index 0000000000000000000000000000000000000000..0bb83b59d69896621882b77884c4ab519e407ee5 Binary files /dev/null and b/fuzzing/packet/corpus/3.bytes differ diff --git a/fuzzing/packet/corpus/3a199e742da9c4c4898f7a80306b1f68f7ab66c6-3 b/fuzzing/packet/corpus/3a199e742da9c4c4898f7a80306b1f68f7ab66c6-3 new file mode 100644 index 0000000000000000000000000000000000000000..bdeac6422ad6918320549b196d904d3e524557e0 Binary files /dev/null and b/fuzzing/packet/corpus/3a199e742da9c4c4898f7a80306b1f68f7ab66c6-3 differ diff --git a/fuzzing/packet/corpus/3b1d7d76919291b6744b54fd2158f5df5c61ed2d-1 b/fuzzing/packet/corpus/3b1d7d76919291b6744b54fd2158f5df5c61ed2d-1 new file mode 100644 index 0000000000000000000000000000000000000000..886f01d35d0c580a4e4ed0bdc5ed8dabedb2811c Binary files /dev/null and b/fuzzing/packet/corpus/3b1d7d76919291b6744b54fd2158f5df5c61ed2d-1 differ diff --git a/fuzzing/packet/corpus/3e079343af2c1e793bbd2c8fcd672ec56dc6c25c-4 b/fuzzing/packet/corpus/3e079343af2c1e793bbd2c8fcd672ec56dc6c25c-4 new file mode 100644 index 0000000000000000000000000000000000000000..346bb1b3db8c5d09d21891a2d0e38d1af60cabc2 Binary files /dev/null and b/fuzzing/packet/corpus/3e079343af2c1e793bbd2c8fcd672ec56dc6c25c-4 differ diff --git a/fuzzing/packet/corpus/4.bytes b/fuzzing/packet/corpus/4.bytes new file mode 100644 index 0000000000000000000000000000000000000000..10fc460ddcfa541f70d4d1ea6bbdf76369b98205 Binary files /dev/null and b/fuzzing/packet/corpus/4.bytes differ diff --git a/fuzzing/packet/corpus/4466603d1b8c2cbd09564a017acf94ab067a978a-5 b/fuzzing/packet/corpus/4466603d1b8c2cbd09564a017acf94ab067a978a-5 new file mode 100644 index 0000000000000000000000000000000000000000..32b10d9c709e0bebc9d8f782e58e84d16212a1bb Binary files /dev/null and b/fuzzing/packet/corpus/4466603d1b8c2cbd09564a017acf94ab067a978a-5 differ diff --git a/fuzzing/packet/corpus/48bc0d32526f356c3bd18a551c02562dcd5e6beb-15 b/fuzzing/packet/corpus/48bc0d32526f356c3bd18a551c02562dcd5e6beb-15 new file mode 100644 index 0000000000000000000000000000000000000000..06d333bb9d462f922ac6ddf5b22db17e978b7ce0 Binary files /dev/null and b/fuzzing/packet/corpus/48bc0d32526f356c3bd18a551c02562dcd5e6beb-15 differ diff --git a/fuzzing/packet/corpus/48befb084cbe2e3036885a4e93fa62530717e2c4-2 b/fuzzing/packet/corpus/48befb084cbe2e3036885a4e93fa62530717e2c4-2 new file mode 100644 index 0000000000000000000000000000000000000000..4302f83d6d18a86ddd8abb6fa301f48731c60ffb Binary files /dev/null and b/fuzzing/packet/corpus/48befb084cbe2e3036885a4e93fa62530717e2c4-2 differ diff --git a/fuzzing/packet/corpus/4f4a2076a52f15811fb83a19c9d17941d9685338-12 b/fuzzing/packet/corpus/4f4a2076a52f15811fb83a19c9d17941d9685338-12 new file mode 100644 index 0000000000000000000000000000000000000000..9f1c3ef95bc12dbc7a754a26d0aa00be10b0db2f Binary files /dev/null and b/fuzzing/packet/corpus/4f4a2076a52f15811fb83a19c9d17941d9685338-12 differ diff --git a/fuzzing/packet/corpus/4f901d0f63c4332a3127984bd32e7770d5e620af-4 b/fuzzing/packet/corpus/4f901d0f63c4332a3127984bd32e7770d5e620af-4 new file mode 100644 index 0000000000000000000000000000000000000000..b55847d062bbd05c8a1d6af6ae15948619377e9d Binary files /dev/null and b/fuzzing/packet/corpus/4f901d0f63c4332a3127984bd32e7770d5e620af-4 differ diff --git a/fuzzing/packet/corpus/5.bytes b/fuzzing/packet/corpus/5.bytes new file mode 100644 index 0000000000000000000000000000000000000000..2c7f282c3e1ff5041b60af15b15876e339cb6d2f Binary files /dev/null and b/fuzzing/packet/corpus/5.bytes differ diff --git a/fuzzing/packet/corpus/58417300797958a8d956a72f0d461c46bebf266e-3 b/fuzzing/packet/corpus/58417300797958a8d956a72f0d461c46bebf266e-3 new file mode 100644 index 0000000000000000000000000000000000000000..d14799d5d94c1f78b1a38e7a0fb4ff0fa10e2937 Binary files /dev/null and b/fuzzing/packet/corpus/58417300797958a8d956a72f0d461c46bebf266e-3 differ diff --git a/fuzzing/packet/corpus/5c090c615e4374b511fba28f50ac4f8b43d1a1b6-5 b/fuzzing/packet/corpus/5c090c615e4374b511fba28f50ac4f8b43d1a1b6-5 new file mode 100644 index 0000000000000000000000000000000000000000..c8cf0f89c46c42df944919f7373d50e4bae43842 Binary files /dev/null and b/fuzzing/packet/corpus/5c090c615e4374b511fba28f50ac4f8b43d1a1b6-5 differ diff --git a/fuzzing/packet/corpus/5fd3ce661a420848e4aaedfd43ace8bd2898ff24-7 b/fuzzing/packet/corpus/5fd3ce661a420848e4aaedfd43ace8bd2898ff24-7 new file mode 100644 index 0000000000000000000000000000000000000000..e2a95b9ba53a202301da06c811046ed46fbe1dfd Binary files /dev/null and b/fuzzing/packet/corpus/5fd3ce661a420848e4aaedfd43ace8bd2898ff24-7 differ diff --git a/fuzzing/packet/corpus/6.bytes b/fuzzing/packet/corpus/6.bytes new file mode 100644 index 0000000000000000000000000000000000000000..47a09db59b6e2e494c99f0aee1d98566507bde2d Binary files /dev/null and b/fuzzing/packet/corpus/6.bytes differ diff --git a/fuzzing/packet/corpus/6148ec90437b1a05fe8768e94f5bec529f1a8cee-13 b/fuzzing/packet/corpus/6148ec90437b1a05fe8768e94f5bec529f1a8cee-13 new file mode 100644 index 0000000000000000000000000000000000000000..42b3b136c20ca4ef6ea05075b2272c81cf71037e Binary files /dev/null and b/fuzzing/packet/corpus/6148ec90437b1a05fe8768e94f5bec529f1a8cee-13 differ diff --git a/fuzzing/packet/corpus/62371dc5941146bd5d11d3a664a6242e36bcc01f-1 b/fuzzing/packet/corpus/62371dc5941146bd5d11d3a664a6242e36bcc01f-1 new file mode 100644 index 0000000000000000000000000000000000000000..1edd95f27beef0eab0a661f2caa2ee31a720f746 --- /dev/null +++ b/fuzzing/packet/corpus/62371dc5941146bd5d11d3a664a6242e36bcc01f-1 @@ -0,0 +1 @@ +���������������� \ No newline at end of file diff --git a/fuzzing/packet/corpus/63e58e734f4d8ab5d25f4fb42a0a97fbb981e49a-10 b/fuzzing/packet/corpus/63e58e734f4d8ab5d25f4fb42a0a97fbb981e49a-10 new file mode 100644 index 0000000000000000000000000000000000000000..823a32b86a4c7f33f16fed2a30f9055933cbe552 Binary files /dev/null and b/fuzzing/packet/corpus/63e58e734f4d8ab5d25f4fb42a0a97fbb981e49a-10 differ diff --git a/fuzzing/packet/corpus/6698ba73735503c91bd06725a28dd97520492943-6 b/fuzzing/packet/corpus/6698ba73735503c91bd06725a28dd97520492943-6 new file mode 100644 index 0000000000000000000000000000000000000000..9c8f6e57161994df837b8bbcd98113dbcfdd531f Binary files /dev/null and b/fuzzing/packet/corpus/6698ba73735503c91bd06725a28dd97520492943-6 differ diff --git a/fuzzing/packet/corpus/6d51a3c633b809e379ccf02b1d89e651ed886248-2 b/fuzzing/packet/corpus/6d51a3c633b809e379ccf02b1d89e651ed886248-2 new file mode 100644 index 0000000000000000000000000000000000000000..9330e79e146399577b359e7132ecc2449948e42e Binary files /dev/null and b/fuzzing/packet/corpus/6d51a3c633b809e379ccf02b1d89e651ed886248-2 differ diff --git a/fuzzing/packet/corpus/6f9ac81c48e9f8adb7162137978afe333b73d5be-3 b/fuzzing/packet/corpus/6f9ac81c48e9f8adb7162137978afe333b73d5be-3 new file mode 100644 index 0000000000000000000000000000000000000000..6fdb34b7aa71ec77f33ba2691a575b81964c3ff5 Binary files /dev/null and b/fuzzing/packet/corpus/6f9ac81c48e9f8adb7162137978afe333b73d5be-3 differ diff --git a/fuzzing/packet/corpus/728a5dac32c733c2fe484621b5baa43d9bb6b314-8 b/fuzzing/packet/corpus/728a5dac32c733c2fe484621b5baa43d9bb6b314-8 new file mode 100644 index 0000000000000000000000000000000000000000..1adc98e18c7d7006182eb6f08bb95e75ebcf042a Binary files /dev/null and b/fuzzing/packet/corpus/728a5dac32c733c2fe484621b5baa43d9bb6b314-8 differ diff --git a/fuzzing/packet/corpus/7967fa67234cffeb39b049156ddc642d832147de-7 b/fuzzing/packet/corpus/7967fa67234cffeb39b049156ddc642d832147de-7 new file mode 100644 index 0000000000000000000000000000000000000000..f2aa4fd7d347d2353ba27846d34d6b44e9a9a105 Binary files /dev/null and b/fuzzing/packet/corpus/7967fa67234cffeb39b049156ddc642d832147de-7 differ diff --git a/fuzzing/packet/corpus/7f76af64fe02e90fda68781e3a1a92e7f7fa3686-14 b/fuzzing/packet/corpus/7f76af64fe02e90fda68781e3a1a92e7f7fa3686-14 new file mode 100644 index 0000000000000000000000000000000000000000..1d4b88d03c5758b09263f02cad7755fa92ec7e86 Binary files /dev/null and b/fuzzing/packet/corpus/7f76af64fe02e90fda68781e3a1a92e7f7fa3686-14 differ diff --git a/fuzzing/packet/corpus/83e5382679a52a38b6ee66e19234850c6445276b-9 b/fuzzing/packet/corpus/83e5382679a52a38b6ee66e19234850c6445276b-9 new file mode 100644 index 0000000000000000000000000000000000000000..d0e0d2fc3c388b86b978dee344b41b24e071d569 Binary files /dev/null and b/fuzzing/packet/corpus/83e5382679a52a38b6ee66e19234850c6445276b-9 differ diff --git a/fuzzing/packet/corpus/85e53271e14006f0265921d02d4d736cdc580b0b-1 b/fuzzing/packet/corpus/85e53271e14006f0265921d02d4d736cdc580b0b-1 new file mode 100644 index 0000000000000000000000000000000000000000..ce542efaa5124a0437f0c4db329d7ec4b7ba70a7 --- /dev/null +++ b/fuzzing/packet/corpus/85e53271e14006f0265921d02d4d736cdc580b0b-1 @@ -0,0 +1 @@ +� \ No newline at end of file diff --git a/fuzzing/packet/corpus/92ad1f06bf6ed61ed2283e10bfe243f7102ee774-8 b/fuzzing/packet/corpus/92ad1f06bf6ed61ed2283e10bfe243f7102ee774-8 new file mode 100644 index 0000000000000000000000000000000000000000..36cf7b38b97e2e4faf5c38ae1f699462cfa020b2 Binary files /dev/null and b/fuzzing/packet/corpus/92ad1f06bf6ed61ed2283e10bfe243f7102ee774-8 differ diff --git a/fuzzing/packet/corpus/a1a7f1b3b949cdd10400b4f6a06287b263a36477-4 b/fuzzing/packet/corpus/a1a7f1b3b949cdd10400b4f6a06287b263a36477-4 new file mode 100644 index 0000000000000000000000000000000000000000..c63b223b6abc0b81cf213f7f28516e84de3b7209 Binary files /dev/null and b/fuzzing/packet/corpus/a1a7f1b3b949cdd10400b4f6a06287b263a36477-4 differ diff --git a/fuzzing/packet/corpus/a3d0c7741496b9936f0f467f7651f03578fb761e-6 b/fuzzing/packet/corpus/a3d0c7741496b9936f0f467f7651f03578fb761e-6 new file mode 100644 index 0000000000000000000000000000000000000000..3c3ea8f7921fda46cc2120fd5e43a86421da6fdb Binary files /dev/null and b/fuzzing/packet/corpus/a3d0c7741496b9936f0f467f7651f03578fb761e-6 differ diff --git a/fuzzing/packet/corpus/a8e7928916f90886b3d773931170eb8f562d72fe-5 b/fuzzing/packet/corpus/a8e7928916f90886b3d773931170eb8f562d72fe-5 new file mode 100644 index 0000000000000000000000000000000000000000..f3d634a6e0fcbad8ce496a353e6947f48b67b85f Binary files /dev/null and b/fuzzing/packet/corpus/a8e7928916f90886b3d773931170eb8f562d72fe-5 differ diff --git a/fuzzing/packet/corpus/ac28a95fa7e5373eddd5acd8a6ff1fe04b96e671-6 b/fuzzing/packet/corpus/ac28a95fa7e5373eddd5acd8a6ff1fe04b96e671-6 new file mode 100644 index 0000000000000000000000000000000000000000..1e84f9501569fa98d389232d4e4aa47e8cb0c51f Binary files /dev/null and b/fuzzing/packet/corpus/ac28a95fa7e5373eddd5acd8a6ff1fe04b96e671-6 differ diff --git a/fuzzing/packet/corpus/ad17b9fa9045080d6e1aa6c5c7580a10eed4ecb8-3 b/fuzzing/packet/corpus/ad17b9fa9045080d6e1aa6c5c7580a10eed4ecb8-3 new file mode 100644 index 0000000000000000000000000000000000000000..f412b003b5743bd2c3d881ba903805c62f93b902 Binary files /dev/null and b/fuzzing/packet/corpus/ad17b9fa9045080d6e1aa6c5c7580a10eed4ecb8-3 differ diff --git a/fuzzing/packet/corpus/afa974e4717ef61591231fb3cac26787aa908258 b/fuzzing/packet/corpus/afa974e4717ef61591231fb3cac26787aa908258 new file mode 100644 index 0000000000000000000000000000000000000000..22685bbfc411a8f24521b95cb7b212b9fc80fdd0 --- /dev/null +++ b/fuzzing/packet/corpus/afa974e4717ef61591231fb3cac26787aa908258 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fuzzing/packet/corpus/b334ba4f2e51dd6bfdf68994e9e572ef59fb31d4-2 b/fuzzing/packet/corpus/b334ba4f2e51dd6bfdf68994e9e572ef59fb31d4-2 new file mode 100644 index 0000000000000000000000000000000000000000..53bb04d5f81ec9b64e56928692c9e913ee61febf Binary files /dev/null and b/fuzzing/packet/corpus/b334ba4f2e51dd6bfdf68994e9e572ef59fb31d4-2 differ diff --git a/fuzzing/packet/corpus/b6dc94ef39eb455c359b60e2813ae55665c6c085-1 b/fuzzing/packet/corpus/b6dc94ef39eb455c359b60e2813ae55665c6c085-1 new file mode 100644 index 0000000000000000000000000000000000000000..1f3855616eb73206f1461e5b155add4be7320f93 Binary files /dev/null and b/fuzzing/packet/corpus/b6dc94ef39eb455c359b60e2813ae55665c6c085-1 differ diff --git a/fuzzing/packet/corpus/b7bdc0d8438edee7257cbdf70c36cb7d1f7035fa-10 b/fuzzing/packet/corpus/b7bdc0d8438edee7257cbdf70c36cb7d1f7035fa-10 new file mode 100644 index 0000000000000000000000000000000000000000..5f0af85d8332a28978c53ef26ceb11dcfdaf6556 Binary files /dev/null and b/fuzzing/packet/corpus/b7bdc0d8438edee7257cbdf70c36cb7d1f7035fa-10 differ diff --git a/fuzzing/packet/corpus/b851290ca41de3bd9cacf5dd88650582409f9527-2 b/fuzzing/packet/corpus/b851290ca41de3bd9cacf5dd88650582409f9527-2 new file mode 100644 index 0000000000000000000000000000000000000000..b22466e4b93c989e41cb4e2cccf9dc38cd43c641 Binary files /dev/null and b/fuzzing/packet/corpus/b851290ca41de3bd9cacf5dd88650582409f9527-2 differ diff --git a/fuzzing/packet/corpus/b9266e7167c429092cb26b3dff879f40891c3b7d-2 b/fuzzing/packet/corpus/b9266e7167c429092cb26b3dff879f40891c3b7d-2 new file mode 100644 index 0000000000000000000000000000000000000000..391ca0052bf8c728fb4b8c336f4a5da65426223c Binary files /dev/null and b/fuzzing/packet/corpus/b9266e7167c429092cb26b3dff879f40891c3b7d-2 differ diff --git a/fuzzing/packet/corpus/bc6400ae15329575a729943ccc9d0087c5ddfa75-1 b/fuzzing/packet/corpus/bc6400ae15329575a729943ccc9d0087c5ddfa75-1 new file mode 100644 index 0000000000000000000000000000000000000000..22b00376b7bce3e66d18782ab69121547269d01c Binary files /dev/null and b/fuzzing/packet/corpus/bc6400ae15329575a729943ccc9d0087c5ddfa75-1 differ diff --git a/fuzzing/packet/corpus/be687b1f2a8136b143e55a736b9b78cc3ea7c3ba-4 b/fuzzing/packet/corpus/be687b1f2a8136b143e55a736b9b78cc3ea7c3ba-4 new file mode 100644 index 0000000000000000000000000000000000000000..4aee6a1587c2b976c703a0971134f5035724ff0c Binary files /dev/null and b/fuzzing/packet/corpus/be687b1f2a8136b143e55a736b9b78cc3ea7c3ba-4 differ diff --git a/fuzzing/packet/corpus/c184ca210e236d050e56fc256f73e606f4ba3822-9 b/fuzzing/packet/corpus/c184ca210e236d050e56fc256f73e606f4ba3822-9 new file mode 100644 index 0000000000000000000000000000000000000000..9f38d6cfb57a4cebba6080e2ba017e5c41d826c4 Binary files /dev/null and b/fuzzing/packet/corpus/c184ca210e236d050e56fc256f73e606f4ba3822-9 differ diff --git a/fuzzing/packet/corpus/c18bebbf42f8553ed0ba3a214155e9b8e7f88e10-1 b/fuzzing/packet/corpus/c18bebbf42f8553ed0ba3a214155e9b8e7f88e10-1 new file mode 100644 index 0000000000000000000000000000000000000000..2877cb62182ad6ce38e8b5b849c7b2341440915c Binary files /dev/null and b/fuzzing/packet/corpus/c18bebbf42f8553ed0ba3a214155e9b8e7f88e10-1 differ diff --git a/fuzzing/packet/corpus/c2d1525fc885f57c4a3222fdd1280d6113808867 b/fuzzing/packet/corpus/c2d1525fc885f57c4a3222fdd1280d6113808867 new file mode 100644 index 0000000000000000000000000000000000000000..7add13f25a123154590c62b7c24c2d87f895a0ae Binary files /dev/null and b/fuzzing/packet/corpus/c2d1525fc885f57c4a3222fdd1280d6113808867 differ diff --git a/fuzzing/packet/corpus/c817dce08db2ba5edf12dba94b54c8c84685cfdb-6 b/fuzzing/packet/corpus/c817dce08db2ba5edf12dba94b54c8c84685cfdb-6 new file mode 100644 index 0000000000000000000000000000000000000000..aaa9da984d35dfe69097c9bf20d853400cf0f394 Binary files /dev/null and b/fuzzing/packet/corpus/c817dce08db2ba5edf12dba94b54c8c84685cfdb-6 differ diff --git a/fuzzing/packet/corpus/caf0fa4d68cf307435b48a4b673807f7e5eab117-1 b/fuzzing/packet/corpus/caf0fa4d68cf307435b48a4b673807f7e5eab117-1 new file mode 100644 index 0000000000000000000000000000000000000000..d4c0159f724d0c2ea9725f50aafc15734665f517 Binary files /dev/null and b/fuzzing/packet/corpus/caf0fa4d68cf307435b48a4b673807f7e5eab117-1 differ diff --git a/fuzzing/packet/corpus/ce6cfb94676fdceb717db4b1513bdaf00e8b5b95 b/fuzzing/packet/corpus/ce6cfb94676fdceb717db4b1513bdaf00e8b5b95 new file mode 100644 index 0000000000000000000000000000000000000000..452f3353cce296d859cb4a771c63f964d10e451d Binary files /dev/null and b/fuzzing/packet/corpus/ce6cfb94676fdceb717db4b1513bdaf00e8b5b95 differ diff --git a/fuzzing/packet/corpus/ce8172f26f9352332a6dd74d2bbf557182fbb77c-1 b/fuzzing/packet/corpus/ce8172f26f9352332a6dd74d2bbf557182fbb77c-1 new file mode 100644 index 0000000000000000000000000000000000000000..198f6a3ac64a668b3803faaa92f1a387b7393787 Binary files /dev/null and b/fuzzing/packet/corpus/ce8172f26f9352332a6dd74d2bbf557182fbb77c-1 differ diff --git a/fuzzing/packet/corpus/cf35187f48183cd066ab36204b2bed41a1636e8f-8 b/fuzzing/packet/corpus/cf35187f48183cd066ab36204b2bed41a1636e8f-8 new file mode 100644 index 0000000000000000000000000000000000000000..0f9f67d9e93dad4486354c0d8bfdadf76e33925b Binary files /dev/null and b/fuzzing/packet/corpus/cf35187f48183cd066ab36204b2bed41a1636e8f-8 differ diff --git a/fuzzing/packet/corpus/d25c953c2dfc83461f6308c7b153dfc582ad65f8-3 b/fuzzing/packet/corpus/d25c953c2dfc83461f6308c7b153dfc582ad65f8-3 new file mode 100644 index 0000000000000000000000000000000000000000..7e9df35c1cd8ff889a34b9ba5be3a13f79d22f31 Binary files /dev/null and b/fuzzing/packet/corpus/d25c953c2dfc83461f6308c7b153dfc582ad65f8-3 differ diff --git a/fuzzing/packet/corpus/d834b8ed259157d28b3d8340b1000fc5332165cd-2 b/fuzzing/packet/corpus/d834b8ed259157d28b3d8340b1000fc5332165cd-2 new file mode 100644 index 0000000000000000000000000000000000000000..2b38f32e0c77532d08cee62fcd0e5f7fb16620c2 Binary files /dev/null and b/fuzzing/packet/corpus/d834b8ed259157d28b3d8340b1000fc5332165cd-2 differ diff --git a/fuzzing/packet/corpus/d947e66423d44f11981817d9a4ed5f36edc1d73b-1 b/fuzzing/packet/corpus/d947e66423d44f11981817d9a4ed5f36edc1d73b-1 new file mode 100644 index 0000000000000000000000000000000000000000..dc069282d48156996b283a49aea3be81ebb2ef87 Binary files /dev/null and b/fuzzing/packet/corpus/d947e66423d44f11981817d9a4ed5f36edc1d73b-1 differ diff --git a/fuzzing/packet/corpus/dc619c747104de130ec7e3424f9834e77e804c45-7 b/fuzzing/packet/corpus/dc619c747104de130ec7e3424f9834e77e804c45-7 new file mode 100644 index 0000000000000000000000000000000000000000..e6492c7022a473f45bb0a9830f4651e1f4a5b5f8 Binary files /dev/null and b/fuzzing/packet/corpus/dc619c747104de130ec7e3424f9834e77e804c45-7 differ diff --git a/fuzzing/packet/corpus/e4b7cbca02328634bc87979b88ecbd2dfb3c74fd-6 b/fuzzing/packet/corpus/e4b7cbca02328634bc87979b88ecbd2dfb3c74fd-6 new file mode 100644 index 0000000000000000000000000000000000000000..a2415dafb9f3ff3b60be056b9a500cef21a5f985 Binary files /dev/null and b/fuzzing/packet/corpus/e4b7cbca02328634bc87979b88ecbd2dfb3c74fd-6 differ diff --git a/fuzzing/packet/corpus/e6126c61f9505667f0a7cb2b90fb60c31dfded40-12 b/fuzzing/packet/corpus/e6126c61f9505667f0a7cb2b90fb60c31dfded40-12 new file mode 100644 index 0000000000000000000000000000000000000000..6b7b4d0daa83d60d257c357e510229a6a905dc89 Binary files /dev/null and b/fuzzing/packet/corpus/e6126c61f9505667f0a7cb2b90fb60c31dfded40-12 differ diff --git a/fuzzing/packet/corpus/e70ffd323bf2dde3ff5ca80b4e6395724467b98d-4 b/fuzzing/packet/corpus/e70ffd323bf2dde3ff5ca80b4e6395724467b98d-4 new file mode 100644 index 0000000000000000000000000000000000000000..b7f8489eca2e83a61625423e289e9de86979bea5 Binary files /dev/null and b/fuzzing/packet/corpus/e70ffd323bf2dde3ff5ca80b4e6395724467b98d-4 differ diff --git a/fuzzing/packet/corpus/e7952b4c14d15d88eaf665083a22778642302998-3 b/fuzzing/packet/corpus/e7952b4c14d15d88eaf665083a22778642302998-3 new file mode 100644 index 0000000000000000000000000000000000000000..5292b1fd24d40ebc5f1dff6473d539e47a6cd064 Binary files /dev/null and b/fuzzing/packet/corpus/e7952b4c14d15d88eaf665083a22778642302998-3 differ diff --git a/fuzzing/packet/corpus/f1c58f297ddbe60dd6307cd156c4074e192a9453-15 b/fuzzing/packet/corpus/f1c58f297ddbe60dd6307cd156c4074e192a9453-15 new file mode 100644 index 0000000000000000000000000000000000000000..f2f40f0b8de0a17c0b3eacdab1fcbf7e7da8d258 Binary files /dev/null and b/fuzzing/packet/corpus/f1c58f297ddbe60dd6307cd156c4074e192a9453-15 differ diff --git a/fuzzing/packet/corpus/fa4f6be24ac4351604432e26ce02b1c38b213abb-6 b/fuzzing/packet/corpus/fa4f6be24ac4351604432e26ce02b1c38b213abb-6 new file mode 100644 index 0000000000000000000000000000000000000000..cebbd01da53b2bdd3ec5c9f0e265ef83c5771537 Binary files /dev/null and b/fuzzing/packet/corpus/fa4f6be24ac4351604432e26ce02b1c38b213abb-6 differ diff --git a/fuzzing/packet/corpus/fd371aa158566c6ff56ed1ad10898d075ea37216-4 b/fuzzing/packet/corpus/fd371aa158566c6ff56ed1ad10898d075ea37216-4 new file mode 100644 index 0000000000000000000000000000000000000000..d0e8c3419a3c7ceb124d1eb064549a6a8324274e Binary files /dev/null and b/fuzzing/packet/corpus/fd371aa158566c6ff56ed1ad10898d075ea37216-4 differ diff --git a/fuzzing/packet/corpus/ff1f57671f3d6cc4ea97c845bcad6b38160a444b-13 b/fuzzing/packet/corpus/ff1f57671f3d6cc4ea97c845bcad6b38160a444b-13 new file mode 100644 index 0000000000000000000000000000000000000000..26b8b7312e74a5635f60f407f11f49aa0868aae1 Binary files /dev/null and b/fuzzing/packet/corpus/ff1f57671f3d6cc4ea97c845bcad6b38160a444b-13 differ diff --git a/fuzzing/packet/corpus/routerefresh b/fuzzing/packet/corpus/routerefresh new file mode 100644 index 0000000000000000000000000000000000000000..70aeda65c4c08d45cfd8af18e6c98419708d7c46 Binary files /dev/null and b/fuzzing/packet/corpus/routerefresh differ diff --git a/fuzzing/packet/corpus/tes b/fuzzing/packet/corpus/tes new file mode 100644 index 0000000000000000000000000000000000000000..1b7d448f25a57662e92ebf3292f450b04c7ee1c3 Binary files /dev/null and b/fuzzing/packet/corpus/tes differ diff --git a/fuzzing/packet/corpus/updatepcap1 b/fuzzing/packet/corpus/updatepcap1 new file mode 100644 index 0000000000000000000000000000000000000000..0f9cb9ec4cf3c58f3c3b2c6aa3f4c07ca6629a52 Binary files /dev/null and b/fuzzing/packet/corpus/updatepcap1 differ diff --git a/fuzzing/packet/gen_initial_corpus.go b/fuzzing/packet/gen_initial_corpus.go new file mode 100644 index 0000000000000000000000000000000000000000..ef8ee4d3b0e23ff3682ec30d1a09542071aff318 --- /dev/null +++ b/fuzzing/packet/gen_initial_corpus.go @@ -0,0 +1,109 @@ +// +build !test + +package main + +import ( + "fmt" + "log" + "os" +) + +func main() { + tests := []struct { + testNum int + input []byte + wantFail bool + expected interface{} + }{ + { + // Proper packet + testNum: 1, + input: []byte{ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker + 0, 19, // Length + 4, // Type = Keepalive + + }, + wantFail: false, + }, + { + // Invalid marker + testNum: 2, + input: []byte{ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, // Marker + 0, 19, // Length + 4, // Type = Keepalive + + }, + wantFail: true, + }, + { + // Proper NOTIFICATION packet + testNum: 3, + input: []byte{ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker + 0, 21, // Length + 3, // Type = Notification + 1, 1, // Message Header Error, Connection Not Synchronized. + }, + wantFail: false, + }, + { + // Proper OPEN packet + testNum: 4, + input: []byte{ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker + 0, 29, // Length + 1, // Type = Open + 4, // Version + 0, 200, //ASN, + 0, 15, // Holdtime + 10, 20, 30, 40, // BGP Identifier + 0, // Opt Parm Len + }, + wantFail: false, + }, + { + // Incomplete OPEN packet + testNum: 5, + input: []byte{ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker + 0, 28, // Length + 1, // Type = Open + 4, // Version + 0, 200, //ASN, + 0, 15, // Holdtime + 0, 0, 0, 100, // BGP Identifier + }, + wantFail: true, + }, + { + testNum: 6, + input: []byte{ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker + 0, 28, // Length + 2, // Type = Update + 0, 5, 8, 10, 16, 192, 168, 0, 0, // 2 withdraws + }, + wantFail: false, + }, + { + testNum: 7, + input: []byte{ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker + 0, 28, // Length + 5, // Type = Invalid + 0, 5, 8, 10, 16, 192, 168, 0, 0, // Some more stuff + }, + wantFail: true, + }, + } + for i, t := range tests { + f, err := os.Create(fmt.Sprintf("corpus/%v.bytes", i)) + if err != nil { + log.Fatalf(err.Error()) + } + f.Write(t.input) + f.Close() + } +} diff --git a/net/ip.go b/net/ip.go index 616658ca14977195a4d3b81a3db73f64d61f3399..44b84d192402d5e309ea9e394ee5237664cecae2 100644 --- a/net/ip.go +++ b/net/ip.go @@ -62,6 +62,21 @@ func IPFromBytes(b []byte) (IP, error) { return IP{}, fmt.Errorf("byte slice has an invalid legth. Expected either 4 (IPv4) or 16 (IPv6) bytes but got: %d", len(b)) } +// IPFromString returns an IP address for a given string +func IPFromString(str string) (IP, error) { + ip := net.ParseIP(str) + if ip == nil { + return IP{}, fmt.Errorf("%s is not a valid IP address", str) + } + + ip4 := ip.To4() + if ip4 != nil { + return IPFromBytes(ip4) + } + + return IPFromBytes(ip.To16()) +} + // Equal returns true if ip is equal to other func (ip IP) Equal(other IP) bool { return ip == other diff --git a/net/ip_test.go b/net/ip_test.go index 4720985f825ba242b1c78cf75773499d55bdd9bf..961730c01844a3c13c569de97eb7caed0be0567e 100644 --- a/net/ip_test.go +++ b/net/ip_test.go @@ -370,3 +370,46 @@ func TestBitAtPosition(t *testing.T) { } } } + +func TestIPFromString(t *testing.T) { + tests := []struct { + name string + input string + expected IP + wantFail bool + }{ + { + name: "ipv4", + input: "192.168.1.234", + expected: IPv4FromOctets(192, 168, 1, 234), + }, + { + name: "ipv6", + input: "2001:678:1e0::cafe", + expected: IPv6FromBlocks(0x2001, 0x678, 0x1e0, 0, 0, 0, 0, 0xcafe), + }, + { + name: "invalid", + input: "foo", + wantFail: true, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + ip, err := IPFromString(test.input) + if err == nil && test.wantFail { + t.Fatal("expected error but got nil") + } + if err != nil { + if test.wantFail { + return + } + + t.Fatal(err) + } + + assert.Equal(t, test.expected, ip) + }) + } +} diff --git a/protocols/bgp/packet/fuzzing.go b/protocols/bgp/packet/fuzzing.go new file mode 100644 index 0000000000000000000000000000000000000000..0adaded071d6eb2f23ecd4eb92055daa266cd8bb --- /dev/null +++ b/protocols/bgp/packet/fuzzing.go @@ -0,0 +1,49 @@ +// foobar +// +bu ild go fuzz + +package packet + +import ( + "bytes" + + "github.com/bio-routing/bio-rd/protocols/bgp/types" +) + +const ( + INC_PRIO = 1 + KEEP = 0 + DISMISS = -1 +) + +func Fuzz(data []byte) int { + + buf := bytes.NewBuffer(data) + for _, option := range getAllOptions() { + msg, err := Decode(buf, &option) + if err != nil { + if msg != nil { + panic("msg != nil on error") + } + + } + return INC_PRIO + } + return KEEP +} + +func getAllOptions() []types.Options { + parameters := []bool{true, false} + var ret []types.Options + for _, octet := range parameters { + for _, multi := range parameters { + for _, addPathX := range parameters { + ret = append(ret, types.Options{ + Supports4OctetASN: octet, + SupportsMultiProtocol: multi, + AddPathRX: addPathX, + }) + } + } + } + return ret +} diff --git a/protocols/bgp/packet/mp_reach_nlri.go b/protocols/bgp/packet/mp_reach_nlri.go index 55a709f53e96d50afae44d5894427f08c1ef7bf6..32009637f8b17fd282392ad0a7231a67940ce44b 100644 --- a/protocols/bgp/packet/mp_reach_nlri.go +++ b/protocols/bgp/packet/mp_reach_nlri.go @@ -42,8 +42,13 @@ func (n *MultiProtocolReachNLRI) serialize(buf *bytes.Buffer, opt *EncodeOptions func deserializeMultiProtocolReachNLRI(b []byte) (MultiProtocolReachNLRI, error) { n := MultiProtocolReachNLRI{} nextHopLength := uint8(0) - variable := make([]byte, len(b)-4) + variableLength := len(b) - 4 // 4 <- AFI + SAFI + NextHopLength + if variableLength <= 0 { + return n, fmt.Errorf("Invalid length of MP_REACH_NLRI: expected more than 4 bytes but got %d", len(b)) + } + + variable := make([]byte, variableLength) fields := []interface{}{ &n.AFI, &n.SAFI, @@ -55,19 +60,25 @@ func deserializeMultiProtocolReachNLRI(b []byte) (MultiProtocolReachNLRI, error) return MultiProtocolReachNLRI{}, err } + budget := variableLength + if budget < int(nextHopLength) { + return MultiProtocolReachNLRI{}, + fmt.Errorf("Failed to decode next hop IP: expected %d bytes for NLRI, only %d remaining", nextHopLength, budget) + } + n.NextHop, err = bnet.IPFromBytes(variable[:nextHopLength]) if err != nil { return MultiProtocolReachNLRI{}, fmt.Errorf("Failed to decode next hop IP: %v", err) } - - variable = variable[1+nextHopLength:] + budget -= int(nextHopLength) n.Prefixes = make([]bnet.Prefix, 0) - - if len(variable) == 0 { + if budget == 0 { return n, nil } + variable = variable[1+nextHopLength:] // 1 <- RESERVED field + idx := uint16(0) for idx < uint16(len(variable)) { pfxLen := variable[idx] diff --git a/protocols/bgp/packet/mp_unreach_nlri.go b/protocols/bgp/packet/mp_unreach_nlri.go index 6431577ce4188837811f26bb8d819f4015c2d2a3..fd72618c51b58fe3437b5f7445f827f0b3820bcd 100644 --- a/protocols/bgp/packet/mp_unreach_nlri.go +++ b/protocols/bgp/packet/mp_unreach_nlri.go @@ -34,36 +34,41 @@ func (n *MultiProtocolUnreachNLRI) serialize(buf *bytes.Buffer, opt *EncodeOptio func deserializeMultiProtocolUnreachNLRI(b []byte) (MultiProtocolUnreachNLRI, error) { n := MultiProtocolUnreachNLRI{} - prefix := make([]byte, len(b)-3) + prefixesLength := len(b) - 3 // 3 <- AFI + SAFI + if prefixesLength < 0 { + return n, fmt.Errorf("Invalid length of MP_UNREACH_NLRI: expected more than 3 bytes but got %d", len(b)) + } + + prefixes := make([]byte, prefixesLength) fields := []interface{}{ &n.AFI, &n.SAFI, - &prefix, + &prefixes, } err := decode(bytes.NewBuffer(b), fields) if err != nil { return MultiProtocolUnreachNLRI{}, err } - if len(prefix) == 0 { + if len(prefixes) == 0 { return n, nil } idx := uint16(0) - for idx < uint16(len(prefix)) { - pfxLen := prefix[idx] + for idx < uint16(len(prefixes)) { + pfxLen := prefixes[idx] numBytes := uint16(BytesInAddr(pfxLen)) idx++ - r := uint16(len(prefix)) - idx + r := uint16(len(prefixes)) - idx if r < numBytes { return MultiProtocolUnreachNLRI{}, fmt.Errorf("expected %d bytes for NLRI, only %d remaining", numBytes, r) } start := idx end := idx + numBytes - pfx, err := deserializePrefix(prefix[start:end], pfxLen, n.AFI) + pfx, err := deserializePrefix(prefixes[start:end], pfxLen, n.AFI) if err != nil { return MultiProtocolUnreachNLRI{}, err } diff --git a/protocols/bgp/packet/path_attributes_test.go b/protocols/bgp/packet/path_attributes_test.go index e92efb76ab7194d8f4087b7cfd90cadd1be9aa4a..958da99b783d20121e89fe4b85c4d213891bf550 100644 --- a/protocols/bgp/packet/path_attributes_test.go +++ b/protocols/bgp/packet/path_attributes_test.go @@ -934,6 +934,51 @@ func TestDecodeMultiProtocolReachNLRI(t *testing.T) { }, }, }, + { + name: "MP_REACH_NLRI with invalid length", + input: []byte{ + 0x00, 0x02, // AFI + }, + wantFail: true, + }, + { + name: "MP_REACH_NLRI with invalid length 2", + input: []byte{ + 0x00, 0x02, // AFI + 0x01, // SAFI + 0x10, 0x20, 0x01, 0x06, 0x78, 0x01, 0xe0, 0x00, // incomplete NextHop + }, + wantFail: true, + }, + { + name: "MP_REACH_NLRI without prefixes", + input: []byte{ + 0x00, 0x02, // AFI + 0x01, // SAFI + 0x10, 0x20, 0x01, 0x06, 0x78, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // NextHop + 0x00, // RESERVED + }, + expected: &PathAttribute{ + Length: 21, + Value: MultiProtocolReachNLRI{ + AFI: IPv6AFI, + SAFI: UnicastSAFI, + NextHop: bnet.IPv6FromBlocks(0x2001, 0x678, 0x1e0, 0, 0, 0, 0, 0x2), + Prefixes: []bnet.Prefix{}, + }, + }, + }, + { + name: "MP_REACH_NLRI with invalid prefixes", + input: []byte{ + 0x00, 0x02, // AFI + 0x01, // SAFI + 0x10, 0x20, 0x01, 0x06, 0x78, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // NextHop + 0x00, // RESERVED + 0x30, 0x26, 0x00, // Prefix + }, + wantFail: true, + }, } t.Parallel() @@ -998,6 +1043,22 @@ func TestDecodeMultiProtocolUnreachNLRI(t *testing.T) { }, }, }, + { + name: "MP_UNREACH_NLRI with invalid length", + input: []byte{ + 0x00, 0x02, // AFI + }, + wantFail: true, + }, + { + name: "MP_UNREACH_NLRI with invalid prefixes", + input: []byte{ + 0x00, 0x02, // AFI + 0x01, // SAFI + 0x2c, 0x26, 0x20, 0x01, // Prefix + }, + wantFail: true, + }, } t.Parallel()