summaryrefslogtreecommitdiff
path: root/core/java/android/content/AttributionSource.java
Commit message (Collapse)AuthorAgeFilesLines
* Fix vulnerability in AttributionSource due to incorrect Binder callLokesh Kumar Goel2024-06-231-3/+17
| | | | | | | | | | | | | | | | | | | AttributionSource uses Binder.getCallingUid to verify the UID of the caller from another process. However, getCallingUid does not always behave as expected. If the AttributionSource is unparceled outside a transaction thread, which is quite possible, getCallingUid will return the UID of the current process instead. If this is a system process, the UID check gets bypassed entirely, meaning any uid can be provided. This patch fixes the vulnerability by emptying out the state of the AttributionSource, so that the service checking its credentials will fail to give permission to the app. Bug: 267231571 Test: v2/android-virtual-infra/test_mapping/presubmit-avd (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5d79e535b9a802680062545e15fc1faaf779c0bf) Merged-In: I3f228064fbd62e1c907f1ebe870cb61102f788f0 Change-Id: I3f228064fbd62e1c907f1ebe870cb61102f788f0
* Merge "Validate pid can be trusted" into sc-dev am: 45312b8382 am: fd12e311a2Ganesh Olekar2022-02-051-4/+42
|\ | | | | | | | | | | Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16461958 Change-Id: Ibe87764f679863f20bac59ce237fbabeca29ce26
| * Validate pid can be trustedGanesh Olekar2022-01-131-4/+42
| | | | | | | | | | | | | | Bug: 200288596 Test: Manual Test: atest android.security.cts.AttributionSourceTest#testPidCheck Change-Id: I07f86ba220bedb1393f4d7ed23175e92d4576601
* | Moved AttributionSource related APIs in AttributionSourceEtienne Ruffieux2021-12-151-5/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | Modified myAttributionSource() to check for global AS for process in ActivityThread and fallback to building new AS with PackageManager#getPackageForUid(myUid()) if null. Tag: #feature Bug: 210467846 Bug: 210468546 Test: build Change-Id: I7aa75395469bf0bb806100420faaf98c52057355 CTS-Coverage-Bug: 210906055
* | Use AttributionSource BuilderWilliam Escande2021-09-221-0/+12
|/ | | | | | | | | | | Attribution source constructor are hidden api Add a Builder option to take a AttributionSource as parameter Test: atest BluetoothInstrumentationTests Bug: 195144968 Tag: #refactor Ignore-AOSP-First: No such thing on aosp Change-Id: I901c8afff6a40bd8484fd8e10baf290aa483c280
* Root UID can synthesize AttributionSource values.Jeff Sharkey2021-07-141-1/+2
| | | | | | | | | | We trust any incoming value from the system UID, so we should also trust values coming from the root UID, which includes many shell commands such as "svc". Bug: 193659633 Test: atest BluetoothInstrumentationTests:com.android.bluetooth.btservice.AdapterServiceTest --rerun-until-failure 100 Change-Id: Ied07731345f08fc3c4df465a3773e35c8df7c59a
* Merge "Validate AttributionSource during unparceling." into sc-devTreeHugger Robot2021-07-131-0/+4
|\
| * Validate AttributionSource during unparceling.Jeff Sharkey2021-07-131-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Bluetooth stack is just one example of an application that makes self-calls through public APIs, which makes it very difficult to unconditionally validate AttributionSource arguments. (The AttributionSource is correctly defined the first time a remote caller enters the Bluetooth stack, but we've found many cases where Bluetooth stack calls back into itself without clearing the Binder identity, causing validation chaos.) This change is an attempt at gracefully solving this by performing validation automatically as part of unparceling an AttributionSource the first time it enters a process. This strategy isn't perfect, since transporting an instance inside a Bundle would risk unparceling much later, possibly long after the calling UID information has been discarded. We're rationalizing that this risk doesn't exist since AttributionSource was only added a few months ago, and isn't being used in this way. We still intend to circle back and provide a better strategy in a future release for transporting AttributionSource across AIDL which will handle the nuances of self-calls. Bug: 188391719 Test: atest BluetoothInstrumentationTests Change-Id: I10b198cfcd8f361e19d52f86deb7f10f05fec891
* | Optimize AttributionSource tokens - baseSvet Ganov2021-07-101-3/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For cases where the attribution soruce doesn't need to be registered as trusted we are now using a shares static token since the only purpose of the token in these cases is for watching the source process dying as opposed to that and security for registered cases. bug: 192415943 Test: CtsPermissionTestCases CtsPermission2TestCases CtsPermission3TestCases CtsPermission4TestCases CtsPermission5TestCases Change-Id: I93fde9ca1cacada7929761533dcae11b2736ce1e
* | Tag some "new Binder()" instances to detect leaks.Jeff Sharkey2021-07-071-3/+5
|/ | | | | | | | | | We've seen evidence of a Binder leak, and our hunch is that it's caused by one of these anonymous "new Binder()" sites. Adding descriptors will help us identify the leak cause. Bug: 192415943 Test: atest BluetoothInstrumentationTests Change-Id: I30cd15f084cf50f67edd833b27b853c4b22e1db1
* Switch media fw permissions checks to AttributionSourceSvet Ganov2021-06-011-32/+99
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Attribution source is the abstraction to capture the data flows for private data across apps. Checking permissions for an attribution source does this for all apps in the chain that would receive the data as well as the relevant app ops are checked/noted/started as needed. Teach speech recognition service about attribution chains. If an implementation does nothing the OS would enforce permisisons and do blame as always. This apporach leads to double blaming and doesn't support attribition chains where app calls into the default recognizer which calls into the on device recognizer (this nests recursively). If the implementer takes advantage of the attribution chain mechanims the permissions for the entire chain are checked at mic access time and all apps are blamed only once. Fixed a few bugs around finishing ops for attribution chains. Also ensured that any app death in a started attribution chain would lead to finishing the op for this app bug: 158792096 Test: (added tests for speech reco) atest CtsMediaTestCases atest CtsPermissionTestCases atest CtsPermission2TestCases atest CtsPermission3TestCases atest CtsPermission4TestCases atest CtsPermission5TestCases atest CtsAppOpsTestCases atest CtsAppOps2TestCases Merged-In: Ic92c7adc14bd2d135ac13b96f17a1b393dd562e4 Change-Id: Ic92c7adc14bd2d135ac13b96f17a1b393dd562e4
* Prepare AttributionSource to expose to nativeSvet Ganov2021-05-041-265/+120
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Separate the internal state of AttributionSource from the class to make it a simple AIDL we can translate automatically to native - keeping Java and native parts in sync. This would allow writing a thin native lib for checking attribution source permissions which would be used to teach camera and audio about attributions. Deinfe an AIDL interface for passing around an attribution source and opr performing permission checker oprations allowing native and Java permission checks on attribution chains to be handled. The Java side permission checker functions are in a dedicated permisison checker service on top of which sits the PermissionChecker. We expose similar PermissionChecker native APIs sitting on top of the same remote interface. The nice thing is that we have native and Java permisison checkers in sync sharing remoting code and being close in shape. For now the PermissionChecker in Java is divorced from the PermissionManager but in T we will consider how to unify them, either by an extension object on the PermmissionManager or APIs on the PermissionManager, or another approach, and then migrate clients off the PermissionChecker APIs. Sync app ops were not tracked across multiple binder calls which prevents moving the permission checks in the system server as this adds one more hop. Now sync ops are propagated backed the call stack and only the ops for the package are dispatched to it and the rest are propagated back to the caller, recursively. bug: 158792096 Test: atest CtsPermission5TestCases atest CtsAppOps2TestCases atest CtsPermissionTestCases atest CtsPermission2TestCases atest CtsPermission3TestCases atest CtsPermission4TestCases atest CtsPermission5TestCases Change-Id: Ia5cbd2eb20a2da172a5960afdddd7e467f4bcb0d
* Revert "Prepare AttributionSource to expose to native"Adam Bookatz2021-04-261-120/+265
| | | | | | | | | | | | | Revert "Prepare AttributionSource to expose to native - native" Revert submission 14225527-bug-158792096-04/16/21-1 Reason for revert: b/186467053 Reverted Changes: I16740cc2d:Prepare AttributionSource to expose to native - na... I4e050e78b:Prepare AttributionSource to expose to native Change-Id: I83e4091231241c2211edf5745735f4ee993c6680
* Prepare AttributionSource to expose to nativeSvet Ganov2021-04-251-265/+120
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Separate the internal state of AttributionSource from the class to make it a simple AIDL we can translate automatically to native - keeping Java and native parts in sync. This would allow writing a thin native lib for checking attribution source permissions which would be used to teach camera and audio about attributions. Deinfe an AIDL interface for passing around an attribution source and opr performing permission checker oprations allowing native and Java permission checks on attribution chains to be handled. The Java side permission checker functions are in a dedicated permisison checker service on top of which sits the PermissionChecker. We expose similar PermissionChecker native APIs sitting on top of the same remote interface. The nice thing is that we have native and Java permisison checkers in sync sharing remoting code and being close in shape. For now the PermissionChecker in Java is divorced from the PermissionManager but in T we will consider how to unify them, either by an extension object on the PermmissionManager or APIs on the PermissionManager, or another approach, and then migrate clients off the PermissionChecker APIs. bug: 158792096 Test: atest CtsPermission5TestCases Change-Id: I4e050e78b2361cbf524cc213802e0fef5b487f67
* Refine setRenouncedPermissions() docs.Jeff Sharkey2021-04-211-1/+20
| | | | | | Bug: 182423603 Test: none Change-Id: I3c92a3150d3f22b4ed072a66d6b080e00a7ddabe
* Remove annotations from generated class until tests updatedSvet Ganov2021-04-071-6/+3
| | | | | | | | | | | | | | | | Codegen is a tool that generates parcelable classes from field declarations. Hence, the @SystemApi annotations are placed on the field and the tool propagetes them to the generated APIs. We need to update the AnnotationTest to either ingore these generated classes or ignore private fields annotated with @SystemApi as they are not API in practice. This CL removes the annotations to fix the test. bug: 184086213 Test: atest android.signature.cts.api.AnnotationTest Change-Id: Ibe9059f20d95d4cda4eb402704e3c4c002ff0e47
* Hookup renounced permissionsSvet Ganov2021-04-021-4/+13
| | | | | | | | | | | | | | | | | | | | | | Propagate renounced permissions from context params to the context attribution source. Throw if one tries to request at runtime a renounced permission. Also make the AttributionSource take null for the setters to ease usage, otherwise folks should always check for null before calling a builder method. Additionally, we allow apps that have UPDATE_APP_OPS_STATS to register arbitrary trusted AttributionSource for testing. Note that this permission allows abritrary app op operations, thus we are not relaxing the security model. bug: 158792096 Test: atest CtsPermission5TestCases Change-Id: I4330684bb8695fb998cf31e9363b94ad981ba2cc
* Runtime permission attribution improvementsSvet Ganov2021-03-291-0/+612
When an app is proxying access to runtime permission protected data it needs to check whether the calling app has a permission to the data it is about to proxy which leaves a trace in app ops that the requesting app perofmed a data access. However, then the app doing the work needs to get the protected data itself from the OS which access gets attributed only to itself. As a result there are two data accesses in app ops where only the first one is a proxy one that app A got access to Foo through app B - that is the one we want to show in the permission tracking UIs - and one for the data access - that is the one we would want to blame on the calling app, and in fact, these two accesses should be one - that app A accessed Foo though B. This limitation requires fragile one off workarounds where both accesses use the same attribution tag and sys UI has hardcoded rules to dedupe. Since this is not documented we cannot expect that the ecosystem would reliably do this workaround in apps that that the workaround in the OS would be respected by every OEM. This change adds a mechaism to resolve this issue. It allows for an app to create an attribution context for another app and then any private data access thorugh this context would result in a single app op blame that A accessed Foo though B, i.e. we no longer have double accounting. Also this can be nested through apps, e.g. app A asks app B which asks app C for contacts. In this case app B creates an attribution context for app A and calls into app C which creates an attribution context for app B. When app C gets contacts the entire attribution chain would get a porper, single blame: that C accessed the data, that B got the data from C, and that A got the data form B. Furthermore, this mechanism ensures that apps cannot forget to check permissions for the caller before proxying private data. In our example B and C don't need to check the permisisons for A and B, respectively, since the permisisons for the entire attribution chain are checked before data delivery. Attribution chains are not forgeable preventing a bad actor to create an arbitrary one - each attribution is created by the app it refers to and points to a chain of attributions created by their corresponding apps. This change also fixes a bug where all content provider accesses were double counted in app ops due to double noting. While at this it also fixes that apps can now access their own last ops. There was a bug where one could not pass null getting the attributed ops from a historical package ops while this is a valid use case since if there is no attribution everything is mapped to the null tag. There were some app op APIs not being piped thorough the app ops delegate and by extension through the app ops policy. Also now that we have nice way to express the permission chain in a call we no longer need the special casing in activity manager to handle content provider accesses through the OS. Fixed a bug where we don't properly handle the android.os.shell calls with an invlaid tag which was failing while the shell can do any tag. Finally, to ensure the mechanims is validated and works end-to-end we are adding support for a voice recognizer to blame the client app for the mic access. The recognition service can create a blaming context when opening the mic and if the mic is open, which would do all permission checks, we would not do so again. Since changes to PermissionChercker for handling attribution sources were made the CL also hooks up renounced permissoins in the request permission flow and in the permission checks. bug:158792096 bug:180647319 Test:atest CtsPermissionsTestCases atest CtsPermissions2TestCases atest CtsPermissions3TestCases atest CtsPermissions4TestCases atest CtsPermissions5TestCases atest CtsAppOpsTestCases atest CtsAppOps2TestCases Change-Id: Ib04585515d3dc3956966005ae9d94955b2f3ee08