blob: 157059f54c8144533e2f02a5ecf6aa4ed59755a0 [file] [log] [blame]
Ned Williamson3d55bbb2017-11-07 22:58:131// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ryan Hamiltona3ee93a72018-08-01 22:03:085#include "net/quic/quic_stream_factory.h"
Ned Williamson3d55bbb2017-11-07 22:58:136
Max Moroza1707f42019-08-28 21:10:287#include <fuzzer/FuzzedDataProvider.h>
8
Avi Drissman4365a4782018-12-28 19:26:249#include "base/stl_util.h"
Matt Menke26e41542019-06-05 01:09:5110#include "net/base/network_isolation_key.h"
Ned Williamson3d55bbb2017-11-07 22:58:1311#include "net/base/test_completion_callback.h"
Ryan Sleevi8a9c9c12018-05-09 02:36:2312#include "net/cert/ct_policy_enforcer.h"
Ryan Sleevi987d2d92017-12-19 19:22:1413#include "net/cert/do_nothing_ct_verifier.h"
14#include "net/cert/mock_cert_verifier.h"
Ryan Hamiltone3e592e2017-11-16 04:49:0915#include "net/cert/x509_certificate.h"
Eric Orth4e55b362019-05-07 22:00:0316#include "net/dns/context_host_resolver.h"
17#include "net/dns/fuzzed_host_resolver_util.h"
Matt Menke609160742019-08-02 18:47:2618#include "net/http/http_server_properties.h"
Ned Williamson3d55bbb2017-11-07 22:58:1319#include "net/http/transport_security_state.h"
Ryan Hamiltona3ee93a72018-08-01 22:03:0820#include "net/quic/mock_crypto_client_stream_factory.h"
21#include "net/quic/quic_http_stream.h"
22#include "net/quic/test_task_runner.h"
Ned Williamson3d55bbb2017-11-07 22:58:1323#include "net/socket/fuzzed_datagram_client_socket.h"
24#include "net/socket/fuzzed_socket_factory.h"
Paul Jensen8e3c5d32018-02-19 17:06:3325#include "net/socket/socket_tag.h"
Ryan Sleevi987d2d92017-12-19 19:22:1426#include "net/ssl/ssl_config_service_defaults.h"
Ryan Hamilton0a9f01462017-11-14 01:27:3027#include "net/test/gtest_util.h"
Victor Vasiliev6bb59d22019-03-08 21:34:5128#include "net/third_party/quiche/src/quic/test_tools/mock_clock.h"
29#include "net/third_party/quiche/src/quic/test_tools/mock_random.h"
Ramin Halavatia1256c82018-02-21 06:18:2130#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
Ned Williamson3d55bbb2017-11-07 22:58:1331
32namespace net {
33
34namespace {
35
Ryan Hamiltone3e592e2017-11-16 04:49:0936const char kCertData[] = {
37#include "net/data/ssl/certificates/wildcard.inc"
38};
39
Ned Williamson3d55bbb2017-11-07 22:58:1340} // namespace
41
42namespace test {
43
44const char kServerHostName[] = "www.example.org";
45const int kServerPort = 443;
46const char kUrl[] = "https://www.example.org/";
47// TODO(nedwilliamson): Add POST here after testing
48// whether that can lead blocking while waiting for
49// the callbacks.
50const char kMethod[] = "GET";
51const size_t kBufferSize = 4096;
52const int kCertVerifyFlags = 0;
53
54// Static initialization for persistent factory data
55struct Env {
56 Env() : host_port_pair(kServerHostName, kServerPort), random_generator(0) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:5257 clock.AdvanceTime(quic::QuicTime::Delta::FromSeconds(1));
Ryan Sleevib8449e02018-07-15 04:31:0758 ssl_config_service = std::make_unique<SSLConfigServiceDefaults>();
Ned Williamson3d55bbb2017-11-07 22:58:1359 crypto_client_stream_factory.set_use_mock_crypter(true);
Ryan Sleevi987d2d92017-12-19 19:22:1460 cert_verifier = std::make_unique<MockCertVerifier>();
Ryan Sleevi987d2d92017-12-19 19:22:1461 cert_transparency_verifier = std::make_unique<DoNothingCTVerifier>();
Ryan Hamilton0a9f01462017-11-14 01:27:3062 verify_details.cert_verify_result.verified_cert =
Avi Drissman4365a4782018-12-28 19:26:2463 X509Certificate::CreateFromBytes(kCertData, base::size(kCertData));
Ryan Hamiltone3e592e2017-11-16 04:49:0964 CHECK(verify_details.cert_verify_result.verified_cert);
Ryan Hamilton0a9f01462017-11-14 01:27:3065 verify_details.cert_verify_result.is_issued_by_known_root = true;
Ned Williamson3d55bbb2017-11-07 22:58:1366 }
67
Ryan Hamilton8d9ee76e2018-05-29 23:52:5268 quic::MockClock clock;
Ryan Sleevib8449e02018-07-15 04:31:0769 std::unique_ptr<SSLConfigService> ssl_config_service;
Ryan Hamilton0a9f01462017-11-14 01:27:3070 ProofVerifyDetailsChromium verify_details;
Ned Williamson3d55bbb2017-11-07 22:58:1371 MockCryptoClientStreamFactory crypto_client_stream_factory;
72 HostPortPair host_port_pair;
Ryan Hamilton8d9ee76e2018-05-29 23:52:5273 quic::test::MockRandom random_generator;
Ned Williamson3d55bbb2017-11-07 22:58:1374 NetLogWithSource net_log;
75 std::unique_ptr<CertVerifier> cert_verifier;
Ned Williamson3d55bbb2017-11-07 22:58:1376 TransportSecurityState transport_security_state;
Ryan Hamilton8d9ee76e2018-05-29 23:52:5277 quic::QuicTagVector connection_options;
78 quic::QuicTagVector client_connection_options;
Ned Williamson3d55bbb2017-11-07 22:58:1379 std::unique_ptr<CTVerifier> cert_transparency_verifier;
Ryan Sleevi8a9c9c12018-05-09 02:36:2380 DefaultCTPolicyEnforcer ct_policy_enforcer;
Ned Williamson3d55bbb2017-11-07 22:58:1381};
82
83static struct Env* env = new Env();
84
85extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
Max Morozcfbe47cc2019-06-24 17:45:0286 FuzzedDataProvider data_provider(data, size);
Ned Williamson3d55bbb2017-11-07 22:58:1387
Eric Orth4e55b362019-05-07 22:00:0388 std::unique_ptr<ContextHostResolver> host_resolver =
89 CreateFuzzedContextHostResolver(HostResolver::ManagerOptions(), nullptr,
90 &data_provider,
91 true /* enable_caching */);
Ned Williamson3d55bbb2017-11-07 22:58:1392 FuzzedSocketFactory socket_factory(&data_provider);
93
94 // Initialize this on each loop since some options mutate this.
Matt Menke609160742019-08-02 18:47:2695 HttpServerProperties http_server_properties;
Ned Williamson3d55bbb2017-11-07 22:58:1396
Nick Harper72ade192019-07-17 03:30:4297 QuicParams params;
98 params.max_server_configs_stored_in_properties =
99 data_provider.ConsumeBool() ? 1 : 0;
100 params.close_sessions_on_ip_change = data_provider.ConsumeBool();
Nick Harper72ade192019-07-17 03:30:42101 params.allow_server_migration = data_provider.ConsumeBool();
102 params.race_cert_verification = data_provider.ConsumeBool();
103 params.estimate_initial_rtt = data_provider.ConsumeBool();
104 params.headers_include_h2_stream_dependency = data_provider.ConsumeBool();
105 params.enable_socket_recv_optimization = data_provider.ConsumeBool();
106 params.race_stale_dns_on_connection = data_provider.ConsumeBool();
Ned Williamson1000a492017-11-09 20:40:14107
Ryan Hamilton0a9f01462017-11-14 01:27:30108 env->crypto_client_stream_factory.AddProofVerifyDetails(&env->verify_details);
109
Nick Harper72ade192019-07-17 03:30:42110 params.goaway_sessions_on_ip_change = false;
111 params.migrate_sessions_early_v2 = false;
112 params.migrate_sessions_on_network_change_v2 = false;
113 params.retry_on_alternate_network_before_handshake = false;
114 params.migrate_idle_sessions = false;
115 params.go_away_on_path_degrading = false;
Zhongyi Shif4683a32017-12-01 00:03:28116
Nick Harper72ade192019-07-17 03:30:42117 if (!params.close_sessions_on_ip_change) {
118 params.goaway_sessions_on_ip_change = data_provider.ConsumeBool();
119 if (!params.goaway_sessions_on_ip_change) {
120 params.migrate_sessions_on_network_change_v2 =
121 data_provider.ConsumeBool();
122 if (params.migrate_sessions_on_network_change_v2) {
123 params.migrate_sessions_early_v2 = data_provider.ConsumeBool();
124 params.retry_on_alternate_network_before_handshake =
Zhongyi Shi8de43832018-08-15 23:40:00125 data_provider.ConsumeBool();
Nick Harper72ade192019-07-17 03:30:42126 params.migrate_idle_sessions = data_provider.ConsumeBool();
Zhongyi Shi63574b7f2018-06-01 20:22:25127 }
Zhongyi Shi56e44b22017-12-02 00:06:33128 }
Zhongyi Shif4683a32017-12-01 00:03:28129 }
Ned Williamson1000a492017-11-09 20:40:14130
Nick Harper72ade192019-07-17 03:30:42131 if (!params.migrate_sessions_early_v2) {
132 params.go_away_on_path_degrading = data_provider.ConsumeBool();
133 }
Renjiea5722ccf2018-08-10 00:18:49134
Ned Williamson3d55bbb2017-11-07 22:58:13135 std::unique_ptr<QuicStreamFactory> factory =
136 std::make_unique<QuicStreamFactory>(
Eric Orth4e55b362019-05-07 22:00:03137 env->net_log.net_log(), host_resolver.get(),
138 env->ssl_config_service.get(), &socket_factory,
139 &http_server_properties, env->cert_verifier.get(),
Nick Harperecf319d2018-10-16 07:58:54140 &env->ct_policy_enforcer, &env->transport_security_state,
141 env->cert_transparency_verifier.get(), nullptr,
142 &env->crypto_client_stream_factory, &env->random_generator,
Nick Harper72ade192019-07-17 03:30:42143 &env->clock, params);
Ned Williamson3d55bbb2017-11-07 22:58:13144
Nick Harper057264a82019-09-12 23:33:49145 SetQuicReloadableFlag(quic_supports_tls_handshake, true);
Ned Williamson3d55bbb2017-11-07 22:58:13146 QuicStreamRequest request(factory.get());
147 TestCompletionCallback callback;
148 NetErrorDetails net_error_details;
Ryan Hamilton9ef8c102019-06-28 03:58:52149 quic::ParsedQuicVersionVector versions = quic::AllSupportedVersions();
150 quic::ParsedQuicVersion version =
151 versions[data_provider.ConsumeIntegralInRange<size_t>(
152 0, versions.size() - 1)];
Ryan Hamilton8d9ee76e2018-05-29 23:52:52153 request.Request(
Ryan Hamilton9ef8c102019-06-28 03:58:52154 env->host_port_pair, version, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
155 SocketTag(), NetworkIsolationKey(), kCertVerifyFlags, GURL(kUrl),
156 env->net_log, &net_error_details,
Zhongyi Shia6b68d112018-09-24 07:49:03157 /*failed_on_default_network_callback=*/CompletionOnceCallback(),
158 callback.callback());
Ned Williamson3d55bbb2017-11-07 22:58:13159
160 callback.WaitForResult();
Yixin Wang7891a39d2017-11-08 20:59:24161 std::unique_ptr<QuicChromiumClientSession::Handle> session =
162 request.ReleaseSessionHandle();
163 if (!session)
Ned Williamson3d55bbb2017-11-07 22:58:13164 return 0;
Yixin Wang7891a39d2017-11-08 20:59:24165 std::unique_ptr<HttpStream> stream(new QuicHttpStream(std::move(session)));
Ned Williamson3d55bbb2017-11-07 22:58:13166
167 HttpRequestInfo request_info;
168 request_info.method = kMethod;
169 request_info.url = GURL(kUrl);
Ramin Halavatia1256c82018-02-21 06:18:21170 request_info.traffic_annotation =
171 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:27172 stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY, env->net_log,
Bence Békya25e3f72018-02-13 21:13:39173 CompletionOnceCallback());
Ned Williamson3d55bbb2017-11-07 22:58:13174
175 HttpResponseInfo response;
176 HttpRequestHeaders request_headers;
177 if (OK !=
178 stream->SendRequest(request_headers, &response, callback.callback()))
179 return 0;
180
181 // TODO(nedwilliamson): attempt connection migration here
Nick Harper7ac20cc2018-05-08 18:06:04182 int rv = stream->ReadResponseHeaders(callback.callback());
183 if (rv != OK && rv != ERR_IO_PENDING) {
184 return 0;
185 }
Ned Williamson3d55bbb2017-11-07 22:58:13186 callback.WaitForResult();
187
Victor Costan9c7302b2018-08-27 16:39:44188 scoped_refptr<net::IOBuffer> buffer =
189 base::MakeRefCounted<net::IOBuffer>(kBufferSize);
Nick Harper7ac20cc2018-05-08 18:06:04190 rv = stream->ReadResponseBody(buffer.get(), kBufferSize, callback.callback());
Ned Williamson3d55bbb2017-11-07 22:58:13191 if (rv == ERR_IO_PENDING)
192 callback.WaitForResult();
193
194 return 0;
195}
196
197} // namespace test
198} // namespace net