dexter has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/android-apdu-proxy/+/41803?usp=email )


Change subject: OmapiCallbackHandlerVpcd: fix extration of DF-Name (AID)
......................................................................

OmapiCallbackHandlerVpcd: fix extration of DF-Name (AID)

When the DF-Name (AID) is extracted from the SELECT TPDU, the length
of the TPDU is not checked properly, which may lead to an exception
in case no DF-Name (AID) is supplied. Let's put proper length checks
in place to filter corner cases and to ensure that the DF-Name (AID)
is properly extracted in case it is supplied.

Related: OS#6836
Change-Id: Idf08d752d046e012680c872552960cc069272777
---
M app/src/main/java/org/osmocom/androidApduProxy/OmapiCallbackHandlerVpcd.java
1 file changed, 24 insertions(+), 1 deletion(-)



  git pull ssh://gerrit.osmocom.org:29418/android-apdu-proxy 
refs/changes/03/41803/1

diff --git 
a/app/src/main/java/org/osmocom/androidApduProxy/OmapiCallbackHandlerVpcd.java 
b/app/src/main/java/org/osmocom/androidApduProxy/OmapiCallbackHandlerVpcd.java
index 57c5035..8f1d8c7 100644
--- 
a/app/src/main/java/org/osmocom/androidApduProxy/OmapiCallbackHandlerVpcd.java
+++ 
b/app/src/main/java/org/osmocom/androidApduProxy/OmapiCallbackHandlerVpcd.java
@@ -117,8 +117,31 @@
                 //AID is different, we close the OMAPI channel and re-open it 
with the new AID. If this fails, we
                 //we just pretend that we haven't found the file.
                 if (Arrays.equals(Arrays.copyOf(tpdu, 3), 
Utils.h2b("00A404"))) {
-                    byte[] aidReq = Arrays.copyOfRange(tpdu, 5, tpdu.length - 
1);
                     int compareLength = 0;
+
+                    //Make sure that the Lc field of the TPDU does not exceed 
the TPDU length
+                    if (tpdu[4] > tpdu.length - 5) {
+                        Log.e("PROXY", String.format("SELECT by DF-Name with 
invalid length field, rejecting TPDU (%s)...\n",
+                            Utils.b2h(tpdu)));
+                        //see also ISO/IEC 7816-4, table 5 (wrong length; no 
further indication)
+                        return (Utils.h2b("6700"));
+                    }
+
+                    //Extract the DF-Name (AID) from the TPDU.
+                    byte[] aidReq;
+                    if (tpdu[4] > 0) {
+                        //The DF-Name (AID) does not have to represent a full 
AID, a shortened (right truncated) AID
+                        //is sufficient (see also ETSI TS 102 221, section 
11.1.1.2).
+                        aidReq = Arrays.copyOfRange(tpdu, 5, tpdu[4] + 5);
+                    } else {
+                        //ETSI TS 102 221, section 11.1.1.2 vaguely indicates 
that the DF-Name (AID) may also be
+                        //left out entirely. GlobalPlatform Card Specification 
2.1.1, section 9.9.2.3 is more
+                        //concrete. According to GlobalPlatform, the ISD shall 
be selected in case no DF-Name is
+                        //supplied. This is also coherent to Open Mobile API 
Specification – Public Review
+                        //v3.2.0.13, section 4.2.7.8.
+                        aidReq = new byte[0];
+                    }
+
                     if (omapiAid != null) {
                         if (aidReq.length < omapiAid.length)
                             compareLength = aidReq.length;

--
To view, visit https://gerrit.osmocom.org/c/android-apdu-proxy/+/41803?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: android-apdu-proxy
Gerrit-Branch: master
Gerrit-Change-Id: Idf08d752d046e012680c872552960cc069272777
Gerrit-Change-Number: 41803
Gerrit-PatchSet: 1
Gerrit-Owner: dexter <[email protected]>

Reply via email to