SlideShare a Scribd company logo
1 of 92
Download to read offline
おばあちゃんの古いハンドバッグ	
古いライブラリがAndroidアプリの	
セキュリティを壊す仕組み	(Dra+	2)	
Marc	Schoenefeld	@	PacSec	Tokyo	2017
概要	
•  Androidアプリのストアには様々な言語やフレームワークで書かれ
たアプリケーションがあふれている	
•  パフォーマンスと先端的機能の最適化のためには、C/C++で書か
れた特別なコンポーネントを使用することが最善である	
•  しかし、力の増加は責任の増加でもあり、インポートされたサード
パーティライブラリは時間とともに劣化し、インストール済みアプリ
をセキュリティの悪夢に変えることがある	
•  OWASPでもこのシナリオをトップ10リストの「既知の脆弱性を持つ
コンポーネントの使用」に位置付けている	
	
	
Grandma's	old	handbag	/	M	Schoenefeld		 2
概要	
•  我々の研究では理論から実践に切り替え、ダウンロード数の多い
著名アプリのサンプルを調査した	
•  2017年の大手ベンダーであっても、残念なことによく知られている
セキュリティ上の問題を抱えたまま様々なアプリを出荷しており、
その中には毎週のように機能面を更新しているものもあるが、古
いサードパーティのネイティブ/マネージドコードのライブラリを
(CVSS	10の脆弱性があっても)を裏側にそのまま残している	
•  このプレゼンテーションでは、これらやユーザーに危険を及ぼす可
能性のあるAndroidプログラミングのアンチパターン、推奨事例や
実際の例を採り上げる	
Grandma's	old	handbag	/	M	Schoenefeld		 3
講演者 	
•  Marc	Schönefeld	
–  Holds	a		
•  バンベルグ大学コンピューターサイエンスのDe.	rer.	nat.	
•  ミュンスター大学ビジネス情報学 マスター	
–  著名なカンファレンスでのセキュリティに関する講演やトレーニング	
Javaの講演やトレーニング、AndroidおよびUndxのリバーシング、Web
フォントのセキュリティ	
@	PacSec,	CanSecWest,	Blackhat,	HackInTheBox,	RSA,	J1,	Xcon,		…		
–  ブラウザやOSの問題点の報告	
•  Chrome,	Firefox,	Safari,	…			
–  USがベースの多国籍コンピュータ技術会社での日々が好き	
•  ただし、この発表は個人としての意見である	
Grandma's	old	handbag	/	M	Schoenefeld		 4
ANDROIDアプリの監査	
おばあちゃんの古いハンドバッグ	
Grandma's	old	handbag	/	M	Schoenefeld		 5
Android	エコシステム	
•  Android		
– オープンソースのプラットフォーム	
– モバイル、組み込み、ウェアラブルデバイス向け	
– おもにGoogleによってメンテナンスされている	
– 製造業者が自分たちのデバイスにあわせてカス
タマイズ可能	
– アプリの標準的な配布としてPlayストアを使用	
Grandma's	old	handbag	/	M	Schoenefeld		 6
Android	エコシステム	
[h]ps://source.android.com/security/images/android_so+ware_stack.png]	
Grandma's	old	handbag	/	M	Schoenefeld		 7	
アプリケーション	
Android	
フレームワーク	
ネイティブライブラリ	 Androidランタイム	
Linux	
カーネル
Android	エコシステム	
APKs		
	
DEX	classes	in	android.*	
C,	C++	コード,	ネイティブのプラットフォーム (x86,	arm,...)向けに	
コンパイルされたコード ,	通常はJNI経由でアクセス可能	
ネイティブプラットフォーム向けのCコード	
Grandma's	old	handbag	/	M	Schoenefeld		 8
調査の焦点	
•  ネイティブコードに焦点をあてる	
•  Andoroidアプリはマネージドコード(DEX)の制限を回避
するためにネイティブコードを使用する	
–  ハードウェアへのアクセス、例えば特定の操作など	
–  パフォーマンスの改善	
–  カプセル化	
•  より大きな攻撃面のコスト	
–  C,	C++	は明示的なメモリの管理やバッファオーバーフロー
などを招く	
Grandma's	old	handbag	/	M	Schoenefeld		 9
歴史の振り返り	
•  Exec	Code	Master	Key	
–  Android	1.6	through	4.2		does	not	properly	check	cryptographic	signatures	for	applicajons,	which	allows	a]ackers	to	execute	arbitrary	code	via	an	applicajon	package	file	(APK)	that	is	modified	in	a	way	
that	does	not	violate	the	cryptographic	signature,	probably	involving	muljple	entries	in	a	Zip	file	with	the	same	name	in	which	one	entry	is	validated	but	the	other	entry	is	installed,	aka	Android	security	
bug	8219321	and	the	"Master	Key"	vulnerability.	
•  Exec	Code	Overflow	
–  Andoroid	2.2.2までおよび2.3.6までのlibsysujlsにスタックベースのバッファオーバーフローにより、アプリケーションがFrameworkListener::dispatchCommandメソッドを間違った数の引数で呼び出すこと
で、use-a+er-freeを引き起こすzegRushのデモのように、ユーザーが補助したリモートの攻撃者がリモートでのコード実行が可能になる	
•  Privacy	
–  Android	Picasa	in	Android	3.0	and	2.x	through	2.3.4	uses	a	cleartext	HTTP	session	when	transmirng	the	authToken	obtained	from	ClientLogin,	which	allows	remote	a]ackers	to	gain	privileges	and	access	
private	pictures	and	web	albums	by	sniffing	the	token	from	connecjons	with	picasaweb.google.com.	
•  DoS	WebView	
–  Disney	Mobiole、eAccess、KDDI、NTT	DoCoMo、So+BankなどのAndroid	3.0から4.1.xまでのデバイスでは、WebViewクラスが正しく実装されていないため、CVE-2012-6636に関連した問題のように
WebView.addJavascriptInterfaceの使用で実証されたように、細工されたページを通じてリモートの攻撃者がJavaオブジェクトの任意のメソッド呼び出しやDoS(再起動)などを行える	
•  DoS	Zygote	
–  Zygote	in	Android	4.0.3	and	earlier	accepts	fork	requests	from	processes	with	arbitrary	UIDs,	which	allows	remote	a]ackers	to	cause	a	denial	of	service	(reboot	loop)	via	a	cra+ed	applicajon.	
•  Bypass	
–  Android	4.0	through	4.3	allows	a]ackers	to	bypass	intended	access	restricjons	and	remove	device	locks	via	a	cra+ed	applicajon	that	invokes	the	updateUnlockMethodAndFinish	method	in	the	
com.android.serngs.ChooseLockGeneric	class	with	the	PASSWORD_QUALITY_UNSPECIFIED	opjon.	
•  Exec	Code	JS	API	
–  java/android/webkit/BrowserFrame.java	in	Android	before	4.4	uses	the	addJavascriptInterface	API	in	conjuncjon	with	creajng	an	object	of	the	SearchBoxImpl	class,	which	allows	a]ackers	to	execute	
arbitrary	Java	code	by	leveraging	access	to	the	searchBoxJavaBridge_	interface	at	certain	Android	API	levels.	
•  SSL	PRNG	
–  4.4より前のAndroidでは、OpenSSL	PRNGのシードを適切に整理しておらず、攻撃者が複数のアプリケーション内でPRNGの使用を利用して暗号化保護メカニズムを無効にすることを助ける	
•  Exec	Code	Sql	
–  Muljple	SQL	injecjon	vulnerabilijes	in	the	queryLastApp	method	in	packages/WAPPushManager/src/com/android/smspush/WapPushManager.java	in	the	WAPPushManager	module	in	Android	before	
5.0.0	allow	remote	a]ackers	to	execute	arbitrary	SQL	commands,	and	consequently	launch	an	acjvity	or	service,	via	the	(1)	wapAppId	or	(2)	contentType	field	of	a	PDU	for	a	malformed	WAPPush	
message,	aka	Bug	17969135.	
•  addAccount	Method	Vulnerability	
–  The	addAccount	method	in	src/com/android/serngs/accounts/AddAccountSerngs.java	in	the	Serngs	applicajon	in	Android	before	5.0.0	does	not	properly	create	a	PendingIntent,	which	allows	
a]ackers	to	use	the	SYSTEM	uid	for	broadcasjng	an	intent	with	arbitrary	component,	acjon,	or	category	informajon	via	a	third-party	authenjcator	in	a	cra+ed	applicajon,	aka	Bug	17356824.</item>	
•  Graphic	buffer	DoS	and	Memory	corrupjon	
–  Android	5.0	までのpla{orm/frameworks/najve/libs/ui/GraphicBuffer.cpp内のGraphicBuffer:unfla]ern関数に複数の整数オーバーフローがあり、多数の(1)ファイル記述子 または (2)整数値をトリガー
とするベクトルを介してDoS(メモリ破壊)や権限昇格を引き起こす可能性がある	
Grandma's	old	handbag	/	M	Schoenefeld		 10
歴史の振り返り	
•  Exec	Code	Master	Key	
–  Android	1.6	through	4.2		does	not	properly	check	cryptographic	signatures	for	applicajons,	which	allows	a]ackers	to	execute	arbitrary	code	via	an	applicajon	package	file	(APK)	that	is	modified	in	a	way	
that	does	not	violate	the	cryptographic	signature,	probably	involving	muljple	entries	in	a	Zip	file	with	the	same	name	in	which	one	entry	is	validated	but	the	other	entry	is	installed,	aka	Android	security	
bug	8219321	and	the	"Master	Key"	vulnerability.	
•  Exec	Code	Overflow	
–  Andoroid	2.2.2までおよび2.3.6までのlibsysujlsにスタックベースのバッファオーバーフローにより、アプリケーションがFrameworkListener::dispatchCommandメソッドを間違った数の引数で呼び出すこと
で、use-a+er-freeを引き起こすzegRushのデモのように、ユーザーが補助したリモートの攻撃者がリモートでのコード実行が可能になる	
•  Privacy	
–  Android	Picasa	in	Android	3.0	and	2.x	through	2.3.4	uses	a	cleartext	HTTP	session	when	transmirng	the	authToken	obtained	from	ClientLogin,	which	allows	remote	a]ackers	to	gain	privileges	and	access	
private	pictures	and	web	albums	by	sniffing	the	token	from	connecjons	with	picasaweb.google.com.	
•  DoS	WebView	
–  Disney	Mobiole、eAccess、KDDI、NTT	DoCoMo、So+BankなどのAndroid	3.0から4.1.xまでのデバイスでは、WebViewクラスが正しく実装されていないため、CVE-2012-6636に関連した問題のように
WebView.addJavascriptInterfaceの使用で実証されたように、細工されたページを通じてリモートの攻撃者がJavaオブジェクトの任意のメソッド呼び出しやDoS(再起動)などを行える	
•  DoS	Zygote	
–  Zygote	in	Android	4.0.3	and	earlier	accepts	fork	requests	from	processes	with	arbitrary	UIDs,	which	allows	remote	a]ackers	to	cause	a	denial	of	service	(reboot	loop)	via	a	cra+ed	applicajon.	
•  Bypass	
–  Android	4.0	through	4.3	allows	a]ackers	to	bypass	intended	access	restricjons	and	remove	device	locks	via	a	cra+ed	applicajon	that	invokes	the	updateUnlockMethodAndFinish	method	in	the	
com.android.serngs.ChooseLockGeneric	class	with	the	PASSWORD_QUALITY_UNSPECIFIED	opjon.	
•  Exec	Code	JS	API	
–  java/android/webkit/BrowserFrame.java	in	Android	before	4.4	uses	the	addJavascriptInterface	API	in	conjuncjon	with	creajng	an	object	of	the	SearchBoxImpl	class,	which	allows	a]ackers	to	execute	
arbitrary	Java	code	by	leveraging	access	to	the	searchBoxJavaBridge_	interface	at	certain	Android	API	levels.	
•  SSL	PRNG	
–  4.4より前のAndroidでは、OpenSSL	PRNGのシードを適切に整理しておらず、攻撃者が複数のアプリケーション内でPRNGの使用を利用して暗号化保護メカニズムを無効にすることを助ける	
•  Exec	Code	Sql	
–  Muljple	SQL	injecjon	vulnerabilijes	in	the	queryLastApp	method	in	packages/WAPPushManager/src/com/android/smspush/WapPushManager.java	in	the	WAPPushManager	module	in	Android	before	
5.0.0	allow	remote	a]ackers	to	execute	arbitrary	SQL	commands,	and	consequently	launch	an	acjvity	or	service,	via	the	(1)	wapAppId	or	(2)	contentType	field	of	a	PDU	for	a	malformed	WAPPush	
message,	aka	Bug	17969135.	
•  addAccount	Method	Vulnerability	
–  The	addAccount	method	in	src/com/android/serngs/accounts/AddAccountSerngs.java	in	the	Serngs	applicajon	in	Android	before	5.0.0	does	not	properly	create	a	PendingIntent,	which	allows	
a]ackers	to	use	the	SYSTEM	uid	for	broadcasjng	an	intent	with	arbitrary	component,	acjon,	or	category	informajon	via	a	third-party	authenjcator	in	a	cra+ed	applicajon,	aka	Bug	17356824.	
•  Graphic	buffer	DoS	and	Memory	corrupjon	
–  Android	5.0	までのpla{orm/frameworks/najve/libs/ui/GraphicBuffer.cpp内のGraphicBuffer:unfla]ern関数に複数の整数オーバーフローがあり、多数の(1)ファイル記述子 または (2)整数値をトリガー
とするベクトルを介してDoS(メモリ破壊)や権限昇格を引き起こす可能性がある	
Grandma's	old	handbag	/	M	Schoenefeld		 11
歴史の振り返り	
•  Exec	Code	Overflow	
–  Andoroid	2.2.2までおよび2.3.6までのlibsysujlsにスタックベースのバッファオーバーフローにより、アプリ
ケーションがFrameworkListener::dispatchCommandメソッドを間違った数の引数で呼び出すことで、use-
a+er-freeを引き起こすzegRushのデモのように、ユーザーが補助したリモートの攻撃者がリモートでのコード
実行が可能になる	
•  DoS	WebView	
–  Disney	Mobiole、eAccess、KDDI、NTT	DoCoMo、So+BankなどのAndroid	3.0から4.1.xまでのデバイスでは、
WebViewクラスが正しく実装されていないため、CVE-2012-6636に関連した問題のように
WebView.addJavascriptInterfaceの使用で実証されたように、細工されたページを通じてリモートの攻撃者
がJavaオブジェクトの任意のメソッド呼び出しやDoS(再起動)などを行える	
•  SSL	PRNG	
–  4.4より前のAndroidでは、OpenSSL	PRNGのシードを適切に整理しておらず、攻撃者が複数のアプリケーショ
ン内でPRNGの使用を利用して暗号化保護メカニズムを無効にすることを助ける	
•  グラフィックバッファのDoSおよびメモリ破壊	
–  Android	5.0	までのpla{orm/frameworks/najve/libs/ui/GraphicBuffer.cpp内のGraphicBuffer:unfla]ern関数
に複数の整数オーバーフローがあり、多数の(1)ファイル記述子 または (2)整数値をトリガーとするベクトル
を介してDoS(メモリ破壊)や権限昇格を引き起こす可能性がある	
Grandma's	old	handbag	/	M	Schoenefeld		 12
マネージド	vs	ネイティブコード	
•  サンプルにはネイティブコードの40%で問題があった	
•  Androidのデフォルトの実行モデルはマネージド	
–  制御フローはJava/Kotlinから開始しなければいけない	
–  JNI	(Java	Najve	Interface)		
•  マネージドコードとネイティブコード間のブリッジ機能を提供	
•  Android上のJNIはネイティブメソッドへのDEXスタブの結合を提供	
•  エッジケースのシナリオではAndroidはネイティブアク
ティビティーを提供	
Grandma's	old	handbag	/	M	Schoenefeld		 13
JNI	
Grandma's	old	handbag	/	M	Schoenefeld		 14
JNI	
•  典型的なシナリオ	
–  Javaのメソッドがライブラリ(技術的にはELF共有オブジェクト)
のロードのためにSystem.loadLibraryを呼び出す			
–  ランタイムシステムは有効なメソッドを登録するために
JNI_OnLoadを呼び出す	
Grandma's	old	handbag	/	M	Schoenefeld		 15
ネイティブコードのセキュリティ	
•  一般的にはアプリケーション開発には Android	NDKに
よってネイティブコードを使うのではなく、Android	SDK
を使うべきである	
•  ネイティブコードによって作られたアプリケーションは	
–  より複雑で、	
–  ポータビリティに欠ける上、	
–  バッファオーバーフローのような一般的なメモリーエラー
を含みがちである	
h]ps://developer.android.com/training/arjcles/security-jps.html#Najve	Grandma's	old	handbag	/	M	Schoenefeld		 16
典型的なJNIの問題領域	
•  バッドポインター、ヌルポインター	
•  古き良き new/delete、malloc/freeの整合性の要求	
•  Yet	Anotherな命名規則	(java/io/File)	
•  次のJNI呼び出しまでに全ての例外でハンドリングが必要	
•  型が安全でない	(全てのJavaの型がjobject*にまとめられる)		
•  jmethodとjfield両方におなじシグネイチャが適用	
•  jniEnvの参照を同じスレッド内で保持しなければいけない	
•  アクセスチェックがない	(JNIはプライベートをパブリックと同様に扱う)		
•  ...		
•  [h]p://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/
design.html#wp615]		
Grandma's	old	handbag	/	M	Schoenefeld		 17
JNIとNDK	
•  それでもコードをネイティブにしたい場合は
NDK(Najve	Development	Kit)が必要	
Grandma's	old	handbag	/	M	Schoenefeld		 18
APK内のネイティブコードの入手先	
•  以下にある.soファイル内のネイティブコード	
–  libディレクトリ内	
–  assetsディレクトリまたはres/rawディレクトリも含む	
–  またはzip/7z/xzファイル内の複数のファイル	
•  サポートされている各アーキテクチャごとのネイティブライ
ブラリのサブディレクトリ	
–  x86,	x86_64,	armeabi,	armeabi-v7a,	arm64-v8a,	mips,	mips64		
•  プリインストールアプリにも/usr/libにそれぞれのライブラリ
がある	
	
Grandma's	old	handbag	/	M	Schoenefeld		 19
注目したサンプル	
•  Android	Playストアのアンチウイルスアプリ	
–  セキュリティ向上の先導役となることが期待されるs	
–  ネイティブコードのパターンに加え、選択的なDEXの弱点をチェック	
–  ネイティブコードを以下のために利用	
•  バイナリの高速なパーシング	
•  セキュアな通信のための暗号化	
–  高頻度な更新	
–  50以上の製品、ダウンロード数に応じた優先度	
•  さらに		
–  類似の要件のよくダウンロードされているいくつかのアプリ(Office,	ゲーム,	
メッセンジャー,	トラベル	&	バンキングアプリ)	
–  Galaxy	Tab	Aのプリインストールアプリ	
Grandma's	old	handbag	/	M	Schoenefeld		 20
APKの監査	
•  脆弱なコードの識別	
–  コードのタイプ	:	
•  Dex	クラス		
•  ネイティブコード	(スタンドアローン,	JNI)		
•  WebView内で実行されるJavascript	
–  この場での解説に該当する攻撃境界面:	
•  古いバージョンのライブラリ	
•  それ以外の安全でない実例	
–  アップデート方法	
–  暗号の不適切な利用	
Grandma's	old	handbag	/	M	Schoenefeld		 21
既知の脆弱性を持つ	
コンポーネント	
おばあちゃんの古いハンドバッグ	
Grandma's	old	handbag	/	M	Schoenefeld		 22
OWASP	outdated	components	
Grandma's	old	handbag	/	M	Schoenefeld		 23
ネイティブコードライブラリの例	
•  よく見られるのは以下のような共有ライブラリ:	
–  OpenSSL	
–  OpenCV	
–  SQLite/SQLCipher	
–  libCurl	
–  libTiff	
–  Zlib	
–  Bzip2	
Grandma's	old	handbag	/	M	Schoenefeld		 24
ネイティブコードライブラリの例	
•  よく見られるのは以下のような共有ライブラリ:	
–  OpenSSL	
–  OpenCV	
–  FreeType	
–  SQLite/SQLCipher	
–  libCurl	
–  libTiff	
–  Zlib	
–  Bzip2	
Grandma's	old	handbag	/	M	Schoenefeld		 25
OpenSSLのケース	
•  OpenSSLはAndroidコアにバンドルされているものの「Android上でOpenSSLを使用
するとJNIとプラットフォームバージョンのOpenSSLまたはBoringSSLが頻繁に使用さ
れる。そのプラットフォームではブート時のZygote初期化中にシステムバージョン
のlibssl.soおよびlibcrypto.soがロードされた可能性がある	
•  ローダーとシンボル解決の問題のためによく使われるLD_LIBRARY_PATHのトリッ
クはほとんどのアプリケーションでは機能しない。 また、クラッシュを避けるため
にlibmyssl.soやlibmycrypto.soのようにビルド時に出力するファイル名を変更する
ことも機能しない	
•  名前空間とシンボル解決の問題を解消する方法は、他の動的ライブラリまたはあ
なたが提供する共有オブジェクトで静的バージョンのOpenSSLライブラリをラップす
ることである	
•  これを行うには、OpenSSLライブラリ内の必要な機能への参照を持つ小さなCの
ラッパーライブラリを作成する。すべての機能をラップする必要はない」	[h]ps://
wiki.openssl.org/index.php/Android]	
	
Grandma's	old	handbag	/	M	Schoenefeld		 26
OpenSSLのケース	
–  ベンダーはシステムライブラリの代わりにカスタムされたものを使用
することでより高度にOpenSSLの機能を制御できる	
–  しかしカスタムライブラリが経年劣化し脆弱になることもある	
–  理論上の話ではない:	
-  2017年9月現在少なくともひとつのAVライブラリ(1000万ダウンロード)が古い
OpenSSLライブラリのバージョン1.0.1eを使用している	
-  2014年のGoogle	Playでの警告にも関わらず:		
-  [セキュリティ警告:非常に脆弱なバージョンのOpenSSLが使われています]	
h]ps://groups.google.com/forum/#!msg/android-security-discuss/
o3ymXQjdQLI/KianK6PIIagJ	
-  しかし2017年現在、Googleはベンダー(無反応)と直接解決するよう我々のレ
ポートを受け入れず、この手の問題を気にしていないようである	
	
Grandma's	old	handbag	/	M	Schoenefeld		 27
OpenSSLのケース	
> python scanapk.py com.**.avcom.**.av-716.apk
[...]
['lib/armeabi/libacs.so', 'lib/armeabi/libcork.so', 'lib/armeabi/
libsdkgif.so', 'lib/armeabi/libacceleratecoreproxy.so', 'lib/armeabi/
libacs_sdk.so', 'lib/armeabi/libbdpush_V2_3.so', 'lib/armeabi/
libacceleratecore.so', 'lib/x86/libsdkgif.so', 'lib/armeabi-v7a/
libsdkgif.so']
[...]
lib/armeabi/libacs_sdk.so
=========================
gcc=GCC: (GNU) 4.6 20120106 (prerelease)
gold=gold 1.10
isjni=False
openssl=ECONF_def part of OpenSSL 1.0.1e 11 Feb 2013
[...]
	
Grandma's	old	handbag	/	M	Schoenefeld		 28
h]ps://www.cvedetails.com/vulnerability-list/vendor_id-217/product_id-383/version_id-157548/Openssl-Openssl-1.0.1e.html	
Grandma's	old	handbag	/	M	Schoenefeld		 29
OpenSSLのケース	
-  OpenSSLの亜種も見られる:	
-  BoringSSL	(バージョン番号の埋め込みなし)	
-  LibreSSL		
-  …2014年にOpenSSLからフォークし、コードベースの近代化、
セキュリティの向上、ベストプラクティスな開発プロセスの採
用を目的としている.	[h]ps://www.libressl.org/]	
-  1000万以上ダウンロードされているウイルススキャナーで
2.2.5を発見。現在は2.5.5でありその間の修正がされていな
い	
Grandma's	old	handbag	/	M	Schoenefeld		 30
OpenSSLのケース	
Grandma's	old	handbag	/	M	Schoenefeld		 31	
h]ps://en.wikipedia.org/wiki/LibreSSL#3_May_2016
ネイティブコードライブラリの例	
•  よく見られるのは以下のような共有ライブラリ:	
–  OpenSSL	
–  OpenCV	
–  SQLite/SQLCipher	
–  libCurl	
–  libTiff	
–  Zlib	
–  Bzip2	
Grandma's	old	handbag	/	M	Schoenefeld		 32	
Similar	list	in	“Finding	So+ware	License	Violajons	Through	Binary	Code	Clone	Detecjon”		(h]ps://nixos.org/~eelco/pubs/clones-msr2011-final.pdf	)
OpenCV	
•  BSDライセンスなオープンソースのコンピュータビジョン
ライブラリ	
•  Androidを含む全てのメジャーなプラットフォームに対
応	
•  C/C++で書かれJava他向けのバインディングも存在	
•  libPngやlibTiffといった画像処理ライブラリとも統合	
•  ソースコード h]ps://github.com/Itseez/opencv	
	
Grandma's	old	handbag	/	M	Schoenefeld		 33
OpenCV	
•  BSDライセンスなオープンソースのコンピュータビジョン
ライブラリ	
•  Androidを含む全てのメジャーなプラットフォームに対
応	
•  主にC++で書かれている	
•  Java等へのバインディングが用意されている	
•  ドキュメント	h]p://docs.opencv.org/		
•  ソースコード h]ps://github.com/Itseez/opencv	
	
Grandma's	old	handbag	/	M	Schoenefeld		 34
OpenCV	
•  いくつかのベンダーはビルドせずに上流のラ
イブラリビルドを使用している	
•  ソーシャルネットワークやトラベルアプリなど:	
–  a6c9a1612ff02fb44aa420c8a6b0e36a *libopencv_core.so
–  dda85f14f278bfd6673d345eedc6e556 *libopencv_imgproc.so
•  上流のライブラリは監査済み?		
	
Grandma's	old	handbag	/	M	Schoenefeld		 35
OpenCV	
•  Some	variants	of	OpenCV	bundle	image	
parsing	libraries	
•  Old	embedded	versions	were	observed	too:	
Grandma's	old	handbag	/	M	Schoenefeld		 36
FreeType	
– FreeTypeはテキストレンダリングのためのオープ
ンソースのCライブラリ	
– バイナリ内にはバージョン文字列はないが、コー
ドから見つけることができる	
– 航空会社の予約アプリよりここから:	(libarmeabi-
v7alibgdx-freetype.so)		
Grandma's	old	handbag	/	M	Schoenefeld		 37
FreeType	
Grandma's	old	handbag	/	M	Schoenefeld		 38
FreeType	
Grandma's	old	handbag	/	M	Schoenefeld		 39
FreeType	
Grandma's	old	handbag	/	M	Schoenefeld		 40
FreeType	
Grandma's	old	handbag	/	M	Schoenefeld		 41	
[r3]:
0x04 0x02
0x08 0x06
0x0c 0x02
FreeType	
Grandma's	old	handbag	/	M	Schoenefeld		 42
Busybox	
– スタンドアローンバイナリのBusyBox、IPTablesとと
もに配布されているウイルススキャナが少なくと
も2つある	
•  ベンダーへリクエストしたが、これらが何に使われてい
るのか説明することはなかった	
•  どちらのGPLライセンスのライブラリにもソースが添付
されておらず、これらによりまったく別の種類のワーム
が開かれる可能性がある	
Grandma's	old	handbag	/	M	Schoenefeld		 43
Busyboxとその仲間	
Grandma's	old	handbag	/	M	Schoenefeld		 44
ネイティブコードライブラリの例	
•  よく見られるのは以下のような共有ライブラリ:	
–  OpenSSL	
–  OpenCV	
–  SQLite/SQLCipher	
–  libCurl	
–  libTiff	
–  Zlib	
–  Bzip2	
Grandma's	old	handbag	/	M	Schoenefeld		 45
GITHUBからのコピー&ペースト	
おばあちゃんの古いハンドバッグ	
Grandma's	old	handbag	/	M	Schoenefeld		 46
代替となるアプリストアのクライアント
このパッケージを信じていい?	
Grandma's	old	handbag	/	M	Schoenefeld		 47
このアプリを気に入った。パッケージを信じていい?	
Grandma's	old	handbag	/	M	Schoenefeld		 48	
>python scanapk.py QooApp-v214.apk
Nativelibs=['lib/arm64-v8a/libpl_droidsonroids_gif.so',
'lib/x86/libpl_droidsonroids_gif.so', 'lib/x86_64/
libpl_droidsonroids_gif.so', [...] ]
[..]
lib/arm64-v8a/libpl_droidsonroids_gif.so:
GCC: (GNU) 4.9.x 20150123 (prerelease), Unknown, JNI
devpath=['/home/koral/workspace/android-gif-drawable/
android-gif-drawable/src/main/c/bitmap.c', '...']
SHA256=1dcfe98283f6ca1f7e8fb9f1cb799e1acc95827a28337bf2
c4f6c04a8ee9e1c4
Size=57024
このアプリを気に入った。パッケージを信じていい?	
Grandma's	old	handbag	/	M	Schoenefeld		 49
このアプリを気に入った。パッケージを信じていい?	
Grandma's	old	handbag	/	M	Schoenefeld		 50
segfaultは修正されてる(v1.2.8)?	
Grandma's	old	handbag	/	M	Schoenefeld		 51	
•  v1.2.8のアーカイブ(aar)をスキャンしてみよう		
>scanapk.py android-gif-drawable-1.2.8.aar
[...]
jni/arm64-v8a/libpl_droidsonroids_gif.so:
GCC: (GNU) 4.9.x 20150123 (prerelease), Unknown,
JNI
SHA256=1b6eca3b1805fe174e8714082797324739726b928ca
a4950e22d6ef27f779f7e
Size=42776
Is	this	segfault	fixed	(v1.2.6)?	
Grandma's	old	handbag	/	M	Schoenefeld		 52	
•  古いもの(aar)であるv.1.2.6をスキャンしてみよう	
>scanapk.py android-gif-drawable-1.2.6.aar
[...]
jni/arm64-v8a/libpl_droidsonroids_gif.so:
GCC: (GNU) 4.9.x 20150123 (prerelease), Unknown, JNI
SHA256=1dcfe98283f6ca1f7e8fb9f1cb799e1acc95827a28337
bf2c4f6c04a8ee9e1c4
Size=57024
•  セグメンテーションフォールトを修正していない古い
バージョンとチェックサムが一致
内部アプリのバージョンのカオス	
•  単一のアプリであっても同一のネイティブライブラリ
の異なるバージョンがバンドルされている	
–  例えばGalaxy	TAB	AはPhoto	Studioアプリをバンドル	
•  Libpng	1.6.10	in	libQuramCodecPE.so	
•  Libpng	1.6.23	in	libSPenSkia.so	
Grandma's	old	handbag	/	M	Schoenefeld		 53
セキュアでないエンジンの更新	
おばあちゃんの古いハンドバッグ	
Grandma's	old	handbag	/	M	Schoenefeld		 54
セキュアでないエンジンの更新	
•  アプリのデータやコードを更新することは頻繁に必要
とされる:	
•  アプリケーションAPKの外部からコードをロードしないことを
強く推奨する	
•  これにより、コードの改ざんや注入によるアプリケーション
侵害の可能性が大きく増加するためである	
•  また、バージョン管理とアプリケーションテストの複雑さも増
加する	
•  さらに、アプリケーションの動作を検証することが不可能に
なることもあるため、一部の環境では禁止されることもある	
Grandma's	old	handbag	/	M	Schoenefeld		 55	h]ps://developer.android.com/training/arjcles/security-jps.html
セキュアでないエンジンの更新	
•  しかし、一部のアプリでは気にしていない	
•  以下の例は100万以上ダウンロードされているあ
るアプリあの安全でないアップデートの例である	
•  Playストアのバイパス	
•  保護されていない接続上で行われる	
•  真正証明の欠如	(あるいはMD5	J	)		
•  ネイティブ共有ライブラリを含んでいる	
Grandma's	old	handbag	/	M	Schoenefeld		 56
実行可能なコンテキストを伴った	
平文でのエンジンの更新	public class DataUpdater implements DataDownloadListener {
private static final String SERVER_INFOFILE_URL = "http://download.c********y.com/data_info_cfg.xml";
[...]
private void updateNativeLibs(Context v1, File v2) {
Iterator v4 = this.getUpdateList().iterator();
while(v4.hasNext()) {
DataLibInfo v5 = (DataLibInfo)v4.next();
String v3;
if(v5.mIsCompressed) {
v3 = v5.mId + ".zip";
} else {
v3 = v5.mId;
}
String v6 = FileUtil.addSlash(v2.getAbsolutePath()) + v3;
if(FileUtil.exportAssetFileAsTmp(v1, v3, v6)) {
(new File(v6 + ".tmp")).renameTo(new File(FileUtil.addSlash(v2.getAbsolutePath()) + v3));
if(v5.mIsCompressed) {
ZipHelper.unzip(v6, FileUtil.addSlash(v2.getAbsolutePath()) + v5.mId);
}
this.notifyDataChange(v5.mId);
}
}
this.clearUpdateList();
}
Grandma's	old	handbag	/	M	Schoenefeld		 57
実行可能なコンテキストを伴った

平文でのエンジンの更新	wget -O - http://download.c*******y.com/data_info_cfg.xml
--2017-09-21 09:23:06-- http://download.c*******y.com/data_info_cfg.xml
Resolving download.cy-security.com (download.c*******y.com)... 5*.**.248.95, 5*.**.14.164
Connecting to download.cy-security.com (download.c*******y.com)|5*.**.248.95|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 400 [text/xml]
Saving to: 'STDOUT'
0%[ ]
<data mainVersion="15000416">
<lib>
<id>avbases</id>
<version>20150004161900</version>
<country>global</country>
<size>1003717</size>
<type>zip</type>
<compressed>true</compressed>
<silence>false</silence>
<url>http://download.c********y.com/15000416/avbases.zip</url>
<md5>28c2b682b2136a0f55d3fbbc59ca1a90</md5>
</lib>
</data>	
Grandma's	old	handbag	/	M	Schoenefeld		 58
実行可能なコンテキストを伴った

平文でのエンジンの更新	wget -O - http://download.c*******y.com/data_info_cfg.xml
--2017-09-21 09:23:06-- http://download.c*******y.com/data_info_cfg.xml
Resolving download.cy-security.com (download.c*******y.com)... 5*.**.248.95, 5*.**.14.164
Connecting to download.cy-security.com (download.c*******y.com)|5*.**.248.95|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 400 [text/xml]
Saving to: 'STDOUT'
0%[ ]
<data mainVersion="15000416">
<lib>
<id>avbases</id>
<version>20150004161900</version>
<country>global</country>
<size>1003717</size>
<type>zip</type>
<compressed>true</compressed>
<silence>false</silence>
<url>http://download.c********y.com/15000416/avbases.zip</url>
<md5>28c2b682b2136a0f55d3fbbc59ca1a90</md5>
</lib>
</data>	
Grandma's	old	handbag	/	M	Schoenefeld		 59
実行可能なコンテキストを伴った

平文でのエンジンの更新	wget -O - http://download.c*******y.com/data_info_cfg.xml
--2017-09-21 09:23:06-- http://download.c*******y.com/data_info_cfg.xml
Resolving download.cy-security.com (download.c*******y.com)... 5*.**.248.95, 5*.**.14.164
Connecting to download.cy-security.com (download.c*******y.com)|5*.**.248.95|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 400 [text/xml]
Saving to: 'STDOUT'
0%[ ]
<data mainVersion="15000416">
<lib>
<id>avbases</id>
<version>20150004161900</version>
<country>global</country>
<size>1003717</size>
<type>zip</type>
<compressed>true</compressed>
<silence>false</silence>
<url>http://download.c********y.com/15000416/avbases.zip</url>
<md5>28c2b682b2136a0f55d3fbbc59ca1a90</md5>
</lib>
</data>	
Grandma's	old	handbag	/	M	Schoenefeld		 60
実行可能なコンテキストを伴った

平文でのエンジンの更新	http://download.c*********y.com/15000416/avbases.zip
--2017-09-21 07:58:54-- http://download.c*********y.com/15000416/avbases.zip
Resolving download.cy-security.com (download.c*********y.com)... 5*.**.248.95, 5*.**.14.164
Connecting to download.cy-security.com (download.c*********y.com)| 5*.**.248.95|:80...
connected.
HTTP request sent, awaiting response... 200 OK
Length: 1005807 (982K) [application/zip]
Saving to: 'avbases.zip'
avbases.zip 100%[====================================>] 982.23K
357KB/s in 2.8s	
Grandma's	old	handbag	/	M	Schoenefeld		 61
更新パッケージには	
ネイティブライブラリが含まれる	unzip -t avbases.zip
Archive: avbases.zip
testing: avbases/ OK
testing: avbases/android.kdc OK
testing: avbases/index OK
testing: avbases/kavheur.kdl OK
testing: avbases/kms90.avc OK
testing: avbases/libkavheur.kdl.so OK
testing: avbases/libkavsdk.so OK
testing: avbases/list.ksl OK
testing: avbases/mmh001.kdc OK
testing: avbases/mmh002.kdc OK
testing: avbases/mmheur.mft OK
testing: avbases/mmheur01.kdc OK
testing: avbases/mmhlnk01.kdc OK
testing: avbases/version.txt OK
No errors detected in compressed data of avbases.zip.	
Grandma's	old	handbag	/	M	Schoenefeld		 62
更新パッケージには	
ネイティブライブラリが含まれる	unzip -t avbases.zip
Archive: avbases.zip
testing: avbases/ OK
testing: avbases/android.kdc OK
testing: avbases/index OK
testing: avbases/kavheur.kdl OK
testing: avbases/kms90.avc OK
testing: avbases/libkavheur.kdl.so OK
testing: avbases/libkavsdk.so OK
testing: avbases/list.ksl OK
testing: avbases/mmh001.kdc OK
testing: avbases/mmh002.kdc OK
testing: avbases/mmheur.mft OK
testing: avbases/mmheur01.kdc OK
testing: avbases/mmhlnk01.kdc OK
testing: avbases/version.txt OK
No errors detected in compressed data of avbases.zip.	
Grandma's	old	handbag	/	M	Schoenefeld		 63
更新パッケージには	
ネイティブライブラリが含まれる	
unzip -p avbases.zip avbases/libkavsdk.so > x.so ; readelf -a x.so
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: ARM
Version: 0x1
Entry point address: 0x8d48
Start of program headers: 52 (bytes into file)
Start of section headers: 185432 (bytes into file)	
Grandma's	old	handbag	/	M	Schoenefeld		 64
過度の情報	(リーク)	
おばあちゃんの古いハンドバッグ	
Grandma's	old	handbag	/	M	Schoenefeld		 65
過度の情報	
バイナリ内の開発者の名前は、ビルドシステムでのソーシャルエンジニアリングを招く:		
	
Youtube	Kids 	libarmeabi-v7alibambisonic_audio_renderer.so:	/tmp/ndk-tr****/tmp/build-72533	
Opera	 	libarmeabi-v7alibopera.so:	/home/s*****	
Baidu 	 	libarmeabilibFFmpeg.so:	/home/l**/android/ffmpeg-2.2.2/	
Dropbox	 	libarmeabi-v7alibDropboxXplat.so:	/Users/p****/	
RyanAir	 	libarm64-v8alibopencv_core.so:	/Users/l****/	
Booking.com 	libarmeabi-v7alibopencv_core.so:	/Users/j*****/	
Dr.	Web	AV 	libarmeabilibDRWScanSLib.so:		/tmp/ndk-andre****/tmp/build-24347	
Facebook	Pages 	libarmeabi-v7alibopencv_core.so:	/Users/j**/	
Larro	VDC 	libarmeabilibvdc.so:	/usr/local/google/home/andr***	
BitIncepjon 	(assetsavla)libavla.so:	/home/d***/workspace/android-ndk-r9d/pla{orms/android-14/
arch-arm/usr/include	
G-Data										 	libarmeabilibstrongswan.so:	/home/a*****/git/pwf-android/		
Line	Anjvirus 	libarmeabilibbrick.so:	/Users/m*****/Documents/	
[...]	
	
	 Grandma's	old	handbag	/	M	Schoenefeld		 66
コードから引用	
"我々にはAndroidエコシステム全体を破壊すること
なくsqliteをバンドルする方法がわかりません"	
(Google	Keep,	libarmeabi-v7alibsketchology_najve.so)	
	
Grandma's	old	handbag	/	M	Schoenefeld		 67
BYCATCH:	DEXコードの脆弱性	
おばあちゃんの古いハンドバッグ	
Grandma's	old	handbag	/	M	Schoenefeld		 68
Vulnerabilijes	in	Dex	code	
•  public	class	UpdateTask	
•  		extends	AsyncTask<Void,	Void,	Void>	
•  {	
•  		String	URL	=	"h]ps://a_m.com/db.xmlsdb";	
•  [...]		
•  URLConnecjon	localURLConnecjon	=	new	URL(paramString).openConnecjon();	
•  	xmllint	--format	db.xmlsdb.xml	
•  <?xml	version="1.0"?>	
•  <items>	
•  		<item>	
•  				<name>75542011cff56e222b622f10715df7e87d6610a91363bc76b600f719c81ef64c</name>	
•  				<jp>applicajon</jp>	
•  				<path>343ef33f96940ad4d126fd7bd6c324147d394bc20f436ˆ1ba858463cfe88f32</path>	
•  		</item>	
Grandma's	old	handbag	/	M	Schoenefeld		 69
暗号化された更新は?	
–  Example:	Passwords	in	Code	
–  package	com.a____m.anjvirus.pro.classes;	
package com.a____m.antivirus.pro.classes;
[...]
public class CryptClass
{
private Cipher cipher;
private IvParameterSpec ivspec = new IvParameterSpec("Yz**MjIzYmZkMjI5".getBytes());
private SecretKeySpec keyspec = new SecretKeySpec("NjAz**RiNDBkMTAz".getBytes(), "AES");
[...]
public byte[] decrypt(String paramString) throws Exception
{
if ((paramString == null) || (paramString.length() == 0)) {
throw new Exception("Empty string");
}
try {
this.cipher.init(2, this.keyspec, this.ivspec);
byte[] arrayOfByte = this.cipher.doFinal(hexToBytes(paramString));
return arrayOfByte;
}
catch (Exception localException) {
throw new Exception("[decrypt] " + localException.getMessage());
}
	}	
Grandma's	old	handbag	/	M	Schoenefeld		 70
とにかく暗号化?	
–  Example:	Passwords	in	Code	
–  package	com.a____m.anjvirus.pro.classes;	
package com.a____m.antivirus.pro.classes;
[...]
public class CryptClass
{
private Cipher cipher;
private IvParameterSpec ivspec = new IvParameterSpec("Yz**MjIzYmZkMjI5".getBytes());
private SecretKeySpec keyspec = new SecretKeySpec("NjAz**RiNDBkMTAz".getBytes(), "AES");
[...]
public byte[] decrypt(String paramString) throws Exception
{
if ((paramString == null) || (paramString.length() == 0)) {
throw new Exception("Empty string");
}
try {
this.cipher.init(2, this.keyspec, this.ivspec);
byte[] arrayOfByte = this.cipher.doFinal(hexToBytes(paramString));
return arrayOfByte;
}
catch (Exception localException) {
throw new Exception("[decrypt] " + localException.getMessage());
}
	}	
Grandma's	old	handbag	/	M	Schoenefeld		 71
DEXコードの脆弱性	
•  	PS	C:US>		[xml]$virusdoc	=	get-content	db.xml	
•  PS	C:US>		$virusdoc.items.item.name|	ForEach-Object	{	java	
HelmDeCrypt	$_}		
–  Android.Trojan.Downloader								
–  Android.Trojan.FakeApp											
–  [...]	
–  	Android.Trojan.FakeInst.AB							
–  Android.Adware.Plankton.A								
–  Android.Trojan.Plankton.a								
–  Android.Trojan.FinSpy.B										
–  Android.Adware.Wallap.A			
Grandma's	old	handbag	/	M	Schoenefeld		 72
古いDexコードのコンポーネント	
–  info.module				=	h]pcore	
–  info.release			=	4.0.1	
–  info.jmestamp	=	${mvn.jmestamp}	
=>	h]p://archive.apache.org/dist/h]pcomponents/h]pcore/
binary/	
–  h]pcomponents-core-4.0.1-bin.tar.gz	2009-06-21	11:17	1.2M	
Grandma's	old	handbag	/	M	Schoenefeld		 73
古いDexコードのコンポーネント	
•  h]ps://www.cvedetails.com/vulnerability-list/
vendor_id-45/product_id-20943/Apache-H]pclient.html	
Grandma's	old	handbag	/	M	Schoenefeld		 74
TLS	あるいは	MITMLS	
–  				SSLContext	localSSLContext	=	
SSLContext.getInstance("TLS");	
						TrustManager[]	arrayOfTrustManager	=	new	
TrustManager[1];	
						arrayOfTrustManager[0]	=	new	o();	
						localSSLContext.init(null,	arrayOfTrustManager,	new	
SecureRandom());	
						
localH]psURLConnecjon.setSSLSocketFactory(localSSLCon
text.getSocketFactory());	
						localH]psURLConnecjon.setHostnameVerifier(new	
n(null));	
Grandma's	old	handbag	/	M	Schoenefeld		 75
TLS	あるいは	MITMLS	
–  		class	com.anjy.a.o		{	
	
//	disables	issuer	verificajon:	
		
		public	void	checkClientTrusted(X509Cerjficate[]	paramArrayOfX509Cerjficate,	String	paramString)	{}	
			
		public	void	checkServerTrusted(X509Cerjficate[]	paramArrayOfX509Cerjficate,	String	paramString)	{}	
			
		public	X509Cerjficate[]	getAcceptedIssuers()	
		{	
				return	new	X509Cerjficate[0];	
		}	
		
	
–  class	com.anjy.a.n		{		
	
//	disables	host	name	verificajon:	
		
		public	boolean	verify(String	paramString,	SSLSession	paramSSLSession)	
		{	
				return	true;	
		}	
Grandma's	old	handbag	/	M	Schoenefeld		 76
h]p経由でのDBバージョンの問い合わせ	
public class GetServerVirusDefsService extends IntentService {
private void a() {
URL u = null;
try {
u = new URL("http://redacted.com/antivirus/virusdb/version.html");
} catch (MalformedURLException nue) {}
Grandma's	old	handbag	/	M	Schoenefeld		 77
h]p経由でのDBバージョンの問い合わせ	
public class GetServerVirusDefsService extends IntentService {
private void a() {
URL u = null;
try {
u = new URL("http://redacted.com/antivirus/virusdb/version.html");
} catch (MalformedURLException nue) {}
Grandma's	old	handbag	/	M	Schoenefeld		 78
h]p経由でのデータベースの更新	
•  >	$xml=New-Object	-typename	xml	;	
$xml.load("h]p://redacted.com/anjvirus/virusdb/
blacklist_apps.xml");	$xml.resources.'string-array'.Item	
|		select	-First	5	
–  com.*studio.security.anjvirus	
–  com.*laystudioapps.mobileanjvirussecurityscanner	
–  com.*vtest.gpb.testyouranjvirus	
–  avtester.*nderdog1987.com.pruebatuanjvirus	
–  com.*karus.ikarustestvirus	
Grandma's	old	handbag	/	M	Schoenefeld		 79
壊れてる署名	
package com.**.sdk.cmloginsdkjar;
public final class gg {
private static volatile String Rg;
public static void al(Context var0) {
v2 = var0.getPackageManager().getApplicationInfo(var0.getPackageName(), 128);
Rg = v2.metaData.getString("com.**.ApplicationSalt");
}
private static String bG(String var0) {
v7 = var0.getBytes("UTF-8");
SecretKeySpec v2 = new SecretKeySpec(Rg.getBytes("UTF-8"), "HmacSHA1");
Mac v3 = Mac.getInstance("HmacSHA1");
v3.init(v2);
v8 = v3.doFinal(v7);
return Base64.encodeToString(v8, 2);
}
Grandma's	old	handbag	/	M	Schoenefeld		 80
壊れてる署名	(キーが秘密になってない)	
	Get-Content .AndroidManifest.xml | Select-String -Pattern Salt
<meta-data android:name="com.**.ApplicationSalt"
android:value="@string/g9"/>
Get-Content .resvaluesstrings.xml | Select-String -SimpleMatch '"g9'
<string name="g9">c2Kx9s8R</string>
	
	 Grandma's	old	handbag	/	M	Schoenefeld		 81
Weak	crypto	
•  Scan smali in binaries for deprecated crypto primitives
•  Static input to key generators (IV, secret key)
• 
	
Grandma's	old	handbag	/	M	Schoenefeld		 82
ログの暗号化の失敗	
import android.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class **Security {
private static String NELO2_AES_SECURITY_SEED = “******_spg_nelo2_seed_value_!";
public static String decrypt(String var0) {
Cipher var1 = Cipher.getInstance("AES");
var1.init(2, new SecretKeySpec(NELO2_AES_SECURITY_SEED.getBytes(), "AES"));
return new String(var1.doFinal(Base64.decode(var0, 2)), "UTF-8");
}
public static String encrypt(String var0) {
Cipher var1 = Cipher.getInstance("AES");
var1.init(1, new SecretKeySpec(NELO2_AES_SECURITY_SEED.getBytes(), "AES"));
return Base64.encodeToString(var1.doFinal(var0.getBytes("UTF-8")), 2);
}
}
	
Grandma's	old	handbag	/	M	Schoenefeld		 83
長期有効なRC4	
public static byte[] a(byte[] var0, byte[] var1) {
try {
Cipher var2 = Cipher.getInstance("RC4");
var2.init(2, new SecretKeySpec(var1, "RC4"));
var0 = var2.update(var0);
return var0;
} catch (NoSuchAlgorithmException var3) {
bjc.a("EncryptionUtils", "decrypt", var3);
} catch (NoSuchPaddingException var4) {
bjc.a("EncryptionUtils", "decrypt", var4);
} catch (InvalidKeyException var5) {
bjc.a("EncryptionUtils", "decrypt", var5);
}
return null;
}
Called from:
ldc "xf4kfh9dlk483jmfbn5ujf8dj46m7i8fj4mf96adfh543" (java.lang.String)
ldc "UTF-8" (java.lang.String)
invokevirtual java/lang/String getBytes((Ljava/lang/String;)[B);
invokestatic bzb b(([B)[B); => MD5
invokestatic biw a(([B[B)[B); => RC4
astore2 // reference to arg1
	
Grandma's	old	handbag	/	M	Schoenefeld		 84
無効なJavaScript	
./a/n$1.smali- .line 58
./a/n$1.smali- iget-object v0, p0, Lcom/b/a/n$1;->a:Landroid/webkit/WebView;
./a/n$1.smali- invoke-virtual {v0}, Landroid/webkit/WebView;->getSettings()Landroid/webkit/
WebSettings;
./a/n$1.smali- move-result-object v0
./a/n$1.smali- const/4 v1, 0x1
./a/n$1.smali: invoke-virtual {v0, v1}, Landroid/webkit/WebSettings;->setJavaScriptEnabled(Z)V	
h]ps://developer.android.com/training/arjcles/security-jps.html	Grandma's	old	handbag	/	M	Schoenefeld		 85
背景事情:	ツール	
おばあちゃんの古いハンドバッグ	
Grandma's	old	handbag	/	M	Schoenefeld		 86
ネイティブコード用のツール	
•  結果はPythonベースのツールscanapk.pyによって収集した	
–  APKの再帰的アンパッキング	
–  埋め込まれている既知のライブラリ向けにELFバイナリを評価	
–  バージョン番号の検出		
•  現状はRegEx,	Yaraへ移行中	
–  危険なC関数のインポートチェック	
–  エクスポートされているJNI関数の一覧	
–  証明書情報の一覧(ハッシュアルゴリズム、署名者、正当性)	
–  危険なパーミッションの一覧	
Grandma's	old	handbag	/	M	Schoenefeld		 87
DEXコード用のツール	
•  手動解析のため巨人の肩に立つ:	
– APKTool	
– Dex2Jar	
– Fernflower	
Grandma's	old	handbag	/	M	Schoenefeld		 88
最後にひとこと	
おばあちゃんの古いハンドバッグ	
Grandma's	old	handbag	/	M	Schoenefeld		 89
提言		
•  信頼できる標準ライブラリをAndroidエコシス
テムに追加してください	
•  定期的な更新、修正のバックポート	
Grandma's	old	handbag	/	M	Schoenefeld		 90
まとめ	
•  ネイティブライブラリは遅いDEXコードの速度面での代替手段である	
•  しかし、パフォーマンス向上には大きなリスクがある	
–  メンテナンスの難しさ =>		ソフトウェアの腐敗	
–  より高いリスクを持つ脆弱性の攻撃面の増加	
•  そのためネイティブアプリには特別な要件がある	
–  信頼できるソースからのみ更新を受け入れる	
–  ネイティブアプリがCVEに対して高頻度でパッチ適用されることを確実にする	
•  アプリベンダー:	エンドユーザーを脆弱にしないようアプリのケアを増やす	
•  アプリユーザー:	単一目的、より権限の少ないアプリを選ぶ	
Grandma's	old	handbag	/	M	Schoenefeld		 91
Q	&	A	
Grandma's	old	handbag	/	M	Schoenefeld		 92	h]ps://www.reddit.com/r/ProgrammerHumor/comments/6qlpwd/the_whole_droid_family/

More Related Content

Viewers also liked

Shusei tomonaga pac_sec_20171026_jp
Shusei tomonaga pac_sec_20171026_jpShusei tomonaga pac_sec_20171026_jp
Shusei tomonaga pac_sec_20171026_jpPacSecJP
 
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...PacSecJP
 
Lucas apa pacsec slides
Lucas apa pacsec slidesLucas apa pacsec slides
Lucas apa pacsec slidesPacSecJP
 
Lucas apa pacsec_slides_jp-final
Lucas apa pacsec_slides_jp-finalLucas apa pacsec_slides_jp-final
Lucas apa pacsec_slides_jp-finalPacSecJP
 
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-jYuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-jPacSecJP
 
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_finalYuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_finalPacSecJP
 
Ryder robertson pac-sec skeleton 2017_jp
Ryder robertson pac-sec skeleton 2017_jpRyder robertson pac-sec skeleton 2017_jp
Ryder robertson pac-sec skeleton 2017_jpPacSecJP
 
Di shen pacsec_final
Di shen pacsec_finalDi shen pacsec_final
Di shen pacsec_finalPacSecJP
 
Shusei tomonaga pac_sec_20171026
Shusei tomonaga pac_sec_20171026Shusei tomonaga pac_sec_20171026
Shusei tomonaga pac_sec_20171026PacSecJP
 
Yunusov babin 7sins-pres_atm_v4(2)_jp
Yunusov babin 7sins-pres_atm_v4(2)_jpYunusov babin 7sins-pres_atm_v4(2)_jp
Yunusov babin 7sins-pres_atm_v4(2)_jpPacSecJP
 
Yunusov babin 7 sins pres atm v2
Yunusov babin 7 sins pres atm v2Yunusov babin 7 sins pres atm v2
Yunusov babin 7 sins pres atm v2PacSecJP
 
Rouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsecRouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsecPacSecJP
 
Anıl kurmuş pacsec3-ja
Anıl kurmuş pacsec3-jaAnıl kurmuş pacsec3-ja
Anıl kurmuş pacsec3-jaPacSecJP
 
Mickey pac sec2016_final_ja
Mickey pac sec2016_final_jaMickey pac sec2016_final_ja
Mickey pac sec2016_final_jaPacSecJP
 
Jurczyk windows metafile_pacsec_jp3
Jurczyk windows metafile_pacsec_jp3Jurczyk windows metafile_pacsec_jp3
Jurczyk windows metafile_pacsec_jp3PacSecJP
 
Villegas first pacsec_2016
Villegas first pacsec_2016Villegas first pacsec_2016
Villegas first pacsec_2016PacSecJP
 
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)PacSecJP
 
Jurczyk windows metafile_pacsec_v2
Jurczyk windows metafile_pacsec_v2Jurczyk windows metafile_pacsec_v2
Jurczyk windows metafile_pacsec_v2PacSecJP
 
Moony li pacsec-1.8
Moony li pacsec-1.8Moony li pacsec-1.8
Moony li pacsec-1.8PacSecJP
 
Stuart attacking http2 implementations truefinal-jp
Stuart  attacking http2 implementations truefinal-jpStuart  attacking http2 implementations truefinal-jp
Stuart attacking http2 implementations truefinal-jpPacSecJP
 

Viewers also liked (20)

Shusei tomonaga pac_sec_20171026_jp
Shusei tomonaga pac_sec_20171026_jpShusei tomonaga pac_sec_20171026_jp
Shusei tomonaga pac_sec_20171026_jp
 
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
 
Lucas apa pacsec slides
Lucas apa pacsec slidesLucas apa pacsec slides
Lucas apa pacsec slides
 
Lucas apa pacsec_slides_jp-final
Lucas apa pacsec_slides_jp-finalLucas apa pacsec_slides_jp-final
Lucas apa pacsec_slides_jp-final
 
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-jYuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
 
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_finalYuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
 
Ryder robertson pac-sec skeleton 2017_jp
Ryder robertson pac-sec skeleton 2017_jpRyder robertson pac-sec skeleton 2017_jp
Ryder robertson pac-sec skeleton 2017_jp
 
Di shen pacsec_final
Di shen pacsec_finalDi shen pacsec_final
Di shen pacsec_final
 
Shusei tomonaga pac_sec_20171026
Shusei tomonaga pac_sec_20171026Shusei tomonaga pac_sec_20171026
Shusei tomonaga pac_sec_20171026
 
Yunusov babin 7sins-pres_atm_v4(2)_jp
Yunusov babin 7sins-pres_atm_v4(2)_jpYunusov babin 7sins-pres_atm_v4(2)_jp
Yunusov babin 7sins-pres_atm_v4(2)_jp
 
Yunusov babin 7 sins pres atm v2
Yunusov babin 7 sins pres atm v2Yunusov babin 7 sins pres atm v2
Yunusov babin 7 sins pres atm v2
 
Rouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsecRouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsec
 
Anıl kurmuş pacsec3-ja
Anıl kurmuş pacsec3-jaAnıl kurmuş pacsec3-ja
Anıl kurmuş pacsec3-ja
 
Mickey pac sec2016_final_ja
Mickey pac sec2016_final_jaMickey pac sec2016_final_ja
Mickey pac sec2016_final_ja
 
Jurczyk windows metafile_pacsec_jp3
Jurczyk windows metafile_pacsec_jp3Jurczyk windows metafile_pacsec_jp3
Jurczyk windows metafile_pacsec_jp3
 
Villegas first pacsec_2016
Villegas first pacsec_2016Villegas first pacsec_2016
Villegas first pacsec_2016
 
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
 
Jurczyk windows metafile_pacsec_v2
Jurczyk windows metafile_pacsec_v2Jurczyk windows metafile_pacsec_v2
Jurczyk windows metafile_pacsec_v2
 
Moony li pacsec-1.8
Moony li pacsec-1.8Moony li pacsec-1.8
Moony li pacsec-1.8
 
Stuart attacking http2 implementations truefinal-jp
Stuart  attacking http2 implementations truefinal-jpStuart  attacking http2 implementations truefinal-jp
Stuart attacking http2 implementations truefinal-jp
 

Similar to Marc schoenefeld grandma‘s old handbag_draft2_ja

オープンセミナー2014@広島プレゼン
オープンセミナー2014@広島プレゼンオープンセミナー2014@広島プレゼン
オープンセミナー2014@広島プレゼンKakigi Katuyuki
 
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまでSphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまでStudy Group by SciencePark Corp.
 
AWS Summit New York 2017 Keynote Recap
AWS Summit New York 2017 Keynote RecapAWS Summit New York 2017 Keynote Recap
AWS Summit New York 2017 Keynote RecapEiji Shinohara
 
Eucalyptus infra technology
Eucalyptus infra technologyEucalyptus infra technology
Eucalyptus infra technologyEtsuji Nakai
 
ソニーでElectronアプリをリリースしてみた
ソニーでElectronアプリをリリースしてみたソニーでElectronアプリをリリースしてみた
ソニーでElectronアプリをリリースしてみたYasuharu Seki
 
dbtech showcase 2016 Delphix講演資料
dbtech showcase 2016 Delphix講演資料dbtech showcase 2016 Delphix講演資料
dbtech showcase 2016 Delphix講演資料Delphix Japan
 
【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!
【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!
【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!日本マイクロソフト株式会社
 
モバイルアプリケーションセキュリティ101
モバイルアプリケーションセキュリティ101モバイルアプリケーションセキュリティ101
モバイルアプリケーションセキュリティ101TokujiAkamine
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介NilOne Ltd.
 

Similar to Marc schoenefeld grandma‘s old handbag_draft2_ja (10)

オープンセミナー2014@広島プレゼン
オープンセミナー2014@広島プレゼンオープンセミナー2014@広島プレゼン
オープンセミナー2014@広島プレゼン
 
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまでSphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
 
第37回「Dockerのユースケースと将来」(2014/10/30 on しすなま!)
第37回「Dockerのユースケースと将来」(2014/10/30 on しすなま!)第37回「Dockerのユースケースと将来」(2014/10/30 on しすなま!)
第37回「Dockerのユースケースと将来」(2014/10/30 on しすなま!)
 
AWS Summit New York 2017 Keynote Recap
AWS Summit New York 2017 Keynote RecapAWS Summit New York 2017 Keynote Recap
AWS Summit New York 2017 Keynote Recap
 
Eucalyptus infra technology
Eucalyptus infra technologyEucalyptus infra technology
Eucalyptus infra technology
 
ソニーでElectronアプリをリリースしてみた
ソニーでElectronアプリをリリースしてみたソニーでElectronアプリをリリースしてみた
ソニーでElectronアプリをリリースしてみた
 
dbtech showcase 2016 Delphix講演資料
dbtech showcase 2016 Delphix講演資料dbtech showcase 2016 Delphix講演資料
dbtech showcase 2016 Delphix講演資料
 
【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!
【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!
【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!
 
モバイルアプリケーションセキュリティ101
モバイルアプリケーションセキュリティ101モバイルアプリケーションセキュリティ101
モバイルアプリケーションセキュリティ101
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
 

Recently uploaded

あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]
あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]
あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]Taka Narita
 
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法ivanwang53
 
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーン
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーンWindowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーン
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーンivanwang53
 
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元ivanwang53
 
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docx
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docxWindows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docx
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docxivanwang53
 
動的 & 非同期コンポーネント / Dynamic & Async Components
動的 & 非同期コンポーネント / Dynamic & Async Components動的 & 非同期コンポーネント / Dynamic & Async Components
動的 & 非同期コンポーネント / Dynamic & Async Componentsokitamasashi
 

Recently uploaded (6)

あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]
あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]
あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]
 
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法
 
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーン
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーンWindowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーン
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーン
 
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元
 
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docx
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docxWindows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docx
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docx
 
動的 & 非同期コンポーネント / Dynamic & Async Components
動的 & 非同期コンポーネント / Dynamic & Async Components動的 & 非同期コンポーネント / Dynamic & Async Components
動的 & 非同期コンポーネント / Dynamic & Async Components
 

Marc schoenefeld grandma‘s old handbag_draft2_ja