mirror of https://github.com/grpc/grpc.git
Merge pull request #19359 from yashykt/out_of_bounds_tests
Add out of bounds frame testspull/19425/head
commit
bdab6833f1
7 changed files with 234 additions and 0 deletions
@ -0,0 +1,112 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2019 gRPC authors. |
||||
* |
||||
* 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. |
||||
* |
||||
*/ |
||||
|
||||
#include <string> |
||||
|
||||
#include <gtest/gtest.h> |
||||
|
||||
#include <grpc/support/string_util.h> |
||||
#include "src/core/lib/surface/server.h" |
||||
#include "test/core/bad_client/bad_client.h" |
||||
|
||||
#define APPEND_BUFFER(string, to_append) \ |
||||
((string).append((to_append), sizeof(to_append) - 1)) |
||||
|
||||
namespace { |
||||
|
||||
void verifier(grpc_server* server, grpc_completion_queue* cq, |
||||
void* registered_method) { |
||||
while (grpc_server_has_open_connections(server)) { |
||||
GPR_ASSERT(grpc_completion_queue_next( |
||||
cq, grpc_timeout_milliseconds_to_deadline(20), nullptr) |
||||
.type == GRPC_QUEUE_TIMEOUT); |
||||
} |
||||
} |
||||
|
||||
void FrameVerifier(const std::string& attack_vector) { |
||||
grpc_bad_client_arg args[2]; |
||||
args[0] = connection_preface_arg; |
||||
args[1].client_validator = nullptr; |
||||
args[1].client_payload = attack_vector.c_str(); |
||||
args[1].client_payload_length = attack_vector.size(); |
||||
grpc_run_bad_client_test(verifier, args, 2, GRPC_BAD_CLIENT_DISCONNECT); |
||||
} |
||||
|
||||
TEST(OutOfBounds, MaxFrameSizeDataFrame) { |
||||
std::string out_of_bounds_data; |
||||
// Send a data frame larger than 2^14
|
||||
APPEND_BUFFER(out_of_bounds_data, "\x01\x00\x00\x00\x00\x00\x00\x00\x01"); |
||||
out_of_bounds_data.append(1 << 16, 'a'); |
||||
FrameVerifier(out_of_bounds_data); |
||||
} |
||||
|
||||
TEST(OutOfBounds, BadSizePriorityFrame) { |
||||
std::string bad_size_priority_frame; |
||||
// Priority Frame should be a length of 5 octets
|
||||
APPEND_BUFFER(bad_size_priority_frame, |
||||
"\x00\x00\x03\x02\x00\x00\x00\x00\x01" |
||||
"\x11\x11\x12"); |
||||
FrameVerifier(bad_size_priority_frame); |
||||
} |
||||
|
||||
TEST(OutOfBounds, BadSizeRstStream) { |
||||
std::string bad_size_rst_stream; |
||||
// Rst Stream Frame should have a length of 4 octets
|
||||
APPEND_BUFFER(bad_size_rst_stream, |
||||
"\x00\x00\x02\x03\x00\x00\x00\x00\x01" |
||||
"\x11\x11"); |
||||
FrameVerifier(bad_size_rst_stream); |
||||
} |
||||
|
||||
TEST(OutOfBounds, BadSizeSettings) { |
||||
std::string bad_size_settings; |
||||
// Settings Frame should have a length which is a multiple of 6 octets
|
||||
APPEND_BUFFER(bad_size_settings, |
||||
"\x00\x00\x05\x04\x00\x00\x00\x00\x00" |
||||
"\x11\x11\x11\x11\x11"); |
||||
FrameVerifier(bad_size_settings); |
||||
} |
||||
|
||||
TEST(OutOfBounds, BadSizePing) { |
||||
std::string bad_size_ping; |
||||
// Rst Stream Frame should have a length of 8 octets
|
||||
APPEND_BUFFER(bad_size_ping, |
||||
"\x00\x00\x05\x06\x00\x00\x00\x00\x00" |
||||
"\x11\x11\x11\x11\x11"); |
||||
FrameVerifier(bad_size_ping); |
||||
} |
||||
|
||||
TEST(OutOfBounds, WindowUpdate) { |
||||
std::string bad_size_window_update; |
||||
// Window Update Frame should have a length of 4 octets
|
||||
APPEND_BUFFER(bad_size_window_update, |
||||
"\x00\x00\x01\x08\x00\x00\x00\x00\x00" |
||||
"\x11"); |
||||
FrameVerifier(bad_size_window_update); |
||||
} |
||||
|
||||
} // namespace
|
||||
|
||||
int main(int argc, char** argv) { |
||||
grpc_init(); |
||||
grpc::testing::TestEnvironment env(argc, argv); |
||||
::testing::InitGoogleTest(&argc, argv); |
||||
int retval = RUN_ALL_TESTS(); |
||||
grpc_shutdown(); |
||||
return retval; |
||||
} |
Loading…
Reference in new issue