Monthly Research 「Android Things Developer Preview 2のセキュリティ調査」
2017年2月9日にAndroid Things の Developer Preview 2 がリリースされました。
主な変更点は、Intel Jouleへの対応、APIの追加や一部デバイスでのUSBオーディオ対応と機械学習アルゴリズムTensorFlowのサンプル追加、開発時の物理ポートの確認コマンド実装でした。リリースノートでセキュリティ関連のアップデート内容の記載はありませんでした。
今回は、このAndroid Things Developer Preview 2 の想定されるユースケースやシステムのファイル構成、セキュリティ設定の変更方法について紹介します。
●Android Things のユースケースと Weave
Android Thingsは電球やスマートプラグなどでの利用が想定されたOSで、土台となったOS "Brillo"はスマートホームの為のOSでした。今後スマート家電向け通信プロトコルWeaveが利用可能になる予定です。
Weaveとは2015年にBrilloと同時にGoogleが発表した通信プロトコルです。
空調や壁のスイッチなど様々な家電製品をスマートフォンアプリなどから制御できるようにする際に利用でき、今後も多くのスマート家電メーカーの製品で対応が予定されています。Android以外にもiOSのアプリでも利用可能で、Weave Device SDK と Weave Server という要素を含みます。
Weave デバイスではデバイススキーマ情報(コンポーネントと特性)で実装している機能を示し、Weave Serverはデバイススキーマ情報を利用し、デバイスに対し利用可能なコマンドなどを判断します。
また、デバイス開発者のためのWebコンソールや管理アプリやセキュリティガイドラインなども存在し、TLS実装時の諸注意や強力なアルゴリズム等によるリソースの暗号化が説明されているので、商品開発を行う場合は 商用利用についての説明をまとめたProgram Onboarding と同時に確認をすると良いでしょう。
●Android Things のセキュリティ(前回の調査結果)
セキュリティ設定の変更に入る前に前回までの内容の確認と今回発見された内容による補足を行います。
前回の調べで確認されたAndroid Thingsのセキュリティ上の注意点は下記の通りです。
- 5555/tcp で Listen している adb に認証無しで接続してコマンドが実行可能
- root へ権限昇格が su パスワードなしで可能
- アプリから要求された権限は全て許可してしまうので、アプリが乗っ取られた場合、デバイスの異常動作や情報漏洩の恐れがある
上記の内容から例えば、デフォルト設定の Android Things デバイスが公共ネットワークに接続されている場合に、第三者によって adb に接続され、root へ権限で任意のコマンドを実行される恐れがありました。
●Android Things 基本的な情報
Android Things のバージョン情報の確認を行っていきます。
getprop コマンドの実行結果は下記の通りで、SDK バージョンは24で、リリースバージョンは 7.0 となっています。
APIから確認した結果は下記の通りです。
uname コマンドからシステムの情報を取得した結果は下記のとおりです。
●Android Things 基本的な情報
mountコマンドを実行し、マウント状態のチェックを行いました。
ここで確認できるselinuxfsはSELinuxを管理する為のファイルシステムです。
次にルートの直下を確認した結果は下記の通りです。
/直下に存在するinit.rcファイルはAndroidの初期設定などが記述されているファイルです。
●adb のポート変更方法
adbがデフォルトで使用している5555ポートは一般的なポートスキャンで見つかることが懸念されます。
- /init.rcを修正
Linuxで一般的にネットワークの設定は/etc/serviceや/etc/sysconfigに記述され、これを変更することでポートの変更を行います。しかし、Android Thigsではこれらのファイルが見当たりません。
そこで、PCなどからadbでAndroid Thingsに接続し/init.rcを抽出し、on initの末尾に下記を記述します。
adb を 管理者権限に変更し、Android Thingsを書込権限でマウントし直した後、編集したinit.rcファイルをAndroid Thingsの方へ置換します。
adbから書き込んだ際に本来の権限から変更される事があるのでchmodコマンドを使って修正しておきます。
再起動後、上記の設定が適用されデフォルトのポートが変更されます。
それによりポートスキャンでサービスが特定される危険性を軽減できます。
●ファイアウォールの設定変更方法
ファイアフォールについて、前回serviceコマンドではiptablesが確認できませんでしたが、調査を行った結果、iptablesコマンドは存在し、使用することが可能な事が確認できました。
root へ昇格後にiptables -L コマンドで現在のフィルタリングが確認することができます。
ps コマンドと service コマンドでは iptables は確認できないものの、フィルタリング設定は存在します。
Wi-Fiアダプタに対するフィルタリングを行う事もできるので、Wi-Fi等のネットワーク設定を有効にする際は適宜フィルタリングルールを設定することが望ましいでしょう。
●SELinux の設定変更方法と root 権限について
Android Things ではSELinuxがデフォルトでpermissiveになっており制限がされていない状態でした。
setenforceコマンド等により有効化することもできますが、再起動の度に初期化されてしまいます。
そこで設定をデフォルトでenforcingにする為にイメージの書き込まれたSDカードをPCなどから読み込み、直下のCMDLINE.TXTファイル末尾を下記の通り修正し保存します。
修正前:androidboot.selinux=permissive
修正後:androidboot.selinux=enforcing
SDカードをボードに挿入し起動するとSELinuxが有効になっているのが確認できます。
SELinuxに関連するコマンドとしてはchconやrestoreconなどが存在するものの、semanageは見当たりませんでした。
また、Android Thingsではデフォルトでsuを実行しパスワードなしでrootへの権限昇格が可能なのですが、パスワードを付与するのに使えるpasswdやuseraddコマンドは存在せず、/etc直下にpasswd・shadowファイルを設置しパスワードが設定されたか調査したものの、効果は得られませんでした。
rootにパスワードを設定するもしくはsuを実行されない方法については今後も調査を継続していきます。
●SELinux の設定変更方法と root 権限について
調査にあたってファイル構成は一般的なAndroidの構成と似ている点も多いものの、通信関係などの設定ファイルは配置が変わっていて見当たらず、普段は実ファイルなのにディレクトリになっている箇所があり調査の際に苦労しました。
ユースケースについて、Android Thingsでは電球やスマートプラグなどスマート家電の為の利用を目指しており、スマートフォンとデバイス間などの安全な通信をサポートしているスマート家電向け通信プロトコルWeaveも利用可能になる予定とのことでした。
ポートの変更については、前述通りnmapによる一般的なポートスキャンであってもポート番号が1024以上であってもチェックされることがあるので、適当なポートに変更しておくことが望ましいと感じます。ただし、この方法はあくまで気休め程度で、有効な対策としてはファイアウォールに対しフィルタリングを設定する方法があり、今回はサンプルとしてWi-Fiからのadbへの接続を拒否するルールの設定する場合を紹介しました。
今後もrootへのパスワード設定方法など、検証を続けていきます。
Monthly Researchのダウンロードはこちら(日本語 / English)
関連記事
Monthly Research 「IoT向けOS「Android Things」のセキュリティ」
Monthly Research 「Black Hat Europe 2016 サーベイレポート」
Monthly Research 「IoT向けOS「Android Things」のセキュリティ」
FFRI yaraiは、パターンファイルに依存しない先読み防御検出技術を徹底的に追及した「純国産エンドポイントセキュリティ」です。
FFRI yarai Home and Business Edition は、個人・小規模事業者向け「純国産エンドポイントセキュリティ」です。
最近の記事
特集
アーカイブ
HOME ≫ FFRIセキュリティ BLOG ≫ 2017年 ≫ 2017年3月 ≫ Monthly Research 「Android Things Developer Preview 2のセキュリティ調査」