BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 最新iOSアプリのセキュリティ事情

最新iOSアプリのセキュリティ事情

ブックマーク

原文(投稿日:2016/08/03)へのリンク

Trail of BitsのCEOでセキュリティ専門家のDan Guido氏がQCon New York 2016で,iOSアプリのセキュリティ確保の方法を解説した。iOSのセキュリティ機構を正しく使用すること,脱獄されたデバイス上でアプリが実行される可能性を忘れないこと,などがその内容だ。

Guido氏の説明によれば,iOSアプリのセキュリティはオペレーティングシステム層の範囲内にあり,アプリケーションのコード署名とサンドボックスモデルが提供されている。コード署名は4KBのページ単位で所有者の追跡を可能にし,サンドボックスモデルは他のアプリへのアクセスを制限し,システムファイルやリソースを保護する。これらによって悪意を持ったアプリでも,何らかの問題を引き起こすことは難しくなっている。

iOSセキュリティの基盤となっているのがSecure Enclaveだ,とGuido氏は言う。Secure Enclaveは製造時に組み込まれたユニークなデバイスキーで,アプリのレベルからはアクセスできない。つまりセキュリティ上のキーをSecure Enclaveの外から読み出すことはできないのだ。このキーはiOSのすべての暗号化処理,ApplePay,キーチェーン保護に使用されている。

開発者にとって,iOSアプリのセキュリティには3つの基本理念がある,とGuido氏は言う。

  • HTTPSのみを使用すること。 これはURLとして常にhttpsを指定することで実現できる。この場合,NSURLConnectionNSURLSessionApp Transport Security(ATS)を使用するので,TLS 1.2の適切な使用,証明書の検証といったことが保証される。加えてGuido氏は,TrustKitを使用するように推奨している。TrustKitは任意のiOSあるいはOS Xアプリにおいて,SSL公開鍵のピンニング展開とピンの検証失敗の監視を容易にするフレームワークである。
  • 暗号化を使用すること。すべてのファイルやパスワード,トークンの暗号化には,DPAPIとキーチェーンを使用するべきだ。ここでGuido氏はしばらく,DPAPIで使用可能なオプションについて説明した。
    • ファイルの暗号化: NSFileProtectionComplete, NSFileProtectionCompleteUnlessOpen, NSFileProtectionCompleteUntilFirstAuth;
    • ディスクへのNSDataの書き込み: NSDataWritingProtectionComplete, NSDataWritingProtectionCompleteUnlessOpen, NSDataWritingProtectionCompleteUntilFirstAuth.
    こちらのStack Overflowの記事にも興味深い情報が提供されている。
  • クリーンアップすること。これは機密データを残さないための基本的なステップだ。ディスク保存時に,ほぼすべてのファイルが暗号化されているという事実はあるが,Guido氏はいくつかの落とし穴を警告する。具体的には,iTunesのバックアップは暗号化されずに格納されているため,iOS以外のデスクトップOSを攻撃することで機密データを盗むことが可能になる。これについてGuido氏は,NSURLIsExcludedFromBackupKeyキーを使うことで,iCloudあるいはiTunesへの同期を防止できる,と述べている。また,一般的にUIPasteboardやURL,キーボードキャッシュ,iOSが自動的に取得するバックグラウンドスナップショット,クッキー,NSLogエントリなどには,かなりの量の重要情報が暗号化されずに残されている可能性がある。このようなリスクは,applicationDidEnterBackground{/0]をオーバーライドしてhiddenYESを設定する,secureTextEntryを使用してオートコレクションを無効にすることでキーボードキャッシュを迂回するなどの方針に従うことで,すべて回避することができる。

基本事項を完了したならば,カスタムURLハンドの導入やUIWebViewのXSS,XML解析,SQLインジェクションといった次のレベルの軽減策を考えることができる,とGuido氏は結論付けている。

しかしながら,脱獄されたデバイス上でアプリが実行される場合は,これらすべての施策が有効ではない。脱獄(Jailbreak)とは,基本的なセキュリティ機構を無効にするエクスプロイトのことだ。デバイスを攻撃してコントロールを奪うためにも利用されるが,興味深い事実として,サードパーティのアプリストアへのアクセス,デフォルトアプリの置き換え,OSの外観のカスタマイズ,デバイスのアンロックなどのさまざまな理由から,ユーザが自発的に脱獄を行なう場合がある。Guido氏によると,最大で700万のiPhoneユーザが自身のデバイスで脱獄を行なっている。これはつまり,それらのデバイス上で動作する悪意のあるアプリが,デバイスのセキュリティをバイパス可能であることを意味する。225.000台のデバイスからアプリ内購入用のApple ID資格情報を盗み出したKeyraiderなどはその例だ。

脱獄されたiPhone上で動作するアプリのセキュリティを改善するには,いくつかの方法がある。

  • 脱獄の成功した結果として残されたシステムアーティファクトを確認することで,脱獄されたデバイス上で動作していることを検出する。これには多くの場合,sshやCydia.appファイルの有無,fork()システムコールなど,さまざまなチェック機構の実装が必要になる。
  • アプリケーションに対するデバッグやフックなどの操作を拒否することで,tsProtecrtorxConなど特定のツールを使って脱獄チェックをバイパスする試みを阻止する。一般的にこれは,実行時にsysctlを使ってアプリの親を確認することで実現可能だ。それがlauchdあるいはカーネルでなければ,アプリの実行を終了ないし変更すればよい。
  • IDA Pro, Hopper, Binary Ninjaなどを使って生成されたアプリの逆アセンブルコードを,理解の難しいものにする。これを実現するには,100倍以上の使用しないコードの追加,シンボルの暗号化,述語の使用など,さまざまな難読化のテクニックを駆使することが必要だ。

最後にGuido氏は,個々のプログラマによる必要なチェックの追加作業に頼るのではなく,コンパイル時にコードを変更するようなLLVMの独自バージョンを使用して,これらの条項を例外なく実施することが重要だ,と指摘している。

セッション全体のビデオはInfoQで見ることができる。

 
 

この記事を評価

関連性
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

BT