Androidマルウェアによるシステム改ざんを検知する技術「セキュアブート」「dm_verity」とはAndroidセキュリティ技術の最前線(6)(2/3 ページ)

» 2016年08月03日 05時00分 公開

セキュアブート

 「セキュアブート」とは、ROM上のソフトウェアが端末ベンダー(もしくは利用者)の意図したソフトウェアと同一であるかを確認するために、ソフトウェアを実行する前に、暗号技術を使ってソフトウェアの改ざんを検出する技術のことである。

 より具体的に説明すると、セキュアブートでは、改ざんすることが物理的に難しいハードウェアなどの「信頼の基点(Root of Trust)」を開始点として、次に起動するソフトウェアを“正しさが検証されたソフトウェア”に限定することにより、「信頼の連鎖(Chain of Trust)」を形成していく。そして、システム全体を端末ベンダー(もしくは利用者)が意図した状態で起動させる。Android端末が搭載するプロセッサを設計しているARMは、セキュアブートの構成や運用の指針を開発者向けガイドに示しており、次のような準備と起動の手順を推奨している(図3、関連リンク)。

  • 製造時
  1. 端末ベンダーは、準備として公開鍵ペア(公開鍵PuKと秘密鍵PrK)を生成する
  2. 端末ベンダーは、RSA-PSSなどの公開鍵暗号を使った署名アルゴリズムを用いて、開発したソフトウェアの署名を秘密鍵PrKで生成する
  3. 端末ベンダーは、端末の製造時にROMにソフトウェアとその署名の両方を書き込むとともに、公開鍵PuKをプロセッサ内に確保したOTP(One Time Programmable)メモリに書き込む。OTPメモリは一度しか書き込むことができず、改ざんが困難であるため、これを端末における信頼の基点(Root of Trust)とする
  • 端末起動時
  1. Android端末の起動プログラムは、SoC(System on a Chip)内蔵メモリ上で署名検証アルゴリズムを使い、ソフトウェアの署名をOTPメモリの公開鍵PuKで検証する
  2. この署名が正当であれば、改ざんされていないと見なしてソフトウェアを実行する
図3 ARM社開発者向けガイドにおけるセキュアブート 図3 ARM社開発者向けガイドにおけるセキュアブート

 セキュアブートは、端末ベンダーの意図したシステムを起動するためのものであるが、ハードウェアのサポートが必要であるため、実質的にはQualcommやSamsungなどのプロセッサベンダーがそれぞれのセキュアブート仕様を設計している。詳細な仕様は公開されていないが、各ベンダーのカタログスペックにはチップのセキュリティ機能としてセキュアブートの記載がある。

 このセキュアブートを、Android起動時にuserdata.imgを除く3つのイメージ(bootloader.img、boot.img、system.img)に適用することで、システム領域が改ざんされていないことを検出できる(図4)。userdata.imgは先に説明した通りユーザーによって追加されたデータなどが格納される場所であり、頻繁に更新されることや、システムに比べて重要性の低いデータが格納されることなどの理由から、セキュアブートの対象外とするのが一般的である。

図4 Androidにおけるセキュアブート 図4 Androidにおけるセキュアブート

 ところが、前述のセキュアブート対象とすべき3つのイメージのうち、system.imgについてはほとんどの端末でセキュアブートされていないのが実情である。これには2つの理由がある。1つ目は、イメージサイズが大きい(boot.imgの約100倍、数ギガバイトになる場合もある)ために、セキュアブート方式で検証しようとすると、メモリリソースが大きく消費され、起動が著しく遅くなってしまうこと。そして2つ目が、小規模更新パッチであるOTA(Over The Air)アップデートがファイルレベルで行われるために、更新後のsystem.imgがビットレベルでの同一性を保持できず(ファイルの内容は同じでもメタデータなどが異なってしまう場合がある)、完全な同一性が求められるセキュアブートが実施できなくなってしまうことである。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。