第6回 TDEポリシーとアプリケーションのサンドボックス化

面 和毅
サイオステクノロジー株式会社
インフラストラクチャービジネスユニット
Linuxテクノロジー部
OSSテクノロジーグループ
シニアマネージャ
2006/5/9

 前回「『信頼されたPath』という考え方をLIDSで使う」では、LIDS-1系列で拡張されたTPE(Trusted Path Execution)について説明しました。今回は、TPEからさらに進んだ拡張であるTDE(Trusted Domain Enforcement)について説明します。

 今回、TDEを説明するためのVMWareイメージを用意しました。以下のURLよりダウンロードしてください。

【VMwareイメージのダウンロード】
http://www.selinux.gr.jp/LIDS-JP/atmarkit.html

 Trusted Domain Enforcementとは何か

 前回はLIDS TPEの機能を体験してみましたが、実はLIDS TPEの実装だけではまだ不十分です。

 例えば、LIDS TPEではshやperlなどが信頼されてしまうと、シェルスクリプトやPerlスクリプトに関しても自動的に信頼してしまうため、悪意のあるスクリプトによる攻撃を防ぐことができません。また、信頼されたバイナリであっても、保護されていない入力など、入力の種類によっては異常な振る舞いをすることがあります。これもLIDS TPEでは防げません。

 このような脅威に対処するためにTDE機能が開発されました。TDE機能は、次の2つのメカニズムから成り立っています。

  1. TDEポリシー
  2. アプリケーションのサンドボックス化

 それでは、それぞれを詳しく見ていきましょう。

 すべてのプロセスに強制されるTDEポリシー

 LIDS TDEがカーネルに組み込まれている場合、LIDSはすべてのプロセスに対して「TDEポリシー」を強制します。

 LIDSによるACLやケーパビリティが与えられたプロセスがあり、ファイルやキャラクタデバイスから入力が与えられた場合を考えてみます。このファイルがACLによってREADONLYに設定されていて、書き換えが不可能だった場合には特に問題は発生しません。しかし、ファイルの書き換えが可能になっていると、ファイルの中身を変更される可能性があります。改ざんされたファイルからの入力で、プロセスが予期せぬ動作を行う危険性があります。

 TDEポリシーでは、プロセスに対してACLで保護されていないファイルからの入力があった場合には、プロセスを「信頼されたドメイン」から「信頼されていないドメイン」に移動します。そして、「信頼されていないドメイン」に移動されたプロセスに与えられていた権限やケーパビリティは剥奪されます。この結果、危険性があるファイルによってプロセスが悪用されたとしても、重要な問題が発生することはありません。

図1 権限の剥奪

 Apacheやbindといったプロセスが設定ファイルをリロードした際にもTDEポリシーが適用されます。もし、それらの設定ファイルがACLで保護されていなかったら、Apacheやbindの権限やケーパビリティが剥奪されます。仮に、悪意のある設定にすり替えられていたとしても、プロセスは悪用されません。このように、TDEは非常に応用の利く機能です。

 TDEポリシーの例

 TDEの簡単な例を見てみましょう。冒頭でダウンロードしたVMwareイメージを使います。これは、簡単なCGIスクリプトが動作するようにLIDSを設定しています。以下のCGIスクリプトは、指定されたファイルに載っているIPアドレスにpingを打つものです。

#!/usr/bin/perl

use CGI;
use Net::Ping;
open(STDERR, ">&STDOUT");
$|=1;

$cgi = new CGI;
print "Content-Type: text/html\r\n\r\n";
print "<HTML><BODY><PRE>";
$file = $cgi->param('file');
$filepath = $file;
open(FILE, $filepath) || die"Error: $filepath is not found!\n";
while($line=<FILE>) {
use Net::Ping;
$host=$line;
$timeout=0.1;
$p = Net::Ping->new("icmp");
if ($p->ping($host, $timeout)){
    print "$host is alive.\n";
}
$p->close();

}
close(FILE);

print "</PRE></BODY></HTML>";

 VMwareイメージを起動したら、rootアカウントでログインします。rootアカウントのパスワードは「lids」です。そして「/sbin/ifconfig eth0」コマンドでIPアドレスを確認します。

画面1 「/sbin/ifconfig eth0」コマンドでIPアドレスを確認

 ホストOSでWebブラウザを起動し、URDに確認したIPアドレスを入力します(例では192.168.230.100)。VMware上でApacheが動作しているため、次のような画面が表示されます。

画面2 TDEの実験

 ファイル名入力欄に「/root/hosts」と入力し、ボタンを押します。/root以下はLIDSによりREADONLYで保護されているため、/root/hostsファイルは保護されている入力になります。それ故、/root/hostsファイルに記載されているIPアドレスにpingを打った結果が出力されます。

画面3 pingを打った結果

 次に、ファイル名入力欄に「/var/tmp/hosts」と入力し、ボタンを押します。/var/tmp/hosts以下はLIDSによりすべてのプロセスからWRITEが与えられているため、/var/tmp/hostsファイルは保護されていない入力になります。

 保護されていない入力が与えられたため、このプロセスに設定されているACLやケーパビリティがすべて剥奪されます。pingを使用するために必要な「CAP_NET_RAW」というケーパビリティも剥奪されます。「icmp socket error - Operation not permitted at /usr/local/apache/cgi-bin/test.cgi line 18」というエラーが表示され、pingが打てなくなっているはずです。

画面4 pingが打てない

 VMwareの/var/log/syslogファイルを見てみましょう。「保護されていない入力が与えられたために、TDEポリシーが適用された」というログが残っているはずです。

Apr 8 17:56:47 lids1 kernel: LIDS: perl5.8.4 (dev 3:1 inode 64627) pid 933 ppid 850 uid/gid (1001/65534) on (null tty) : Enforce TDE policy! Read unprotected input /var/tmp/hosts

Apr 8 17:56:47 lids1 kernel: LIDS: perl5.8.4 (dev 3:1 inode 64627) pid 933 ppid 850 uid/gid (1001/65534) on (null tty) : violated CAP_NET_RAW
/var/log/syslogファイル

 TDEポリシーを適用することで、ACLにより保護されているバイナリが、ACLで保護されていない入力を与えられて予期せぬ動作をしてしまうことを防止でき、それに起因する被害を最小限にできます。

1/3

Index
TDEポリシーとアプリケーションのサンドボックス化
Page1
Trusted Domain Enforcementとは何か
すべてのプロセスに強制されるTDEポリシー
TDEポリシーの例
  Page2
アプリケーションのサンドボックス化
LIDSでのサンドボックス化のアプローチ
  Page3
サンドボックス化の例


Security&Trust記事一覧


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間