1. 程式人生 > >友盟反饋中發現的這樣的問題,對下文沒有考證,最終對2.3版本通過繞過Parserable 和 serializable方式解決的,留此只做備忘

友盟反饋中發現的這樣的問題,對下文沒有考證,最終對2.3版本通過繞過Parserable 和 serializable方式解決的,留此只做備忘

OVERVIEW
Sending a private serializable subclass as an Intent extra can crash many receivers.


STEPS TO REPRODUCE
1. Send a private serializable subclass as an Intent extra to a receiver that inspects the extras.  For example, try the following sample code:

public class TestActivity extends Activity
{
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);

		startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS).putExtra("serializable", new CustomSerializable()));
	}

	private static final class CustomSerializable implements Serializable
	{
		private static final long serialVersionUID = 1L;
	}
}


RESULTS
Actual behavior: The receiver crashes as soon as it attempts to look at the Intent's extras with a RuntimeException.  This is the trace generated on the Honeycomb emulator

E/AndroidRuntime(  464): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.Settings$WifiSettingsActivity}: java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object (name = com.test.TestActivity$CustomSerializable)
E/AndroidRuntime(  464): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1736)
E/AndroidRuntime(  464): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1752)
E/AndroidRuntime(  464): 	at android.app.ActivityThread.access$1500(ActivityThread.java:123)
E/AndroidRuntime(  464): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993)
E/AndroidRuntime(  464): 	at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  464): 	at android.os.Looper.loop(Looper.java:126)
E/AndroidRuntime(  464): 	at android.app.ActivityThread.main(ActivityThread.java:3997)
E/AndroidRuntime(  464): 	at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  464): 	at java.lang.reflect.Method.invoke(Method.java:491)
E/AndroidRuntime(  464): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
E/AndroidRuntime(  464): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
E/AndroidRuntime(  464): 	at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(  464): Caused by: java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object (name = com.fragment.test.FragmentTestActivity$CustomSerializable)
E/AndroidRuntime(  464): 	at android.os.Parcel.readSerializable(Parcel.java:2026)
E/AndroidRuntime(  464): 	at android.os.Parcel.readValue(Parcel.java:1897)
E/AndroidRuntime(  464): 	at android.os.Parcel.readMapInternal(Parcel.java:2083)
E/AndroidRuntime(  464): 	at android.os.Bundle.unparcel(Bundle.java:215)
E/AndroidRuntime(  464): 	at android.os.Bundle.getBoolean(Bundle.java:787)
E/AndroidRuntime(  464): 	at android.content.Intent.getBooleanExtra(Intent.java:3444)
E/AndroidRuntime(  464): 	at android.preference.PreferenceActivity.onIsHidingHeaders(PreferenceActivity.java:665)
E/AndroidRuntime(  464): 	at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:495)
E/AndroidRuntime(  464): 	at com.android.settings.Settings.onCreate(Settings.java:66)
E/AndroidRuntime(  464): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
E/AndroidRuntime(  464): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1700)
E/AndroidRuntime(  464): 	... 11 more
E/AndroidRuntime(  464): Caused by: java.lang.ClassNotFoundException: com.fragment.test.FragmentTestActivity$CustomSerializable
E/AndroidRuntime(  464): 	at java.lang.Class.classForName(Native Method)
E/AndroidRuntime(  464): 	at java.lang.Class.forName(Class.java:234)
E/AndroidRuntime(  464): 	at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2392)
E/AndroidRuntime(  464): 	at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1742)
E/AndroidRuntime(  464): 	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:755)
E/AndroidRuntime(  464): 	at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1888)
E/AndroidRuntime(  464): 	at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:859)
E/AndroidRuntime(  464): 	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2090)
E/AndroidRuntime(  464): 	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2045)
E/AndroidRuntime(  464): 	at android.os.Parcel.readSerializable(Parcel.java:2020)
E/AndroidRuntime(  464): 	... 21 more
E/AndroidRuntime(  464): Caused by: java.lang.NoClassDefFoundError: com.fragment.test.FragmentTestActivity$CustomSerializable
E/AndroidRuntime(  464): 	... 31 more
E/AndroidRuntime(  464): Caused by: java.lang.ClassNotFoundException: com.fragment.test.FragmentTestActivity$CustomSerializable in loader dalvik.system.PathClassLoader[/system/app/Settings.apk]
E/AndroidRuntime(  464): 	at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:251)
E/AndroidRuntime(  464): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:548)
E/AndroidRuntime(  464): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:508)
E/AndroidRuntime(  464): 	... 31 more


Expected behavior: The expected behavior requires additional design discussion.  At a minimum, the exception should be a ClassNotFoundException rather than a runtime exception.  This would allow all receivers to more easily catch this issue.  However requiring all receivers to implement such try-catch boilerplate might be non-obvious, and perhaps consideration should be given to other solutions.  For example, the extra could simply be suppressed (and logged as a error) similar to how accessing a extras as the wrong type is currently handled (e.g. store a string, try to retrieve a boolean, gets treated as if the boolean simply doesn't exist).


WORKAROUND
When reading the extras, the following can be done to prevent the receiver from crashing
		/*
		 * This is a hack to work around a custom serializable classloader attack. This check must come before any of the Intent
		 * extras are examined.
		 */
		try
		{
			final Bundle extras = intent.getExtras();

			if (extras != null)
			{
				// if a custom serializable subclass exists, this will throw an exception
				extras.containsKey(null);
			}
		}
		catch (final Exception e)
		{
			Log.e("Test", "Custom serializable attack detected; do not send private Serializable subclasses to this receiver", e); //$NON-NLS-1$
			return;
		}


NOTES
This issue reproduces on Droid, Nexus One, Nexus S, etc. running Android 2.2, 2.3.3, and 2.3.2 respectively.  It also reproduces on the Honeycomb emulator.

相關推薦

反饋發現這樣的問題下文沒有考證最終2.3版本通過繞過Parserable serializable方式解決

OVERVIEW Sending a private serializable subclass as an Intent extra can crash many receivers. STEPS TO REPRODUCE 1. Send a private seri

分享的那些坑

友盟整合中的部分問題: 1. 你所訪問的站點在微博認證失敗。。。(umeng Sdk 6.3.0 微博精簡版) Error:redirect_uri_mismatch: 解決方案: 檢查項: 1,Application 中配置: P

統計反饋的新增

在相應的介面新增 匯入#import "UMFeedback.h",以及新增代理 UMFeedbackDataDelegate 在相應的.m檔案裡面加入 //新增友盟反饋     [UMFeedback setLogEnabled:YES];     [UMFeedback checkWithAppkey

JAVA分為基本數據類型及引用數據類型(問題:堆棧的區別系統根據什麽區分堆棧內存)

復雜 復合 小寫 name 布爾 語言 內存空間 結構 抽象 一、基本數據類型: byte:Java中最小的數據類型,在內存中占8位(bit),即1個字節,取值範圍-128~127,默認值0 short:短整型,在內存中占16位,即2個字節,取值範圍-32768~32717

jdbcmysql數據庫操作的簡單封裝--(僅記錄)

nihao lse bin javaee sub getc eva 目的 web-inf 本次使用jdbc中的mysql-connector-java-5.1.47-bin.jar的連接包,下載這個jar包放在javaee項目的WEB-INF/lib目錄下,再把它作為外包j

機器學習的過擬合欠擬合現象以及通過正則化的方式解決

過擬合: 過擬合(over-fitting)是所建的機器學習模型或者是深度學習模型在訓練樣本中表現得過於優越,導致在驗證資料集以及測試資料集中表現不佳的現象。就像上圖中右邊的情況。 過擬合的模型太過具體從而缺少泛化能力,過度的擬合了訓練集中的資料。出現的原因是模型將其中的不重要的變

數字瘦身最後輸出一位數例如:75 7+5=12 1+2=3 最終答案 3

基本 adl using ram static mil ogr string pub 數字瘦身,最後輸出一位數,例如:75 7+5=12 1+2=3 最終答案 3 using System; public class Solution { private

題目:求s=a+aa+aaa+aaaa+aa…a的值其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加)幾個數相加由鍵盤控制。

 先定義為字串型別,字串相加只會增加字串的長度,將兩個字串相連。再轉化成整型相加求和即可。 public class Test8 { public static void main(String[] args) { Scanner s = new Scanner(System

cesium載入飛機模型entity方式primitive方式載入縮放至模型處

<!DOCTYPE html> <html lang="en"> <head> <!-- Use correct character set. --> <meta charset="utf-8"> <!-- T

Redis Desktop Manager 0.9.3 版本下載(官方最新版需要訂閱好像要給錢才行)

下載地址:https://pan.baidu.com/s/1P856NPusJLUSFwQjjPdltA 密碼: 12d3   版本是兩三個月前,我從官網下載的,然後順便存到了我的行動硬碟上。0.9.3.817.exe github 上有 redis destop

a=15b=2,如何不通過其他變數=符號交換a、b的的值

不能通過=符號交換的話,也就是說不能用其他變數去取儲存兩者值了。於是馬上想到了異或運算子:^ a = 15 二進位制:1111 b = 2 二進位制:0010 a = a ^ b = 1101 = 13 b = b ^ a = 1111 = 15 a = a 

作業2.3:求兩個數的最大公約數最小公倍數?

#include<stdio.h> #include<math.h> int fun_y(int,int); int fun_b(int,int); main() { int a,b,gy,gb; printf("輸入兩個整數:\n");

《ServerSuperIO Designer IDE使用教程》-4.增加臺達PLC驅動及使用教程從0到1的改變。釋出:v4.2.3版本

v4.2.3 更新內容:1.優化資料儲存部分,提高效率。2.修復資料庫服務停止造成程式異常退出的現象。3.修復本機沒有串列埠造成無法增加裝置驅動的情況。4.增加編輯裝置和監測點配置資訊功能。5.增加臺達PLC驅動。 v4.2.2 下載地址:官方下載 目      

Spring Boot 2.0版本 Jackson全域性轉化long型別為String解決jackson序列化時long型別缺失精度問題

說明 在傳遞long型別到前臺時,如果long型別的數值比較長,會出現精度丟失的問題。以下是解決辦法。 前提 版本:Spring Boot 2.0及以上 序列化工具Jackson 解決辦法 import org.springframework.boot.aut

喧喧釋出2.3 版本新增多語言支援等功能

   喧喧是由然之協同團隊推出的一款輕量級的開源企業聊天軟體。提供企業內部通訊交流、企業通訊錄、協同辦公通訊交流、企業IM解決方案。喧喧官網: https://xuan.im/ 本次更新增加多語言支援,新增訊息批量分享、傳送程式碼等功能,優化了圖片瀏覽互動體驗,並修復了一些 b

【程式18】 題目:求s = a + aa + aaa + aaaa + aa...a的值其中a是一個數字。例如2 + 22 + 222 + 2222 + 22222(此時 共有5個數相加)幾個數

初試版本 存在的問題:陣列記憶體大小固定,無法動態改變 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> /* 【程式18】 題目:求s = a + aa + aaa + aaaa + aa...a的值,其中a是一個數字。例如

查詢無限整數序列的第n位1,2,3,4,5,6,7,8,9,10,11...

本題源自leetcode  400 ------------------------------------------------------------- 思路:1 1-9 有9 位數,10-99 有180 位。因此我們首先找到這個位數是幾位數。 2 在找到這個數,然後

Linux下安裝python3.62.7版本如何將python改為預設的2.7版本的方法

1、首先要檢視python的安裝路徑:    $ which python查詢的是系統預設的版本(如果安裝了3.6版,那麼這裡顯示的是3.6版本的路徑)    $ which python2.7 查詢的是python2.7版本的路徑(一般預設為/usr/bin/python)

Unity3D 4.2以上版本 Terrain繪製一個下凹(下陷坑)的地形 詳解

由於國內關於Unity3D的書籍大多數都侷限於3.5版本,lynda官網上的教學視訊也是3.5版本的。 但是現在Unity3D已經到4.3版本了。好多介面已經不太想容,教學視訊已然過時。 在Unity 3d 3.5 essential training的教學視訊上說,按住