Commit f950e9a3 authored by Jochen Eisinger's avatar Jochen Eisinger Committed by Commit Bot

Only log hashes of headers from 1p intents

Bug: 873178
Change-Id: Id0ae7b02ba2d2ecd135331da5649d415033088b4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1936294Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarMartin Šrámek <msramek@chromium.org>
Commit-Queue: Jochen Eisinger <jochen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#719193}
parent 1d47eec0
...@@ -780,6 +780,9 @@ public class IntentHandler { ...@@ -780,6 +780,9 @@ public class IntentHandler {
// We do some logging to determine what kinds of headers developers are inserting. // We do some logging to determine what kinds of headers developers are inserting.
IntentHeadersRecorder recorder = shouldLogHeaders ? new IntentHeadersRecorder() : null; IntentHeadersRecorder recorder = shouldLogHeaders ? new IntentHeadersRecorder() : null;
boolean firstParty = shouldLogHeaders
? IntentHandler.notSecureIsIntentChromeOrFirstParty(intent)
: false;
for (String key : bundleExtraHeaders.keySet()) { for (String key : bundleExtraHeaders.keySet()) {
String value = bundleExtraHeaders.getString(key); String value = bundleExtraHeaders.getString(key);
...@@ -787,7 +790,7 @@ public class IntentHandler { ...@@ -787,7 +790,7 @@ public class IntentHandler {
// Strip the custom header that can only be added by ourselves. // Strip the custom header that can only be added by ourselves.
if ("x-chrome-intent-type".equals(key.toLowerCase(Locale.US))) continue; if ("x-chrome-intent-type".equals(key.toLowerCase(Locale.US))) continue;
if (shouldLogHeaders) recorder.recordHeader(key, value); if (shouldLogHeaders) recorder.recordHeader(key, value, firstParty);
if (!HttpUtil.isAllowedHeader(key, value)) continue; if (!HttpUtil.isAllowedHeader(key, value)) continue;
...@@ -797,9 +800,7 @@ public class IntentHandler { ...@@ -797,9 +800,7 @@ public class IntentHandler {
extraHeaders.append(value); extraHeaders.append(value);
} }
if (shouldLogHeaders) { if (shouldLogHeaders) recorder.report(firstParty);
recorder.report(IntentHandler.notSecureIsIntentChromeOrFirstParty(intent));
}
return extraHeaders.length() == 0 ? null : extraHeaders.toString(); return extraHeaders.length() == 0 ? null : extraHeaders.toString();
} }
......
...@@ -26,8 +26,9 @@ public class IntentHeadersRecorder { ...@@ -26,8 +26,9 @@ public class IntentHeadersRecorder {
/** Determines whether a header is CORS Safelisted or not. */ /** Determines whether a header is CORS Safelisted or not. */
@JNINamespace("chrome::android") @JNINamespace("chrome::android")
/* package */ static class HeaderClassifier { /* package */ static class HeaderClassifier {
/* package */ boolean isCorsSafelistedHeader(String name, String value) { /* package */ boolean isCorsSafelistedHeader(
return IntentHeadersRecorderJni.get().isCorsSafelistedHeader(name, value); String name, String value, boolean firstParty) {
return IntentHeadersRecorderJni.get().isCorsSafelistedHeader(name, value, firstParty);
} }
} }
...@@ -65,9 +66,12 @@ public class IntentHeadersRecorder { ...@@ -65,9 +66,12 @@ public class IntentHeadersRecorder {
} }
/* Records that a HTTP header has been used. */ /* Records that a HTTP header has been used. */
public void recordHeader(String name, String value) { public void recordHeader(String name, String value, boolean firstParty) {
if (mClassifier.isCorsSafelistedHeader(name, value)) mSafeHeaders++; if (mClassifier.isCorsSafelistedHeader(name, value, firstParty)) {
else mUnsafeHeaders++; mSafeHeaders++;
} else {
mUnsafeHeaders++;
}
} }
/** /**
...@@ -102,6 +106,6 @@ public class IntentHeadersRecorder { ...@@ -102,6 +106,6 @@ public class IntentHeadersRecorder {
@NativeMethods @NativeMethods
interface Natives { interface Natives {
boolean isCorsSafelistedHeader(String name, String value); boolean isCorsSafelistedHeader(String name, String value, boolean firstParty);
} }
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.browser; package org.chromium.chrome.browser;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
...@@ -38,8 +39,12 @@ public class IntentHeadersRecorderTest { ...@@ -38,8 +39,12 @@ public class IntentHeadersRecorderTest {
ShadowRecordHistogram.reset(); ShadowRecordHistogram.reset();
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
doReturn(true).when(mClassifier).isCorsSafelistedHeader(eq(SAFE_HEADER), anyString()); doReturn(true)
doReturn(false).when(mClassifier).isCorsSafelistedHeader(eq(UNSAFE_HEADER), anyString()); .when(mClassifier)
.isCorsSafelistedHeader(eq(SAFE_HEADER), anyString(), anyBoolean());
doReturn(false)
.when(mClassifier)
.isCorsSafelistedHeader(eq(UNSAFE_HEADER), anyString(), anyBoolean());
mRecorder = new IntentHeadersRecorder(mClassifier); mRecorder = new IntentHeadersRecorder(mClassifier);
} }
...@@ -58,44 +63,44 @@ public class IntentHeadersRecorderTest { ...@@ -58,44 +63,44 @@ public class IntentHeadersRecorderTest {
@Test @Test
public void safeHeaders_firstParty() { public void safeHeaders_firstParty() {
mRecorder.recordHeader(SAFE_HEADER, ""); mRecorder.recordHeader(SAFE_HEADER, "", true);
mRecorder.report(true); mRecorder.report(true);
assertUma(0, 1, 0, 0, 0, 0); assertUma(0, 1, 0, 0, 0, 0);
} }
@Test @Test
public void safeHeaders_thirdParty() { public void safeHeaders_thirdParty() {
mRecorder.recordHeader(SAFE_HEADER, ""); mRecorder.recordHeader(SAFE_HEADER, "", false);
mRecorder.report(false); mRecorder.report(false);
assertUma(0, 0, 0, 0, 1, 0); assertUma(0, 0, 0, 0, 1, 0);
} }
@Test @Test
public void unsafeHeaders_firstParty() { public void unsafeHeaders_firstParty() {
mRecorder.recordHeader(UNSAFE_HEADER, ""); mRecorder.recordHeader(UNSAFE_HEADER, "", true);
mRecorder.report(true); mRecorder.report(true);
assertUma(0, 0, 1, 0, 0, 0); assertUma(0, 0, 1, 0, 0, 0);
} }
@Test @Test
public void unsafeHeaders_thirdParty() { public void unsafeHeaders_thirdParty() {
mRecorder.recordHeader(UNSAFE_HEADER, ""); mRecorder.recordHeader(UNSAFE_HEADER, "", false);
mRecorder.report(false); mRecorder.report(false);
assertUma(0, 0, 0, 0, 0, 1); assertUma(0, 0, 0, 0, 0, 1);
} }
@Test @Test
public void mixedHeaders_firstParty() { public void mixedHeaders_firstParty() {
mRecorder.recordHeader(SAFE_HEADER, ""); mRecorder.recordHeader(SAFE_HEADER, "", true);
mRecorder.recordHeader(UNSAFE_HEADER, ""); mRecorder.recordHeader(UNSAFE_HEADER, "", true);
mRecorder.report(true); mRecorder.report(true);
assertUma(0, 0, 1, 0, 0, 0); assertUma(0, 0, 1, 0, 0, 0);
} }
@Test @Test
public void mixedHeaders_thirdParty() { public void mixedHeaders_thirdParty() {
mRecorder.recordHeader(SAFE_HEADER, ""); mRecorder.recordHeader(SAFE_HEADER, "", false);
mRecorder.recordHeader(UNSAFE_HEADER, ""); mRecorder.recordHeader(UNSAFE_HEADER, "", false);
mRecorder.report(false); mRecorder.report(false);
assertUma(0, 0, 0, 0, 0, 1); assertUma(0, 0, 0, 0, 0, 1);
} }
......
...@@ -17,16 +17,19 @@ namespace android { ...@@ -17,16 +17,19 @@ namespace android {
jboolean JNI_IntentHeadersRecorder_IsCorsSafelistedHeader( jboolean JNI_IntentHeadersRecorder_IsCorsSafelistedHeader(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jstring>& j_header_name, const JavaParamRef<jstring>& j_header_name,
const JavaParamRef<jstring>& j_header_value) { const JavaParamRef<jstring>& j_header_value,
jboolean is_first_party) {
std::string header_name(ConvertJavaStringToUTF8(env, j_header_name)); std::string header_name(ConvertJavaStringToUTF8(env, j_header_name));
std::string header_value(ConvertJavaStringToUTF8(env, j_header_value)); std::string header_value(ConvertJavaStringToUTF8(env, j_header_value));
if (network::cors::IsCorsSafelistedHeader(header_name, header_value)) if (network::cors::IsCorsSafelistedHeader(header_name, header_value))
return true; return true;
base::UmaHistogramSparse( if (is_first_party) {
"Android.IntentNonSafelistedHeaderNames", base::UmaHistogramSparse(
base::PersistentHash(base::ToLowerASCII(header_name))); "Android.IntentNonSafelistedHeaderNames",
base::PersistentHash(base::ToLowerASCII(header_name)));
}
return false; return false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment