2008年12月04日

セキュアOSの落とし穴

http://Kumaneko-Sakura.sblo.jp/article/22921019.html で「 SELinux を以ってしても防げない落とし穴」について言及しましたが、誰も気が付いてくれないようなので補足します。

セキュアOSを使えば、従来は1人で行うしかなかった管理者業務を複数人で分担して行うことができるようになります。つまり、 Alice さんには sshd の管理を、 Bob さんには httpd の管理を、 Carol さんには sendmail の管理をしてもらうことも可能なわけです。

もし、 Alice さんが意地悪だったら(それって Malice さん?)、 ssh サーバを起動するときに以下のようなコマンドラインを入力するかもしれません。

[alice@server.example.com ~] # /usr/sbin/sshd -o 'Banner /etc/shadow'

Malice さん、もとい、 Alice さんには「 sshd の管理」という役割が与えられているので、上記のコマンドラインは許可されます。すると、何が起こるでしょう?

[evil@gateway.example.com ~] $ ssh root@server.example.com
root:$1$d8kgaeX7$PqJEIeNsGAGPw4WwiVy0C/:14217:0:99999:7:::
bin:*:14189:0:99999:7:::
daemon:*:14189:0:99999:7:::
adm:*:14189:0:99999:7:::
lp:*:14189:0:99999:7:::
sync:*:14189:0:99999:7:::
shutdown:*:14189:0:99999:7:::
halt:*:14189:0:99999:7:::
mail:*:14189:0:99999:7:::
news:*:14189:0:99999:7:::
uucp:*:14189:0:99999:7:::
operator:*:14189:0:99999:7:::
games:*:14189:0:99999:7:::
gopher:*:14189:0:99999:7:::
ftp:*:14189:0:99999:7:::
nobody:*:14189:0:99999:7:::
rpm:!!:14189:0:99999:7:::
dbus:!!:14189:0:99999:7:::
mailnull:!!:14189:0:99999:7:::
smmsp:!!:14189:0:99999:7:::
nscd:!!:14189:0:99999:7:::
vcsa:!!:14189:0:99999:7:::
rpc:!!:14189:0:99999:7:::
sshd:!!:14189:0:99999:7:::
rpcuser:!!:14189:0:99999:7:::
nfsnobody:!!:14189:0:99999:7:::
pcap:!!:14189:0:99999:7:::
haldaemon:!!:14189:0:99999:7:::
xfs:!!:14189:0:99999:7:::
kumaneko:$1$Y1sTeizV$y59KJ5302WPGh9rw8kGU50:14217:0:99999:7:::
root@server.example.com's password:

認証されていないユーザに対して、パスワードのハッシュ値を公開してしまいました。せっかく root ユーザであっても「 cat /etc/shadow 」でパスワードのハッシュ値を読まれることが無いようにポリシーを設定していたとしても、誰でもパスワードのハッシュ値を読める状態を実現できてしまったわけです。これは「セキュリティ上問題あり」ですよね?

従来は1人で行うしかなかった管理者業務を複数人で分担して行うようにする以上、自分なら試さないであろう馬鹿げた指定が行われる可能性を考慮しなければなりません。強制アクセス制御は「資源へのアクセスの可否」を制御することはできますが、「アクセスが許可された資源がどのように利用されるか」については保証できません。「アクセスが許可された資源がどのように利用されるか」は「プログラムとユーザの正しさ」にも依存しています。ですから、「適切なラベルが割り当てられていても、適切なポリシーが定義されていても、それだけで十分とは限らない」ことを忘れないでください。

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

2008年11月16日

TOMOYO Linux 1.6.5 が公開されました。

PacSec2008 準備で報告が遅くなりましたが、11/11に TOMOYO Linux 1.6.5 をリリースしました。

TOMOYO Linux 1.0 の公開からもう3年になるのですね。ネーミングで騒がれ、2ちゃんねるで人格を否定され、ラベル陣営に叩かれました。それでも、まだ生きています。

今回はいろいろな不具合修正が含まれています。また、メインライン提案用バージョンへの移植を容易にするための仕様変更も含まれています。

変更点はこちらこちらにあります。

スラッシュドットにて「(便利で)くだらないUnix技は?」というエントリがあったので、SELinux を以ってしても防げない落とし穴という書き込みをしました。
SELinux の人が見たら怒るだろうなぁ。でも、実際問題、「ファイルやソケットなどにラベルを付けることはできるけれども、バイト列にラベルを付けることはできない」のですから、「ラベルベースであれば機密度の高い方から低い方へ情報が流れないように制限できる」なんていう考え方は、まるで某サブプライムローンにしか思えません。

"Why TOMOYO Linux?"The role of "pathname based access control" in security.では、「ラベルを維持するだけでは十分なセキュリティは実現できない」ということを書きました。でも、未だに「 TOMOYO や AppArmor から学ぶところは何もない」という考え方が残っているのは残念です。

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

2008年10月27日

PacSec2008 にてケロちゃんチェックの話をすることになりました。

セキュリティ・スタジアム 2004で攻撃側をとことん疲れ果てさせ、情報学ワークショップ 2005で論文として登場し、セキュリティホール memo BoF 2006で笑いを誘った「ケロちゃんチェック」ネタを、国際会議であるPacSec 2008ですることになりました。

昨年の Ottawa Linux Symposium 2007 にて「 TOMOYO Linux を Black Hat に提案してみてはどうか」と薦められていたこともあり、 Black Hat Japan 2008 に応募しましたが、採用されませんでした。

PacSec 2008 の募集締め切りが Black Hat Japan 2008 の採否通知前であったため、同一ネタの2重発表になってしまうのを避ける必要があったので、悩んだ末に PacSec 2008 への応募は諦めていたのですが、セキュリティホール memo メーリングリストで募集期間が延長されていたことを知り、早速応募しました。

以下はケロちゃんチェックに関連するリンク(一部)です。

昨年度までは「対話的にコマンドを入力するシェルセッションへの適用」しかできませんでしたが、 TOMOYO Linux 1.6 で execute_handler と task.state が搭載されたことにより、現在では「 scp や sftp への適用」および「 TCP ポートフォワーディングへの適用」も可能になっています。

はぅ〜〜。緊張するよ〜〜〜。

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

2008年09月03日

TOMOYO Linux 1.5.5 / 1.6.4 が公開されました。

世の中的には今日はドラえもんの誕生日だそうですが、大道寺知世ちゃんの誕生日でもあります。

カーネル 2.6.27-rc5 に対応したほか、 openSUSE 11.0 と Ubuntu 8.10 と Mandriva 2009.0 用のカーネルに対応しました。

1.6.3 → 1.6.4 に関しては不具合修正や機能追加はありません。

1.5.4 → 1.5.5 に関しては 1.6.1 → 1.6.4 までの修正の内、 1.5.x に該当する部分を反映したものです。

TOMOYO Linux 1.6.3 を搭載している Mandriva 2008.1 向けのと Turbolinux Client 2008 向けの体験ページもあります。
http://tomoyo.sourceforge.jp/ja/1.6.x/1st-step/tc2008/
http://tomoyo.sourceforge.jp/en/1.6.x/1st-step/mandriva2008.1/

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

2008年08月13日

TOMOYO Linux 1.6.3 が公開されました。

LiveCD に使われている unionfs のバージョン 2.x 系列において、パス名を取得できないために TOMOYO Linux によるアクセス制御を利用できないという不具合を修正したものを 1.6.3 として7/15に公開しました。

今月末に発売開始予定の Turbolinux Client 2008 には TOMOYO Linux が搭載されており、 LiveCD としても使える仕様になっているため、今回の不具合修正は不可欠だったわけです。

また、 Turbolinux Client 2008 と同じカーネルを使用している Mandriva Linux 2008.1 においても、8/12にリリースされたカーネル 2.6.24.7-desktop586-1mnb 以降で TOMOYO Linux 1.6.3 が使えるようになっています。

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

2008年06月28日

TOMOYO Linux 1.6.2 が公開されました。

従来の Linux はサーバ用途で使われることが多かったので、 TOMOYO Linux はWebサーバのようにサーバアプリケーションの振る舞いを制限することを念頭に設計されていました。しかし、 Linux がデスクトップ用途でも使われだしたことに伴い、Webブラウザのようにデスクトップアプリケーションの振る舞いを制限することも考慮する必要が生じてきました。

そこで、今回のバージョンアップでは、デスクトップアプリケーション向けのポリシーを作成しやすくするための規制緩和を行いました。また、ソフトウェアアップデート時の手順を簡略化しました。

業務用サーバとして利用する場合は、ソフトウェアアップデートを適用するにあたり、同一環境を用意して事前検証を行ったりすることが多いと思います。しかし、デスクトップとして利用する場合には、同一環境を用意して事前検証を行うことはほとんど無いと思います。場合によっては、ソフトウェアアップデートが適用されたことを知らせないように設定されていることさえあります。

ソフトウェアアップデートが適用されたことを知らされないままで済めば理想ですが、ポリシーに基づいて振る舞いを制限するという性格上、ソフトウェアアップデートに伴うパス名や依存関係の変化が原因で正常に動作できなくなる可能性があります。そのため、 TOMOYO Linux は、ポリシー違反が発生した場合に、リクエストを拒否するのではなく管理者の判断を仰ぐという、他のセキュリティ強化OSには存在しないユニークな機能を備えています。この機能のおかげで、ソフトウェアアップデート時のみ発生する突発的なリクエストや、パス名や依存関係の変化に対処できるようになっているのです。

今回のバージョンアップにより、この機能をより手軽に使えるようになりました。 設定内容を理解した上で使えるのが TOMOYO Linux の強みです。ポリシー違反を恐れずに、ちゃんとソフトウェアアップデートを適用するようにしてください。

http://lists.sourceforge.jp/mailman/archives/tomoyo-users/2008-June/000451.html

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

2008年06月16日

TOMOYO Linux 1.6.x を使いこなすためのヒントについて

↓に 1.6.x でできるようになったことの紹介があります。
http://tomoyo.sourceforge.jp/wiki/?TOMOYO-1.6-TIPS

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

2008年05月18日

TOMOYO Linux 1.5.4 / 1.6.1 が公開されました。

5/10の TLUG の技術ミーティングでの紹介に合わせて、 TOMOYO Linux 1.5.4 / 1.6.1 をリリースしました。

1.5.4 はカーネル 2.6.24 / 2.6.25 への対応及びバグフィックスです。

1.6.1 はカーネル 2.6.25 への対応及びバグフィックスが行われた他、ポリシーを記憶しておくために割り当てられるメモリ量の上限を制限する機能( Memory Quota )を追加しました。
1.6.0 までは上限を指定する機能が無かったので、カーネルが使えるメモリを全てポリシーのために割り当ててしまうことによりシステムがハングアップしてしまう可能性が理論上は存在していました。(現実にはそうなる前にシステムの応答が遅くなりすぎて使い物にならなくなるので、ハングアップに遭遇した方は居ないと思われます。)
1.6.1 では上限を制限できるようになったので、(アクセスを解析する用途で使うために)永遠に学習モードで動作させていても大丈夫なようになりました。もちろん、アクセスを制限する目的で使う場合には強制モードにする必要があります。

以下の場所でアナウンスを読むことができます。
http://lists.sourceforge.jp/mailman/archives/tomoyo-users/2008-May/000433.html

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

2008年04月01日

TOMOYO Linux 1.6.0 が公開されました。

今回のリリースには 1.5.0 のリリースから約半年間の開発成果を詰め込んでいます。
実際の環境に導入する場合に不足していると思われる部分を補強しました。具体的には

  • GUIポリシーエディタから操作するために root ユーザでの ssh ログインを許可する必要がなくなった
  • プログラム実行時の引数や環境変数も考慮したアクセス制御ができるようになった
  • プログラムの実行可否をカーネルの外部で判断できるようになった

等です。詳しい内容はmlに投稿しましたのでそちらをどうぞ。
http://lists.sourceforge.jp/mailman/archives/tomoyo-users/2008-March/000412.html
http://lists.sourceforge.jp/mailman/archives/tomoyo-users/2008-April/000415.html

1.6.0 の機能を活かすためのユーザランドツールはこれから開発していきたいと思います。

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

2008年02月02日

TOMOYO Linux 1.5.3 が公開されました。

今回はカーネルのバグフィックスと、ツールの機能拡張です。
http://lists.sourceforge.jp/mailman/archives/tomoyo-users/2008-January/000330.html

普通、マウント操作といえば、「mount /dev/sda1 /mnt/sda1/」とか「mount --bind /mnt/src/ /mnt/dest/」のように、マウントポイントとしてディレクトリを指定すると思います。
驚いたことに、「touch /mnt/null; mount --bind /dev/null /mnt/null」のように、マウントポイントとしてディレクトリでないものを指定することもできると教えてもらいました。( http://lkml.org/lkml/2007/12/17/514
ln によるハードリンクはマウントポイントを超えて行うことはできませんが、 mount --bind によるマウントであればマウントポイントを超えてハードリンクを作成したかのように見えます。(ただし、実際にはリンクカウントが増えるわけではないので、 mount --bind によるマウントはハードリンクを作成することとは違います。)

ツールでは、GUIからの操作を意識して savepolicy や loadpolicy を拡張したほか、ポリシーエディタを一部書きなおしました。
editpolicy での O コマンドをヘルプ画面に追加、ソート順を切り替える @ コマンドを追加、そして 1 〜 7 という数値よりも rwx の方が嬉しいというユーザのために環境変数を使ってキーワードの別名指定ができるようにしました。 ITpro EXPO 2008 の展示では説明しやすくするために以下のような別名を使いました。

ディレクティブ名別名
1allow_execute
2allow_write
3allow_write/execute
4allow_read
5allow_read/execute
6allow_read/write
7allow_read/write/execute

例外ポリシーでは読み込み許可が 4 ではなく allow_read というディレクティブを使っていること、ドメインポリシーでは読み書き実行以外のアクセス許可が全て allow_ で始まっているため、ドメインポリシーにおける読み書き実行の許可だけが数値というのに違和感があるため、 TOMOYO Linux 1.6.x では、以下のようにディレクティブ名を変更したいと考えています。

1.5.x までのディレクティブ名1.6.x でのディレクティブ名
1allow_execute
2allow_write
3allow_write
allow_execute
4allow_read
5allow_read
allow_execute
6allow_read/write
7allow_read/write
allow_execute

TOMOYO Linux 1.1.1 以降では、強制モードにおいてポリシー違反が発生した場合に、要求を直ちに拒否するのではなく、管理者に判断を仰ぐという機能が実装されています。この機能は、ソフトウェアのアップデート時にライブラリファイルのパス名が変化したり、普段は起こらない突発的な要求を処理するために使うことができます。
今回、この機能を利用して、強制モードにおけるポリシー違反の発生を直ちにメール等で通知するためのユーティリティを追加しました。使い方は、

/usr/lib/ccs/misc/ccs-notifyd 0 'mail 携帯電話などのアドレス'

です。なお、このユーティリティは、 ccs-queryd と同様、プロファイルで ALLOW_ENFORCE_GRACE=1 が指定されていない場合には機能しません。また、ポリシー違反が発生する度に通知を行うとメールの洪水になりかねない(1秒間に50回とかいう頻度でポリシー違反が発生することもありえる)ため、 ccs-notifyd は最初のポリシー違反だけを通知して終了するような仕様になっています。重複起動もできないようになっていますので、 /etc/crontab から定期的(例えば1日1回とか、1時間に1回など)に起動するという使われ方を想定しています。不具合や要望などがありましたらどうぞお知らせください。

/etc/crontab への記述例動作
* * * * * root /usr/lib/ccs/misc/ccs-notifyd 0 'mail root@example.com'1分に1回まで通知する
00 * * * * root /usr/lib/ccs/misc/ccs-notifyd 0 'mail root@example.com'1時間に1回まで通知する
posted by 熊猫さくら at 15:05| Comment(0) | TrackBack(0) | TOMOYO Linux

2007年12月05日

TOMOYO Linux 1.5.2 が公開されました。

今回はバグフィックスのみです。
http://lists.sourceforge.jp/mailman/archives/tomoyo-users/2007-December/000310.html

PacSec2007 に参加して、 Global Distributed Honeynet の話を聞きながら、「普段は正常にサービスを提供しながら、攻撃を受けた時だけ偽のログインシェルに誘導できたら面白いだろうなぁ」と思いました。
http://lists.sourceforge.jp/mailman/archives/tomoyo-users/2007-November/000303.html で言及している機能で実現可能であり、実装は済んでいます。

PacSec2007 では、ライブCDから起動してケロちゃんチェックのデモをやろうと思っていたのですが、準備中にCDの読み込みエラーが発生したためにシステムがハングアップしてしまい、結局デモを断念せざるを得ませんでした。
TOMOYO Linux のデモは何度もしてきましたが、今回初めてデモが失敗してしまいました。
「 TOMOYO ちゃんは悪くないもん。読み込みエラーになったハードが悪いんだもん。」(笑)

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

2007年10月23日

TOMOYO Linux 1.5.1 が公開されました。

今回はバグフィックスと、若干の使い勝手向上です。

http://lists.sourceforge.jp/mailman/archives/tomoyo-users/2007-October/000299.html

頼んでなくてもどこまでも追いかけて記録してくれちゃうのが知世ちゃんの性格なもので・・・。
時にはこれ以上記録しないでと頼むことも必要なんだぁ・・・って、 TOMOYO のミスを知世ちゃんの性格で誤魔化すでない。(笑)

次は、環境変数に対するアクセス制御もできるようにしたいなぁ。実装はもう済んでるのだけれど。

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

2007年09月28日

TOMOYO Linux 1.5.0 が公開されました。

機能面では TOMOYO Linux 1.4.2 とほぼ同じですが、 ファイルの配置などを見直すことで導入しやすくなりました。

変更点を説明すると長くなるのでここには書きませんが、 今後は 1.5.x を長期サポートすることを目標とします。
紙面での連載ではまだ 1.4.2 を用いて説明をしていますが、 これから触られる方もすでに触ったことのある方も 1.5.0 を 使われることをお勧めします。

一部で、リリース日が9/3(知世ちゃんの誕生日)じゃなかったのは何故かという ツッコミがあるようですが、今年の9/3は仏滅なので(7/13に 1.4.2 をリリースする前から)9/3のリリースは行わないと決めていました。
リリース日が仏滅にならないようにしていたのに気がついていましたか?(笑)

Version 1.0 2005/11/11先勝
Version 1.0.1 2005/12/08大安
Version 1.0.2 2006/02/14大安
Version 1.1 2006/04/01赤口
Version 1.1.1 2006/05/15先負
Version 1.1.2 2006/06/02大安
Version 1.1.3 2006/07/13大安
Version 1.2 2006/09/03大安
Version 1.3 2006/11/11大安
Version 1.3.1 2006/12/08先負
Version 1.3.2 2007/02/14友引
Version 1.4 2007/04/01先負
Version 1.4.1 2007/06/05大安
Version 1.4.2 2007/07/13先負
Version 1.5.0 2007/09/20大安
posted by 熊猫さくら at 23:41| Comment(0) | TrackBack(0) | TOMOYO Linux

2007年06月05日

TOMOYO Linux 1.4.1 が公開されました。

大きな変更は、以下の2点です。
・特定のパス名を除外するための演算子をサポート
・プログラム実行時の argv[0] のチェック方法の見直し

従来は /etc/\* と指定すると /etc/shadow などの重要なファイルも含まれてしまうので、それを避けるためには /etc/resolv.conf や /etc/nsswitch.conf のように個別に許可する必要がありました。しかし、 \- という演算子を用いて /etc/\*\-\*shadow\* のように指定すると /etc/\* から /etc/\*shadow\* に一致するもの( /etc/shadow /etc/shadow.\$ /etc/gshadow など)を除外できるので、ワイルドカードの便利さを残しつつ重要なファイルへのアクセスを禁止することができるようになります。
どうして今まで無かったのだろうと思うくらい、便利です。

TOMOYO Linux には、「プログラム実行時の filename (プログラムへのパス名)と argv[0] (プログラムへの最初の引数で多くの場合は filename と同一内容)の組み合わせ」を制限する機能があります。これは、 argv[0] の内容によって振る舞いを変化させるプログラムのために提供されている機能です。
TOMOYO Linux には、シンボリックリンクの名前でドメイン遷移を行うための機能もあります。これも、 argv[0] の内容によって振る舞いを変化させるプログラムのために提供されている機能です。これは、「シンボリックリンクとそのリンク先の組み合わせ」を事前に指定しておいた場合のみ機能します。
しかし、 1.4 までは、「シンボリックリンクの名前と argv[0] の内容の組み合わせ」で argv[0] をチェックしていたため、「シンボリックリンクとそのリンク先の組み合わせ」に指定されていないシンボリックリンクを使うことで、 argv[0] のチェックを無力化できてしまう(シンボリックリンクのリンク先のパス名が指すプログラム用のドメインに遷移させながら、シンボリックリンク自身のパス名が指すプログラムとして振る舞わせることができてしまう)ことに気がつきました。これは、設計上のミスです。
そこで、 1.4.1 では、「シンボリックリンクのリンク先の名前と argv[0] の内容の組み合わせ」で argv[0] をチェックするように変更しました。(正確に言うと、「シンボリックリンクとそのリンク先の組み合わせ」が指定されている場合には「シンボリックリンクの名前と argv[0] の内容の組み合わせ」で、そうでは無い場合には「シンボリックリンクのリンク先の名前と argv[0] の内容の組み合わせ」でチェックします。)
これにより、「シンボリックリンクとそのリンク先の組み合わせ」が指定されていないシンボリックリンクを経由することで argv[0] のチェックを無力化できないようになりました。

今回はバイナリカーネルパッケージの作成に関してコンパイルを手伝っていただきました。おかげさまで、予定通りリリース日に間に合わせることができました。どうもありがとうございます。
カーネルをコンパイルするのは初めてという方が多く、最初は不安そうでしたが、手順どおりに幾つかのコマンドを叩くだけですので、全然難しいところはありません。

ディストリビュータカーネルのバージョンアップが無いかどうかを毎日のようにチェックするのは時間が掛かります。「パッチの作成やカーネルをコンパイルするのはちょっと・・・」という方でも、カーネルのバージョンアップがあったら御一報くださるだけでも助かります。

さて、今月末に向けてこれから忙しいことになります。

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

2007年05月02日

TOMOYO カーネルを普通のカーネルとして使う方法について

TOMOYO Linux 用のパッチを適用したカーネルを、通常のカーネルとして使いたい場合には、 /.init というファイルを作成しないようにしてください。 /.init が存在しなければ強制アクセス制御が開始されないので、通常のカーネルとして使うことができます。

逆に、 /.init が存在する場合は、カーネル起動時のコマンドラインに init=/.init を指定する必要があります。 /.init が存在するのに init=/.init を指定しなかった場合は、カーネルパニックになって起動できません。

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

2007年04月01日

TOMOYO Linux 1.4 が公開されました。

大きな変更は、以下の2点です。
・IPアドレスのグループを用いたアクセス許可の指定をサポート
・ x86_64 アーキテクチャのサポート

1.3.2 でパス名のグループ化を行う path_group 構文を導入しましたが、IPアドレスもグループ化できたほうが便利だという意見があったので IPv4/IPv6 アドレスをグループ化する address_group 構文を導入しました。今までは DNS サーバ等のアドレスをドメインポリシーで直接指定していましたが、 1.4 では例外ポリシーで address_group DNS-SERVER 192.168.0.1 のように指定しておくことによりドメインポリシーでは allow_network UDP connect @DNS-SERVER 53 のように指定できるようになりました。

1.3.2 までは x86_64 アーキテクチャのように 64 ビットカーネルで 32 ビットアプリケーションを動作させる場合に( 32 ビットアプリケーションが呼び出すシステムコールが 64 ビットアプリケーションとは一部異なっているのが原因で)一部の強制アクセス制御が機能していませんでした。今回、 x86_64 アーキテクチャの ThinkPad X60 が手に入ったので、動作確認を行い、問題点を修正しました。 x86 と arm と x86_64 でしか試せていませんが、他の 64 ビットアーキテクチャでも動作するようになったと思います。

今月アメリカのサンフランシスコで開催される Embedded Linux Conference 2007 と6月にカナダのオタワで開催される Linux Symposium 2007 に参加することになりました。いよいよ TOMOYO Linux の海外進出が始まります。

posted by 熊猫さくら at 11:40| Comment(4) | TrackBack(0) | TOMOYO Linux

2007年02月17日

TOMOYO 用カーネルパッチの作り方について(続)

既存の TOMOYO Linux カーネルパッチから新しいパッチを作成する方法について紹介します。

所要時間は、カーネルのコンパイルを除いて30分程度です。

現時点の最新版は ccs-patch-1.3.2-20070214.tar.gz です。
これを tar -zxf で展開した時に作成される ccs-patch-*.txt というのがカーネルパッチです。

http://sourceforge.jp/tracker/?atid=7342&group_id=1973&func=browse には、 ccs-patch-*.tar.gz のリリース後に公開されたカーネル用の ccs-patch-*.txt が置かれていますので、パッチを作成する前に最新版の有無を確認してください。また、 http://tomoyo.sourceforge.jp/ja/1.3.2/compile.html には、既存のパッチを使用してコンパイルする手順について書かれています。

例えば、 Fedora Core 6 向け 2.6.19-1.2895.fc6 用のパッチから 2.6.19-1.2911.fc6 用のパッチを作成するには以下のようにします。

まずは2.6.19-1.2911.fc6 のソースをインストールして、ディストリビューション固有のパッチを適用します。 rpmbuild の --target オプションに i586 ではなく i686 を指定しないと動作しないディストリビューションもあります。また、Makefile の先頭にある EXTRAVERSION= を予め修正しておきます。

rpm -ivh kernel-2.6.19-1.2911.fc6.src.rpm
rpmbuild -bp --target i586 /usr/src/redhat/SPECS/kernel-2.6.spec
mv /usr/src/redhat/BUILD/kernel-2.6.19/linux-2.6.19.i586/ /usr/src/linux-2.6.19-1.2911.fc6-ccs
cd /usr/src/linux-2.6.19-1.2911.fc6-ccs
sed -i 's/EXTRAVERSION = -prep/EXTRAVERSION = -1.2911.fc6/' Makefile

TOMOYO Linux パッチを展開して、既存のパッチの適用を試みます。 --dry-run オプションを指定することで、どれくらい不一致があるかを確かめることができます。既存のパッチの内、最も Reject が少なかったものをベースにします。

tar -zxf ccs-patch-1.3.2-20070214.tar.gz
patch --dry-run -p1 < ccs-patch-2.6.19-1.2895.fc6.txt

どのパッチをベースにするかが決まったら、 cpio のコピーパスモードを用いてパッチを適用するファイルのバックアップを作成します。

patch --dry-run -p1 < ccs-patch-2.6.19-1.2895.fc6.txt | grep ^patching | awk ' { print $NF } ' | cpio -pd ../linux-2.6.19-1.2911.fc6/

実際にパッチを適用します。

patch -p1 < ccs-patch-2.6.19-1.2895.fc6.txt

Reject された部分を修正していきます。軽微な変更であれば Reject されることはありません。
パッチを適用する時に with fuzz という表示が出た場合は要注意です。
パッチを適用する時に offset という表示が出た場合、数行程度ならほとんどの場合無視できます。十行以上の場合は要注意です。

修正が終わったら、 Makefile の先頭にある EXTRAVERSION= および fs/proc/proc_misc.c の末尾にある Hook version: を更新します。

1つ上のディレクトリへ行って diff を取得します。

cd ..
export LANG=C
diff -ubBpEr linux-2.6.19-1.2911.fc6/ linux-2.6.19-1.2911.fc6-ccs/ | grep -v "Only in" > ccs-patch-2.6.19-1.2911.fc6.txt

パッチ同士の diff を取得して、不自然な差異が無いかどうかを確認します。軽微な変更であれば、 EXTRAVERSION= と Hook version: 以外の違いは表示されません。

diff linux-2.6.19-1.2911.fc6-ccs/ccs-patch-2.6.19-1.2895.fc6.txt ccs-patch-2.6.19-1.2911.fc6.txt | grep -vF linux-2.6.19

とりあえずコンパイルして、コンパイルエラーが発生しないことを確認してください。エラーが発生しなければパッチの作成は終了です。

ここから先は、 http://kumaneko-sakura.sblo.jp/article/2965101.html と同じです。動作テストプログラムの最新版は ccs-tools-1.3.2-20070214.tar.gz です。
なお、 IPv6 でローカルポートの空きが無い場合に connect 操作で数分間停止してしまう場合がありましたが、カーネル 2.6.20-git10 にて修正されました。今後公開されるバージョンでは修正されていることでしょう。

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

2007年02月14日

TOMOYO Linux 1.3.2 が公開されました。

大きな変更は、以下の3点です。
・ポリシーエディタの使い勝手が向上
・ドメイン遷移をより詳細に制御する構文をサポート
・パス名のグループを用いたアクセス許可の指定をサポート

ポリシーエディタが大きく進化しました。カーネルは 1.3.1 を使い続ける予定でも 1.3.2 のポリシーエディタを使う価値があると思います。

1.3.1 では initializer と keep_domain 構文しかありませんでしたが、 1.3.2 ではそれらを必要に応じて打ち消すことができるようになりました。
例えばログイン後のドメインを keep_domain で遷移を抑制しながら、追加認証のためのプログラムを実行する時にだけ no_keep_domain で遷移を強制させることにより、追加認証や管理者権限の分割が行いやすくなりました。
initializer というキーワードは keep_domain というキーワードに合わせるために initialize_domain というキーワードに変更されました。また、 initialize_domain を打ち消すために no_initialize_domain キーワードが導入されました。なお、互換性のために initializer および no_initializer という指定でも認識します。

パス名のグループ化機能により、 SELinux で言うところの .fc ファイルみたいな使い方ができます。 SELinux では .fc ファイルにパス名とラベル名の対応を定義してからポリシーファイルにラベル名を用いてアクセス許可を与えます。 TOMOYO Linux でも、例外ポリシーでパス名とグループ名の対応を定義してから、ドメイン別ポリシーでグループ名を用いてアクセス許可を与えることができるようになりました。 TOMOYO Linux では1つのパス名に複数のグループ名が対応することを容認しているので SELinux のようにパス名に対するラベルの付け方についてドメイン間で調停する必要がありません。

何かが動き始めているようです・・・。

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

2007年01月06日

TOMOYO 用カーネルパッチの作り方について

既存の TOMOYO Linux カーネルパッチから新しいパッチを作成する方法について紹介します。

所要時間は、カーネルのコンパイルを除いて30分程度です。

現時点の最新版は ccs-patch-1.3.1-20070105.tar.gz です。
これを tar -zxf で展開した時に作成される ccs-patch-*.txt というのがカーネルパッチです。

例えば、 Debian Etch 向け 2.6.18-7 用のパッチから 2.6.18-8 用のパッチを作成するには以下のようにします。

まずはカーネル 2.6.18-8 のソースをインストールして、そのディレクトリへ移動します。後で diff を作成することにするので、予めディレクトリ名を変更しておきます。

cd /usr/src/
tar -jxf linux-source-2.6.18.tar.bz2
mv linux-source-2.6.18 linux-source-2.6.18-8-ccs
cd linux-source-2.6.18-8-ccs

TOMOYO Linux パッチを展開して、既存のパッチの適用を試みます。 --dry-run オプションを指定することで、どれくらい不一致があるかを確かめることができます。既存のパッチの内、最も Reject が少なかったものをベースにします。

tar -zxf ccs-patch-1.3.1-20070105.tar.gz
patch --dry-run -p1 < ccs-patch-2.6.18-7etch.txt

どのパッチをベースにするかが決まったら、 cpio のコピーパスモードを用いてパッチを適用するファイルのバックアップを作成します。

patch --dry-run -p1 < ccs-patch-2.6.18-7etch.txt | grep ^patching | awk ' { print $NF } ' | cpio -pd ../linux-source-2.6.18-8/

実際にパッチを適用します。

patch -p1 < ccs-patch-2.6.18-7etch.txt

Reject された部分を修正していきます。軽微な変更であれば Reject されることはありません。
パッチを適用する時に with fuzz という表示が出た場合は要注意です。
パッチを適用する時に offset という表示が出た場合、数行程度ならほとんどの場合無視できます。十行以上の場合は要注意です。

修正が終わったら、 Makefile の先頭にある EXTRAVERSION= および fs/proc/proc_misc.c の末尾にある Hook version: を更新します。

1つ上のディレクトリへ行って diff を取得します。

cd ..
export LANG=C
diff -ubBpEr linux-source-2.6.18-8/ linux-source-2.6.18-8-ccs/ | grep -v "Only in" > ccs-patch-2.6.18-8etch.txt

パッチ同士の diff を取得して、不自然な差異が無いかどうかを確認します。軽微な変更であれば、 EXTRAVERSION= と Hook version: 以外の違いは表示されません。

diff linux-source-2.6.18-8-ccs/ccs-patch-2.6.18-7etch.txt ccs-patch-2.6.18-8etch.txt | grep -vF linux-source-2.6.18

とりあえずコンパイルして、コンパイルエラーが発生しないことを確認してください。エラーが発生しなければパッチの作成は終了です。以下は、パッチが正しいかどうかを確認するための手順です。

動作テストプログラムを展開してコンパイルします。現時点の最新版は ccs-tools-1.3.1-20061208.tar.gz です。

cd /root/
tar -zxf ccs-tools-1.3.1-20061208.tar.gz
make -sC ccstools/kernel_test/

/etc/ccs/manager.txt に /root/ccstools/kernel_test/ 以下にあるプログラムを追加します。

find /root/ccstools/kernel_test/ -type f -perm +100 >> /etc/ccs/manager.txt

コンパイルしたカーネルで再起動したら、以下のように testall.sh コマンドを実行してフックの掛け忘れが無いかどうかをチェックします。

/root/ccstools/kernel_test/testall.sh

must fail という行を含む処理が全て Permission Denied になれば、フックの掛け忘れはありません。
たまに、 Function not implemented と表示される場合がありますが、それはフックの掛け忘れでは無いので大丈夫です。

IPv6 を使う場合は、 testall.sh の実行前に ifconfig コマンドを実行して IPv6 アドレスが表示されることを確認してください。表示されない場合は insmod ipv6 や modprobe ipv6 を試してください。
なお、 IPv6 ではローカルポートの空きが無い場合に connect 操作で数分間停止してしまう場合があります。放置しておけばそのまま再開するはずですが、待ちきれない場合は Ctrl-C で中断してから再実行してください。

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

2006年12月25日

ケロちゃんチェック使用上の注意

クリスマスということで、封印の獣の話を・・・。(←何故?)

ケロちゃんの綴りは CERBERUS でして、 CERUBERUS ではありませんので。
それから地獄の番犬でもなくて、黄金の瞳の最強の守護獣です。CCさくら第1巻P17によると、犬さんや猫さんでは無いとのことです。

で、本題。
セキュリティホールmemo BoFでデモをしたログイン認証の多重化(愛称:ケロちゃんチェック、名前の由来は http://I-love.SAKURA.ne.jp/tomoyo/ )ですが、利用上の注意があります。

デモ用に用意したサンプルの一部

#! /bin/sh
for i in 1 2 3
do
  echo -n 'Password: '
  read -r -s passwd
  echo
  [ "$passwd" = "SAKURA" ] && exec $SHELL
done
echo 'Incorrect password.'
#! /bin/sh
for i in 1 2 3
do
  echo -n 'Password: '
  read -r -s passwd
  echo
  [ "$passwd" = "TOMOYO" ] && exec $SHELL
done
echo 'Incorrect password.'
#! /bin/sh
for i in 1 2 3
do
  echo -n 'Password: '
  read -r -s passwd
  echo
  [ -f /tmp/rootauth ] && exec $SHELL
done
echo 'Incorrect password.'
#! /bin/sh
for i in 1 2 3
do
  echo -n 'Password: '
  read -r -s passwd
  echo
  [ "$1" = "pass" -a "$2" = "me" -a "$3" = "please" ] && exec $SHELL
done
echo 'Incorrect password.'
#! /bin/sh
echo -n 'Password: '
read -r -s passwd
echo
exec $SHELL
#! /bin/sh
while :
do
  echo -n 'Password: '
  read -r -s passwd
  echo
done

上記のサンプルのように bash 等で実行するスクリプトとして実装した場合、環境変数
SHELLOPTS に verbose が設定されている状態で実行すると、スクリプトの内容(=認証で使用するアルゴリズム)が丸見えになってしまいます。

認証スクリプトの2行目で
set +v
を実行すればそこから先の表示を防げるとお考えかもしれませんが、実際にはそれでは不十分です。もし、環境変数 SHELLOPTS に verbose:noexec が設定されている状態で実行すると、
set +v
が実行されないためにスクリプトの内容が丸見えになってしまいます。

SHELLOPTS は読み込み専用だから変な値が設定されることは無いと考えてはいけません。 tcsh 等では
setenv SHELLOPTS verbose
を実行することで環境変数 SHELLOPTS に値を設定することができてしまいます。

デモ用に用意した上記のサンプルはあくまで概念の説明用です。実際のシステムで利用する場合は、環境変数によってプログラムの内容が暴露されないような言語で作成してください。

ところで、先頭行を #! /bin/sh ではなく #! /bin/sh -p にすれば SHELLOPTS の設定が無視されるようになるから大丈夫・・・なのかなぁ?

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