Commit 2bb383a1 authored by Xinghui Lu's avatar Xinghui Lu Committed by Commit Bot

Synchronous implementation of CSD allowlist check on Android

Before allowlist is available from GmsCore, we plan to have it
hardcoded in our code. This call is synchronous for now,
since it gets result directly instead of a IPC call.

I will have a follow up CL for Async implementation.

Bug: 999344
Change-Id: Ide3b7de83f0e32c5be8ac657369ce9f95a848f7b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1776601
Commit-Queue: Xinghui Lu <xinghuilu@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarVarun Khaneja <vakh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#694876}
parent afb0a7da
...@@ -51,7 +51,6 @@ import org.chromium.base.test.util.FlakyTest; ...@@ -51,7 +51,6 @@ import org.chromium.base.test.util.FlakyTest;
import org.chromium.base.test.util.InMemorySharedPreferences; import org.chromium.base.test.util.InMemorySharedPreferences;
import org.chromium.components.safe_browsing.SafeBrowsingApiBridge; import org.chromium.components.safe_browsing.SafeBrowsingApiBridge;
import org.chromium.components.safe_browsing.SafeBrowsingApiHandler; import org.chromium.components.safe_browsing.SafeBrowsingApiHandler;
import org.chromium.components.safe_browsing.SafeBrowsingApiHandler.Observer;
import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.Criteria;
...@@ -194,6 +193,11 @@ public class SafeBrowsingTest { ...@@ -194,6 +193,11 @@ public class SafeBrowsingTest {
callbackId, SafeBrowsingResult.SUCCESS, metadata, CHECK_DELTA_US)); callbackId, SafeBrowsingResult.SUCCESS, metadata, CHECK_DELTA_US));
// clang-format on // clang-format on
} }
@Override
public boolean startAllowlistLookup(final String uri, int[] threatsOfInterest) {
return false;
}
} }
/** /**
......
...@@ -11,7 +11,6 @@ import org.json.JSONObject; ...@@ -11,7 +11,6 @@ import org.json.JSONObject;
import org.chromium.base.annotations.UsedByReflection; import org.chromium.base.annotations.UsedByReflection;
import org.chromium.base.task.PostTask; import org.chromium.base.task.PostTask;
import org.chromium.components.safe_browsing.SafeBrowsingApiHandler; import org.chromium.components.safe_browsing.SafeBrowsingApiHandler;
import org.chromium.components.safe_browsing.SafeBrowsingApiHandler.Observer;
import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.UiThreadTaskTraits;
import java.util.HashMap; import java.util.HashMap;
...@@ -62,6 +61,11 @@ public class MockSafeBrowsingApiHandler implements SafeBrowsingApiHandler { ...@@ -62,6 +61,11 @@ public class MockSafeBrowsingApiHandler implements SafeBrowsingApiHandler {
// clang-format on // clang-format on
} }
@Override
public boolean startAllowlistLookup(final String uri, int[] threatsOfInterest) {
return false;
}
private String getMetadata(String uri, int[] threatsOfInterest) { private String getMetadata(String uri, int[] threatsOfInterest) {
if (mResponseMap.containsKey(uri)) { if (mResponseMap.containsKey(uri)) {
try { try {
......
...@@ -81,6 +81,18 @@ public final class SafeBrowsingApiBridge { ...@@ -81,6 +81,18 @@ public final class SafeBrowsingApiBridge {
} }
} }
/**
* TODO(crbug.com/995926): Make this call async
* Starts a Safe Browsing Allowlist check.
*
* If the uri is in the allowlist, return true. Otherwise, return false.
*/
@CalledByNative
private static boolean startAllowlistLookup(
SafeBrowsingApiHandler handler, String uri, int[] threatsOfInterest) {
return handler.startAllowlistLookup(uri, threatsOfInterest);
}
private static native boolean nativeAreLocalBlacklistsEnabled(); private static native boolean nativeAreLocalBlacklistsEnabled();
private static native void nativeOnUrlCheckDone( private static native void nativeOnUrlCheckDone(
long callbackId, int resultStatus, String metadata, long checkDelta); long callbackId, int resultStatus, String metadata, long checkDelta);
......
...@@ -71,4 +71,20 @@ public interface SafeBrowsingApiHandler { ...@@ -71,4 +71,20 @@ public interface SafeBrowsingApiHandler {
* This is called on every URL resource Chrome loads, on the same sequence as |init|. * This is called on every URL resource Chrome loads, on the same sequence as |init|.
*/ */
public void startUriLookup(long callbackId, String uri, int[] threatsOfInterest); public void startUriLookup(long callbackId, String uri, int[] threatsOfInterest);
/**
* Start a check to determine if a uri is in a set of allowlists. If true, password protection
* service will assume the url to be safe and skip it. This feature is not applicable to Android
* Webview, because there is no saved password or GAIA password in AW.
*
* @param uri The uri from a password protection event(user focuses on password form
* * or user reuses their password)
* @param threatsOfInterest determines the type of allowlists that the uri will be matched to.
*
* @return true if the uri is found in the set of allowlists. Otherwise, false.
*/
// TODO(xinghuilu@): remove default once downstream implementation is patched
default boolean startAllowlistLookup(String uri, int[] threatsOfInterest) {
return false;
}
} }
...@@ -271,8 +271,17 @@ bool RemoteSafeBrowsingDatabaseManager::CheckUrlForSubresourceFilter( ...@@ -271,8 +271,17 @@ bool RemoteSafeBrowsingDatabaseManager::CheckUrlForSubresourceFilter(
AsyncMatch RemoteSafeBrowsingDatabaseManager::CheckCsdWhitelistUrl( AsyncMatch RemoteSafeBrowsingDatabaseManager::CheckCsdWhitelistUrl(
const GURL& url, const GURL& url,
Client* client) { Client* client) {
// TODO(crbug.com/995926): Enable CSD allowlist on Android DCHECK_CURRENTLY_ON(BrowserThread::IO);
return AsyncMatch::NO_MATCH;
// If this URL's scheme isn't supported, call is safe.
if (!CanCheckUrl(url)) {
return AsyncMatch::MATCH;
}
// TODO(crbug.com/995926): Make this call async
SafeBrowsingApiHandler* api_handler = SafeBrowsingApiHandler::GetInstance();
bool is_match = api_handler->StartCSDAllowlistCheck(url);
return is_match ? AsyncMatch::MATCH : AsyncMatch::NO_MATCH;
} }
bool RemoteSafeBrowsingDatabaseManager::MatchDownloadWhitelistString( bool RemoteSafeBrowsingDatabaseManager::MatchDownloadWhitelistString(
......
...@@ -27,6 +27,7 @@ class TestSafeBrowsingApiHandler : public SafeBrowsingApiHandler { ...@@ -27,6 +27,7 @@ class TestSafeBrowsingApiHandler : public SafeBrowsingApiHandler {
void StartURLCheck(std::unique_ptr<URLCheckCallbackMeta> callback, void StartURLCheck(std::unique_ptr<URLCheckCallbackMeta> callback,
const GURL& url, const GURL& url,
const SBThreatTypeSet& threat_types) override {} const SBThreatTypeSet& threat_types) override {}
bool StartCSDAllowlistCheck(const GURL& url) override { return false; }
}; };
} // namespace } // namespace
......
...@@ -36,6 +36,8 @@ class SafeBrowsingApiHandler { ...@@ -36,6 +36,8 @@ class SafeBrowsingApiHandler {
const GURL& url, const GURL& url,
const SBThreatTypeSet& threat_types) = 0; const SBThreatTypeSet& threat_types) = 0;
virtual bool StartCSDAllowlistCheck(const GURL& url) = 0;
virtual ~SafeBrowsingApiHandler() {} virtual ~SafeBrowsingApiHandler() {}
private: private:
......
...@@ -63,6 +63,8 @@ int SBThreatTypeToJavaThreatType(const SBThreatType& sb_threat_type) { ...@@ -63,6 +63,8 @@ int SBThreatTypeToJavaThreatType(const SBThreatType& sb_threat_type) {
return safe_browsing::JAVA_THREAT_TYPE_POTENTIALLY_HARMFUL_APPLICATION; return safe_browsing::JAVA_THREAT_TYPE_POTENTIALLY_HARMFUL_APPLICATION;
case SB_THREAT_TYPE_URL_UNWANTED: case SB_THREAT_TYPE_URL_UNWANTED:
return safe_browsing::JAVA_THREAT_TYPE_UNWANTED_SOFTWARE; return safe_browsing::JAVA_THREAT_TYPE_UNWANTED_SOFTWARE;
case SB_THREAT_TYPE_CSD_WHITELIST:
return safe_browsing::JAVA_THREAT_TYPE_CSD_ALLOWLIST;
default: default:
NOTREACHED(); NOTREACHED();
return 0; return 0;
...@@ -118,8 +120,6 @@ void OnUrlCheckDoneOnIOThread(jlong callback_id, ...@@ -118,8 +120,6 @@ void OnUrlCheckDoneOnIOThread(jlong callback_id,
jint result_status, jint result_status,
const std::string metadata) { const std::string metadata) {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
DVLOG(1) << __FUNCTION__ << ": check: " << callback_id
<< " status: " << result_status << " metadata: [" << metadata << "]";
PendingCallbacksMap* pending_callbacks = GetPendingCallbacksMapOnIOThread(); PendingCallbacksMap* pending_callbacks = GetPendingCallbacksMapOnIOThread();
bool found = base::Contains(*pending_callbacks, callback_id); bool found = base::Contains(*pending_callbacks, callback_id);
...@@ -137,7 +137,6 @@ void OnUrlCheckDoneOnIOThread(jlong callback_id, ...@@ -137,7 +137,6 @@ void OnUrlCheckDoneOnIOThread(jlong callback_id,
CHECK(!callback->is_null()); // Remove after fixing crbug.com/889972 CHECK(!callback->is_null()); // Remove after fixing crbug.com/889972
ReportUmaResult(UMA_STATUS_TIMEOUT); ReportUmaResult(UMA_STATUS_TIMEOUT);
DVLOG(1) << "Safe browsing API call timed-out";
} else { } else {
CHECK(!callback->is_null()); // Remove after fixing crbug.com/889972 CHECK(!callback->is_null()); // Remove after fixing crbug.com/889972
...@@ -162,9 +161,6 @@ void OnUrlCheckDoneOnIOThread(jlong callback_id, ...@@ -162,9 +161,6 @@ void OnUrlCheckDoneOnIOThread(jlong callback_id,
ThreatMetadata threat_metadata; ThreatMetadata threat_metadata;
ReportUmaResult( ReportUmaResult(
ParseJsonFromGMSCore(metadata, &worst_threat, &threat_metadata)); ParseJsonFromGMSCore(metadata, &worst_threat, &threat_metadata));
if (worst_threat != SB_THREAT_TYPE_SAFE) {
DVLOG(1) << "Check " << callback_id << " was a MATCH";
}
std::move(*callback).Run(worst_threat, threat_metadata); std::move(*callback).Run(worst_threat, threat_metadata);
} }
...@@ -195,10 +191,6 @@ void JNI_SafeBrowsingApiBridge_OnUrlCheckDone( ...@@ -195,10 +191,6 @@ void JNI_SafeBrowsingApiBridge_OnUrlCheckDone(
TRACE_EVENT1("safe_browsing", "SafeBrowsingApiHandlerBridge::OnUrlCheckDone", TRACE_EVENT1("safe_browsing", "SafeBrowsingApiHandlerBridge::OnUrlCheckDone",
"metadata", metadata_str); "metadata", metadata_str);
DVLOG(1) << "OnURLCheckDone invoked for check " << callback_id
<< " with status=" << result_status << " and metadata=["
<< metadata_str << "]";
base::PostTask(FROM_HERE, {BrowserThread::IO}, base::PostTask(FROM_HERE, {BrowserThread::IO},
base::BindOnce(&OnUrlCheckDoneOnIOThread, callback_id, base::BindOnce(&OnUrlCheckDoneOnIOThread, callback_id,
result_status, metadata_str)); result_status, metadata_str));
...@@ -215,7 +207,6 @@ SafeBrowsingApiHandlerBridge::~SafeBrowsingApiHandlerBridge() {} ...@@ -215,7 +207,6 @@ SafeBrowsingApiHandlerBridge::~SafeBrowsingApiHandlerBridge() {}
bool SafeBrowsingApiHandlerBridge::CheckApiIsSupported() { bool SafeBrowsingApiHandlerBridge::CheckApiIsSupported() {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (!checked_api_support_) { if (!checked_api_support_) {
DVLOG(1) << "Checking API support.";
j_api_handler_ = base::android::ScopedJavaGlobalRef<jobject>( j_api_handler_ = base::android::ScopedJavaGlobalRef<jobject>(
Java_SafeBrowsingApiBridge_create(AttachCurrentThread())); Java_SafeBrowsingApiBridge_create(AttachCurrentThread()));
checked_api_support_ = true; checked_api_support_ = true;
...@@ -235,7 +226,6 @@ std::string SafeBrowsingApiHandlerBridge::GetSafetyNetId() { ...@@ -235,7 +226,6 @@ std::string SafeBrowsingApiHandlerBridge::GetSafetyNetId() {
Java_SafeBrowsingApiBridge_getSafetyNetId(env, j_api_handler_); Java_SafeBrowsingApiBridge_getSafetyNetId(env, j_api_handler_);
safety_net_id = safety_net_id =
jsafety_net_id ? ConvertJavaStringToUTF8(env, jsafety_net_id) : ""; jsafety_net_id ? ConvertJavaStringToUTF8(env, jsafety_net_id) : "";
DVLOG(1) << __FUNCTION__ << ": safety_net_id: " << safety_net_id;
} }
return safety_net_id; return safety_net_id;
...@@ -258,7 +248,6 @@ void SafeBrowsingApiHandlerBridge::StartURLCheck( ...@@ -258,7 +248,6 @@ void SafeBrowsingApiHandlerBridge::StartURLCheck(
jlong callback_id = next_callback_id_++; jlong callback_id = next_callback_id_++;
GetPendingCallbacksMapOnIOThread()->insert( GetPendingCallbacksMapOnIOThread()->insert(
{callback_id, std::move(callback)}); {callback_id, std::move(callback)});
DVLOG(1) << "Starting check " << callback_id << " for URL " << url;
DCHECK(!threat_types.empty()); DCHECK(!threat_types.empty());
...@@ -271,4 +260,22 @@ void SafeBrowsingApiHandlerBridge::StartURLCheck( ...@@ -271,4 +260,22 @@ void SafeBrowsingApiHandlerBridge::StartURLCheck(
j_url, j_threat_types); j_url, j_threat_types);
} }
bool SafeBrowsingApiHandlerBridge::StartCSDAllowlistCheck(const GURL& url) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (!CheckApiIsSupported()) {
return false;
}
SBThreatTypeSet threat_types(
CreateSBThreatTypeSet({safe_browsing::SB_THREAT_TYPE_CSD_WHITELIST}));
// TODO(crbug.com/999344): Add UMA metrics
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, url.spec());
ScopedJavaLocalRef<jintArray> j_threat_types =
SBThreatTypeSetToJavaArray(env, threat_types);
return Java_SafeBrowsingApiBridge_startAllowlistLookup(env, j_api_handler_,
j_url, j_threat_types);
}
} // namespace safe_browsing } // namespace safe_browsing
...@@ -32,6 +32,8 @@ class SafeBrowsingApiHandlerBridge : public SafeBrowsingApiHandler { ...@@ -32,6 +32,8 @@ class SafeBrowsingApiHandlerBridge : public SafeBrowsingApiHandler {
const GURL& url, const GURL& url,
const SBThreatTypeSet& threat_types) override; const SBThreatTypeSet& threat_types) override;
bool StartCSDAllowlistCheck(const GURL& url) override;
private: private:
// Creates the |j_api_handler_| if it hasn't been already. If the API is not // Creates the |j_api_handler_| if it hasn't been already. If the API is not
// supported, this will return false and j_api_handler_ will remain nullptr. // supported, this will return false and j_api_handler_ will remain nullptr.
......
...@@ -163,6 +163,8 @@ int GetThreatSeverity(JavaThreatTypes threat_type) { ...@@ -163,6 +163,8 @@ int GetThreatSeverity(JavaThreatTypes threat_type) {
return 3; return 3;
case JAVA_THREAT_TYPE_BILLING: case JAVA_THREAT_TYPE_BILLING:
return 4; return 4;
case JAVA_THREAT_TYPE_CSD_ALLOWLIST:
return 5;
case JAVA_THREAT_TYPE_MAX_VALUE: case JAVA_THREAT_TYPE_MAX_VALUE:
return std::numeric_limits<int>::max(); return std::numeric_limits<int>::max();
} }
......
...@@ -28,6 +28,9 @@ enum JavaThreatTypes { ...@@ -28,6 +28,9 @@ enum JavaThreatTypes {
JAVA_THREAT_TYPE_SOCIAL_ENGINEERING = 5, JAVA_THREAT_TYPE_SOCIAL_ENGINEERING = 5,
JAVA_THREAT_TYPE_SUBRESOURCE_FILTER = 13, JAVA_THREAT_TYPE_SUBRESOURCE_FILTER = 13,
JAVA_THREAT_TYPE_BILLING = 15, JAVA_THREAT_TYPE_BILLING = 15,
// TODO(crbug.com/999344): temp magic number, update once GMSCore is
// available.
JAVA_THREAT_TYPE_CSD_ALLOWLIST = 16,
JAVA_THREAT_TYPE_MAX_VALUE JAVA_THREAT_TYPE_MAX_VALUE
}; };
......
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