From b7773ce8751b424b824cdd1e78a95520d124734c Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Thu, 22 Jun 2017 08:22:18 -0700 Subject: [PATCH] Stop loading other package's font by default. Since CONTEXT_RESTRICTED is not a default flag of createPackageContext, we can't rely on it for preventing unexpected font injections. To protect developers and existing apps from a risk of font injection, stop loading font from other package's resouce unless the developer explicitly set CONTEXT_IGNORE_SECURITY. Bug: 62813533 Bug: 62879353 Test: Manually done Merged-In: I4442ddc48dadb5c968b444be86038b602074d301 Change-Id: I4442ddc48dadb5c968b444be86038b602074d301 (cherry picked from commit 6d6cd68660635d670b0cb17f348b7c1da13704b3) --- core/java/android/app/ContextImpl.java | 8 ++++++++ core/java/android/content/Context.java | 6 ++++++ core/java/android/content/ContextWrapper.java | 6 ++++++ core/java/android/widget/TextView.java | 6 +++--- test-runner/src/android/test/mock/MockContext.java | 6 ++++++ 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index a040520ffb9f..318c7ac31522 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -2157,6 +2157,14 @@ class ContextImpl extends Context { } @Override + public boolean canLoadUnsafeResources() { + if (getPackageName().equals(getOpPackageName())) { + return true; + } + return (mFlags & Context.CONTEXT_IGNORE_SECURITY) != 0; + } + + @Override public Display getDisplay() { if (mDisplay == null) { return mResourcesManager.getAdjustedDisplay(Display.DEFAULT_DISPLAY, diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 5929aca0a38f..ef6170359dda 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4681,6 +4681,12 @@ public abstract class Context { public abstract boolean isCredentialProtectedStorage(); /** + * Returns true if the context can load unsafe resources, e.g. fonts. + * @hide + */ + public abstract boolean canLoadUnsafeResources(); + + /** * @hide */ public IBinder getActivityToken() { diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index c719c6474cf1..a9fd58bc950c 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -925,6 +925,12 @@ public class ContextWrapper extends Context { return mBase.isCredentialProtectedStorage(); } + /** {@hide} */ + @Override + public boolean canLoadUnsafeResources() { + return mBase.canLoadUnsafeResources(); + } + /** * @hide */ diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 6b328ea01997..9a924890fcd7 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -913,7 +913,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; case com.android.internal.R.styleable.TextAppearance_fontFamily: - if (!context.isRestricted()) { + if (!context.isRestricted() && context.canLoadUnsafeResources()) { try { fontTypeface = appearance.getFont(attr); } catch (UnsupportedOperationException @@ -1233,7 +1233,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; case com.android.internal.R.styleable.TextView_fontFamily: - if (!context.isRestricted()) { + if (!context.isRestricted() && context.canLoadUnsafeResources()) { try { fontTypeface = a.getFont(attr); } catch (UnsupportedOperationException | Resources.NotFoundException e) { @@ -3417,7 +3417,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Typeface fontTypeface = null; String fontFamily = null; - if (!context.isRestricted()) { + if (!context.isRestricted() && context.canLoadUnsafeResources()) { try { fontTypeface = ta.getFont(R.styleable.TextAppearance_fontFamily); } catch (UnsupportedOperationException | Resources.NotFoundException e) { diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java index ebad81cdda34..5e5ba462cfca 100644 --- a/test-runner/src/android/test/mock/MockContext.java +++ b/test-runner/src/android/test/mock/MockContext.java @@ -816,6 +816,12 @@ public class MockContext extends Context { /** {@hide} */ @Override + public boolean canLoadUnsafeResources() { + throw new UnsupportedOperationException(); + } + + /** {@hide} */ + @Override public IBinder getActivityToken() { throw new UnsupportedOperationException(); } -- 2.11.0