Skip to content
This repository has been archived by the owner on Oct 12, 2022. It is now read-only.

[android] FATAL EXCEPTION: decoding JWT token (when installing signed update) #613

Open
miqmago opened this issue Apr 30, 2020 · 12 comments

Comments

@miqmago
Copy link

miqmago commented Apr 30, 2020

Description

Expected a fine restart after download and install succeeded.
All was working fine with [email protected] and started to crash with [email protected]. Really weird because error is raised in native code SignedJWT.parse(jwt).
Crashes after restart and can't start again, entering in a crash loop with following error:

04-30 23:25:31.763 20170-20286/com.app E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
    Process: com.app PID: 20170
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:309)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.NoClassDefFoundError: com.nimbusds.jose.util.Base64URL
        at com.nimbusds.jose.JOSEObject.split(JOSEObject.java:238)
        at com.nimbusds.jwt.SignedJWT.parse(SignedJWT.java:110)
        at com.microsoft.cordova.CodePush.verifyAndDecodeJWT(CodePush.java:176)
        at com.microsoft.cordova.CodePush.access$100(CodePush.java:40)
        at com.microsoft.cordova.CodePush$1.doInBackground(CodePush.java:134)
        at com.microsoft.cordova.CodePush$1.doInBackground(CodePush.java:116)
        at android.os.AsyncTask$2.call(AsyncTask.java:295)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
        at java.lang.Thread.run(Thread.java:818) 

Reproduction

I've tried to place this logs on CodePush.java:

    private Map<String, Object> verifyAndDecodeJWT(String jwt, PublicKey publicKey) throws CodePushException {
        try {
            Log.d("*** HERETHELOG ***", jwt);
            SignedJWT signedJWT = SignedJWT.parse(jwt);
            Log.d("*** HERETHELOG ***", "ok");
            JWSVerifier verifier = new RSASSAVerifier((RSAPublicKey) publicKey);
            if (signedJWT.verify(verifier)) {
                Map<String, Object> claims = signedJWT.getJWTClaimsSet().getClaims();
                Utilities.logMessage("JWT verification succeeded, payload content: " + claims.toString());
                return claims;
            }
            throw new CodePushException("JWT verification failed: wrong signature");
        } catch (Exception e) {
            Log.d("*** HERETHELOG ***", e.getMessage());
            throw new CodePushException(e);
        }
    }

With following result:

04-30 23:33:29.662 20461-20461/com.app I/chromium: [INFO:CONSOLE(157)] "[CodePush] Verifying signature for folder path: /codepush/deploy/versions/64b7d1e211cda8fe7d38d953439437c6483f516279a7cc2e71ed4de90794a801/", source: http://localhost:8100/__ion-dev-server/ion-dev.js?v=3.2.4 (157)
04-30 23:33:29.668 20461-20601/com.appD/*** HERETHELOG ***: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbG...
04-30 23:33:29.670 20461-20601/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.util.Base64>

So it prints first log but not second one neither the third one. Strange thing because SignedJWT.parse(jwt) is inside a try{} catch {} block, but app crashes...

  • I've tried to verify the jwt token with https://jwt.io/ and it seems the token can be parsed, content seems fine and the signature is valid.

  • I've tried to remove cordova-plugin-push and install again with no success.

  • I've tried to remove signature at all, recompile app and it works fine.

Also getting lots of this:

04-30 23:40:56.913 20784-20929/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.util.Base64>
04-30 23:40:56.913 20784-20929/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.util.Base64>
04-30 23:40:56.914 20784-20929/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.util.Base64URL>
04-30 23:40:56.914 20784-20929/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.util.Base64URL>
04-30 23:40:56.914 20784-20929/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.util.Base64URL>
04-30 23:40:56.916 20784-20929/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.Algorithm>
04-30 23:40:56.916 20784-20929/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.Algorithm>
04-30 23:40:56.917 20784-20929/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.Algorithm>
04-30 23:40:56.917 20784-20929/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.JWSAlgorithm>
04-30 23:40:56.917 20784-20929/com.app I/art: Rejecting re-init on previously-failed class java.lang.Class<com.nimbusds.jose.JWSAlgorithm>

I suppose one for each install intent.

Additional Information

  • cordova-plugin-code-push version: 1.12.2

  • List of installed plugins:
    code-push 3.0.1 "CodePushAcquisition"
    cordova-play-services-version-adapter 1.0.2 "Cordova/Ionic Google Play Services Versions Incompatibility Adapter"
    cordova-plugin-advanced-http 2.4.1 "Advanced HTTP plugin"
    cordova-plugin-app-version 0.1.9 "AppVersion"
    cordova-plugin-appcenter-analytics 0.5.1 "App Center Analytics for Cordova"
    cordova-plugin-appcenter-shared 0.5.1 "App Center shared code for Cordova"
    cordova-plugin-apprate 1.5.0 "AppRate"
    cordova-plugin-background-mode 0.7.3 "BackgroundMode"
    cordova-plugin-badge 0.8.8 "Badge"
    cordova-plugin-code-push 1.12.2 "CodePush"
    cordova-plugin-compat 1.2.0 "Compat"
    cordova-plugin-device 2.0.2 "Device"
    cordova-plugin-dialogs 2.0.1 "Notification"
    cordova-plugin-file 6.0.2 "File"
    cordova-plugin-file-transfer 1.6.3 "File Transfer"
    cordova-plugin-geolocation 4.0.2 "Geolocation"
    cordova-plugin-googleplus 7.0.1 "Google SignIn"
    cordova-plugin-health 1.0.5 "Cordova Health"
    cordova-plugin-inappbrowser 3.2.0 "InAppBrowser"
    cordova-plugin-ionic-keyboard 2.1.2 "cordova-plugin-ionic-keyboard"
    cordova-plugin-ionic-webview 4.1.3 "cordova-plugin-ionic-webview"
    cordova-plugin-iosrtc 6.0.9 "iosrtc"
    cordova-plugin-local-notification 0.9.0-beta.2 "LocalNotification"
    cordova-plugin-localization-strings 3.2.1 "Localization"
    cordova-plugin-media 5.0.3 "Media"
    cordova-plugin-nativestorage 2.3.2 "NativeStorage"
    cordova-plugin-network-information 2.0.1 "Network Information"
    cordova-plugin-screen-orientation 3.0.1 "Screen Orientation"
    cordova-plugin-splashscreen 5.0.2 "Splashscreen"
    cordova-plugin-statusbar 2.4.3 "StatusBar"
    cordova-plugin-vibration 3.1.1 "Vibration"
    cordova-plugin-whitelist 1.3.3 "Whitelist"
    cordova-plugin-zip 3.1.0 "cordova-plugin-zip"
    cordova-sqlite-storage 3.2.0 "Cordova sqlite storage plugin - cordova-sqlite-storage plugin version"
    cordova-support-google-services 1.1.0 "cordova-support-google-services"
    es6-promise-plugin 4.2.2 "Promise"
    phonegap-plugin-media-recorder 1.1.0 "Media Recorder"
    phonegap-plugin-media-stream 1.2.1 "MediaStream"
    phonegap-plugin-multidex 1.0.0 "Multidex"
    phonegap-plugin-push 2.2.3 "PushPlugin"

  • Cordova version: android 8.1.0

  • iOS/Android/Windows version: Android 6.0.1

  • Does this reproduce on a debug build or release build? Both build and release

  • Does this reproduce on a simulator, or only on a physical device? Physical device

@miqmago miqmago changed the title FATAL EXCEPTION: decoding JWT token (after installing signed update) [android] FATAL EXCEPTION: decoding JWT token (after installing signed update) May 1, 2020
@miqmago miqmago changed the title [android] FATAL EXCEPTION: decoding JWT token (after installing signed update) [android] FATAL EXCEPTION: decoding JWT token (when installing signed update) May 1, 2020
@dpogue
Copy link
Contributor

dpogue commented May 20, 2020

This also just started affecting one of my apps, did a CodePush update over the weekend and woke up to a tonne of crash reports and angry users.

It appears to be caused by the changes in #601
Downgrading the CodePush plugin to 1.12.1 works.

This is a pretty major issue, and it's rather disappointing that changes get released with apparently no testing on actual devices.
/cc @ahdbilal

@nakedgun
Copy link

Same issue. As @dpogue said, the only fix was downgrading to 1.12.1.

@alexandergoncharov-zz
Copy link
Contributor

Hi all,
Thanks for reporting!

Unfortunately, I can't reproduce this issue. Could you please provide some demo app with reproducing issue and reprosteps? I would like to reproduce and investigate it.

@jacksonkr
Copy link

@alexandergoncharov I can also validate via #648

@Krasavinigor
Copy link
Contributor

Hi there!
Sorry for the late response. Unfortunately, now we should slow down supporting. For more info, please check #666.

For this issue we created a new branch with a workaround: https://github.com/microsoft/cordova-plugin-code-push/tree/fix-signed-bundles-crashes. To install the latest version from this branch, you can use:
npm install https://github.com/microsoft/cordova-plugin-code-push.git#fix-signed-bundles-crashes

Thanks,
Igor

@brassier
Copy link

@Krasavinigor - Can you explain why this was done with a new branch, as opposed to an update to the main repo and a new release/update? Is this something that only impacts some apps, and thus only some people will need this new branch?

@Krasavinigor
Copy link
Contributor

Hi @brassier! Sorry for the late response.
I created a new branch because it's only a workaround for fixing the signed issue. Now some customers have an issue with signing updates for Cordova/Ionic apps. The reason is PR: 601. But this PR also fixes another issue Bug: 600, which affected a few customers. So, this branch doesn't contain a full fix for both issues. Now we're making service more stable and don't have much time for developing and resolving these issues.

Thanks,
Igor

@ludufre
Copy link

ludufre commented Jan 11, 2021

Since #601 I have to undo that changes every re-add Android platform...

@jacksonkr
Copy link

@Krasavinigor I typically use cordova plug add [plugin name] to install my plugins. How can I go about installing the plugin by using this specific branch instead ? Cheers

@Krasavinigor
Copy link
Contributor

@jacksonkr cordova plugin add https://github.com/microsoft/cordova-plugin-code-push.git#fix-signed-bundles-crashes

@jacksonkr
Copy link

jacksonkr commented Jan 26, 2021

The fix-signed-bundles-crashes branch works for android but I'm still having issues with iOS

Specifically I'm getting the xcode output of
Failed to load webpage with error: unsupported URL
which is talking about CDVWKWebViewEngine+CodePush.m line 103
I logged the request's url and it came out as nil so I'm not exactly sure what's going on. Any ideas ?

@ss-dc
Copy link

ss-dc commented Oct 13, 2021

Hi,

Was there any further update on this issue? I am facing the same with the latest version.

Following is my plugin list.

    "code-push": "^3.0.1",

    "cordova-android": "^9.1.0",
    "cordova-plugin-actionsheet": "^2.3.3",
    "cordova-plugin-advanced-http": "^3.2.1",
    "cordova-plugin-androidx": "^3.0.0",
    "cordova-plugin-androidx-adapter": "^1.1.3",
    "cordova-plugin-appcenter-analytics": "^0.5.1",
    "cordova-plugin-appcenter-crashes": "^0.5.1",
    "cordova-plugin-appcenter-shared": "^0.5.1",
    "cordova-plugin-apprate": "^1.7.2",
    "cordova-plugin-chooser": "^1.3.2",
    "cordova-plugin-code-push": "^2.0.0",
    "cordova-plugin-device": "^2.0.3",
    "cordova-plugin-dialogs": "^2.0.2",
    "cordova-plugin-enable-multidex": "^0.2.0",
    "cordova-plugin-fcm-with-dependecy-updated": "^7.8.0",
    "cordova-plugin-file": "^6.0.2",
    "cordova-plugin-file-opener2": "^3.0.5",
    "cordova-plugin-fingerprint-aio": "^4.0.2",
    "cordova-plugin-firebase-analytics": "^6.0.1",
    "cordova-plugin-firebase-dynamiclinks": "^6.0.1",
    "cordova-plugin-geolocation": "^4.1.0",
    "cordova-plugin-googlemaps": "^2.7.1",
    "cordova-plugin-inappbrowser": "^5.0.0",
    "cordova-plugin-nativestorage": "^2.3.2",
    "cordova-plugin-splashscreen": "^6.0.0",
    "cordova-plugin-statusbar": "^2.4.3",
    "cordova-plugin-uniquedeviceid": "^1.3.2",
    "cordova-plugin-whitelist": "^1.3.5",
    "cordova-plugin-x-socialsharing": "^6.0.3",
    "cordova-plugin-zip": "^3.1.0",
    "cordova-support-android-plugin": "^1.0.2",
    "cordova.plugins.diagnostic": "^6.0.4",
    "es6-promise-plugin": "^4.2.2",
    "phonegap-plugin-barcodescanner": "^8.1.0",
    "skwas-cordova-plugin-datetimepicker": "^2.1.2"

Exception from android studio:

2021-10-13 13:30:10.839 12710-12913/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.dotconnect.dev1, PID: 12710
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$4.done(AsyncTask.java:415)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/nimbusds/jose/util/Base64;
        at com.nimbusds.jwt.SignedJWT.parse(SignedJWT.java:110)
        at com.microsoft.cordova.CodePush.verifyAndDecodeJWT(CodePush.java:174)
        at com.microsoft.cordova.CodePush.access$100(CodePush.java:39)
        at com.microsoft.cordova.CodePush$1.doInBackground(CodePush.java:133)
        at com.microsoft.cordova.CodePush$1.doInBackground(CodePush.java:115)
        at android.os.AsyncTask$3.call(AsyncTask.java:394)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:923) 
     Caused by: java.lang.ClassNotFoundException: com.nimbusds.jose.util.Base64
        at java.lang.VMClassLoader.findLoadedClass(Native Method)
        at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:738)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:363)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.nimbusds.jwt.SignedJWT.parse(SignedJWT.java:110) 
        at com.microsoft.cordova.CodePush.verifyAndDecodeJWT(CodePush.java:174) 
        at com.microsoft.cordova.CodePush.access$100(CodePush.java:39) 
        at com.microsoft.cordova.CodePush$1.doInBackground(CodePush.java:133) 
        at com.microsoft.cordova.CodePush$1.doInBackground(CodePush.java:115) 
        at android.os.AsyncTask$3.call(AsyncTask.java:394) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:923) 
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lnet/minidev/json/JSONAware;
        at com.nimbusds.jwt.SignedJWT.parse(SignedJWT.java:110) 
        at com.microsoft.cordova.CodePush.verifyAndDecodeJWT(CodePush.java:174) 
        at com.microsoft.cordova.CodePush.access$100(CodePush.java:39) 
        at com.microsoft.cordova.CodePush$1.doInBackground(CodePush.java:133) 
        at com.microsoft.cordova.CodePush$1.doInBackground(CodePush.java:115) 
        at android.os.AsyncTask$3.call(AsyncTask.java:394) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:923) 
     Caused by: java.lang.ClassNotFoundException: Didn't find class "net.minidev.json.JSONAware" on path: DexPathList[[zip file "/data/app/~~yt_VGZXd4Vd2lHmlWYpxug==/com.dotconnect.dev1-QUIO9Jx4iXpO3PSBxXE1Dg==/base.apk"],nativeLibraryDirectories=[/data/app/~~yt_VGZXd4Vd2lHmlWYpxug==/com.dotconnect.dev1-QUIO9Jx4iXpO3PSBxXE1Dg==/lib/arm64, /data/app/~~yt_VGZXd4Vd2lHmlWYpxug==/com.dotconnect.dev1-QUIO9Jx4iXpO3PSBxXE1Dg==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64, /product/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.nimbusds.jwt.SignedJWT.parse(SignedJWT.java:110) 
        at com.microsoft.cordova.CodePush.verifyAndDecodeJWT(CodePush.java:174) 
        at com.microsoft.cordova.CodePush.access$100(CodePush.java:39) 
        at com.microsoft.cordova.CodePush$1.doInBackground(CodePush.java:133) 
        at com.microsoft.cordova.CodePush$1.doInBackground(CodePush.java:115) 
        at android.os.AsyncTask$3.call(AsyncTask.java:394) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:923) 

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

9 participants