-Androidの普及に伴い、Javaソースコード難読化ツールへの注目が高まっている。Androidアプリをリバースエンジニアリングの悪用から守るためである。Androidアプリは、Java言語によるソースコードを、実行環境であるDalvik仮想マシン用の中間コードに変換して配布する。kwoutこのような中間コードと仮想マシンを用いる実行環境には強力なメリットがある一方、ネイティブコード(機械語)に比べてリバースエンジニアリングが非常に容易であるという特性がある。中間コードからソースコードを復元する「逆コンパイラ(デコンパイラ)」と呼ぶツールがあるためだ。@ITリバースエンジニアリングそれ自体は有用な技術だ。Injection、依存性注入)」といった新しいプログラミング技術は、中間コードを巧みに操作することで実現している。中間コードは解読と操作が可能であるという性質には、悪用されるリスクが伴う。このリスクを大幅に減らしてくれるのが難読化ツールだ。本稿では、難読化ツールとしてよく知られている「ProGuard」と、高機能な「DashO」を取り上げる。ProGuardは、AndroidのSDKのビルドシステムに組み込まれており、誰でも無償で利用可能だ(参考:ProGuardの紹介記事、その1とその2)。ProGuardを利用中の開発者も数多い。kwout一方、「DashO」(「ダッシュオー」と読む)は機能が多い商用製品である。Solutions社が開発し、エージーテックが国内販売する。Studioに同梱されて広く使われているという実績を持つ。Java向けの難読化ツールDashOも古くからある製品だが「ここ2年ほど」(エージーテック)で注目が高まっているという。Androidが台頭してきたためだ。kwout「中間コード+仮想マシン」のメリットとデメリット公平を期すために、中間コードを仮想マシン上で実行するプログラム処理系にはどのようなメリットとデメリットがあるのか記しておく必要があるだろう。ソフトウェアの歴史を俯瞰すれば、中間コードを用いる処理系は、大きな流れとして観測できる。Pascal」でも用いられていた。1990年代に登場したJavaテクノロジと.NETテクノロジでも採用されている。これらの処理系は、開発者が記述したソースコードを中間コードにコンパイルし、仮想マシン上で実行する。このような中間コードによる実行環境には、2つの重要な特徴がある。ネイティブコードよりも実行ファイルのサイズが小さくなる実行中のプログラムが異常な状態になっても、他のプログラムに悪影響を及ぼす可能性を削減できる(これは、アプリのバグによるOSのクラッシュや、悪意のあるプログラムの登場を防ぐ意味からも、重要だ)サイズが小さくなり、しかもセキュリティ上も有利──これはインターネット上で配布するプログラムの実行形式として優れた特質といえる。JavaテクノロジやAndroid、そして.NETテクノロジで「中間コード+仮想マシン」による実行形式が取り入れられてるのは、このようなメリットがあるためだ。中間コードには弱点もある。弱点には対処法がある。1の性能問題を解決する「JIT(Just-in-Time)」コンパイラには長い歴史があり、多大な開発投資が注ぎ込まれてきた。今のJavaやC#で処理性能が問題となる場合はめったに聞かない。2.2以降でJITコンパイラを導入し、計算処理が多いアプリの処理性能が大きく改善された。2の「リバースエンジニアリングの容易さ」を解決する道具建てが、今回取り上げる難読化ツールなのである。Androidの普及で再び注目を浴びる難読化ツール興味深いことに、Javaがエンタープライズ分野で広く使われるようになってから約10年という年月が経っているのにもかかわらず、Javaの難読化ツールはこれまであまり注目されていなかった。エンタープライズ分野でのJavaは、主にサーバサイドで使われていた。マシンルームの奥深く、ユーザーから直接アクセスできないアプリケーションサーバ上で実行するプログラムに対してリバースエンジニアリング悪用の可能性を考慮するユーザーは、ほとんどいなかったということだろう。歴史をさかのぼれば、Java登場の初期段階(1995〜1997年ごろ)にはJavaアプレットの形態で本格的なOffice系アプリを作る試みもあった。この時期には、難読化ツールの必要性が議論されたこともある。Marketなどで世界中の不特定多数のユーザーに公開されるという性格を持っている。スマートフォン製品にプリインストールするAndroidアプリもある。端末プリインストールのアプリが、リバースエンジニアリングの悪用により改ざんされて配布されるような事態が起これば、メーカーの責任が問われるだろう。このような事情から、Javaプログラムのリバースエンジニアリング悪用の可能性に再び注目が集まるようになったのだ。Manager岩沢宏美氏)ことにある。一般論として、どのようなセキュリティ技術であっても、スキルが高いプログラマが、全力であるターゲットに攻撃を試みる場合には「絶対に安全」といい切ることはできない。いえ、面白半分に企業のブランド価値を毀損するようなリバースエンジニアリングの悪用の可能性を大幅に減らすことができる。「悪用の難易度を大幅に高める」ことが、難読化ツールの価値なのである。鍵がかかっていないドアより、鍵がかかったドアの方が安全であることは、いうまでもない。2009.)では、リバースエンジニアリングの悪用に基づくリスクを次のように分類している。読んでいると恐ろしくなってくるかもしれないが、あくまでも悪用の可能性を列挙した記述であることに注意したい。リバースエンジニアリングを妨害するには、次のような手段がある。名前の難読化クラス名、メソッド名、変数名などソースコード中の「名前」を人間にとって読みにくいものに変換する。副次的に、コードのサイズを減らす効果もある。意味がないループやGoto文を挿入するなどして、ソースコードをわざと難解にする。CPUサイクルが若干増加(=パフォーマンスが低下する)する副作用がある文字列暗号化による難読化ログインプロンプト、SQLクエリなど、重要な情報を含む文字列を暗号化する。パフォーマンスが低下する副作用がある事前コンパイル「AOT(Ahead-of-Time)コンパイラ」と呼ぶ技術を用いて中間コードではなくネイティブコードの形式で配布。使用状況のモニタリング認証されないアプリ利用やインストールを検出ツールの必要性・使い道を考える難読化ツールProGuardが提供する機能は1の「名前の難読化」の範囲にフォーカスしている。DashOは1に加えて、2「制御フローの難読化」、3「文字列暗号化による難読化」、7「コード署名」(Androidのビルドプロセスに署名に必要な情報を渡す。DashO自体はコードの署名を行わない)、8「改ざん防御」の機能を提供する。Service」が提供している。開発者は、開発サイクルの一部に難読化の工程を含める必要がある。上記2の「制御フローの難読化」などのテクニックは、性能やタイミングに厳しいアプリ(例えばゲームアプリ)に適用する場合には、テスト工程で性能を評価し、制御フロー難読化の程度などを調整する必要がある。無償で利用できるProGuardでも、「カジュアルハック」を防ぐ効果は期待できる。個人開発者が無償で提供するアプリなどでは、ProGuardが提供する難読化機能で事足りる場合もあるだろう。その一方で、メーカー製端末プリインストールだったり、企業の「看板」となるアプリの場合には、より高度なリバースエンジニア対策が求められる場合も出てくるだろう。商用製品のDashOは前述したように、より範囲が広い機能群を備える。このツールを指名して開発会社に使わせる発注主もいるという。DashOは定価で最小構成79万円という価格設定なので、適用を見送る場合もあるという。有償ツールを適用するか否かは、開発プロジェクトの規模と、悪用された場合のインパクトを元に、個別に判断しているのが実情だろう。どのようなツールを選ぶにせよ、Androidが普及するほど、これら難読化ツールの出番も増えてきそうだ。iPhone/iPad・Androidアプリ開発にが重要な“使い心地”。AndroidセキュリティAndroidに潜む危険はマルウェアだけはありません。実はアプリの作り方にも注意が必要です。クウと一緒に学びましょう「Security&Trust」フォーラムAndroidセキュリティの今、これから爆発的な勢いで普及し始めたAndroid端末は、大きなポテンシャルを秘める一方で、セキュリティという課題にも直面しています。(2017/7/24)子ども向け電子工作&プログラミング用マイコンボード「chibi:bit」の基本的な使い方を紹介する企画。(2017/7/20)子ども向け電子工作&プログラミング用マイコンボード「chibi:bit」の基本的な使い方を紹介する。