2016年8月23日にリリースされたAndroid 7.0には、多数のセキュリティ改良が施されている。その一つが、共有ライブラリーの配置順序を毎回変更することで攻撃耐性を高めるダイナミックローダーの改良である。従来のASLR(Address Space Layout Randomization)機能との違いや、近々登場するAndroid 7.1に採用される改良などについて紹介する。

 Androidはバージョン4.0以降で、「ASLR」(Address Space Layout Randomization)というセキュリティ機能を既定で有効化している。ALSRとは、プログラムの実行コードや共有ライブラリー、データなどの仮想メモリー空間内の配置を、プログラムの実行時にランダムに変化させる機能である。同機能によって攻撃対象となるコードやデータの位置が推測困難になるため、標準Cライブラリー(libc)内の特定コードを不正に実行する「Return-to-libc攻撃」などの、いくつかの攻撃手法を成立させにくくする効果がある。

 なお、バージョン4.0の時点ではAndroidのASLR機能の動作は不完全だった。完全に動作するようになったのは2012年6月にリリースされたAndroid 4.1以降である。

 2016年8月23日にリリースされたAndroid 7.0では、「/proc/sys/vm/mmap_rnd_bits」というファイルに数値を設定することで配置位置の変動幅を端末ベンダーが自由に調整できるようにASLR機能を拡張した。この拡張によって、32ビット環境では従来8ビット幅でしか変動できなかった配置位置を、最大16ビット幅で変動できるようになった。変動幅を大きく設定すれば、これまでよりも攻撃耐性をかなり高められる。

ライブラリー配置順序も変更

 AndroidのASLR機能は、ヒープ領域、mmap領域、スタック領域という各メモリー領域の位置を変動させる。しかし、ASLR機能は各メモリー領域内のデータ構造は変更しない。そのため、共有ライブラリーの配置順序やライブラリー同士の相対位置は変わらなかった(図1)。

図1●実行プログラムの仮想メモリー内配置の概要(Android 6.0系列以前)
図1●実行プログラムの仮想メモリー内配置の概要(Android 6.0系列以前)
Android 4.0以降で有効化されるASLR(Address Space Layout Randomization)機能によって、ヒープ領域、mmap領域、スタック領域の位置が実行のたびに変化する。しかし、ASLR機能は各メモリー領域内のデータ構造は変更しない。そのため、共有ライブラリーの配置順序やライブラリー同士の相対位置は変わらなかった。
[画像のクリックで拡大表示]

 これでは、何らかの手法でどれか1つの共有ライブラリーの位置が把握されてしまった場合、他の共有ライブラリーの位置についても比較的簡単に推定されしまう危険がある。