Googleは、1年前に研究者によってStagefrightの脆弱性が発見されて以来、Androidのセキュリティをこれまで以上に真剣に受け止めているようです。同社は最近、メディアサーバーライブラリの強化から、よりサニタイズされたコード、整合性チェックシステムの強化まで、Android 7.0「Nougat」向けに多くのセキュリティ強化を発表しました。
メモリ保護
カーネルの脆弱性はシステムの他の部分に影響を及ぼす可能性があるため、カーネル メモリの保護はそれらの脆弱性をユーザー空間から分離するために重要です。
メモリを読み取り専用/実行不可としてマークする
この機能はメモリを分離された論理空間に分割し、コードは読み取り専用かつ実行可能とします。つまり、これらの空間には新しいコード(マルウェアなど)を書き込むことができず、既存のコードのみを読み取って実行できます。少なくとも一部のデータセクションは書き込む必要があるため、実行不可としてマークされます。これにより、マルウェアがそこに侵入した場合でも実行できなくなります。
Google は、Grsecurity の KERNEXEC 機能と Qualcomm の CONFIG_STRICT_MEMORY_RWX 機能のサブセットに基づいてこの機能を開発しました。この機能は、設定オプション CONFIG_DEBUG_RODATA で有効にできます。また、この機能を Android 3.18 以降のカーネルにバックポートしました。
ユーザー空間へのカーネルアクセスを制限する
Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。
カーネルからユーザー空間へのアクセスを制限すると、攻撃者が実行可能なカーネルメモリを制御できなくなるため、攻撃がより困難になります。特にCONFIG_DEBUG_RODATAが有効になっている場合、この機能はGrsecurityのUDEREFにもヒントを得ています。ユーザーは設定オプションCONFIG_CPU_SW_DOMAIN_PANでこの機能を有効にできます。
スタックバッファオーバーフローに対する保護を強化
スタックバッファオーバーフローは、プログラムがコールスタックバッファにシステムによって割り当てられたデータ量を超えるデータを書き込んだ場合に発生します。オーバーフローは通常、スタック上の隣接するデータの破損を引き起こし、プログラムが正しく動作しないかクラッシュする原因となります。
スタック バッファ オーバーフローに対する保護はコンパイラの機能であり、Google は gcc 4.9 コンパイラに「stack-protector-strong」と呼ばれる改良された「スタック プロテクター」機能を追加しました。
攻撃対象領域の縮小
攻撃面の縮小とは、潜在的な脆弱性を増加させる可能性のあるソースコードやシステムの不要な機能を削減することです。また、システムが特定の機能をユーザーに公開する方法を制限することでも効果を発揮します。
デバッグ機能へのデフォルトアクセスを削除する
デバッグツールは、開発者がシステム内で通常のユーザーでは実行できない操作を実行できるようにするという点で強力です。しかし、この特性により、マルウェアが組み込みのデバッグ機能を悪用し始めた場合、セキュリティの観点からデバッグツールは危険なものとなります。
Android Nougatでは、システムはデフォルトで「perf」デバッグツールへのアクセスをブロックしますが、開発者はadbシェルを通じて引き続きアクセスできます。Googleは、perfブロックを可能にするカーネルパッチをGrsecurityのCONFIG_GRKERNSEC_PERF_HARDENから取得しました。CopperheadのCTOであるDaniel Micay氏が、ユーザー空間の変更を追加しました。
IOCTLコマンドへのアプリのアクセスを制限する
Android のカーネル脆弱性のほとんどは、入出力制御 (ioctl) システムコールを介して発生します。アプリケーションは ioctl コマンドを必要としますが、Android は機能を損なうことなく、それらのほとんどを制限できます。
Android Nougatでは、アプリケーションで使用できるioctlコマンドはごく限られたホワイトリストに限られています。一部のデバイスでは、GPU ioctlも制限されていました。
SECCOMP-BPF が必要
seccompは、カーネルの攻撃対象領域を大幅に制限できるサンドボックス化メカニズムです。GoogleはAndroid 5.0「Lollipop」以降、Nexusデバイスにこの機能を導入しましたが、Android 7.0以降では他のメーカーもこの機能の有効化が義務付けられます。Android 7.0では、Googleはメディアフレームワーク向けのより強固なサンドボックス構築の一環として、mediaextractorプロセスとmediacodecプロセスにseccompを採用しています。
今後の機能
Linux コミュニティも最近セキュリティに重点を置き始めている。自動車メーカーが自動運転車に Linux を採用し始めると、Linux のセキュリティがすぐに生死に関わる問題になる可能性があるからだ。
Grsecurityのような独立プロジェクトは長年存在してきました。Linuxコミュニティは今になってようやく、これらの機能の一部をアップストリームのLinuxカーネルに統合することを検討しており、一部のディストリビューションでは、ユーザー向けにデフォルトで有効化することを検討しています。
カーネル自己保護プロジェクトは、GrsecurityのサブセットをアップストリームLinuxカーネルに導入しようとするプロジェクトの一つです。Googleは、Grsecurityが開発した機能への貢献と採用に関心を示しているようです。
Google は、SELinux を使用してさらに多くの Android 機能をサンドボックス化する取り組みも行っているようです。
Minijail は、Android チームが seccomp フィルターや名前空間など、カーネルが提供する多くの封じ込め機能とサンドボックス機能を適用できるようにする新しいメカニズムです。
kasanやkcovなどの他のプロジェクトは、ファジングと呼ばれるプロセスを通じてバグの発見に役立ちます。
Android は、Linux エコシステム全体と比べてはるかに集中化されたエコシステムであるため、スマートフォンメーカーやアプリ開発者に十分な適応時間を与えれば、機能面でどれほど制限があっても、必要なセキュリティ機能を採用することができます。
Androidの現在のセキュリティにおける唯一の欠点は、メーカーがすべてのデバイスをアップデートする必要がないことです。アップデートが行われるとしても、デバイスのライフサイクルの中で1、2回程度で、しかも適切なタイミングで行われない可能性もあります。
強固なセキュリティアーキテクチャも、特定のデバイスにハッカーやマルウェア作成者が悪用できる重大な脆弱性が1年間分蓄積されてしまうと、その効果は限定的になります。これはGoogleがまだ解決できていない問題です。