Skip to content

Commit d97ae01

Browse files
authored
Check sender ID in the Dart Debug Extension (#2289)
1 parent 1e37cc8 commit d97ae01

File tree

5 files changed

+45
-1
lines changed

5 files changed

+45
-1
lines changed

dwds/debug_extension_mv3/web/background.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ Future<void> _handleRuntimeMessages(
6969
expectedType: MessageType.isAuthenticated,
7070
expectedSender: Script.detector,
7171
expectedRecipient: Script.background,
72+
sender: sender,
7273
messageHandler: (String isAuthenticated) async {
7374
final dartTab = sender.tab;
7475
if (dartTab == null) {
@@ -89,6 +90,7 @@ Future<void> _handleRuntimeMessages(
8990
expectedType: MessageType.debugInfo,
9091
expectedSender: Script.detector,
9192
expectedRecipient: Script.background,
93+
sender: sender,
9294
messageHandler: (DebugInfo debugInfo) async {
9395
final dartTab = sender.tab;
9496
if (dartTab == null) {
@@ -118,6 +120,7 @@ Future<void> _handleRuntimeMessages(
118120
expectedType: MessageType.debugStateChange,
119121
expectedSender: Script.debuggerPanel,
120122
expectedRecipient: Script.background,
123+
sender: sender,
121124
messageHandler: (DebugStateChange debugStateChange) {
122125
final newState = debugStateChange.newState;
123126
final tabId = debugStateChange.tabId;
@@ -132,6 +135,7 @@ Future<void> _handleRuntimeMessages(
132135
expectedType: MessageType.debugStateChange,
133136
expectedSender: Script.popup,
134137
expectedRecipient: Script.background,
138+
sender: sender,
135139
messageHandler: (DebugStateChange debugStateChange) {
136140
final newState = debugStateChange.newState;
137141
final tabId = debugStateChange.tabId;
@@ -146,6 +150,7 @@ Future<void> _handleRuntimeMessages(
146150
expectedType: MessageType.multipleAppsDetected,
147151
expectedSender: Script.detector,
148152
expectedRecipient: Script.background,
153+
sender: sender,
149154
messageHandler: (String multipleAppsDetected) async {
150155
final dartTab = sender.tab;
151156
if (dartTab == null) {
@@ -167,6 +172,7 @@ Future<void> _handleRuntimeMessages(
167172
expectedType: MessageType.appId,
168173
expectedSender: Script.copier,
169174
expectedRecipient: Script.background,
175+
sender: sender,
170176
messageHandler: (String appId) {
171177
displayNotification('Copied app ID: $appId');
172178
},

dwds/debug_extension_mv3/web/chrome_api.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ class Runtime {
191191

192192
external String getURL(String path);
193193

194+
external String get id;
195+
194196
// Note: Not checking the lastError when one occurs throws a runtime exception.
195197
external ChromeError? get lastError;
196198

@@ -253,6 +255,7 @@ class MessageSender {
253255
external String? get id;
254256
external Tab? get tab;
255257
external String? get url;
258+
external String? get origin;
256259
external factory MessageSender({String? id, String? url, Tab? tab});
257260
}
258261

dwds/debug_extension_mv3/web/copier.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ void _handleRuntimeMessages(
3232
expectedType: MessageType.appId,
3333
expectedSender: Script.background,
3434
expectedRecipient: Script.copier,
35+
sender: sender,
3536
messageHandler: _copyAppId,
3637
);
3738

dwds/debug_extension_mv3/web/messaging.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:js/js.dart';
1414
import 'chrome_api.dart';
1515
import 'data_serializers.dart';
1616
import 'logger.dart';
17+
import 'utils.dart';
1718

1819
// A default response for the sendResponse callback.
1920
//
@@ -90,9 +91,12 @@ void interceptMessage<T>({
9091
required MessageType expectedType,
9192
required Script expectedSender,
9293
required Script expectedRecipient,
94+
required MessageSender sender,
9395
required void Function(T message) messageHandler,
9496
}) {
9597
if (message == null) return;
98+
if (!_isLegitimateSender(sender)) return;
99+
96100
try {
97101
final decodedMessage = Message.fromJSON(message);
98102
if (decodedMessage.type != expectedType ||
@@ -188,3 +192,31 @@ Future<bool> _sendMessage({
188192
}
189193
return completer.future;
190194
}
195+
196+
// Verify the message sender is our extension.
197+
bool _isLegitimateSender(MessageSender sender) {
198+
// Check that the sender ID matches our extension ID:
199+
if (sender.id != chrome.runtime.id) return false;
200+
201+
final senderUri = Uri.parse(sender.origin ?? '');
202+
final senderHost = senderUri.host;
203+
final isDartAppHost = senderHost == 'localhost' ||
204+
senderHost == '127.0.0.1' ||
205+
_isGoogleHost(senderHost);
206+
final isExtensionOrigin =
207+
senderHost == chrome.runtime.id && senderUri.scheme == 'chrome-extension';
208+
209+
if (isDartAppHost || isExtensionOrigin) return true;
210+
211+
// If the sender's host is unexpected, display an error.
212+
displayNotification(
213+
'Unexpected sender ${sender.origin}. Please file a bug at go/dde-bug or https://github.com/dart-lang/webdev',
214+
isError: true,
215+
);
216+
return false;
217+
}
218+
219+
bool _isGoogleHost(String host) {
220+
const googleSuffices = ['.googlers.com', '.google.com', '.googleprod.com'];
221+
return googleSuffices.any((suffix) => host.endsWith(suffix));
222+
}

dwds/debug_extension_mv3/web/panel.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ void _handleRuntimeMessages(
8989
expectedType: MessageType.debugStateChange,
9090
expectedSender: Script.background,
9191
expectedRecipient: Script.debuggerPanel,
92+
sender: sender,
9293
messageHandler: (DebugStateChange debugStateChange) async {
9394
if (debugStateChange.tabId != _tabId) {
9495
debugWarn(
@@ -107,6 +108,7 @@ void _handleRuntimeMessages(
107108
expectedType: MessageType.connectFailure,
108109
expectedSender: Script.background,
109110
expectedRecipient: Script.debuggerPanel,
111+
sender: sender,
110112
messageHandler: (ConnectFailure connectFailure) async {
111113
debugLog(
112114
'Received connect failure for ${connectFailure.tabId} vs $_tabId',
@@ -185,7 +187,7 @@ Future<void> _maybeUpdateFileABugLink() async {
185187
if (bugLink == null) return;
186188
bugLink.setAttribute(
187189
'href',
188-
'http://b/issues/new?component=775375&template=1791321',
190+
'http://go/dde-bug',
189191
);
190192
}
191193
}

0 commit comments

Comments
 (0)