ハッキング技法#5: バイナリ改ざん

みなさんこんにちは。
セキュリティソリューションチームで働くオルトプラスラボのcimadaiです。

本記事はハッキング技法シリーズとして、Androidアプリをハッキングする方法などについて連載しています。
主な読者としては、Androidアプリの開発をしているエンジニアの方を想定しています。

さて、ハッキング技法シリーズ第五弾の今回は、バイナリ改ざんというテクニックをご紹介します。

▶バイナリ改ざん

バイナリ改ざんは読んで字のごとく、アプリのバイナリを改ざんしてしまい、プログラムそのものを書き換えてしまおう、というテクニックです。

バイナリを改ざんするには今までの技法よりも更に低レイヤーの知識が必要になる、高度なハッキング技法になります。

バイナリ改ざんは、その性質上自由度が高くできることの幅も広いため、本記事では初歩的なバイナリ書き換えであるアセンブリ書き換えをご紹介します。

逆アセンブルで有名なのはIDA Proですが、Macであれば Binary Ninja というツールで逆アセンブルとアセンブリ書き換えを手軽に始めることができます。
自分で作った動的ライブラリとして、以下のようなコードがあるとします。
自作の get_number関数から数値を受け取って、「Number is 100.」という文字列をJavaに返すというネイティブ処理です。

このライブラリの成果物である libnative-lib.soをBinary Ninjaで開いて、get_number関数内の即値の100 (0x64) を255 (0xff) に書き換えてみます。

その後、変更を加えたバイナリを「File->Save」で同名で保存したあと、端末にadb pushで戻すとJavaコードからdoThingsを呼び出した時に「Number is 255.」という文字列が返るようになります。

このように、バイナリ自体を変更してしまうことでプログラムの動作を非root端末でも変更することができるようになってしまいます。

▶対策方法

バイナリ書き換えに対する対策というのは非常に多岐にわたりますが、アプリ生成時のライブラリのサイズやハッシュ値を記憶しておき、ロード時に変更されていたら改ざんされていると認識するという方法が手軽さと効果の観点からはいい方法と言えるでしょう。

しかし、ライブラリのサイズを同一サイズに調整したり、有名なハッシュアルゴリズムの場合にハッシュ値をあえて衝突させるなどの方法を取られると上記の対策だけでは守りきれない可能性もあります。

バイナリ改ざんの手法およびバイナリ改ざんを隠す方法が多岐に渡るように、その対策も多岐に渡って行う必要があります。
特に有名なアプリになればなるほど、日本以外の国にリリースすればするほど、改ざんされたバイナリが出回ってしまうなどの被害にあう機会は増えてしまいます。

ハッキング手法とその対策の繰り返しで消耗してしまい、本来のアプリ開発がおろそかになってしまっては本末転倒です。

DxShieldではこのような攻撃に対して、アプリを強固に守るための対策を何重にもおこなっていますので、簡単にしっかりと守ることが可能です。

オルトプラスではアプリ開発者のみなさんが安心してアプリ開発に集中できるようになるためのセキュリティソリューションを提供していますので、是非ご利用下さい!

開発者向けセキュリティソリューション DxShield のサイトはこちらから!

それではみなさん、安全なアプリ開発を!