LinuxからJailbreakしていないiOS上でアプリケーションセキュリティテストを行う
LinuxマシンからJailbreakしていないiPhone上で、iOSアプリケーションファイルのセキュリティチェックを行う方法。
概要
iOSアプリケーションのセキュリティテストに、JailbreakされたiPhoneやiPadは必要ありません。本稿は、Jailbreakしていない 端末上でモバイルアプリケーションの各側面を評価する方法を列挙した、更新され続けるドキュメントです。
注記
これは暗号化されていないIPAにアクセスできることを前提としています。
Apple Developer Account
セキュリティテストの目的には、無料のApple developer accountのみが必要です。登録については要件の リンクを参照してください。
個人の場合、必要なのはApple IDと二要素認証の有効化だけです。
有料のApple Developer Accountは、アプリケーション制作者向けおよびアプリケーション配布向けの機能を提供します。
簡単な方法:Cydia Impactorによるインストール
iOSデバイスにIPAアプリケーションをインストールする最も簡単な方法は、Cydia Impactorを使うことです。 Cydia Impactorは、無料ですがオープンソースではないツールです。
まず、Apple developer accountの証明書をリセットし、iOSまたはiPadデバイスが検出されていることを確認したうえで、 install packageを選択してアプリケーションをインストールします。
Cydiaは非常に使いやすいものの、アプリケーションがデバッグモードでない場合はインストールに失敗し、あるいは エンタイトルメントが適切にパッチされていなかったために実行時に失敗します。
完全な制御の方法:ideviceinstallerと手動でのパッチ
この方法は手動で、IPAのエンタイトルメントをパッチし、その後ideviceinstallerを使ってパッチ済みのアプリケーションを
インストールすることからなります。
デバッグモードを有効にするためにIPAをパッチする
最初に遭遇し得る問題は、デバッグが有効でないアプリケーションをインストールしようとすることです。iOSは無効な署名について 不満を述べるでしょう。
デバッグモードを有効にするには、まずIPAからエンタイトルメントを抽出します。
これはjtoolを使って行えます。
unzip app.ipa
./jtool.ELF64 -arch arm64 --ent Payload/myOstorlabApp.app/myOstorlabApp > /tmp.ent.xml
生成されるエンタイトルメントは次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>4ZX4Z3MVHG.com.appleseedinc.MyProject</string>
<key>com.apple.developer.team-identifier</key>
<string>4ZX4Z3MVHG</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>4ZX4Z3MVHG.com.appleseedinc.MyProject</string>
</array>
</dict>
</plist>
デバッグモードのアプリケーションは、キーget-task-allowが<true/>に設定されています。そうなっていない場合は、
エンタイトルメントを変更し、新しく作成したエンタイトルメントでバイナリをパッチします。
そのためにはLinux上で、代替エンタイトルメントをサポートするisignの以下のフォーク版を 使います。isignはPython2専用です。
from isign import isign
isign.resign("file.ipa", output_path="/tmp/new_ipa.ipa", alternate_entitlements_path="/tmp/ent.xml")
OpenSSLのエラーが出る場合は、pyOpenSLLを再インストールしてみてください。
sudo python2 -m pip install pyOpenSSL
エラーが発生した場合に、isignのログを確認するには、次のコードを使います。
import logging
import sys
root = logging.getLogger()
root.setLevel(logging.DEBUG)
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
root.addHandler(handler)
isignはconstructのチェックで失敗することがありますが、このチェックは誤りなので、単にコメントアウトして再試行してください。
ideviceinstallerによるインストール
ideviceinstallerの場合、まずdeveloper証明書をプロビジョニングする必要があります。そのためには、次のリポジトリの ツールを使います。
./genProvisioningProfileFree.sh <AppleID> <Password> <Device UUID>
デバイスのUUIDはlsusbを使って取得できます。
developer accountがプロビジョニングされたら、ホームフォルダー内に生成された.isign/isign.mobileProvisionファイルを調べ、
<TeamIdentifier>の値を探してください。これは4ZX4Z3MVHGのようなものになっているはずです。その値を使って、
エンタイトルメントファイルを変更し、以前のチームIdentifierのすべての出現を自分のチームの値に置き換えます。
変更したエンタイトルメントでアプリケーションに署名します。
from isign import isign
isign.resign("file.ipa", output_path="/tmp/new_ipa.ipa", alternate_entitlements_path="/tmp/ent.xml")
最後に、ideviceinstallerを使って、新しく生成したIPAをインストールします。
ideviceinstaller -i /tmp/new_ipa.ipa
その他のアクション
以下は、評価の際に行うと便利なアクションの一覧です。
Developer Disk Imageを取得する
いくつかのimobiledeviceツールは、Developer Disk Imageのマウントを必要とします。自分のOSバージョンに一致する ディスクイメージをダウンロードするには、リポジトリを参照してください。
ディスクイメージをマウントするには、ideviceimagemounterを使います。
ideviceimagemounter -t Developer DeveloperDiskImage.dmg DeveloperDiskImage.dmg.signature
ディスクが正しくマウントされているかを確認するには、次のようにします。
ideviceimagemounter -l 2 ↵
ImageSignature[1]:
0: OIrMZfwD5TcdgVaizBMAaImjwDXsrldgRDbsiSWbtafuf1t0BSJR9tDycyYPG3E+wmUY8fmP0l0S3UkMkQpJksFOx2fn0h1lAuhAiP9bJBjZ6PvbetHE/A2XJNVu78obBZl9dAzgpIEHPSvu6HJM7mdZrdFjA7GG7QJOnCL4Vnc=
デバイスのログにアクセスする
iOSデバイスのログにアクセスするには、Developer Disk Imageをマウントしたあとにidevicesyslogを使います。
スクリーンショットを撮る
スクリーンショットを撮るには、Developer Disk Imageをマウントしたあとにidevicescreenshotを使います。
LLDBデバッガーをアタッチする
Linux上のLLDBデバッガーは、ターゲットとしてremote-iosをサポートしていません。
タグ:
ios