cordova-plugin-code-push icon indicating copy to clipboard operation
cordova-plugin-code-push copied to clipboard

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

Open miqmago opened this issue 4 years ago • 12 comments

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 avatar Apr 30 '20 23:04 miqmago

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 https://github.com/microsoft/cordova-plugin-code-push/pull/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

dpogue avatar May 20 '20 18:05 dpogue

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

nakedgun avatar Aug 13 '20 20:08 nakedgun

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.

alexandergoncharov-zz avatar Aug 27 '20 12:08 alexandergoncharov-zz

@alexandergoncharov I can also validate via https://github.com/microsoft/cordova-plugin-code-push/issues/648

jacksonkr avatar Oct 05 '20 15:10 jacksonkr

Hi there! Sorry for the late response. Unfortunately, now we should slow down supporting. For more info, please check https://github.com/microsoft/cordova-plugin-code-push/issues/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

Krasavinigor avatar Dec 30 '20 11:12 Krasavinigor

@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?

brassier avatar Dec 30 '20 13:12 brassier

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

Krasavinigor avatar Jan 11 '21 11:01 Krasavinigor

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

ludufre avatar Jan 11 '21 21:01 ludufre

@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

jacksonkr avatar Jan 19 '21 20:01 jacksonkr

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

Krasavinigor avatar Jan 20 '21 07:01 Krasavinigor

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 ?

jacksonkr avatar Jan 26 '21 18:01 jacksonkr

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) 

ss-dc avatar Oct 13 '21 16:10 ss-dc