2016年8月17日水曜日

IPAセキュリティキャンプ2016全国大会3章 ~~~学習内容~~~

チューターも一緒に学ぶことができるのがセキュリティキャンプです!!!
セキュリティキャンプの講義は毎年内容が新しくなります!!!最先端のセキュリティを学べる場所です!!

〜〜〜学習内容〜〜〜
1. 廣田先生のHTTPプロキシ入門


この講義ではBurp SuiteというHTTPプロキシツールを使って、
さらにJavaプラグイン開発によって機能を拡張することによって、
HTTPの上の独自プロトコルを解析し、パケット偽装をしてモバイルアプリケーションのペネトレーションテストをするというハンズオンでした。

一番楽しかったのがJavaプラグイン開発で、
「スクリプトキディではなく、自分のコードでペネトレーションテスト」というロマンを感じました!!!(^O^)
Java自体はそこまで好きではないですが(笑)(JVM言語ならKotlin推し)、
Javaだと「コード書いた!!!」感があるので「自分のコードでペネトレーションテストしている!!!」という達成感が味わえます!!!!

2. はるぷ先生のスマホゲームセキュリティ
この講義ではスマホゲームの多角的なセキュリティ問題を分析しつつ、
Burp Suiteによるパケット解析&パケット偽装やHTTPリクエストなどでモバイルゲームのペネトレーションテストをするというハンズオンでした。
バリデーションチェックの重要性を手を動かしながら、ブラウザゲームなどのゲームバランスを崩壊させて、身を持って体験しました。
一番楽しかったのが講義でちょろっと触れた、ゲームのメモリの挙動を見て値を改ざんしたり、
Unity Androidアプリケーションのapkを展開し、dll(MSIL)をバイナリ解析してTelerik JustDecompileでリバースエンジニアリングを行うことで秘密鍵を手に入れたり、
IDA Proでcocos-2dxで生成されたARMの.soを解析することでした。
Unityでゲーム開発をしたことがあるので、Unityが簡単にリバースエンジニアリングできるということを手を動かして知ったことが新鮮でした!
また、Unityの最新ベータ機能であるILCPPという最新機能についても講義で触れていました。
ILCPPはMSILコードをC++に変換し、 C++ -> バイナリに変換するコンパイラなのですが、
これを使用することによってMSILバイナリ -> x86/armバイナリになるので、バイナリ解析の敷居が上がり難読化と同じ効果が見込めるということをはるぷ先生が話していました。
自分はAndroid用ARMバイナリを解析しようとして挫折したことがあったのでこれはすごく共感しました。
~~~Android用ARMバイナリ(共有ライブラリ)を静的解析しようして挫折した話~~~
自分は以前Apache 2.0ライセンスのGoogle Cardboard Android SDK(Google社製)を使うときにAPIを拡張したかったのですが、JavaDocと.jarファイルしか提供されてないことがありました。
Google CardboardはAndroidをVRデバイスにするためのプラットフォームで、車輪の再発明をするとパフォーマンスが落ちそうだったので(VRはUX上高フレームレートの確保が必須)、
APIの拡張をするのが一番効率的だと思いました。
.jarファイルを展開してJava bytecodeをdecompileすると、所々の関数にnativeという修飾子を発見しました。
これが意味することは、肝心な実装のロジックはC++でJNIで書かれていているよ、ということです。
そこで参照している.soファイルをobjdumpでarmモードでディスアセンブルしたのですが、JNIのコルーチンをアセンブラレベルで読むのは大変で、またところどころにNEON命令やFPU命令があり、10000行以上あり解析が大変すぎて途中で読むのをやめました。
フリーのobjdumpで静的解析は大変で、IDA Proを買うお金はない。。。。。。

3. 河合先生&坂井先生の「システムに新機能を追加してみよう」
この集中講義は河合先生の実装した、khpcという永続変数ライブラリを使って「何かソフトウェアを開発しよう」、というものです。
永続変数とは、データが永続化された変数で、
khpcはファイルI/O(libcの関数を使用)を抽象化したAPIをユーザーに提供しています。
河合先生はGUI開発のためにblikeという自作したライブラリもこの講義で提供してくれたのですが、このblikeライブラリは2Dグラフィックス専用です。
自分はkhpcの機能を3D空間、そしてVR空間に持って行きたかったので、Unity用のkhpcプラグインを開発しました。
行ったことは、
1. khpcをC -> C++にする
2. khpcにDLLImportの構文を追加する
3. g++でコンパイル & dll生成
4. C#でkhpcのdllを呼び出すラッパー関数を作る
 です。
4で, C#上でポインタ操作を行う必要がありました。
残念ながら、デモ時にVRゲームが2秒でクラッシュしてしまいました。
後ほど原因を解析したところ、C#のvoid*型はC/C++のvoid型ではなく、
C++/CLRのSystem.Void型であることが判明し、そこの型の異なりによって実行時にエラーを起こしてしまったのだと思います。
つまりkhpcの関数の返り値をvoid*型ではなくSystem.Void*型にしなければなりませんでした。
C#/.NETの良い勉強になりました。

4. 竹岡先生の「ハードウエアの基礎」
この講義では、ロボットを作る上で重要なデジタル回路のハンズオンでした。
自分が、中学生のときロボカップジュニアのロボットを一日中作っていたときの懐かしい雰囲気の、いい雰囲気の講義でした。 (^^)

5. 長谷川先生&にしむねあ先生の「次世代プラットフォームのセキュリティ」

この講義ではelectronやWebViewなどのハイブリッドアプリケーションをペネトレーションテストするという講義でした。 Webには色々な脆弱性があるのだな、と知りました。
また、あの有名なWEBサイトを踏み台にexploitしたり、JSの匿名関数/関数オブジェクトの機能を使って任意のJSの関数を実行させるexploit技法が新鮮でした。


6. 三村先生の「.NETプログラムの解析」
人生初のランサムウェア解析を体験しました!!!

この講義では、最近徐々に増加傾向であるMSILマルウエアを解析する技法を学習する講義でした。
 .NET仮想マシンの挙動、仕組みを学習しました。.NET仮想マシンは1つのスタックしか存在しないスタックマシンなので、「x86/ARMより簡単!」と思いました。
MSILバイナリはC#コードにデコンパイルできるので、すいすいと読めます。
MSDNでオペコードのリストも公開されており、 スタックが一つだけなのでMSILコード生でも比較的簡単に読めます。

また、最近オープンソース化された.NET Coreのソースを読む(ilasmのC++ memory allocationコード)という熱い体験をしました!!!
 
スマホゲームセキュリティではるぷ先生がちょろっと触れていた、Packerという難読化技法がされたMSILバイナリに対して静的解析を行いました!

Packerというアプリケーションバイナリ難読化方法があるよ(はるぷ先生) ->
Packerはこんな仕組みだよ/コードはこれ(LoadAssembly)(三村先生) ->
Packerで難読化されたバイナリ読むよ(三村先生)

このような、別トラック間でフルスタックにセキュリティ問題の解決が学べる体験ができて感動しました!!!

最後の演習は、MSILランサムウェアを解析して、 それを元に暗号化されたファイルを復号するソフトウェアをつくろう、というハンズオンでした。 SmartAssemblyという有償のobfuscatorで難読化されているため、静的解析が非常に大変でした。。。。。。(^_^;)

また、IDA Proを買うとできるロマン体験談と、IDA Proやセキュリティソフトウェアの脆弱性を突くマルウエアなどのホットな話を聞きました!!

~~~今後の課題~~
1.今までTCP/UDP上に実装された独自プロトコルは実装/移植/解析したことがあったのですが、HTTPの仕様があまりわからずHTTP上で実装された独自プロトコルの通信の仕組みがあまりわかりませんでした!^^; 
HTTPに関しては、今まではXML-RPCの解析、RESTとOAuth2 APIをただJSでただ叩くだけでしたが、これを期にHTTPプロトコルを理解してレイヤを上げていこう!!!
2. 今まではC#をコーディングするだけでしたが、今回C#/.NETの詳しい仕組みが少しだけわかったので、この調子でCoreCLRの実装などを詳しく読んでいったり、Windows APIの理解をして行こう!!!
3. 今まではJavaScriptのコーディングだけでしたが, V8 EngineやSpiderMonkeyなどのJavaScript EngineのソースやFirefoxのソースを読み、ブラウザやJavaScriptが実行される仕組みを理解していこう!!!
4. 暗号の知識が皆無と感じたので、暗号を学習して行こう!!!
5. 難読化のロジックを理解し、難読化されたバイナリへの対処技術を身につけよう!!!難読化解除ツールやobfuscatorなどが自作できるようになろう!!!

~~~思ったこと~~~
・時代はC#/.NET!!!  

・中間言語楽しい!!!

0 件のコメント: