mirror of https://github.com/google/oss-fuzz.git
[boringssl] Structure Aware ASN.1 Fuzzing in BoringSSL (#4179)
* using asn.1 structure aware fuzzer to fuzz boringssl * incorporating feedback * changing fuzzer output name * updating build script * formatted files * pulling from google/fuzzing * uncommenting build * removing certs
This commit is contained in:
parent
466b6eb6fe
commit
e15b72d833
|
@ -15,7 +15,12 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
FROM gcr.io/oss-fuzz-base/base-builder
|
FROM gcr.io/oss-fuzz-base/base-builder
|
||||||
RUN apt-get update && apt-get install -y cmake ninja-build golang
|
RUN apt-get update && apt-get install -y wget \
|
||||||
|
golang binutils cmake ninja-build liblzma-dev libz-dev \
|
||||||
|
pkg-config autoconf libtool
|
||||||
RUN git clone --depth 1 https://boringssl.googlesource.com/boringssl
|
RUN git clone --depth 1 https://boringssl.googlesource.com/boringssl
|
||||||
COPY build.sh $SRC/
|
# Use ASN.1 pdu protobuf and converter from the google/fuzzing repo.
|
||||||
|
RUN git clone --depth 1 https://github.com/google/fuzzing.git
|
||||||
|
RUN git clone --depth 1 https://github.com/google/libprotobuf-mutator.git
|
||||||
|
RUN (mkdir LPM && cd LPM && cmake ../libprotobuf-mutator -GNinja -DLIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF=ON -DLIB_PROTO_MUTATOR_TESTING=OFF -DCMAKE_BUILD_TYPE=Release && ninja)
|
||||||
|
COPY *.cc build.sh $SRC/
|
|
@ -32,7 +32,6 @@ cmake -GNinja -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX \
|
||||||
$CMAKE_DEFINES $SRC/boringssl/
|
$CMAKE_DEFINES $SRC/boringssl/
|
||||||
ninja
|
ninja
|
||||||
|
|
||||||
|
|
||||||
fuzzerFiles=$(find $SRC/boringssl/fuzz/ -name "*.cc")
|
fuzzerFiles=$(find $SRC/boringssl/fuzz/ -name "*.cc")
|
||||||
|
|
||||||
find . -name "*.a"
|
find . -name "*.a"
|
||||||
|
@ -48,3 +47,26 @@ for F in $fuzzerFiles; do
|
||||||
zip -j $OUT/${fuzzerName}_seed_corpus.zip $SRC/boringssl/fuzz/${fuzzerName}_corpus/*
|
zip -j $OUT/${fuzzerName}_seed_corpus.zip $SRC/boringssl/fuzz/${fuzzerName}_corpus/*
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [[ $CFLAGS != *sanitize=memory* ]]; then
|
||||||
|
fuzzerLPMFiles=$(find $SRC/ -maxdepth 1 -name "*.cc")
|
||||||
|
|
||||||
|
cp $SRC/fuzzing/proto/asn1-pdu/* $SRC/
|
||||||
|
|
||||||
|
rm -rf genfiles && mkdir genfiles && $SRC/LPM/external.protobuf/bin/protoc asn1_pdu.proto --cpp_out=genfiles --proto_path=$SRC/
|
||||||
|
|
||||||
|
for F in $fuzzerLPMFiles
|
||||||
|
do
|
||||||
|
fuzzerName=$(echo ${F#*_})
|
||||||
|
fuzzerName=$(basename $fuzzerName .cc)
|
||||||
|
echo "Building fuzzer $fuzzerName"
|
||||||
|
$CXX $CXXFLAGS -I genfiles -I . -I $SRC/libprotobuf-mutator/ -I $SRC/LPM/external.protobuf/include -I include $LIB_FUZZING_ENGINE \
|
||||||
|
-I $SRC/boringssl/include \
|
||||||
|
$F genfiles/asn1_pdu.pb.cc $SRC/asn1_pdu_to_der.cc \
|
||||||
|
./ssl/libssl.a ./crypto/libcrypto.a \
|
||||||
|
$SRC/LPM/src/libfuzzer/libprotobuf-mutator-libfuzzer.a \
|
||||||
|
$SRC/LPM/src/libprotobuf-mutator.a \
|
||||||
|
$SRC/LPM/external.protobuf/lib/libprotobuf.a \
|
||||||
|
-o $OUT/"${fuzzerName}_lpm"
|
||||||
|
done
|
||||||
|
fi
|
|
@ -0,0 +1,46 @@
|
||||||
|
// Copyright 2020 Google Inc.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// This fuzz target fuzzes the same API as
|
||||||
|
// https://github.com/google/boringssl/blob/master/fuzz/cert.cc, but it employs
|
||||||
|
// libprotobuf-mutator for structure-aware fuzzing.
|
||||||
|
|
||||||
|
#include <openssl/err.h>
|
||||||
|
#include <openssl/mem.h>
|
||||||
|
#include <openssl/x509.h>
|
||||||
|
#include "asn1_pdu.pb.h"
|
||||||
|
#include "asn1_pdu_to_der.h"
|
||||||
|
#include "libprotobuf-mutator/src/libfuzzer/libfuzzer_macro.h"
|
||||||
|
|
||||||
|
DEFINE_PROTO_FUZZER(const asn1_pdu::PDU& asn1) {
|
||||||
|
asn1_pdu::ASN1PDUToDER converter;
|
||||||
|
std::vector<uint8_t> encoded = converter.PDUToDER(asn1);
|
||||||
|
const uint8_t* buf = encoded.data();
|
||||||
|
size_t len = encoded.size();
|
||||||
|
|
||||||
|
X509* x509 = d2i_X509(NULL, &buf, len);
|
||||||
|
if (x509 != NULL) {
|
||||||
|
// Extract the public key.
|
||||||
|
EVP_PKEY_free(X509_get_pubkey(x509));
|
||||||
|
|
||||||
|
// Reserialize the structure.
|
||||||
|
uint8_t* der = NULL;
|
||||||
|
i2d_X509(x509, &der);
|
||||||
|
OPENSSL_free(der);
|
||||||
|
}
|
||||||
|
X509_free(x509);
|
||||||
|
ERR_clear_error();
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
// Copyright 2020 Google Inc.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// This fuzz target fuzzes the same API as
|
||||||
|
// https://github.com/google/boringssl/blob/master/fuzz/pkcs12.cc, but it
|
||||||
|
// employs libprotobuf-mutator for structure-aware fuzzing.
|
||||||
|
|
||||||
|
#include <openssl/bytestring.h>
|
||||||
|
#include <openssl/evp.h>
|
||||||
|
#include <openssl/pkcs8.h>
|
||||||
|
#include <openssl/x509.h>
|
||||||
|
#include "asn1_pdu.pb.h"
|
||||||
|
#include "asn1_pdu_to_der.h"
|
||||||
|
#include "libprotobuf-mutator/src/libfuzzer/libfuzzer_macro.h"
|
||||||
|
|
||||||
|
DEFINE_PROTO_FUZZER(const asn1_pdu::PDU& asn1) {
|
||||||
|
asn1_pdu::ASN1PDUToDER converter;
|
||||||
|
std::vector<uint8_t> encoded = converter.PDUToDER(asn1);
|
||||||
|
const uint8_t* buf = encoded.data();
|
||||||
|
size_t len = encoded.size();
|
||||||
|
|
||||||
|
bssl::UniquePtr<STACK_OF(X509)> certs(sk_X509_new_null());
|
||||||
|
EVP_PKEY* key = nullptr;
|
||||||
|
CBS cbs;
|
||||||
|
CBS_init(&cbs, buf, len);
|
||||||
|
PKCS12_get_key_and_certs(&key, certs.get(), &cbs, "foo");
|
||||||
|
EVP_PKEY_free(key);
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
// Copyright 2020 Google Inc.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// This fuzz target fuzzes the same API as
|
||||||
|
// https://github.com/google/boringssl/blob/master/fuzz/pkcs8.cc, but it employs
|
||||||
|
// libprotobuf-mutator for structure-aware fuzzing.
|
||||||
|
|
||||||
|
#include <openssl/bytestring.h>
|
||||||
|
#include <openssl/err.h>
|
||||||
|
#include <openssl/evp.h>
|
||||||
|
#include <openssl/mem.h>
|
||||||
|
#include "asn1_pdu.pb.h"
|
||||||
|
#include "asn1_pdu_to_der.h"
|
||||||
|
#include "libprotobuf-mutator/src/libfuzzer/libfuzzer_macro.h"
|
||||||
|
|
||||||
|
DEFINE_PROTO_FUZZER(const asn1_pdu::PDU& asn1) {
|
||||||
|
asn1_pdu::ASN1PDUToDER converter;
|
||||||
|
std::vector<uint8_t> encoded = converter.PDUToDER(asn1);
|
||||||
|
const uint8_t* buf = encoded.data();
|
||||||
|
size_t len = encoded.size();
|
||||||
|
|
||||||
|
CBS cbs;
|
||||||
|
CBS_init(&cbs, buf, len);
|
||||||
|
bssl::UniquePtr<EVP_PKEY> pkey(EVP_parse_private_key(&cbs));
|
||||||
|
if (pkey == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* der;
|
||||||
|
size_t der_len;
|
||||||
|
bssl::ScopedCBB cbb;
|
||||||
|
if (CBB_init(cbb.get(), 0) &&
|
||||||
|
EVP_marshal_private_key(cbb.get(), pkey.get()) &&
|
||||||
|
CBB_finish(cbb.get(), &der, &der_len)) {
|
||||||
|
OPENSSL_free(der);
|
||||||
|
}
|
||||||
|
ERR_clear_error();
|
||||||
|
}
|
Loading…
Reference in New Issue