#始めに
原題は「Obfuscator-LLVM — Software Protection for the Masses」[1] で、ICSE2015[2]のワークショップ[3]で今年からはじまったSPRO[4]で発表された論文です。OHPはこちら[5]です
内容は LLVM の中間コードを難読化する拡張を オープンソースとして作りましたという報告の 作りました論文です。実装なしで 手法の提案だけをされるよりも 使える実装のある論文のほうが 読んでてワクワクするので私は好きです
商用開発で必用な技術なのにこれまでオープンソースの適切な実装がなく、それを提供したことが Contributionと主張されてますが全くその通りだと思います。 私もこんなの欲しかった
コードはこちらのgithubで公開されています
インストールして使ってみた記事をこちらに用意いたしました
#前提知識
Obfuscation って何? なんて発音するの?
「オブフスケーション」とか「オブファスケーション」とか読みます。コードや変数を複雑にしてソフトウェアの理解を阻止する技術です。whitebox encription と呼ばれることもあります。「難読化」と訳されることが多いようです
なぜソフトウェアの理解を阻止する必用があるの?
ソフトウェアをハッキングして悪用するためには内容の理解が必須です。その理解を阻止して悪用を防ぎます。
どんなところでつかわれてるの?
- 武器の制御:不発ミサイルを解析されてハックされるのを防ぐのに使われているのだそうです
- 有料動画の再生:暗号化された有料動画を複号するプログラムを解析したり、悪い処理を埋め込んだりして暗号鍵を盗まれることを防いでいます
- 有料ソフトウェアの保護:ゲームコンテンツとかパクってキャラクターだけ別のに差し替えて似たようなのを作って少し値段を安くして Google Play とかに出されるのを防いでいます
具体的にどんなことするの?
例えば以下のような単純な代入を
a = b
以下のような2行に変更します(instruction substitutions )
a = b + c
a -= c
よくみると単に a=b なのですが、c ってなんだろ?とちょっとわかりにくいです。こういうのを沢山入れるとオブジェクトサイズは大きくなってしまう(賢いコンパイラだと最適化して無駄かもしれませんが)のですがなにをやってるのかわからなくなります。
他に、普通のコードを switch case に分割して順番を入れ替えるとか、無駄な関数呼び出しを入れるとか、変数を分割する(暗号鍵を守るのに有効)とかいろいろやります
暗号化ではだめなの?
暗号化したコードは実行時には必ず複合化しなければならず、その時にパクられたらおしまいです。obfuscation は何時みてもわけのわからない、読んで理解しようとする心を折ってしまう凶悪なコードです
無意識でそういうコードかいてしまう人は幸いかもしれません
また、mobile や組み込みの環境では暗号鍵を安全に保管する機構が(プラットフォームの提供者は別の事を言ってるかもしれませんが)ない事がよくあります。ARM の trustZone のようなハードウェアサポートが有効なのであればともかく、All SoftWare なシステムでどこかに鍵をおいておかざるを得ない環境では、最低限、鍵そのものと鍵の処理ルーチンを obfuscation で守る必用があります
尚、obfuscation に合わせて anti debugging (デバッガが動いていることを検知すると、嘘ルーチンに飛んで永遠に無意味なコードをデバッグさせる)を併用することもよくおこなわれます
単なるアカデミックな研究なの?商用でも使われているの?
Java の class を obfuscate するプロダクト ProGuarde が Android アプリの開発環境の一部として提供されていることもあり、よく使われています
論文と同様に LLVM の IR を obfuscate する有名な(famous な意味でも notorious な意味でも)商用実装があります。日本でも多くの関係者がこれのおかげで多くの恩恵といくばくかの被害を受けているのではないかという個人的な感想をもっております
尚、コンテンツプロテクションやリンクプロテクションのいくつかの規格は、そのソフトウェア実装において obfuscation を利用することを推奨しています
教科書とかあるの?
紹介論文でも引用されていましたが、こちらが表紙がちょっといけてませんが網羅的でいい本です
著者の1人の Christian Collberg先生は、よくみたら紹介論文が採録された国際会議のプログラム委員されてますね。今、突然気がついてしまった(手遅れ)のですが、プログラム委員が誰かチェックして著述を refer したほうが採録されやすかったのかしら orz... 関係ないですが、Gemaltoとその関係会社関係者が何人も入ってますね...
論文の内容
1章の Introduction で obfuscation の概要をたっぷりと述べ、学会及び産業界での重要性を述べます。つづけて、ソースコードやバイナリコードを obfuscate するのではなく、LLVM コンパイラの中間コードを難読化する実装にした結果、LLVM のサポートする種々の言語、種々のプラットフォームで利用できる obfuscator となった利点を述べています
続く2章 Code Transformations で、まず LLVM についての簡単な説明を行い、Obfuscator-LLVM が実装している個々の手法の詳しい解説が続きます
3章 Practical Results で定量的な評価を行い、4章 Future Work、5章 Conclusion があっさりと続きます
全体で7ページ、実装した手法についての説明も詳しく、読みやすい論文です。お正月休みの読書にちょうどいいかも
#おまけ
成果はこちらのgithubで公開されています
実際に Mac にインストールして使ってみた記事をこちらに用意いたしました
尚、このオープンソースは strong.codesというベンチャーをおこすのに忙しいのであまりメンテしてないなどと宣われております ^^:
まあ strong.code 社も **「大衆のためのソフトウエア保護」**を歌っているので、有名な商用実装よりも大衆的なのかもしれません
#references
-
Obfuscator-LLVM — Software Protection for the Masses
本稿で御紹介させていただきました論文です -
ICSE2015 ソフトウェア工学の まあ御立派な国際会議です。ここに採録されるような御立派な論文が書けるようになるために全論文を **一日で全部勉強してしまおう!**というとても楽しいICSE 2015 勉強会もここ数年毎年開催されています
-
ICSE2015のワークショップ ソフトウェア工学の研究対象っていっぱいあるんですね。丸とか四角とか描いて線で結んでるだけがソフトウェア工学なわけじゃないんですね
-
SPRO 1st International Workshop on Software PROtection
-
Obfuscator-LLVM — Software Protection for the Masses 4人のリサーチャーと数名の学部生、院生で3年間でつくってこられたそうです。ちなみに **「Debugging an obfuscator is ... hard!」**との事ですが、まあそうでしょうねぇ...