2011年05月31日

ポリシーの名前空間のサポートを実装中です。

TOMOYO のポリシーは現在のところ名前空間に対応していません。そのため、 LXC コンテナのように pivot_root() を使用する環境で TOMOYO を使う場合、コンテナ環境の中で実行されたデーモンプログラムとコンテナ環境の外で実行されたデーモンプログラムとを区別することができないため、管理者が望まない形のドメイン遷移が発生してしまい、不便です。 pivot_root() により作成された環境はほとんど独立した1台のマシンと考えることができるため、その環境を特別なものとして扱うことが望まれます。そのため、 TOMOYO のポリシーに名前空間を導入することについて検討しています。

名前空間の検討は仮想化環境で利用しやすくするために始めたものですが、仮想化環境を利用していなくても名前空間のメリットを享受することができます。名前空間が導入されることにより、 SELinux のようにフラットなドメイン配置をすることも可能になるだけでなく、 AppArmor のようにアプリケーション単位のポリシーの作成を行いやすくなります。

仕様と実装についてはほぼ固まり、現在細かいところを詰めているところです。 TOMOYO 1.8.2 で導入される予定の名前空間は( TOMOYO 1.3 でドメイン単位で異なる制御モードを割り当てるための)プロファイルが導入されたのと同じくらいのインパクトがあります。質問や意見などをお待ちしています。

お隣ネタに釣られてカミングアウト。

TOMOYO のドキュメントページに登場するカメラを持ったペンギンさんは、デザイナーさんにお願いするときにお見せしたこの絵が元ネタだったりします。

同じく、手足の生えた四角い生物は、 Linux におけるプロセスを管理するための task_struct 構造体を熊猫さくらが擬人化したものです。一応、 fork と execve を紹介する GIF アニメーションも作成してみましたが、まだ出番はありません。元ネタは、ツバサ・クロニクルに登場する「白まんじゅう」こと白モコナで、口元がムギュってなっているシーンから採用しました。

posted by 熊猫さくら at 21:19| Comment(0) | TrackBack(0) | TOMOYO Linux

衝撃: openSUSE のカメレオンはカメレオンではないらしい

とあるひとから、 TOMOYO を SUSE カーネルで有効になるようにしたいという要望を受け、過去のスレッドを探すために TOMOYO SUSE で検索していたら、↓なページを発見しました。

どのマスコットがお好き?−@IT

それによると、 openSUSE のマスコットキャラクターである Geeko くんは、カメレオンではなくヤモリなのだそうです。また、みなさんが良くご存じの Geeko くんは日本版なのだそうで、欧州版の Geeko くんはなんだか「恐竜かよ!?」って突っ込みたくなる顔のようです。

Linus さんが Linux 2.6 系は 2.6.39 で終わりにして、 Linux 3 系を 3.0 から始めることを決断した模様です。ペンギンさんから新しいマスコットキャラクターに交代するのかなぁ?

posted by 熊猫さくら at 21:14| Comment(0) | TrackBack(0) | Linux

2011年05月11日

お遊び: gzip ファイルのハッシュ値を選ぶ

以前、お遊び: tar ball のハッシュ値を選ぶでファイルを作成した時刻により md5sum の値が変化するというのを紹介しましたが、調査の結果、 gzip ファイルのヘッダ部分に埋め込まれている MTIME 部分が変化していることが原因であることが判明しました。

ということで、この MTIME 部分の値を書き換えれば、好きな md5sum 値を簡単に取得できるわけです。
TOMOYO Linux の tarball は、「配布用かテスト用か」および「最後までダウンロードされたかどうか」を簡単に見分けられるようにするために、以下のようなプログラムを用いて md5sum 値の先頭4桁が同じになるように選んでいます。(熊猫が作成した tarball かどうかの確認には、ファイル名の末尾に .asc を付与したファイルもダウンロードして、 gpg で確認してください。)

/* gcc this_file.c -lssl */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/md5.h>

static void mkfile(const char *dir, const char *cmdline, const char *outfile)
{
	unsigned char *buf = NULL;
	unsigned long buflen = 0;
	time_t *mtime;
	FILE *fp;
	if (chdir(dir)) {
		fprintf(stderr, "Can't change directory.\n");
		return;
	}
	fp = popen(cmdline, "r");
	if (!fp) {
		fprintf(stderr, "Can't read gzipped data.\n");
		return;
	}
	while (1) {
		int len;
		buf = realloc(buf, buflen + 1048576);
		if (!buf) {
			fprintf(stderr, "Can't allocate memory.\n");
			pclose(fp);
			return;
		}
		len = fread(buf + buflen, 1, 1048576, fp);
		if (len == 0)
			break;
		buflen += len;
	}
	pclose(fp);
	if (buflen < 8 || buf[0] != 0x1f || buf[1] != 0x8b) {
		fprintf(stderr, "Invalid gzipped data.\n");
		return;
	}
	fp = fopen(outfile, "w");
	if (!fp) {
		fprintf(stderr, "Invalid gzipped data.\n");
		return;
	}
	mtime = (time_t *) (buf + 4);
	while (1) {
		const unsigned char *md5 = MD5(buf, buflen, NULL);
		unsigned char c[4] = { md5[0] >> 4, md5[0] & 0xF,
				       md5[1] >> 4, md5[1] & 0xF };
		printf("%02x%02x%02x%02x%02x%02x%02x%02x"
		       "%02x%02x%02x%02x%02x%02x%02x%02x\n",
		       md5[0], md5[1], md5[2], md5[3],	md5[4], md5[5],
		       md5[6], md5[7], md5[8], md5[9], md5[10], md5[11],
		       md5[12], md5[13], md5[14], md5[15]);
		if (c[0] == c[1] && c[1] == c[2] && c[2] == c[3])
			break;
		(*mtime)++;
	}
	if (fwrite(buf, 1, buflen, fp) != buflen || fclose(fp)) {
		fprintf(stderr, "Can't write.\n");
		unlink(outfile);
	}
}

int main(int argc, char *argv[]) {
	mkfile("ソースのディレクトリ", "tar -zcf - --exclude .svn -- *", "出力ファイル");
	return 0;
}

先頭8桁が同じになるまでループさせるとか言って電力を浪費するの禁止!

posted by 熊猫さくら at 21:00| Comment(0) | TrackBack(0) | Linux

2011年04月11日

TOMOYO Linux 1.8.1p1 / AKARI 1.0.12 が公開されました。

予定より10日遅くなってしまいましたが、ドキュメント/レポジトリ/LiveCDなどをアップデートしました。

http://sourceforge.jp/projects/tomoyo/lists/archive/users/2011-April/000803.html

posted by 熊猫さくら at 22:47| Comment(0) | TrackBack(0) | TOMOYO Linux

2011年04月01日

2011年03月03日

お知らせ: TOMOYO Linux 2.3.0 にメモリリークの不具合が発見されました。

カーネル 2.6.36 以降に搭載されている TOMOYO Linux 2.3.0 に、メモリリークが発見されました。(既に 2.6.38-rc7 まで来ているため、即時の修正ではなく) 2.6.38 のリリース後(つまり 2.6.38.1 のリリース時)に修正が反映されるものと思われます。 TOMOYO Linux 2.3.0 をご利用の方( Ubuntu の Natty Narwhal をテスト中の方を含みます)は、上記リンクで示されているパッチを適用するか、あるいは rewrite パーミッションのチェックを無効化してください。

posted by 熊猫さくら at 19:29| Comment(0) | TrackBack(0) | TOMOYO Linux

2011年02月15日

AKARI 1.0.10 が公開されました。

「社長が現れて無限ループから救い出してくれた」でこちらへ来られた方へ:元ネタを知りたい場合は AQUA 第1巻の第4話 「猫の王国」をご覧ください。・・・最初は頭の中でぐるぐる回るほうの無限ループかと思って、まぁ社長が悩めるアリスちゃんを救う話ってどんなんだったっけ?と考えてしまいました。(笑)

ということで(?)本文。

カーネル 2.6.23 以前および 2.6.30 以降において、一部のインタプリタ(例えば /lib/ld-linux.so.2 )のパーミッションがチェックされていなかったのを修正しました。

TOMOYO 2.x および AKARI では全てのインタプリタのパーミッションが security_bprm_check() でチェックされているものと思っていました。しかし、実際には open_exec() を呼び出すハンドラの内、一部しか search_binary_handler() を呼び出していませんでした。そのため、 security_bprm_check() ではなく security_dentry_open() でインタプリタのパーミッションをチェックしてやらないと漏れが発生することが判明しました。

TOMOYO および AKARI では、プログラムの実行( execve() )要求に対しては execute 権限を、インタプリタや共有ライブラリなどの利用( open() )要求に対しては read 権限をチェックするという、普通とは違う判断基準を採用しています。

例えばシェルの場合、「バイナリプログラムとしての /bin/bash の execute 権限をチェックしておこう」という主張は納得できます。しかし、「 /bin/bash が必要とする共有ライブラリはプログラムとして解釈されるのだから共有ライブラリに対しても execute 権限をチェックしておこう」という主張には納得できません。その主張を認めるのなら「シェルに入力される文字列はプログラムとして解釈されるのだから標準入力である /dev/tty に対しても execute 権限をチェックしておこう」「シェルから読み込まれる設定ファイルに含まれる文字列はプログラムとして解釈されるのだから ~/.bashrc に対しても execute 権限をチェックしておこう」という調子で、全てのファイルの execute 権限をチェックすることになるでしょう。つまり、 execute 権限をチェックする価値が消滅してしまうと思うのです。プログラムとして実行されるかどうかはファイルを読み込むプログラムの内容に依存しているため、プログラムとして実行されるかどうかをカーネル側で判断する術はありません。そのため、カーネル側に於いて、プログラムとして解釈される共有ライブラリについては execute 権限をチェックするけれども、プログラムとして解釈される標準入力や設定ファイルについては execute 権限をチェックしないというのは、不釣り合いに思えるのです。

そこで、 TOMOYO および AKARI ではプログラムの実行要求に渡されたパス名を読み込みモードでオープンする場合には execute 権限を、それ以外に渡されたパス名を読み込みモードでオープンする場合には read 権限をチェックするようになっています。前者は呼び出し側が制御権を譲渡するという明確な意思表示であるのに対し、後者はそうではないからです。

さらに、 TOMOYO および AKARI では要求された側のプログラムが必要とするインタプリタや共有ライブラリのパーミッションは、プログラムの実行( execve() )を要求した側ではなく、要求された側の権限でチェックされています。これは、インタプリタや共有ライブラリが必要になるのは(要求する側の事情ではなく)要求される側の事情であるから、要求される側でチェックを行うほうが自然であるという考え方に基づいています。しかし、カーネル 2.6.29 以降、プログラムの制御権が譲渡されることが確定するまでは要求された側の権限で動作することが許されなくなってしまったので、 search_binary_handler() でのチェックは可能でも security_dentry_open() でのチェックは不可能なのです。

このような普通とは異なる処理を行うために、 TOMOYO 1.x および AKARI ではプロセス単位の変数を用いて状態を管理しています。しかし、 TOMOYO 2.x ではプロセス単位の変数を用いる許可をまだ貰えていません。そのため、現時点では TOMOYO 1.x や AKARI と同じ解決策を使えません。

さてさて、どうやってこの問題を解決しようか・・・頭の中で無限ループ?

posted by 熊猫さくら at 20:41| Comment(0) | TrackBack(0) | AKARI

2011年02月07日

TOMOYO Linux 1.8.0p3 / AKARI 1.0.8 が公開されました。

アクセスログを読み出す際のバッファサイズがアクセスログよりも小さい場合、同じアクセスログが何度も読みだされるという無限ループに陥る可能性があったのを修正しました。

AKARI は(プロジェクト開始時は無理だと思われていた 2.6.0/2.6.1/2.6.2 カーネルにおいて vfsmount スピンロックのアドレスを割り出す方法を発見したことで)「LSMが有効になっている全ての 2.6 カーネルで動作」するようになりました。(今更 2.6.0 対応を追加するというのは意地を張っているだけにしか聞こえませんが。(笑))

Jamie Nguyen さんが TOMOYO プロジェクトサイトの再構築を引き受けてくれたため、サイトが大幅にリニューアルされています。きっと驚くことでしょう。

posted by 熊猫さくら at 23:43| Comment(0) | TrackBack(0) | TOMOYO Linux

2011年01月21日

configure スクリプトの -static オプションチェックについて

configure スクリプト中で、 gcc が -static オプションをサポートしているかどうかをチェックする箇所があるかと思います。

checking if gcc static flag -static works... no

ところが、そのチェックを行うために使われる「エラーになる筈がない」と思われていた簡単なプログラムが、最近の Fedora や RHEL6 ではエラーになるのです。

$ echo 'int main(){return(0);}' | gcc -Wall -static -x c -
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status

これは、開発用パッケージである glibc-devel の中にスタティックリンクライブラリである /usr/lib/libc.a が含まれていないことが原因です。このエラーを解決するには、 glibc-static というパッケージを別途インストールする必要があります。

# yum install glibc-static

ダイナミックリンクライブラリだけしかインストールされない開発用パッケージが他にも存在しており、スタティックリンクライブラリを使いたい場合には開発用パッケージをソースパッケージから再コンパイルしなければいけないという、面倒な状況になってきているようです。

posted by 熊猫さくら at 23:57| Comment(0) | TrackBack(0) | Linux

TOMOYO Linux 1.8.0p2 / AKARI 1.0.7 が公開されました。

マウントポイントが不明な場合、マウントポイントまでのパス名の代わりとして dev(メジャー番号,マイナー番号): というプレフィックスを使っていましたが、 メジャー番号が 0 の場合のマイナー番号には意味が無いので、メジャー番号が 0 の 場合にはファイルシステム名( tmpfs: とか devtmpfs: とか)をプレフィックスとして 利用するように修正しました。これは、 CONFIG_SECURITY_PATH=y になっていない RHEL 6 で AKARI を利用しやすくするための仕様変更です。

TOMOYO はマウントポイントが判明している箇所に TOMOYO パッチを適用するため、 dev(メジャー番号,マイナー番号): というプレフィックスを見かけることは無い筈です。 しかし、 grsecurity カーネル向け TOMOYO パッチに含まれていたバグを修正した他、 RHEL 5.6 および RHEL 6 および 2.6.38 向けの対応のための変更も行われたので、 区別できるように 1.8.0p2 にしました。

posted by 熊猫さくら at 23:53| Comment(0) | TrackBack(0) | TOMOYO Linux