Skip to content

Commit a775361

Browse files
krockotmibrunin
authored andcommitted
[Backport] CVE-2021-21198: Out of bounds read in IPC
Manual backport of patch originally reviewed on https://chromium-review.googlesource.com/c/chromium/src/+/2779918: Don't use BigBuffer for IPC::Message transport M86 merge conflicts and resolution: * ipc/ipc_message_pipe_reader.cc Fixed extra include. (cherry picked from commit 85bd7c88523545ab0e497d5e7b3e929793813358) (cherry picked from commit fad3b9ffe7c7ff82909d911c573bd185aa3b3b50) Fixed: 1184399 Change-Id: Iddd91ae8d7ae63022b61c96239f5e39261dfb735 Commit-Queue: Ken Rockot <[email protected]> Reviewed-by: Daniel Cheng <[email protected]> Cr-Original-Original-Commit-Position: refs/heads/master@{#860010} Auto-Submit: Ken Rockot <[email protected]> Reviewed-by: Adrian Taylor <[email protected]> Reviewed-by: Alex Gough <[email protected]> Commit-Queue: Alex Gough <[email protected]> Cr-Original-Commit-Position: refs/branch-heads/4389@{#1597} Cr-Original-Branched-From: 9251c5db2b6d5a59fe4eac7aafa5fed37c139bb7-refs/heads/master@{#843830} Reviewed-by: Victor-Gabriel Savu <[email protected]> Reviewed-by: Artem Sumaneev <[email protected]> Reviewed-by: Ken Rockot <[email protected]> Auto-Submit: Artem Sumaneev <[email protected]> Commit-Queue: Artem Sumaneev <[email protected]> Cr-Commit-Position: refs/branch-heads/4240@{#1587} Cr-Branched-From: f297677702651916bbf65e59c0d4bbd4ce57d1ee-refs/heads/master@{#800218} Reviewed-by: Jüri Valdmann <[email protected]>
1 parent 5cc54b6 commit a775361

File tree

8 files changed

+25
-50
lines changed

8 files changed

+25
-50
lines changed

chromium/ipc/BUILD.gn

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,7 @@ mojom_component("mojom") {
181181
sources = [
182182
"ipc.mojom",
183183
]
184-
public_deps = [
185-
"//mojo/public/interfaces/bindings",
186-
"//mojo/public/mojom/base",
187-
]
184+
public_deps = [ "//mojo/public/interfaces/bindings" ]
188185

189186
# Don't generate a variant sources since we depend on generated internal
190187
# bindings types and we don't generate or build variants of those.

chromium/ipc/ipc.mojom

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
module IPC.mojom;
66

7-
import "mojo/public/mojom/base/big_buffer.mojom";
87
import "mojo/public/interfaces/bindings/native_struct.mojom";
98

109
// A placeholder interface type since we don't yet support generic associated
@@ -14,7 +13,7 @@ interface GenericInterface {};
1413
// Typemapped such that arbitrarily large IPC::Message objects can be sent and
1514
// received with minimal copying.
1615
struct Message {
17-
mojo_base.mojom.BigBuffer buffer;
16+
array<uint8> bytes;
1817
array<mojo.native.SerializedHandle>? handles;
1918
};
2019

@@ -24,6 +23,7 @@ interface Channel {
2423
SetPeerPid(int32 pid);
2524

2625
// Transmits a classical Chrome IPC message.
26+
[UnlimitedSize]
2727
Receive(Message message);
2828

2929
// Requests a Channel-associated interface.

chromium/ipc/ipc_message_pipe_reader.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "base/bind.h"
1212
#include "base/bind_helpers.h"
13+
#include "base/containers/span.h"
1314
#include "base/location.h"
1415
#include "base/logging.h"
1516
#include "base/macros.h"
@@ -63,7 +64,9 @@ bool MessagePipeReader::Send(std::unique_ptr<Message> message) {
6364
if (!sender_)
6465
return false;
6566

66-
sender_->Receive(MessageView(*message, std::move(handles)));
67+
base::span<const uint8_t> bytes(static_cast<const uint8_t*>(message->data()),
68+
message->size());
69+
sender_->Receive(MessageView(bytes, std::move(handles)));
6770
DVLOG(4) << "Send " << message->type() << ": " << message->size();
6871
return true;
6972
}
@@ -82,11 +85,12 @@ void MessagePipeReader::SetPeerPid(int32_t peer_pid) {
8285
}
8386

8487
void MessagePipeReader::Receive(MessageView message_view) {
85-
if (!message_view.size()) {
88+
if (message_view.bytes().empty()) {
8689
delegate_->OnBrokenDataReceived();
8790
return;
8891
}
89-
Message message(message_view.data(), message_view.size());
92+
Message message(reinterpret_cast<const char*>(message_view.bytes().data()),
93+
message_view.bytes().size());
9094
if (!message.IsValid()) {
9195
delegate_->OnBrokenDataReceived();
9296
return;

chromium/ipc/message.typemap

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,5 @@ sources = [
1111
"//ipc/message_view.cc",
1212
"//ipc/message_view.h",
1313
]
14-
public_deps = [
15-
"//ipc:message_support",
16-
"//mojo/public/cpp/base:shared_typemap_traits",
17-
]
14+
public_deps = [ "//ipc:message_support" ]
1815
type_mappings = [ "IPC.mojom.Message=IPC::MessageView[move_only]" ]

chromium/ipc/message_mojom_traits.cc

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@
44

55
#include "ipc/message_mojom_traits.h"
66

7-
#include "mojo/public/cpp/base/big_buffer_mojom_traits.h"
8-
97
namespace mojo {
108

119
// static
12-
mojo_base::BigBufferView
13-
StructTraits<IPC::mojom::MessageDataView, IPC::MessageView>::buffer(
10+
base::span<const uint8_t>
11+
StructTraits<IPC::mojom::MessageDataView, IPC::MessageView>::bytes(
1412
IPC::MessageView& view) {
15-
return view.TakeBufferView();
13+
return view.bytes();
1614
}
1715

1816
// static
@@ -26,14 +24,14 @@ StructTraits<IPC::mojom::MessageDataView, IPC::MessageView>::handles(
2624
bool StructTraits<IPC::mojom::MessageDataView, IPC::MessageView>::Read(
2725
IPC::mojom::MessageDataView data,
2826
IPC::MessageView* out) {
29-
mojo_base::BigBufferView buffer_view;
30-
if (!data.ReadBuffer(&buffer_view))
31-
return false;
27+
mojo::ArrayDataView<uint8_t> bytes;
28+
data.GetBytesDataView(&bytes);
29+
3230
base::Optional<std::vector<mojo::native::SerializedHandlePtr>> handles;
3331
if (!data.ReadHandles(&handles))
3432
return false;
3533

36-
*out = IPC::MessageView(std::move(buffer_view), std::move(handles));
34+
*out = IPC::MessageView(bytes, std::move(handles));
3735
return true;
3836
}
3937

chromium/ipc/message_mojom_traits.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77

88
#include <vector>
99

10+
#include "base/containers/span.h"
1011
#include "base/optional.h"
1112
#include "ipc/ipc.mojom-shared.h"
1213
#include "ipc/message_view.h"
13-
#include "mojo/public/cpp/base/big_buffer.h"
1414
#include "mojo/public/cpp/bindings/struct_traits.h"
1515
#include "mojo/public/interfaces/bindings/native_struct.mojom.h"
1616

@@ -19,7 +19,7 @@ namespace mojo {
1919
template <>
2020
class StructTraits<IPC::mojom::MessageDataView, IPC::MessageView> {
2121
public:
22-
static mojo_base::BigBufferView buffer(IPC::MessageView& view);
22+
static base::span<const uint8_t> bytes(IPC::MessageView& view);
2323
static base::Optional<std::vector<mojo::native::SerializedHandlePtr>> handles(
2424
IPC::MessageView& view);
2525

chromium/ipc/message_view.cc

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,9 @@ namespace IPC {
99
MessageView::MessageView() = default;
1010

1111
MessageView::MessageView(
12-
const Message& message,
12+
base::span<const uint8_t> bytes,
1313
base::Optional<std::vector<mojo::native::SerializedHandlePtr>> handles)
14-
: buffer_view_(base::make_span<const uint8_t>(
15-
static_cast<const uint8_t*>(message.data()),
16-
message.size())),
17-
handles_(std::move(handles)) {}
18-
19-
MessageView::MessageView(
20-
mojo_base::BigBufferView buffer_view,
21-
base::Optional<std::vector<mojo::native::SerializedHandlePtr>> handles)
22-
: buffer_view_(std::move(buffer_view)), handles_(std::move(handles)) {}
14+
: bytes_(bytes), handles_(std::move(handles)) {}
2315

2416
MessageView::MessageView(MessageView&&) = default;
2517

chromium/ipc/message_view.h

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#include "base/containers/span.h"
1212
#include "base/macros.h"
1313
#include "ipc/ipc_message.h"
14-
#include "mojo/public/cpp/base/big_buffer.h"
1514
#include "mojo/public/interfaces/bindings/native_struct.mojom.h"
1615

1716
namespace IPC {
@@ -20,32 +19,20 @@ class COMPONENT_EXPORT(IPC_MOJOM) MessageView {
2019
public:
2120
MessageView();
2221
MessageView(
23-
const Message& message,
24-
base::Optional<std::vector<mojo::native::SerializedHandlePtr>> handles);
25-
MessageView(
26-
mojo_base::BigBufferView buffer_view,
22+
base::span<const uint8_t> bytes,
2723
base::Optional<std::vector<mojo::native::SerializedHandlePtr>> handles);
2824
MessageView(MessageView&&);
2925
~MessageView();
3026

3127
MessageView& operator=(MessageView&&);
3228

33-
const char* data() const {
34-
return reinterpret_cast<const char*>(buffer_view_.data().data());
35-
}
36-
37-
uint32_t size() const {
38-
return static_cast<uint32_t>(buffer_view_.data().size());
39-
}
40-
41-
mojo_base::BigBufferView TakeBufferView() { return std::move(buffer_view_); }
42-
29+
base::span<const uint8_t> bytes() const { return bytes_; }
4330
base::Optional<std::vector<mojo::native::SerializedHandlePtr>> TakeHandles() {
4431
return std::move(handles_);
4532
}
4633

4734
private:
48-
mojo_base::BigBufferView buffer_view_;
35+
base::span<const uint8_t> bytes_;
4936
base::Optional<std::vector<mojo::native::SerializedHandlePtr>> handles_;
5037

5138
DISALLOW_COPY_AND_ASSIGN(MessageView);

0 commit comments

Comments
 (0)