Skip to content

Commit 464ee9f

Browse files
committed
fix: skip system uid when trying to get non-exist key
1 parent 63d85d6 commit 464ee9f

File tree

4 files changed

+33
-8
lines changed

4 files changed

+33
-8
lines changed

module/template/keybox.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0"?>
22
<AndroidAttestation>
3-
<NumberOfKeyboxes>1</NumberOfKeyboxes>
3+
<NumberOfKeyboxes>2</NumberOfKeyboxes>
44
<Keybox DeviceID="sw">
55
<Key algorithm="ecdsa">
66
<PrivateKey format="pem">

service/src/main/java/io/github/a13e300/tricky_store/KeystoreInterceptor.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,31 @@ object KeystoreInterceptor : BinderInterceptor() {
7575
return Skip
7676
}
7777

78-
val response = if (omk != null) {
79-
omk.getKeyEntry(ctx, descriptor)
80-
} else {
81-
Cache.getKeyResponse(callingUid, descriptor.alias)
78+
val p = Parcel.obtain()
79+
80+
if (omk != null) {
81+
val response = omk.getKeyEntry(ctx, descriptor)
82+
p.writeNoException()
83+
p.writeTypedObject(response, 0)
84+
return OverrideReply(0, p)
8285
}
8386

84-
val p = Parcel.obtain()
87+
val response =
88+
Cache.getKeyResponse(callingUid, descriptor.alias)
89+
8590
if (response != null) {
8691
Logger.i("generate key for uid=$callingUid alias=${descriptor.alias}")
8792
p.writeNoException()
8893
p.writeTypedObject(response, 0)
8994
} else {
9095
Logger.d("key not found for uid=$callingUid alias=${descriptor.alias}")
96+
// We skip system uid requests because tricky store obviously does not store every keys
97+
// and it may cause issues with system services expecting certain keys to be present.
98+
// like lockscreen keys.
99+
if (callingUid == 1000) {
100+
Logger.d("system uid requesting generated key alias=${descriptor.alias}")
101+
return Skip
102+
}
91103
p.writeException(
92104
ServiceSpecificException(
93105
ResponseCode.KEY_NOT_FOUND,

service/src/main/java/io/github/a13e300/tricky_store/SecurityLevelInterceptor.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,19 @@ class SecurityLevelInterceptor(
252252
return OverrideReply(0, p)
253253
}
254254
}
255+
256+
deleteKeyTransaction -> runCatching {
257+
data.enforceInterface(IKeystoreSecurityLevel.DESCRIPTOR)
258+
val key = data.readTypedObject(KeyDescriptor.CREATOR) ?: return Skip
259+
260+
if (securityLevel != null) {
261+
securityLevel.deleteKey(key)
262+
263+
val p = Parcel.obtain()
264+
p.writeNoException()
265+
return OverrideReply(0, p)
266+
}
267+
}
255268
}
256269
return Skip
257270
}

service/src/main/java/io/github/a13e300/tricky_store/binder/BinderInterceptor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ open class BinderInterceptor : Binder() {
7575
val theCode = data.readInt()
7676
val theFlags = data.readInt()
7777
val callingUid = data.readInt()
78-
val callingSid = data.readString()
78+
// val callingSid = data.readString()
7979
val callingPid = data.readInt()
8080
val resultCode = data.readInt()
8181
val theData = Parcel.obtain()
@@ -94,7 +94,7 @@ open class BinderInterceptor : Binder() {
9494
val ctx = CallerInfo().apply {
9595
this.callingUid = callingUid.toLong()
9696
this.callingPid = callingPid.toLong()
97-
this.callingSid = callingSid
97+
this.callingSid = "reserved"
9898
}
9999

100100
onPostTransact(target, theCode, theFlags, ctx, theData, if (sz2 == 0) null else theReply, resultCode)

0 commit comments

Comments
 (0)