Slide 1

Slide 1 text

森 槙悟

Slide 2

Slide 2 text

所属 ● システム本部 セキュリティ部 セキュリティ技術グループ 経歴 ● DeNA新卒 8年目、セキュリティエンジニア 8年目 ● ICFPC 2020 世界10位(Rust) セキュリティ技術グループの業務内容 ● 脆弱性診断 ● セキュリティ相談対応 ● NW診断 ● ログ管理 ● セキュリティツール作成、チート対策ライブラリ開発など

Slide 3

Slide 3 text

所属 ● システム本部 セキュリティ部 セキュリティ技術グループ 経歴 ● DeNA新卒 8年目、セキュリティエンジニア 8年目 ● ICFPC 2020 世界10位(Rust) セキュリティ技術グループの業務内容 ● 脆弱性診断 ● セキュリティ相談対応 ● NW診断 ● ログ管理 ● セキュリティツール作成、 など

Slide 4

Slide 4 text

● そもそもDeClangって何? ● DeClangを使ってビルドする方法 ● もっと知りたい方へ DeClangの動作確認 クラウドの各OS上で動作させる テスト内容の詳細 結果・まとめ

Slide 5

Slide 5 text

● いわゆるコンパイラ ○ LLVM・Obfuscator-LLVMを拡張して作成 ● スマホゲームのチートを対策 ○ コンパイル時に難読化・コード改ざん検知などを 埋め込む ● Apache License 2.0 でOSSとして一部公開中

Slide 6

Slide 6 text

Unityのビルドフロー

Slide 7

Slide 7 text

DeClangを使ったフロー

Slide 8

Slide 8 text

もっと詳しく知りたい人は過去の発表を参照 ● DeNA TehCon 2020 ○ https://www.slideshare.net/dena_tech/declang-clang-dena-techcon-2020 ● CODE BLUE 2020 ○ https://speakerdeck.com/dena_tech/declang-anti-hacking-compiler ● OSS部分のソースコード ○ https://github.com/DeNA/DeClang

Slide 9

Slide 9 text

DeClangとは? ● 開発時の動作確認 ● 動作確認の手順 ● 自動テストの難所 クラウドの各OS上で動作させる テスト内容の詳細 結果・まとめ

Slide 10

Slide 10 text

● 追加した機能が動くか? ● サポートしている環境でビルドが通るか? ● デグレしてないか? ○ 例えば、コード改ざん検知にバグがあると、 導入の意味が無いしQAでの発見が困難

Slide 11

Slide 11 text

Mac・Linux・Windowsで以下をやる 1. OSS版をcloneする 2. 内部拡張版(Plugin)をcloneする 3. DeClangをコンパイルする 4. ndk(Xcode Project)のコンパイラを差し替える 5. Android(iOS)アプリをコンパイルする 6. アプリのコードを改ざんする 7. Android(iOS)をPCに繋ぎ、アプリをインストールする 8. アプリ起動後に改ざん検知が動くか確認する

Slide 12

Slide 12 text

● 1環境でテストするだけでも数十分かかる ● 手順を少しでも間違えると確認できない ○ ビルドキャッシュが残っていたり ● なるべく全部クラウドでやりたい

Slide 13

Slide 13 text

リポジトリ更新時に で以下をやる 1. OSS版をcloneする 2. 内部拡張版(Plugin)をcloneする 3. DeClangをclangでコンパイルする 4. ndk(Xcode Project)のコンパイラを差し替える 5. Android(iOS)アプリをコンパイルする 6. アプリのコードを改ざんする 7. Android(iOS)をPCに繋ぎ、アプリをインストールする 8. アプリ起動後に改ざん検知が動くか確認する Mac・Linux・Windowsを クラウドで動かす必要がある

Slide 14

Slide 14 text

Mac・Linux・Windowsで以下をやる 1. 2. 3. DeClangをコンパイルする 4. ndk(Xcode Project)のコンパイラを差し替える 5. Android(iOS)アプリをコンパイルする 6. アプリのコードを改ざんする 7. Android(iOS)をPCに繋ぎ、アプリをインストールする 8. アプリ起動後に改ざん検知が動くか確認する 基本的に内部拡張版の方で開発している ので、内部拡張版の更新をトリガにして OSS版をcloneする必要がある

Slide 15

Slide 15 text

リポジトリ更新時にMac・Linux・Windowsで以下をやる 1. OSS版をcloneする 2. 内部拡張版(Plugin)をcloneする 3. DeClangをコンパイルする 4. ndk(Xcode Project)のコンパイラを差し替える 5. Android(iOS)アプリをコンパイルする 6. 7. Android(iOS)をPCに繋ぎ、アプリをインストールする 8. アプリ起動後に改ざん検知が動くか確認する Android・iOSアプリのコードを全自動 で改ざんする必要がある 複数のシナリオを動かす必要がある

Slide 16

Slide 16 text

リポジトリ更新時にMac・Linux・Windowsで以下をやる 1. OSS版をcloneする 2. 内部拡張版(Plugin)をcloneする 3. DeClangをコンパイルする 4. ndk(Xcode Project)のコンパイラを差し替える 5. Android(iOS)アプリをコンパイルする 6. アプリのコードを改ざんする 7. 8. Android・iOSをクラウドで動かしてアプリ のインストール・起動・ログの確認が必要

Slide 17

Slide 17 text

DeClangとは? DeClangの動作確認 ● 各OS(Mac, Linux, Windows, Android, iOS)への対応 ● テストフローの概略 テスト内容の詳細 結果・まとめ

Slide 18

Slide 18 text

● Bitriseを使う ● AWSのEC2(spot instance)のJenkinsを使う ● HeadSpinを使う

Slide 19

Slide 19 text

Bitriseはモバイルアプリケーション(iOS, Android)に特化 したCIプラットフォーム ● Mac, Ubuntuが利用可能 ● Xcodeのバージョン指定が簡単 ● Provisioning Profileなどの設定が簡単 ● プリセット済みのステップが多くCIのワークフローが 簡単に書ける ○ bashのスクリプトも実行可能

Slide 20

Slide 20 text

● GitHub Enterpriseへのアクセスを確保 ● GitHub Statusの変更(Pendingにする) ● Provisioning Profileを設定 ● 次ページで説明 ● GitHub Statusの変更 ● Slackへの通知

Slide 21

Slide 21 text

● プリセットのステップだと 対応が難しいのでスクリプトで実行 ● ビルドに1時間くらいかかる ccacheを使えば2回目は5分 ● キャッシュはS3とsyncする ● Bats + HeadSpinでやる

Slide 22

Slide 22 text

● 環境構築したAMI(イメージ)を作成する ● JenkinsのEC2 PluginでそのAMIのノードを作る ● Windows版はMSYS2(UnixライクなCLI)を使う ○ Mac・Linuxと処理(bashスクリプト)を共通化 させるため ● 他はBitriseとだいたい同じ

Slide 23

Slide 23 text

HeadSpinはAndroid・iOS実機用デバイスファーム ● 専用端末が安定して動作する ● WebUI・APIから実機を操作ができる ○ デバイス情報・ログの取得 ○ アプリのインストール ○ デバッグ接続など ● アプリのテストにAppiumが使える

Slide 24

Slide 24 text

Appiumとは ● Seleinumのアプリ版みたいなもの ● AppiumのサーバにHTTPでコマンドを送信すると アプリの操作ができる ● DeClangでビルドしたアプリのテストだとアプリ起 動・ログ取得ができるので十分

Slide 25

Slide 25 text

GitHub Enterprise * JenkinsのロゴはJenkins projectに帰属します https://jenkins.io/ * 正式名称は右記の通りです S3 : Amazon Simple Storage Service EC2 : Amazon Elastic Compute Cloud Bitrise(Mac) EC2 + Jenkins (Linux, Windows) S3 HeadSpin (Android, iOS) GitHub

Slide 26

Slide 26 text

GitHub GitHub Enterprise Bitrise(Mac) EC2 + Jenkins (Linux, Windows) S3 HeadSpin (Android, iOS) 1. リポジトリ更新時にBitrise, Jenkinsをトリガ

Slide 27

Slide 27 text

GitHub GitHub Enterprise Bitrise(Mac) EC2 + Jenkins (Linux, Windows) S3 HeadSpin (Android, iOS) 2. DeClang本体をclone

Slide 28

Slide 28 text

GitHub GitHub Enterprise Bitrise(Mac) EC2 + Jenkins (Linux, Windows) S3 HeadSpin (Android, iOS) 3. 内部拡張版をclone

Slide 29

Slide 29 text

GitHub GitHub Enterprise Bitrise(Mac) EC2 + Jenkins (Linux, Windows) S3 HeadSpin (Android, iOS) 4. ビルドキャッシュ(ccache)をS3と同期 & DeClangをビルド

Slide 30

Slide 30 text

GitHub GitHub Enterprise Bitrise(Mac) EC2 + Jenkins (Linux, Windows) S3 HeadSpin (Android, iOS) 5. DeClangを使ってアプリをビルド & HeadSpinのAppiumを使ってテスト

Slide 31

Slide 31 text

DeClangとは? DeClangの動作確認 クラウドの各OS上で動作させる ● コード改ざん検知機能とは? ● コード改ざん検知機能の自動テスト ● 複数のテストシナリオへの対応 結果・まとめ

Slide 32

Slide 32 text

● 関数の先頭をジャンプ命令に書き換える ● その対策としてDeClangは関数の機械語の列が コンパイル時から変わってないかを確認する ○ コード改ざんを検知した場合は指定された 関数を呼び出す

Slide 33

Slide 33 text

● テスト時に.soファイル・実行ファイルのコードを 自動的に書き換えれば機能の確認ができる ● どうやって機械語を自動で改ざんするか?

Slide 34

Slide 34 text

● テスト時に.soファイル・実行ファイルのコードを 自動的に書き換えれば機能の確認ができる ● どうやって機械語を自動で改ざんするか?

Slide 35

Slide 35 text

void func1() { int value = 0x2a791f3e; // = 712580926 改ざん対象の値 printf("func1: %d\n", value); __android_log_print(ANDROID_LOG_DEBUG, "DeClang Test", "func1 %d", value); }

Slide 36

Slide 36 text

libsample.so[0x8d8] <+0>: stp x29, x30, [sp, #-0x10]! libsample.so[0x8dc] <+4>: mov x29, sp libsample.so[0x8e0] <+8>: adrp x0, 1 libsample.so[0x8e4] <+12>: movz w3, #0x1f3e libsample.so[0x8e8] <+16>: add x0, x0, #0x980 ; =0x980 libsample.so[0x8ec] <+20>: movk w3, #0x2a79, lsl #16 ... 略 ...

Slide 37

Slide 37 text

● コンパイル結果は基本的に同じになるので、 自動化の際は命令の確認はせずにいきなりsedする # movz w3, #0x1f3e -> movz w3, #0xffff xxd -p sample.so | tr -d '\n' | sed s/c3e78352/e3ff9f52/ | \ xxd -r -p > ${temp_file} cp ${temp_file} sample.so

Slide 38

Slide 38 text

● アプリのリパッケージ自体は全てコマンドで可能 ○ Androidはapktool, apksignerを使う ○ iOSはcodesign, zipを使う

Slide 39

Slide 39 text

● 改ざんしている場合は検知ログが出力される ● 改ざんしてない場合は正常に動くべき ● 指定した関数の難読化ができているか ● Bats = Bash Automated Testing System ● シナリオ自体はbashスクリプトとassertで構成

Slide 40

Slide 40 text

@test "コード改ざん検知する" { make_modify_apk # コード改ざんしたアプリを作成(bashの関数) run ./headspin_appium.py \ # HeadSpinの実機で実行 --apk-path="${MODIFIED_APK_PATH}" \ # runを使うと後ろのassertで --app-package="${APP_PACKAGE_NAME}" # 戻り値・標準出力が使える assert_success # HeadSpinでの実行が成功した assert_line --partial "func1 is tampered" # 改ざん検知の出力がある refute_line --partial "func1 712580926" # 改ざん前の値は出力してない }

Slide 41

Slide 41 text

DeClangとは? DeClangの動作確認 クラウドの各OS上で動作させる テスト内容の詳細

Slide 42

Slide 42 text

● 動作確認のミスが無くなった ● 各OSでDeClangが動作するのが保証出来る ● 改ざん検知が正常動作しないバグ ● OSのバージョンによってビルドできないバグ

Slide 43

Slide 43 text

● Bitrise・EC2 + Jenkins・HeadSpinを利用して クラウドで実行 ● コード改ざんを自動で再現するためにsedを利用 ● Batsを使って複数のシナリオに対応

Slide 44

Slide 44 text

No content