Japan
このブログでは、Google から開発者のみなさま向けの情報をいち早くお届けします。
セキュアブートの厳格な適用とエラー訂正
2016年8月9日火曜日
[この記事は Sami Tolvanen、ソフトウェア エンジニアによる Android Developers Blog の記事 "
セキュアブートの厳格な適用とエラー訂正
" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]
概要
Android では、ユーザーの安全を保つために複数のレイヤにわたる保護機能が導入されています。そういったレイヤの 1 つが
セキュアブート
です。セキュアブートは、オペレーティング システムの変更を検知するために、暗号学に基づいた整合性チェックを行うことによってセキュリティを向上させます。Android では Marshmallow 以降からすでに
システムの整合性についてのアラート
が表示されるようになっていましたが、Android 7.0 を搭載した端末からは、セキュアブートの厳格な適用が必須になります。ブートイメージや検証済みパーティションが破損している端末は、ブートしなくなるか、ユーザー コンテンツを扱う機能が制限された状態でブートするようになります。しかし、このような厳格なチェックを行うことで、今までほとんど問題にならなかった悪意のないデータ破損が処理機能などに影響を与える可能性がでてきます。
デフォルトで、Android は dm-verity カーネル ドライバを使用して大きなパーティションを検証します。このドライバは、パーティションを 4 KiB のブロックに分割し、各ブロックが読み込まれたときに署名されたハッシュツリーと照合して検証を行います。そのため、dm-verity が強制モードの場合、1 バイトの破損を検出しただけでもブロック全体がアクセスできなくなり、検証済みパーティションへのデータアクセスが発生すると、カーネルがユーザー空間に対して EIO エラーを返すことになります。
本記事では、前方エラー訂正(FEC)の導入による dm-verity の堅牢性向上の内容について説明します。また、これによって、オペレーティング システムのデータ破損への耐性がどのように強まったかについても説明します。この改善は、Android 7.0 が動作するすべての端末に導入されます。なお、本記事は、Nexus 端末に搭載するデフォルトの AOSP 実装について説明しています。
エラー訂正コード
前方エラー訂正とは、エラー訂正コードを使用して生成する冗長な符号化データを追加することで、ソースデータのエラーを検知して訂正できるようにする仕組みです。訂正できるエラーの厳密な数は、使用するコードや符号化データを割り当てる空間の広さによって異なります。
エラー訂正コードの中でよく使われるものの中に、
リード ソロモン
があります。これは Linux カーネルですぐに使える状態になっているので、dm-verity で使用する候補としてはうってつけです。このコードを使って ⌊
t/2
⌋ 個までの未知のエラーと
t
個までの既知のエラー(
イレイジャー
)を訂正できるのは、
t
個の符号化シンボルが追加された場合です。
一般的に使われる RS(255, 223) コードでは、ソースデータ 223 バイトごとに 32 バイトの符号化データを生成します。これは、255 バイトのブロックごとに 16 個までの未知のエラーを訂正できます。ただし、このコードを使用すると、最大 15% の空間オーバーヘッドが余計に消費されることになります。モバイル端末はストレージに制約があるため、これは現実的ではありません。そこで、エラー訂正機能を減らして空間オーバーヘッドを減らすことになります。RS(255, 253) コードは 1 個の未知のエラーしか訂正できませんが、オーバーヘッドはわずか 0.8% です。
ブロックベースのストレージ破損の難しいところは、ブロック全体が破損することが多く、破損が複数の連続するブロックにまたがることがある点です。リード ソロモンは、かなり短い符号化ブロック内の限られた数のバイトの破損の復旧しかできないため、ネイティブの実装では、巨大な空間オーバーヘッドなしに効率的なエラー訂正を行うことはできません。
連続した破損ブロックの復旧
Android 7.0 用の
dm-verity
に加えられた変更には、インターリービングと呼ばれる手法が利用されています。この手法を用いると、4 KiB のソースブロック全体が失われても復旧できるだけでなく、いくつかの連続したブロックが失われても復旧できます。さらに、実用的なエラー訂正を行うために必要な空間オーバーヘッドをネイティブ実装に比べて大幅に削減することもできます。
ブロックの各バイトを別々のリード ソロモン コードにマッピングすると、効率的なインターリービングを行うことができます。具体的には、N バイトをカバーするコードがそれぞれのバイトに対応する N 個のソースブロックにまたがるようにします。各コードが連続した N ブロックのシーケンスをカバーするという簡単なインターリービングでも、
(255 - N) / 2
ブロックまでの破損から復旧できます。たとえば、RS (255, 223) の場合、64 KiB の破損から復旧できます。
さらに優れたソリューションは、各コードをパーティション全体に分散させ、同じコードによってカバーされるバイト間の距離を最大にすることです。これによって、T ブロックで構成されるパーティションにおいて RS (255, N) コードで対応できる連続破損ブロックの数は、⌈
T/N
⌉ ×
(255 - N) / 2
まで増加します。
距離 D、ブロックサイズ B におけるインターリービング
dm-verity が既に実行している整合性チェックとインターリービングを組み合わせると、各コード内のどの位置でエラーが発生しているかを正確に突き止めることができるというメリットも生まれます。コードの各バイトが別々のソースブロックをカバーしており、既存の dm-verity メタデータを使用して各ブロックの整合性を検証できるので、どのバイトにエラーが含まれているかを知ることができます。イレイジャーの場所をピンポイントで指定できることによって、エラー訂正のパフォーマンスと効率が上がり、最大で連続 ⌈
T/N
⌉ ×
(255 - N)
ブロックまでエラー訂正を行うことができるようになります。
524,256 個の 4 KiB ブロックと RS (255, 253) を使用する 2 GiB までのパーティションでは、1 つのコードのバイトは最大で 2073 ブロック離れることになります。各コードは 2 つのイレイジャーから復旧できるため、インターリービング手法を用いると最大で 4,146 個(最大 16 MiB)の連続した破損ブロックを復旧できます。もちろん、符号化データ自体が破損したり、1 つのコードがカバーしているブロックが 3 つ以上失われると、復旧はできなくなります。
エラー訂正をブロックベースのストレージで利用する限り、復号化が遅くなるというインターリービングの副作用は発生しません。というのも、エラーを復旧するためには、1 つのブロックを読み込むのではなく、複数のパーティションにまたがる複数のブロックを読み込む必要があるからです。幸運にも、dm-verity とソリッドステート ストレージを組み合わせる場合、これは大きな問題にはなりません。復号化の必要があるのは、ブロックが実際に破損している場合のみだからです。これはかなり珍しいケースであり、エラー訂正が必要になる場合でも、ランダム アクセスによる読み込みはかなり高速です。
まとめ
セキュアブートの厳格な適用によってセキュリティは改善されますが、ソフトウェアのバグやハードウェアの問題によって発生する可能性がある端末のディスク破損の影響が大きくなり、信頼性の低下につながることも考えられます。
dm-verity 用に開発された新しいエラー訂正機能では、わずか 0.8% の空間オーバーヘッドで通常 2~3 GiB のシステム パーティション内で最大 16~24 MiB の連続したブロックが失われても復旧できるようになっています。さらに、破損を検知した場合を除き、パフォーマンスの低下もありません。これによって、Android 7.0 を実行する端末のセキュリティと信頼性が向上することになります。
Posted by
Yuichi Araki - Developer Relations Team
コメントを投稿
ラベル
#hack4jp
3
Addy Osmani
1
ADK
2
AdMob
7
ALPN
1
AMP
6
Analytics
5
Andorid
6
Android
169
Android Auto
1
Android Design Support Library
1
Android Developer Story
3
Android N
10
Android Pay
1
Android Studio
13
Android Support Library
3
Android TV
7
Android Wear
21
androidmarket
3
AngularJS
2
API
21
APIExpert
45
app engine
21
App Indexing
7
App Invites
5
AppCompat
2
Apps Script
6
aprilfool
3
ArtTech
1
Audio
3
Auth Code
1
Authentication
3
AuthSub
2
Autotrack
1
Awareness API
1
Beacons
5
BigQuery
6
BLE
4
Blink
1
blogger
1
Brillo
1
Brotli
1
Calendar
1
Cardboard
3
Career
1
Case Study
1
chrome
55
Chrome Custom Tab
1
chrome extension
2
Chrome for Android
1
Chrome for iOS
1
Chrome OS
1
Chromebook
1
Chromecast
7
chromewebstore
6
Chromium
4
ClientLogin
3
Cloud
8
Cloud Test Lab
2
CocoaPods
1
codejam
5
codelab
2
compute engine
3
Context
1
Dart
2
DataCenter
1
Daydream
2
Deep Learning
1
Demo Party
1
Design Sprint
3
DesignBytes
1
DevArt
3
DevBytes
6
Developer
14
Developer Console
3
Developer Preview
3
Developer Relations
2
DevFest
6
DevFestX
3
devtools
3
DirectShare
1
Doodle
1
DoubleClick
4
Doze モード
1
drive
2
Dynamic Links
1
EarlGrey
1
Easter Egg
1
ECMAScript 2015
1
Eddystone
3
egypt
1
English
2
ES2015
1
ES2016
1
ES6
2
ES7
1
Firebase
23
font
2
game
14
GDD11JP
56
GDD2010JP
23
GDE
2
GDG
10
Geo
26
Gingerbread
1
GLIDE
5
Gmail
1
Go
1
golang
4
goo.gl
1
Google
5
Google Apps
1
Google Cast
7
Google Cloud Messaging
10
Google Cloud Platform
6
Google Developer Experts
2
Google Developers Academy
1
Google Developers live
5
Google Developers Summit
1
Google Drive
3
Google Fit
2
Google for Work
1
Google Maps
31
Google Play
32
Google Play Game Services
6
Google Play Services
18
Google Plus
14
Google Search
4
Google Sign-In
10
Google Tag Manager
1
Google+
1
Googleapps
10
GoogleGames
1
GoogleI/O
27
GoogleLabs
1
GoogleTV
1
gRPC
2
GTUG
5
GWT
2
hack4jp
2
hackathon
6
HTML5
17
HTML5Rocks
1
HTTP/2
3
HTTPS
2
ID Token
1
Identity
12
Identity Toolkit
1
Ignite
4
IME
10
intern
2
iOS
10
IoT
1
IPv6
1
Japanese Input
1
JavaScript
5
K-12
1
Knowledge Graph
1
l10n
8
Lollipop
10
Machine Learning
1
Marshmallow
10
Material
1
Material Design
17
MDL
1
MIDI
2
Mobile
11
Mobile Bootcamp
4
Mobile Vision
3
mod_pagespeed
1
monetize
3
Mozc
14
Music
1
NativeDriver
2
Nearby
4
Nexus
1
Nexus S
1
NFC
1
NPAPI
2
NPN
1
oauth
6
OpenGL
3
OpenID
3
OpenID Connect
2
OpenSocial
1
opensource
11
Optimization
1
Payment
1
People API
1
Performance
6
PersonFinder
1
Physical Web
3
Place Picker
1
Player Analytics
4
Policy
2
Polymer
6
Progressive Web Apps
5
project hosting
1
Promise
1
Promo code
1
Protocol Buffers
1
publicdata
1
Push API
1
Push Notification
3
QUIC
1
RAIL
1
React Native
2
Realtime Database
1
Remote Config
1
Remote Display API
1
Runtime Permission
1
Sample Code
2
schema.org
1
security
12
Service Worker
3
sketchup
1
SmartLock for Passwords
4
social
4
SPDY
3
speak2tweet
1
startup
3
Storage
1
streetview
3
Study Jams
3
SwiftShader
1
techtalk
12
TensorFlow
2
test
2
Test Lab
1
ToS
1
Transliteration
1
Twitter
1
Udacity
15
Unity
2
UX
1
V8
2
VP9
1
VR
3
Vulkan
2
Watch Face
2
wave
2
Weave
1
Web
3
Web Animations
1
Web Components
4
Web Manifest
1
WebAssembly
1
WebMusic
4
WTM
2
YouTube
15
YouTube API
1
インタビュー
1
コードサンプル
1
プライバシー
1
言論の自由
1
節電
3
東日本大震災
9
日本語入力
40
ブログ アーカイブ
2016
8
7
6
5
4
3
2
1
2015
12
11
10
9
8
7
6
5
4
3
2
2014
12
11
10
9
8
7
6
5
4
3
2
1
2013
12
11
10
9
8
7
6
5
4
3
2
1
2012
12
11
10
9
8
7
6
5
4
3
2
1
2011
12
11
10
9
8
7
6
5
4
3
2
1
2010
12
11
Feed
Google
on
Follow @googledevjp
"プロダクトに関するご意見は
プロダクトフォーラム
にお願いします"