From 5006e178ba46dbb977c9e7363b770bc758782d4b Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sat, 17 Dec 2016 22:35:08 -0500 Subject: Disable TLS signature and finished message checks in fuzzer mode Also use a const time comparison for the finished message, though I don't see any real way of exploiting that timing channel. --- configure.py | 13 ++++++++----- src/lib/tls/msg_cert_verify.cpp | 9 ++++++++- src/lib/tls/msg_finished.cpp | 9 ++++++++- src/lib/tls/msg_server_kex.cpp | 8 +++++++- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/configure.py b/configure.py index 8aa054c16..d690f4b98 100755 --- a/configure.py +++ b/configure.py @@ -278,10 +278,10 @@ def process_command_line(args): help='enable ASan/UBSan checks') build_group.add_option('--with-coverage', action='store_true', default=False, dest='with_coverage', - help='enable coverage checking and disable opts') + help='add coverage info and disable opts') build_group.add_option('--with-coverage-info', action='store_true', default=False, dest='with_coverage_info', - help='enable coverage checking') + help='add coverage info') build_group.add_option('--enable-shared-library', dest='build_shared_lib', action='store_true', default=True, @@ -383,6 +383,9 @@ def process_command_line(args): build_group.add_option('--with-bakefile', action='store_true', default=False, help='Generate bakefile which can be used to create Visual Studio or Xcode project files') + build_group.add_option('--unsafe-fuzzer-mode', action='store_true', default=False, + help='disable essential checks for testing') + mods_group = optparse.OptionGroup(parser, 'Module selection') mods_group.add_option('--module-policy', dest='module_policy', @@ -403,9 +406,6 @@ def process_command_line(args): mods_group.add_option('--minimized-build', action='store_true', dest='no_autoload', help='minimize build') - mods_group.add_option('--unsafe-fuzzer-mode', action='store_true', - help='disable checks for fuzz testing') - # Should be derived from info.txt but this runs too early third_party = ['boost', 'bzip2', 'lzma', 'openssl', 'sqlite3', 'zlib', 'tpm', 'pkcs11'] @@ -2337,6 +2337,9 @@ def main(argv = None): build_config.version_release_type, release_date(build_config.version_datestamp))) + if options.unsafe_fuzzer_mode: + logging.warning("The fuzzer mode flag is labeled unsafe for a reason, this version is for testing only") + if __name__ == '__main__': try: main() diff --git a/src/lib/tls/msg_cert_verify.cpp b/src/lib/tls/msg_cert_verify.cpp index ac8fa97fd..2f8e8230e 100644 --- a/src/lib/tls/msg_cert_verify.cpp +++ b/src/lib/tls/msg_cert_verify.cpp @@ -90,7 +90,14 @@ bool Certificate_Verify::verify(const X509_Certificate& cert, PK_Verifier verifier(*key, format.first, format.second); - return verifier.verify_message(state.hash().get_contents(), m_signature); + const bool signature_valid = + verifier.verify_message(state.hash().get_contents(), m_signature); + +#if defined(BOTAN_UNSAFE_FUZZER_MODE) + return true; +#else + return signature_valid; +#endif } } diff --git a/src/lib/tls/msg_finished.cpp b/src/lib/tls/msg_finished.cpp index 3a2c88fb1..7d5eea77a 100644 --- a/src/lib/tls/msg_finished.cpp +++ b/src/lib/tls/msg_finished.cpp @@ -74,7 +74,14 @@ Finished::Finished(const std::vector& buf) : m_verification_data(buf) bool Finished::verify(const Handshake_State& state, Connection_Side side) const { - return (m_verification_data == finished_compute_verify(state, side)); + std::vector computed_verify = finished_compute_verify(state, side); + +#if defined(BOTAN_UNSAFE_FUZZER_MODE) + return true; +#else + return (m_verification_data.size() == computed_verify.size()) && + same_mem(m_verification_data.data(), computed_verify.data(), computed_verify.size()); +#endif } } diff --git a/src/lib/tls/msg_server_kex.cpp b/src/lib/tls/msg_server_kex.cpp index 521ef4e20..72b90a31c 100644 --- a/src/lib/tls/msg_server_kex.cpp +++ b/src/lib/tls/msg_server_kex.cpp @@ -287,7 +287,13 @@ bool Server_Key_Exchange::verify(const Public_Key& server_key, verifier.update(state.server_hello()->random()); verifier.update(params()); - return verifier.check_signature(m_signature); + const bool signature_valid = verifier.check_signature(m_signature); + +#if defined(BOTAN_UNSAFE_FUZZER_MODE) + return true; +#else + return signature_valid; +#endif } const Private_Key& Server_Key_Exchange::server_kex_key() const -- cgit v1.2.3