From 3405bba3d8f1e805b290c40d2d1f491ccd145823 Mon Sep 17 00:00:00 2001
From: aschaich <108736614+aschaich@users.noreply.github.com>
Date: Sat, 17 Dec 2022 10:32:00 +0900
Subject: [PATCH] [nio-multipart-parser] Initial Integration (#9214)
---
projects/nio-multipart-parser/Dockerfile | 41 ++++++++++
projects/nio-multipart-parser/build.sh | 82 +++++++++++++++++++
projects/nio-multipart-parser/pom.xml | 73 +++++++++++++++++
projects/nio-multipart-parser/project.yaml | 15 ++++
.../main/java/ossfuzz/NioMultipartFuzzer.java | 74 +++++++++++++++++
5 files changed, 285 insertions(+)
create mode 100644 projects/nio-multipart-parser/Dockerfile
create mode 100644 projects/nio-multipart-parser/build.sh
create mode 100644 projects/nio-multipart-parser/pom.xml
create mode 100644 projects/nio-multipart-parser/project.yaml
create mode 100644 projects/nio-multipart-parser/src/main/java/ossfuzz/NioMultipartFuzzer.java
diff --git a/projects/nio-multipart-parser/Dockerfile b/projects/nio-multipart-parser/Dockerfile
new file mode 100644
index 000000000..a53f29c02
--- /dev/null
+++ b/projects/nio-multipart-parser/Dockerfile
@@ -0,0 +1,41 @@
+# Copyright 2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder-jvm
+
+RUN curl -L https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip -o maven.zip && \
+unzip maven.zip -d $SRC/maven-3.6.3 && \
+rm -rf maven.zip
+
+ENV MVN $SRC/maven-3.6.3/apache-maven-3.6.3/bin/mvn
+
+#
+# additional build dependencies as documented in
+# https://netty.io/wiki/setting-up-development-environment.html
+#
+RUN apt-get install -y autoconf automake libtool make tar \
+ libaio-dev libssl-dev libapr1-dev \
+ lksctp-tools
+
+WORKDIR ${SRC}
+#
+# clone repository
+#
+RUN git clone https://github.com/synchronoss/nio-multipart.git
+
+ADD pom.xml build.sh ${SRC}/
+ADD src/ ${SRC}/src/
+WORKDIR ${SRC}/nio-multipart
\ No newline at end of file
diff --git a/projects/nio-multipart-parser/build.sh b/projects/nio-multipart-parser/build.sh
new file mode 100644
index 000000000..8964ee823
--- /dev/null
+++ b/projects/nio-multipart-parser/build.sh
@@ -0,0 +1,82 @@
+#!/bin/bash -eu
+# Copyright 2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+MVN_FLAGS="-DskipTests"
+ALL_JARS=""
+LIBRARY_NAME="nio-multipart"
+
+# Install the build servers' jazzer-api into the maven repository.
+pushd "/tmp"
+ ${MVN} install:install-file -Dfile=${JAZZER_API_PATH} \
+ -DgroupId="com.code-intelligence" \
+ -DartifactId="jazzer-api" \
+ -Dversion="0.12.0" \
+ -Dpackaging=jar
+popd
+
+pushd "."
+ ${MVN} install ${MVN_FLAGS}
+ CURRENT_VERSION=$(${MVN} org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate \
+ -Dexpression=project.version -q -DforceStdout)
+popd
+
+pushd "${SRC}"
+ ${MVN} package -DfuzzedLibaryVersion="${CURRENT_VERSION}" ${MVN_FLAGS}
+ install -v target/${LIBRARY_NAME}-fuzzer-${CURRENT_VERSION}.jar ${OUT}/${LIBRARY_NAME}-fuzzer-${CURRENT_VERSION}.jar
+ ALL_JARS="${ALL_JARS} ${LIBRARY_NAME}-fuzzer-${CURRENT_VERSION}.jar"
+popd
+
+
+
+# The classpath at build-time includes the project jars in $OUT as well as the
+# Jazzer API.
+BUILD_CLASSPATH=$(echo $ALL_JARS | xargs printf -- "$OUT/%s:"):$JAZZER_API_PATH
+
+# All .jar and .class files lie in the same directory as the fuzzer at runtime.
+RUNTIME_CLASSPATH=$(echo $ALL_JARS | xargs printf -- "\$this_dir/%s:"):\$this_dir
+
+MVN_FUZZERS_PREFIX="src/main/java"
+
+for fuzzer in $(find ${SRC} -name '*Fuzzer.java'); do
+ # Find our fuzzer inside the maven structure
+ stripped_path=$(echo ${fuzzer} | sed \
+ -e 's|^.*src/main/java/\(.*\).java$|\1|' \
+ -e 's|^.*src/test/java/\(.*\).java$|\1|' \
+ );
+ # The .java suffix was stripped by sed.
+ if (echo ${stripped_path} | grep ".java$"); then
+ continue;
+ fi
+
+ fuzzer_basename=$(basename -s .java $fuzzer)
+ fuzzer_classname=$(echo ${stripped_path} | sed 's|/|.|g');
+
+ # Create an execution wrapper that executes Jazzer with the correct arguments.
+
+ echo "#!/bin/sh
+# LLVMFuzzerTestOneInput Magic String required for infra/base-images/base-runner/test_all.py. DO NOT REMOVE
+
+
+this_dir=\$(dirname \"\$0\")
+LD_LIBRARY_PATH=\"\$JVM_LD_LIBRARY_PATH\":\$this_dir \
+\$this_dir/jazzer_driver --agent_path=\$this_dir/jazzer_agent_deploy.jar \
+--cp=${RUNTIME_CLASSPATH} \
+--target_class=${fuzzer_classname} \
+--jvm_args=\"-Xmx2048m\" \
+\$@" > $OUT/${fuzzer_basename}
+ chmod u+x $OUT/${fuzzer_basename}
+done
\ No newline at end of file
diff --git a/projects/nio-multipart-parser/pom.xml b/projects/nio-multipart-parser/pom.xml
new file mode 100644
index 000000000..d7e2106f6
--- /dev/null
+++ b/projects/nio-multipart-parser/pom.xml
@@ -0,0 +1,73 @@
+
+ 4.0.0
+
+ ossfuzz
+ nio-multipart-fuzzer
+ ${fuzzedLibaryVersion}
+ jar
+
+
+ 15
+ 15
+ UTF-8
+ 4.0.0-SNAPSHOT
+ NioMultipartFuzzer
+
+
+
+
+
+
+
+ com.code-intelligence
+ jazzer-api
+ 0.12.0
+
+
+ org.synchronoss.cloud
+ nio-multipart-parser
+ ${fuzzedLibaryVersion}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.3.0
+
+
+
+ *:*
+
+ META-INF/*.SF
+ META-INF/*.DSA
+ META-INF/*.RSA
+
+
+
+
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/projects/nio-multipart-parser/project.yaml b/projects/nio-multipart-parser/project.yaml
new file mode 100644
index 000000000..ba718d344
--- /dev/null
+++ b/projects/nio-multipart-parser/project.yaml
@@ -0,0 +1,15 @@
+homepage: "https://github.com/synchronoss/nio-multipart"
+language: jvm
+main_repo: "https://github.com/synchronoss/nio-multipart.git"
+fuzzing_engines:
+ - libfuzzer
+sanitizers:
+ - address
+vendor_ccs:
+ - "wagner@code-intelligence.com"
+ - "yakdan@code-intelligence.com"
+ - "glendowne@code-intelligence.com"
+ - "patrice.salathe@code-intelligence.com"
+ - "hlin@code-intelligence.com"
+ - "schaich@code-intelligence.com"
+ - "bug-disclosure@code-intelligence.com"
\ No newline at end of file
diff --git a/projects/nio-multipart-parser/src/main/java/ossfuzz/NioMultipartFuzzer.java b/projects/nio-multipart-parser/src/main/java/ossfuzz/NioMultipartFuzzer.java
new file mode 100644
index 000000000..df3cad8e1
--- /dev/null
+++ b/projects/nio-multipart-parser/src/main/java/ossfuzz/NioMultipartFuzzer.java
@@ -0,0 +1,74 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package ossfuzz;
+
+import com.code_intelligence.jazzer.api.FuzzedDataProvider;
+import org.synchronoss.cloud.nio.multipart.NioMultipartParser;
+import org.synchronoss.cloud.nio.multipart.Multipart;
+import org.synchronoss.cloud.nio.multipart.Multipart.Builder;
+import org.synchronoss.cloud.nio.multipart.MultipartContext;
+import org.synchronoss.cloud.nio.multipart.NioMultipartParserListener;
+import org.synchronoss.cloud.nio.stream.storage.StreamStorage;
+
+import java.util.List;
+import java.util.Map;
+
+class MultipartListener implements NioMultipartParserListener
+{
+ public void onPartFinished(final StreamStorage partBodyStreamStorage, final Map> headersFromPart)
+ {}
+ public void onAllPartsFinished(){}
+ public void onNestedPartStarted(final Map> headersFromParentPart){}
+ public void onNestedPartFinished(){}
+ public void onError(final String message, final Throwable cause){}
+
+
+}
+
+public class NioMultipartFuzzer {
+
+ private FuzzedDataProvider fuzzedDataProvider;
+
+ public NioMultipartFuzzer(FuzzedDataProvider fuzzedDataProvider) {
+ this.fuzzedDataProvider = fuzzedDataProvider;
+
+ }
+
+ void test() {
+ try {
+
+ var charEncoding = fuzzedDataProvider.consumeAsciiString(fuzzedDataProvider.consumeInt(1, 64));
+ var conentLength = fuzzedDataProvider.consumeInt();
+ var contentType = fuzzedDataProvider.consumeRemainingAsAsciiString();
+ var context = new MultipartContext(contentType, conentLength, charEncoding);
+ var listener = new MultipartListener();
+ var parser = Multipart.multipart(context).forNIO(listener);
+ } catch (IllegalArgumentException e) {
+
+ } catch (IllegalStateException e)
+ {
+
+ }
+
+ }
+
+ public static void fuzzerTestOneInput(FuzzedDataProvider fuzzedDataProvider) {
+
+ NioMultipartFuzzer fixture = new NioMultipartFuzzer(fuzzedDataProvider);
+ fixture.test();
+ }
+}
\ No newline at end of file