QARK とは?

概要

Quick Android Review Kit の略で、LinkedIn がオープンソースで公開している Android アプリの脆弱性検査ツールです。

※ この文書は2015年11月時点での最新版の QARKv0.9-alpha.10 について述べた文書です。

出来ること

ソースコードと apk の両方を対象とした脆弱性のチェックができます。また、検査の際に root 化された端末である必要はありません。

検査内容

QARK は以下の種類の脆弱性を検知します。

  • 意図せずエクスポートされたコンポーネント
  • 不適切に保護されたエクスポートされたコンポーネント
  • インターセプトまたは傍受に対する脆弱性を持つインテント
  • x.509 証明書の不適切な妥当性チェック
  • 他から読んだり書いたりできるファイルの生成
  • データをリークするかもしれない Activity
  • Sticky Intents の使用
  • セキュアでない方法で生成されたペンディング・インテント
  • セキュアでないブロードキャスト・インテントの送信
  • 個人鍵のソースコードへの埋め込み
  • 弱いか不適切な暗号化の使用
  • 潜在的に悪用可能な WebView 設定
  • エクスポートされた Preference Activities
  • タップの乗っ取り
  • アプリがバックアップ有効かどうか
  • アプリがデバッグ可能かどうか
  • 既知の脆弱性を持つ古いAPIが使用されていないか

ライセンス

Apatch License 2.0


導入手順

種別

QARK の動作要件は以下の表になります。

種別 バージョン
Python 2.7.6
JRE 1.6+ (1.7+の方がより望ましい)
OS OS X Ubuntu Linux (他の環境でも動くと思われるが完全にはテストされていない)

ここでは OS X 10.10 Marverix での導入手順について説明します。

まず任意のフォルダで QARK のコードをダウンロードします。

curl -L -o qark-0.9-alpha.10.zip https://github.com/linkedin/qark/archive/v0.9-alpha.10.zip

その後、ダウンロードしたコードを解凍します。

unzip qark-0.9-alpha.10.zip

これだけで、導入は完了です。


使い方

まず、QARK を解凍して出来たフォルダに移動します。 以下は、ホームディレクトリに解凍していた場合のコマンドになります。 別ディレクトリに解答した場合は、適宜読み替えてください。

cd ~/qark-0.9-alpha.10

解答したディレクトリに移動したら QARK を対話モードで実行します。 以下がそのコマンドになります。

python qark.py

初回起動時

次のような画面が表示されます。

初期起動画面

初回起動画面には次のようなことが書いてあります。

初期化に関する情報

QARK の特定の機能は Android SDK に依存しています。使用したい Android SDK はシステムにすでにインストールされているかもしれません。

もしそうでなければ、あなたは QARK に容易に自動的に必要となる Android SDK のコンポーネントをダウンロードさせることができます。もし"n"を選択すれば、Android SDK の path を要求されるでしょう。

おすすめは、QARK に Android SDK のダウンロードとセットアップをさせることです。そうすれば、既にインストールされている Android SDK に影響を及ぼしません。

QARK に Android SDK のダウンロードとセットアップをして欲しいですか?[y/n]

QARK に Android SDK のダウンロードとセットアップをさせるのがオススメのようなので "y" を選択しましょう。

2回目以降起動時

2 回目以降は起動すると以下の画像のようになります。

この画面ではまず検査する対象を apk ファイルかソースコードのどちらにするか選びます。

apk ファイルを検査する場合

『1』を入力して Enter キーを押下しましょう。

  • QARK の公式サイトにも書いてありますが、apk ファイルを検査する場合はライセンスや著作権など法的に問題のないものを対象にしましょう。

Enter キーを押下すると以下の画像のようになります。

表示される選択肢は

[1] apkファイルのパスを指定 [2] 端末からapkファイルを取得

となります。

apkファイルのパスを指定する場合は、『1』を入力して Enter キーを押下しましょう。 指定した apk ファイルを逆コンパイルして脆弱性を検査します。

端末から apk ファイルを取得する場合は、『2』を入力して Enter キーを押下しましょう。 すると端末内の apk が一覧表示されます。その一覧から apk を選択するとその apk ファイルを逆コンパイルして脆弱性を検査します。

ソースコードを検査する場合

『2』を入力して Enter キーを押下しましょう。 検査したいソースコードのパスを渡すと、脆弱性の検査結果が表示されます。

脆弱性使用 APK の生成

検査後、脆弱性をつく悪意のあるアプリがどういったことができるかを確認できるAPKを生成できます。

『1』を入力して Enter キーを押下すると、apk が生成されます。

レポートの出力

検査結果はログファイルと HTML ファイルとして Report フォルダに出力されます。

エラーについて(1)

検査の途中でエラーが出る場合、HTML の Reportは出力されませんが

python qark.py --source 2 -c "プロジェクトのパス" --manifest "Manifestファイルのパス" --exploit 0 -d 50

のように-d 50でデバッグオプションを CRITICAL に設定することで回避できる場合があります。

エラーについて(2)

検査対象のコードや Manifest ファイルの文字コードが UTF-8 でない場合、エラーが出て正常に動作しないことがあります。


情報ソースなど


Python 環境の調整 (おまけ)

ここでは Python 環境の調整について説明します。

例えば、以下のようなことが起きるかもしれません。

インストールされている python のバージョンを確認した所、バージョンが要件とずれていることがわかりました。

$ python -V
Python 2.7.10

そんな時は念の為に Python2.7.6 の環境を整えます。

※ Python 2.7.10 でも動いたので特に必要はないかもしれません。

anyenv インストール

git clone https://github.com/riywo/anyenv ~/.anyenv
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
exec $SHELL -l

anyenv-update インストール

mkdir -p $(anyenv root)/plugins
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update

anyenv周りを最新に

$ anyenv update
Updating 'anyenv'...
Already up-to-date.

Updating 'anyenv-update'...
Already up-to-date.

pyenv インストール

anyenv install pyenv
exec $SHELL -l

pyenvがインストールできていることを確認

$ anyenv version
pyenv: system (set by /Users/username/.anyenv/envs/pyenv/version)

Python 2.7.6 をインストール

pyenv install 2.7.6
$ pyenv versions
* system (set by /Users/username/.anyenv/envs/pyenv/version)
  2.7.6

Python環境切り替え

$ pyenv global 2.7.6
$ python -V
Python 2.7.6

…切り替えた環境を元に戻す場合は

pyenv global system

最後に

検査結果の説明が詳しくでるというのはとても嬉しい機能だと思います。

AnCoLe のように Eclipse 上ではなく CUI で動作するので、Android Studio でのプロジェクトを対象とした脆弱性検査にはよいのではないでしょうか。 ただ、エラーを吐いてレポートが出力されないケースなども少々あるので少し取り扱いに注意が必要かもしれません。