cordova-plugin-crosswalk-webview - 记录所有 UI 交互 - 包括敏感数据
cordova-plugin-crosswalk-webview - Logging all UI interaction - including sensitive data
这是一个经过编辑的问题 - 已找到问题的根源,因此添加了我自己的答案。
Logcat 几乎输出了与 UI 的所有交互,包括我们在密码框中输入的内容(单词 "password" 的开头以 ** 突出显示):
D/cr_Ime (10392): [ImeAdapter.java:313] showSoftKeyboard
D/cr_Ime (10392): [InputMethodManagerWrapper.java:47] showSoftInput
D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [] [0 0] [-1 -1] [true]
D/cr_Ime (10392): [ImeAdapter.java:387] dispatchKeyEvent: action [0], keycode [44]
D/cr_Ime (10392): [AdapterInputConnection.java:393] sendKeyEvent [0] [44] [112]
D/cr_Ime (10392): [AdapterInputConnection.java:239] updateSelectionIfRequired [1 1] [-1 -1]
D/cr_Ime (10392): [InputMethodManagerWrapper.java:74] updateSelection: SEL [1, 1], COM [-1, -1]
D/cr_Ime (10392): [ImeAdapter.java:253] updateKeyboardVisibility: type [2->2], flags [66], show [false],
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [p] [1 1] [-1 -1] [false]
D/cr_Ime (10392): [ImeAdapter.java:387] dispatchKeyEvent: action [1], keycode [44]
D/cr_Ime (10392): [AdapterInputConnection.java:393] sendKeyEvent [1] [44] [112]
D/cr_Ime (10392): [ImeAdapter.java:387] dispatchKeyEvent: action [0], keycode [29]
D/cr_Ime (10392): [AdapterInputConnection.java:393] sendKeyEvent [0] [29] [97]
D/cr_Ime (10392): [AdapterInputConnection.java:239] updateSelectionIfRequired [2 2] [-1 -1]
D/cr_Ime (10392): [InputMethodManagerWrapper.java:74] updateSelection: SEL [2, 2], COM [-1, -1]
D/cr_Ime (10392): [ImeAdapter.java:253] updateKeyboardVisibility: type [2->2], flags [66], show [false],
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [•a] [2 2] [-1 -1] [false]
D/cr_Ime (10392): [ImeAdapter.java:387] dispatchKeyEvent: action [1], keycode [29]
D/cr_Ime (10392): [AdapterInputConnection.java:393] sendKeyEvent [1] [29] [97]
D/cr_Ime (10392): [ImeAdapter.java:387] dispatchKeyEvent: action [0], keycode [47]
D/cr_Ime (10392): [AdapterInputConnection.java:393] sendKeyEvent [0] [47] [115]
D/cr_Ime (10392): [AdapterInputConnection.java:239] updateSelectionIfRequired [3 3] [-1 -1]
D/cr_Ime (10392): [InputMethodManagerWrapper.java:74] updateSelection: SEL [3, 3], COM [-1, -1]
D/cr_Ime (10392): [ImeAdapter.java:253] updateKeyboardVisibility: type [2->2], flags [66], show [false],
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [••s] [3 3] [-1 -1] [false]
在混音中 sendKeyEvent
还输出按键的 ASCII/UTF 代码。这在 Genymotion 模拟设备和实际设备上都会发生 - 两者都使用发布 apk。在发布模式下,这种行为更加明显 - 仅输出上面的 **'d 日志条目,因此很容易看出密码是什么:
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [p] [3 3] [-1 -1] [false]
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [•a] [3 3] [-1 -1] [false]
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [••s] [3 3] [-1 -1] [false]
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [•••s] [3 3] [-1 -1] [false]
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [••••s] [3 3] [-1 -1] [false]
等等...
经过一番挖掘后,日志记录发生在人行横道核心代码和 Chromium 本机代码之间的某处,这似乎不受您在 Cordova 配置等中设置的日志记录级别的影响。解决方案是使用 ProGuard通过指定删除对这些方法的所有调用是安全的,删除对 android 日志记录方法的引用。建议的配置是:
-keep class ** { *; }
#Remove the logging classes - do not remove e, this has security implications...
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** w(...);
public static *** v(...);
public static *** i(...);
}
-keep class ** { *; }
或多或少保留所有 类 - YMMV,您可能需要更积极的清理以降低 APK 大小。
重要提示
在线帮助建议使用默认的 proguard-android.txt 配置以及您的自定义配置。在大多数情况下,这是一个很好的建议,但不幸的是,对于这个用例,它 包含标志 -dontoptimize
,它禁用了我们需要删除日志记录的 -assumenosideeffects
子句。 这是出乎意料并造成了很多困难 - 我是新手,无法弄清楚我在自定义配置中“出错”的地方,而我正在测试的配置默认情况下是禁用的。
为了解决这个问题,我从构建中删除了对默认 Proguard 配置的引用。gradle:
android {
buildTypes {
release {
minifyEnabled = true
// Original line with our custom proguard-android.pro for reference:
// proguardFile getDefaultProguardFile('proguard-android.txt'), 'proguard-android.pro'
proguardFiles 'proguard-android.pro'
}
}
}
接下来,我复制了默认 Proguard 文件的内容并粘贴到自定义文件的开头,删除了有问题的 -dontoptimize
标志。
这是一个经过编辑的问题 - 已找到问题的根源,因此添加了我自己的答案。 Logcat 几乎输出了与 UI 的所有交互,包括我们在密码框中输入的内容(单词 "password" 的开头以 ** 突出显示):
D/cr_Ime (10392): [ImeAdapter.java:313] showSoftKeyboard
D/cr_Ime (10392): [InputMethodManagerWrapper.java:47] showSoftInput
D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [] [0 0] [-1 -1] [true]
D/cr_Ime (10392): [ImeAdapter.java:387] dispatchKeyEvent: action [0], keycode [44]
D/cr_Ime (10392): [AdapterInputConnection.java:393] sendKeyEvent [0] [44] [112]
D/cr_Ime (10392): [AdapterInputConnection.java:239] updateSelectionIfRequired [1 1] [-1 -1]
D/cr_Ime (10392): [InputMethodManagerWrapper.java:74] updateSelection: SEL [1, 1], COM [-1, -1]
D/cr_Ime (10392): [ImeAdapter.java:253] updateKeyboardVisibility: type [2->2], flags [66], show [false],
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [p] [1 1] [-1 -1] [false]
D/cr_Ime (10392): [ImeAdapter.java:387] dispatchKeyEvent: action [1], keycode [44]
D/cr_Ime (10392): [AdapterInputConnection.java:393] sendKeyEvent [1] [44] [112]
D/cr_Ime (10392): [ImeAdapter.java:387] dispatchKeyEvent: action [0], keycode [29]
D/cr_Ime (10392): [AdapterInputConnection.java:393] sendKeyEvent [0] [29] [97]
D/cr_Ime (10392): [AdapterInputConnection.java:239] updateSelectionIfRequired [2 2] [-1 -1]
D/cr_Ime (10392): [InputMethodManagerWrapper.java:74] updateSelection: SEL [2, 2], COM [-1, -1]
D/cr_Ime (10392): [ImeAdapter.java:253] updateKeyboardVisibility: type [2->2], flags [66], show [false],
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [•a] [2 2] [-1 -1] [false]
D/cr_Ime (10392): [ImeAdapter.java:387] dispatchKeyEvent: action [1], keycode [29]
D/cr_Ime (10392): [AdapterInputConnection.java:393] sendKeyEvent [1] [29] [97]
D/cr_Ime (10392): [ImeAdapter.java:387] dispatchKeyEvent: action [0], keycode [47]
D/cr_Ime (10392): [AdapterInputConnection.java:393] sendKeyEvent [0] [47] [115]
D/cr_Ime (10392): [AdapterInputConnection.java:239] updateSelectionIfRequired [3 3] [-1 -1]
D/cr_Ime (10392): [InputMethodManagerWrapper.java:74] updateSelection: SEL [3, 3], COM [-1, -1]
D/cr_Ime (10392): [ImeAdapter.java:253] updateKeyboardVisibility: type [2->2], flags [66], show [false],
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [••s] [3 3] [-1 -1] [false]
在混音中 sendKeyEvent
还输出按键的 ASCII/UTF 代码。这在 Genymotion 模拟设备和实际设备上都会发生 - 两者都使用发布 apk。在发布模式下,这种行为更加明显 - 仅输出上面的 **'d 日志条目,因此很容易看出密码是什么:
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [p] [3 3] [-1 -1] [false]
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [•a] [3 3] [-1 -1] [false]
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [••s] [3 3] [-1 -1] [false]
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [•••s] [3 3] [-1 -1] [false]
**D/cr_Ime (10392): [AdapterInputConnection.java:174] updateState [••••s] [3 3] [-1 -1] [false]
等等...
经过一番挖掘后,日志记录发生在人行横道核心代码和 Chromium 本机代码之间的某处,这似乎不受您在 Cordova 配置等中设置的日志记录级别的影响。解决方案是使用 ProGuard通过指定删除对这些方法的所有调用是安全的,删除对 android 日志记录方法的引用。建议的配置是:
-keep class ** { *; }
#Remove the logging classes - do not remove e, this has security implications...
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** w(...);
public static *** v(...);
public static *** i(...);
}
-keep class ** { *; }
或多或少保留所有 类 - YMMV,您可能需要更积极的清理以降低 APK 大小。
重要提示
在线帮助建议使用默认的 proguard-android.txt 配置以及您的自定义配置。在大多数情况下,这是一个很好的建议,但不幸的是,对于这个用例,它 包含标志 -dontoptimize
,它禁用了我们需要删除日志记录的 -assumenosideeffects
子句。 这是出乎意料并造成了很多困难 - 我是新手,无法弄清楚我在自定义配置中“出错”的地方,而我正在测试的配置默认情况下是禁用的。
为了解决这个问题,我从构建中删除了对默认 Proguard 配置的引用。gradle:
android {
buildTypes {
release {
minifyEnabled = true
// Original line with our custom proguard-android.pro for reference:
// proguardFile getDefaultProguardFile('proguard-android.txt'), 'proguard-android.pro'
proguardFiles 'proguard-android.pro'
}
}
}
接下来,我复制了默认 Proguard 文件的内容并粘贴到自定义文件的开头,删除了有问题的 -dontoptimize
标志。