Skip to content

Commit 3fd2e5f

Browse files
mikewestDevtools-frontend LUCI CQ
authored andcommitted
[SRI Message Signatures] Add an issue for integrity mismatches.
We're now emitting a devtools issue when blocking a response due to signature-based integrity mismatches. This CL allows devtools to render those issues when they appear. This is the Devtools side of a two-sided patch: 1. (Chromium) https://crrev.com/c/6394978 2. (Devtools) https://crrev.com/c/6396680 [You are here] Bug: 406424762 Change-Id: Iab6817bc42e96ddb080324183c8ba8668b773b41 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6396680 Reviewed-by: Simon Zünd <[email protected]> Commit-Queue: Mike West <[email protected]>
1 parent f8ac7f1 commit 3fd2e5f

File tree

6 files changed

+55
-15
lines changed

6 files changed

+55
-15
lines changed

config/gni/devtools_grd_files.gni

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,7 @@ grd_files_release_sources = [
558558
"front_end/models/issues_manager/descriptions/sriSignatureInputHeaderMissingRequiredParameters.md",
559559
"front_end/models/issues_manager/descriptions/sriSignatureInputHeaderValueMissingComponents.md",
560560
"front_end/models/issues_manager/descriptions/sriSignatureInputHeaderValueNotInnerList.md",
561+
"front_end/models/issues_manager/descriptions/sriValidationFailedIntegrityMismatch.md",
561562
"front_end/models/issues_manager/descriptions/sriValidationFailedInvalidLength.md",
562563
"front_end/models/issues_manager/descriptions/sriValidationFailedSignatureExpired.md",
563564
"front_end/models/issues_manager/descriptions/sriValidationFailedSignatureMismatch.md",

front_end/core/host/UserMetrics.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1131,8 +1131,9 @@ export enum IssueCreated {
11311131
'SRIMessageSignatureIssue::ValidationFailedInvalidLength' = 109,
11321132
'SRIMessageSignatureIssue::ValidationFailedSignatureMismatch' = 110,
11331133
'CorsIssue::LocalNetworkAccessPermissionDenied' = 111,
1134+
'SRIMessageSignatureIssue::ValidationFailedIntegrityMismatch' = 112,
11341135
/* eslint-enable @typescript-eslint/naming-convention */
1135-
MAX_VALUE = 112,
1136+
MAX_VALUE = 113,
11361137
}
11371138

11381139
export const enum DeveloperResourceLoaded {

front_end/models/issues_manager/BUILD.gn

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -216,25 +216,26 @@ devtools_issue_description_files = [
216216
"sharedDictionaryWriteErrorShuttingDown.md",
217217
"sharedDictionaryWriteErrorTooLongIdField.md",
218218
"sharedDictionaryWriteErrorUnsupportedType.md",
219-
"sriMissingSignatureHeader.md",
220-
"sriMissingSignatureInputHeader.md",
221219
"sriInvalidSignatureHeader.md",
222220
"sriInvalidSignatureInputHeader.md",
221+
"sriMissingSignatureHeader.md",
222+
"sriMissingSignatureInputHeader.md",
223+
"sriSignatureHeaderValueIsIncorrectLength.md",
223224
"sriSignatureHeaderValueIsNotByteSequence.md",
224225
"sriSignatureHeaderValueIsParameterized.md",
225-
"sriSignatureHeaderValueIsIncorrectLength.md",
226-
"sriSignatureInputHeaderMissingLabel.md",
227-
"sriSignatureInputHeaderValueNotInnerList.md",
228-
"sriSignatureInputHeaderValueMissingComponents.md",
229-
"sriSignatureInputHeaderInvalidComponentType.md",
230226
"sriSignatureInputHeaderInvalidComponentName.md",
231-
"sriSignatureInputHeaderInvalidHeaderComponentParameter.md",
227+
"sriSignatureInputHeaderInvalidComponentType.md",
232228
"sriSignatureInputHeaderInvalidDerivedComponentParameter.md",
233-
"sriSignatureInputHeaderKeyIdLength.md",
229+
"sriSignatureInputHeaderInvalidHeaderComponentParameter.md",
234230
"sriSignatureInputHeaderInvalidParameter.md",
231+
"sriSignatureInputHeaderKeyIdLength.md",
232+
"sriSignatureInputHeaderMissingLabel.md",
235233
"sriSignatureInputHeaderMissingRequiredParameters.md",
236-
"sriValidationFailedSignatureExpired.md",
234+
"sriSignatureInputHeaderValueMissingComponents.md",
235+
"sriSignatureInputHeaderValueNotInnerList.md",
236+
"sriValidationFailedIntegrityMismatch.md",
237237
"sriValidationFailedInvalidLength.md",
238+
"sriValidationFailedSignatureExpired.md",
238239
"sriValidationFailedSignatureMismatch.md",
239240
"placeholderDescriptionForInvisibleIssues.md",
240241
"fetchingPartitionedBlobURL.md",

front_end/models/issues_manager/SRIMessageSignatureIssue.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ describeWithLocale('SRIMessageSignatureIssue', () => {
4141
Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureExpired,
4242
Protocol.Audits.SRIMessageSignatureError.ValidationFailedInvalidLength,
4343
Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureMismatch,
44+
Protocol.Audits.SRIMessageSignatureError.ValidationFailedIntegrityMismatch,
4445
];
4546
for (const errorReason of errorReasons) {
4647
const issueDetails = {

front_end/models/issues_manager/SRIMessageSignatureIssue.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export const enum IssueCode {
6464
VALIDATION_FAILED_INTEGRITY_MISMATCH = 'SRIMessageSignatureIssue::ValidationFailedIntegrityMismatch',
6565
}
6666

67-
function getIssueCode(details: Protocol.Audits.SRIMessageSignatureIssueDetails): IssueCode {
67+
function errorToIssueCode(details: Protocol.Audits.SRIMessageSignatureIssueDetails): IssueCode {
6868
switch (details.error) {
6969
case Protocol.Audits.SRIMessageSignatureError.MissingSignatureHeader:
7070
return IssueCode.MISSING_SIGNATURE_HEADER;
@@ -111,15 +111,28 @@ function getIssueCode(details: Protocol.Audits.SRIMessageSignatureIssueDetails):
111111
}
112112
}
113113

114+
function generateGroupingIssueCode(details: Protocol.Audits.SRIMessageSignatureIssueDetails): string {
115+
const issueCode = errorToIssueCode(details);
116+
if (details.error === Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureMismatch) {
117+
// Signature mismatch errors should be grouped by "signature base".
118+
return issueCode + details.signatureBase;
119+
}
120+
if (details.error === Protocol.Audits.SRIMessageSignatureError.ValidationFailedIntegrityMismatch) {
121+
// Integrity mismatch errors should be grouped by integrity assertion.
122+
return issueCode + details.integrityAssertions.join();
123+
}
124+
125+
// Otherwise, simply group by issue type:
126+
return issueCode;
127+
}
128+
114129
export class SRIMessageSignatureIssue extends Issue {
115130
readonly #issueDetails: Protocol.Audits.SRIMessageSignatureIssueDetails;
116131

117132
constructor(issueDetails: Protocol.Audits.SRIMessageSignatureIssueDetails, issuesModel: SDK.IssuesModel.IssuesModel) {
118133
super(
119134
{
120-
// Append the signature base to the enum's code in order to prevent
121-
// distinct error details from coalescing in the issues panel.
122-
code: getIssueCode(issueDetails) + issueDetails.signatureBase,
135+
code: generateGroupingIssueCode(issueDetails),
123136
umaCode: [
124137
Protocol.Audits.InspectorIssueCode.SRIMessageSignatureIssue,
125138
issueDetails.error,
@@ -151,6 +164,10 @@ export class SRIMessageSignatureIssue extends Issue {
151164
}
152165
if (this.#issueDetails.signatureBase !== '') {
153166
description.substitutions = new Map([['PLACEHOLDER_signatureBase', () => this.#issueDetails.signatureBase]]);
167+
} else if (this.#issueDetails.integrityAssertions.length) {
168+
description.substitutions = new Map([
169+
['PLACEHOLDER_integrityAssertions', () => '\n<li>' + this.#issueDetails.integrityAssertions.join('\n<li>')]
170+
]);
154171
}
155172
return resolveLazyDescription(description);
156173
}
@@ -308,6 +325,13 @@ const issueDescriptions = new Map<Protocol.Audits.SRIMessageSignatureError, Lazy
308325
links: specLinks,
309326
},
310327
],
328+
[
329+
Protocol.Audits.SRIMessageSignatureError.ValidationFailedIntegrityMismatch,
330+
{
331+
file: 'sriValidationFailedIntegrityMismatch.md',
332+
links: specLinks,
333+
},
334+
],
311335
[
312336
Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureMismatch,
313337
{
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Integrity verification failed.
2+
3+
The signature associated with a response could be successfully verified, but the
4+
public keys asserted in the [`signature-input`](signatureInputHeader)
5+
header's [`keyid` parameter](signatureParameters) do not match the integrity
6+
assertions made by the request's initiator. Verificiation failed.
7+
8+
The following are the keys specified by the request's initiator:
9+
10+
<ul>
11+
{PLACEHOLDER_integrityAssertions}
12+
</ul>

0 commit comments

Comments
 (0)