Japan
このブログでは、Google から開発者のみなさま向けの情報をいち早くお届けします。
Android の Linux カーネル保護の強化
2016年8月17日水曜日
[この記事は Jeff Vander Stoep、Android セキュリティ チームによる Android Developers Blog の記事 "
Protecting Android with more Linux kernel defenses
" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]
Android はセキュリティ モデルを強制するために Linux カーネルを活用しており、カーネルの保護を強化するためにさまざまな仕組みが導入されています。大まかに、このような保護はメモリの保護と攻撃対象領域の削減という 2 つのカテゴリに分けることができます。
メモリの保護
カーネルが提供する主要なセキュリティ機能の 1 つが、アドレス空間を独立させることによって、ユーザー空間で動作するプロセスのメモリを保護する仕組みです。ユーザー空間のプロセスとは異なり、さまざまなカーネルのタスクは 1 つのアドレス空間の中に存在しています。そのため、カーネル内に脆弱性があると、システムメモリの別の部分にも影響する可能性があります。カーネルメモリ保護は、脆弱性があったとしてもカーネルの整合性が維持されるように設計されています。
メモリを読み取り専用/実行不可とマークする
この機能によって、カーネルメモリを論理的なセクションに分割し、それぞれのセクションに制限付きのページアクセス権限を設定できます。コードが格納されたメモリは、読み取り専用 + 実行とマークされます。データ セクションは実行不可とマークされ、さらに読み取り専用のセクションと読み書き可能なセクションに分割されます。この機能は、CONFIG_DEBUG_RODATA 設定オプションで有効になります。これは Kees Cook 氏がまとめたもので、Brad Spengler 氏による
Grsecurity
の KERNEXEC 機能と、Larry Bassel 氏と Laura Abbott 氏による Qualcomm の CONFIG_STRICT_MEMORY_RWX 機能のサブセットが基になっています。CONFIG_DEBUG_RODATA は、arm/arm64 のアップストリーム カーネルに追加され、Android の 3.18+ arm/
arm64
標準カーネルに移植されています。
ユーザー空間へのカーネル アクセスの制限
この機能は、ユーザー空間のメモリへの直接アクセスを禁じることによって、カーネルの保護を強化します。これによって、攻撃者が実行可能な
カーネル
メモリを制御するのが大幅に難しくなり、さまざまな攻撃を行いにくくなります。特に CONFIG_DEBUG_RODATA が有効になっている場合はそれが該当します。これと同様の機能は既に存在しています。最も早く登場したのは、Grsecurity の UDEREF です。この機能は、Russell King 氏が ARMv7 用に実装した設定オプション CONFIG_CPU_SW_DOMAIN_PAN で有効になり、Kees Cook 氏によって
Android の 4.1
カーネルに移植されました。
スタック バッファのオーバーフローに対する保護の強化
stack-protector-strong は、前身である stack-protector と同じように、
スタック バッファのオーバーフロー
からの保護を行います。stack-protector では文字配列のみが保護されていたのに対し、
多くの配列型
の保護が提供されるようになっています。stack-protector-strong は Han Shan 氏が実装し、
gcc 4.9 コンパイラーに追加
されました。
攻撃対象領域の削減
攻撃対象領域の削減は、正規の機能を損なうことなく、公開するカーネルへのエントリ ポイントを減らす試みです。攻撃対象領域の削減には、コードの削除、エントリ ポイントへのアクセスの削除、公開する機能の限定などが含まれます。
デバッグ機能へのデフォルト アクセスの削除
カーネルの perf システムはパフォーマンス測定の基盤となっており、カーネルとユーザー空間アプリケーションの両方を解析することができます。perf はデベロッパーにとっては貴重なツールですが、大半の Android ユーザーにとっては、不要な攻撃対象領域を増やすものです。Android Nougat では、デフォルトで perf へのアクセスがブロックされます。デベロッパーは、デベロッパー設定を有効にし、adb を使用して "adb shell setprop security.perf_harden 0" プロパティを設定することによって、perf にアクセスすることができます。
perf へのアクセスをブロックするパッチセットは、カーネル部とユーザー空間部に分けて考えた方がよいかもしれません。
カーネルパッチ
は
Ben Hutchings 氏
によるもので、Brad Spengler 氏による Grsecurity の CONFIG_GRKERNSEC_PERF_HARDEN から派生しています。ユーザー空間の変更は、
Daniel Micay 氏
によるものです。perf のセキュリティ脆弱性を責任を持って開示してくださった
Wish Wu 氏
をはじめとする方々にお礼を申し上げます。
アプリからの ioctl コマンドへのアクセスの制限
Android セキュリティ モデルの多くは、SELinux によって記述、強制されるものです。ioctl() システムコールには、SELinux によって強制される粒度との間に大きなギャップがあります。ioctl システムコールにコマンドごとの制御を提供する手段として、
SELinux における ioctl コマンドのホワイトリスト登録
が追加されました。
Android で報告されているカーネル脆弱性の大半は、ドライバで ioctl システムコールを使用することによって起きています。その例が、
CVE-2016-0820
などです。サードパーティ アプリケーションの中には、いくつかの ioctl コマンドが必要なものもありますが、ほとんどのアプリケーションはそうではなく、ioctl コマンドへのアクセスは正規の機能を損なわずに制限できます。Android Nougat では、アプリケーションが利用できるのはごくわずかなソケット ioctl コマンドのホワイトリストのみとなっています。一部の端末では、アプリケーションからの GPU ioctl へのアクセスも同様に制限されています。
seccomp-bpf の強制
seccomp は、追加のサンドボックス化メカニズムを提供しています。これにより、プロセスは設定変更可能なフィルタを使って、利用できるシステムコールやシステムコールの引数を制限できるようになります。システムコールの利用が制限されることによって、公開されるカーネルの攻撃対象領域は劇的に減少します。Lollipop 搭載の Nexus 端末に seccomp が初めて導入されてから、Android エコシステム全体での seccomp の導入率は着実に増加しています。Android Nougat では、seccomp のサポートは全端末で必須となります。Android Nougat では、
メディアのセキュリティ強化
の一環として、メディア抽出やメディアコーデックの処理で seccomp を使用しています。
進行中の作業
他にもカーネル保護を目的としたプロジェクトが進行中です。
Kernel Self Protection Project
では、アップストリーム カーネルのランタイムやコンパイラを保護する仕組みが開発されています。
AOSP では、SELinux によるさらなるサンドボックスの強化と攻撃対象領域の削減が進行中です。
Minijail
では、seccomp フィルタや名前空間など、カーネルが提供する多くの封じ込め機能やサンドボックス機能を便利に適用するための仕組みが提供されています。
kasan
や
kcov
などのプロジェクトは、ファジング ツールを使ったクラッシュの根本原因追求や、コードのカバレッジを増やすテストケースのスマートな作成を通して、究極的にバグ対応プロセスを効率化することを目指しています。
このような作業によって、カーネルのセキュリティはますます強化されていきます。いつものように、作業に対するフィードバックや Android の改善提案は大歓迎です。
security@android.com
までご連絡ください。
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
173
Android Auto
1
Android Design Support Library
1
Android Developer Story
3
Android N
11
Android Pay
1
Android Studio
13
Android Support Library
3
Android TV
7
Android Wear
21
androidmarket
3
AngularJS
2
API
21
APIExpert
45
apk
1
app engine
21
App Indexing
7
App Invites
6
AppCompat
2
Apps Script
6
aprilfool
3
ArtTech
1
Audio
3
Auth Code
1
Authentication
3
AuthSub
2
Autotrack
1
Awareness API
1
Beacons
6
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
4
egypt
1
English
2
ES2015
1
ES2016
1
ES6
2
ES7
1
Firebase
24
font
2
game
14
GDD11JP
56
GDD2010JP
23
GDE
2
GDG
10
Geo
27
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
32
Google Play
34
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
Invites
1
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
13
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
"プロダクトに関するご意見は
プロダクトフォーラム
にお願いします"