Skip to content

Commit fd48fe2

Browse files
krockotmibrunin
authored andcommitted
[Backport] CVE-2021-21223: Integer overflow in Mojo
Manual backport of patch originally reviewed on https://chromium-review.googlesource.com/c/chromium/src/+/2837712: M86-LTS: Mojo: Properly validate broadcast events This corrects broadcast event deserialization by adding a missing validation step when decoding the outer message header. (cherry picked from commit 6740adb28374ddeee13febfd5e5d20cb8a365979) Fixed: 1195308 Change-Id: Ia67a20e48614e7ef00b1b32f7f4e5f20235be310 Reviewed-by: Daniel Cheng <[email protected]> Commit-Queue: Ken Rockot <[email protected]> Cr-Original-Commit-Position: refs/heads/master@{#870238} Owners-Override: Achuith Bhandarkar <[email protected]> Auto-Submit: Achuith Bhandarkar <[email protected]> Reviewed-by: Artem Sumaneev <[email protected]> Commit-Queue: Achuith Bhandarkar <[email protected]> Cr-Commit-Position: refs/branch-heads/4240@{#1614} Cr-Branched-From: f297677702651916bbf65e59c0d4bbd4ce57d1ee-refs/heads/master@{#800218} Reviewed-by: Allan Sandfeld Jensen <[email protected]>
1 parent 2fbb0ef commit fd48fe2

File tree

4 files changed

+17
-8
lines changed

4 files changed

+17
-8
lines changed

chromium/mojo/core/node_channel.cc

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,16 @@ Channel::MessagePtr NodeChannel::CreateEventMessage(size_t capacity,
181181
}
182182

183183
// static
184-
void NodeChannel::GetEventMessageData(Channel::Message* message,
184+
bool NodeChannel::GetEventMessageData(Channel::Message& message,
185185
void** data,
186186
size_t* num_data_bytes) {
187-
// NOTE: OnChannelMessage guarantees that we never accept a Channel::Message
188-
// with a payload of fewer than |sizeof(Header)| bytes.
189-
*data = reinterpret_cast<Header*>(message->mutable_payload()) + 1;
190-
*num_data_bytes = message->payload_size() - sizeof(Header);
187+
// NOTE: Callers must guarantee that the payload in `message` must be at least
188+
// large enough to hold a Header.
189+
if (message.payload_size() < sizeof(Header))
190+
return false;
191+
*data = reinterpret_cast<Header*>(message.mutable_payload()) + 1;
192+
*num_data_bytes = message.payload_size() - sizeof(Header);
193+
return true;
191194
}
192195

193196
void NodeChannel::Start() {

chromium/mojo/core/node_channel.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ class NodeChannel : public base::RefCountedThreadSafe<NodeChannel>,
8787
void** payload,
8888
size_t num_handles);
8989

90-
static void GetEventMessageData(Channel::Message* message,
90+
// Retrieves address and size of an Event message's underlying message data.
91+
// Returns `false` if the message is not a valid Event message.
92+
static bool GetEventMessageData(Channel::Message& message,
9193
void** data,
9294
size_t* num_data_bytes);
9395

chromium/mojo/core/node_controller.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ ports::ScopedEvent DeserializeEventMessage(
8181
Channel::MessagePtr channel_message) {
8282
void* data;
8383
size_t size;
84-
NodeChannel::GetEventMessageData(channel_message.get(), &data, &size);
84+
bool valid = NodeChannel::GetEventMessageData(*channel_message, &data, &size);
85+
if (!valid)
86+
return nullptr;
8587
auto event = ports::Event::Deserialize(data, size);
8688
if (!event)
8789
return nullptr;

chromium/mojo/core/user_message_impl.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,9 @@ Channel::MessagePtr UserMessageImpl::FinalizeEventMessage(
408408
if (channel_message) {
409409
void* data;
410410
size_t size;
411-
NodeChannel::GetEventMessageData(channel_message.get(), &data, &size);
411+
bool result =
412+
NodeChannel::GetEventMessageData(*channel_message, &data, &size);
413+
DCHECK(result);
412414
message_event->Serialize(data);
413415
}
414416

0 commit comments

Comments
 (0)