2011年07月14日

「セキュリティ&プログラミングキャンプ2011」(無償)/「 TOMOYO Linux(セキュアOS)適用技術」(有償)のお知らせ

どういう訳か、8月に開催されるセキュリティ&プログラミングキャンプ2011の「セキュアなOSを作ろうクラス」で講師をさせていただくことになりました。 TOMOYO の考え方や TOMOYO にまつわる苦労話とかが中心になるのかな?講師経験が無く、人前に出るのが苦手な熊猫さくらに務まるものなのかドキドキしています。何をどう話すかの参考にするための過去の教材とか無いかなぁ?

9月には高度ポリテクセンターでの有償セミナーがあります。こちらは TOMOYO の使い方を習得することが中心です。

どちらも受講者を募集中だそうです。OSレベルのセキュリティというと目立たなすぎて、なかなか受講者が集まらないんですよねぇ・・・。

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

TOMOYO Linux 1.8.2p2 / AKARI 1.0.17 が公開されました。

/proc/ccs/stat でのクォータ設定に関して、項目名と値との間に空白が入っていると無視されてしまうという不具合を修正しました。また、 IPv6 アドレスについて、 RFC5952 形式の表記を扱えるように改良されました。

CentOS 6.0 がリリースされたので、 TOMOYO 対応カーネルを作成しました。レポジトリからダウンロードできます。

TOMOYO 2.3 にセキュリティ上の欠陥( CVE-2011-2518 )が見つかりました。信頼できないユーザにシェルアクセスを認めている場合、カーネルのアップデートを行ってください。 TOMOYO 1.x では NULL でないかどうかをチェックするラッパーを使用しているため、 TOMOYO 1.x にはこの欠陥は存在しません。

Linux 3.1 に搭載される TOMOYO 2.4 では、条件付きアクセス許可の指定もサポートされることになり、ユーザIDに基づく制限などが可能になります。現時点では、 Linux 2.6.38 / 2.6.39 / 3.0 に対しても Linux 3.1 の security/tomoyo/ ディレクトリ内のファイルを上書きコピーするだけで TOMOYO 2.4 を使うことができるようになる見込みです。

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

2011年06月29日

TOMOYO Linux 1.8.2 / AKARI 1.0.15 が公開されました。

今回はポリシー名前空間の追加と systemd 環境への対応追加が中心です。

http://sourceforge.jp/projects/tomoyo/lists/archive/users-en/2011-June/000366.html

openSUSE 12.1 には TOMOYO 2.3 が、 Linux 3.1 には TOMOYO 2.4 が採用されることになりました。

http://sourceforge.jp/projects/tomoyo/lists/archive/users/2011-June/000883.html

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

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