10月版 カーネルのビルドエラーで責任者がクビに!?
上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2006/10/27
linux-kernelメーリングリスト(以下LKML)かいわいで起きるイベントを毎月お伝えする、Linux Kernel Watch。2006年9月はどのようなことが起きたのか、見てみましょう。
2.6.19大規模マージ計画始動
9月20日にカーネル2.6.18がリリースされました。それを受けて、9月21日にAndrew Mortonが2.6.19のマージ計画をLKMLに投稿しました。現在の-mmツリーに存在しているすべてのパッチを1つ1つ検討した巨大なメールでした。該当するパッチの担当者全員に対して返答を求めており、100通以上のメールが流れる大きなスレッドになりました。
ここまで大規模になった2.6.19のマージ計画ですが、一体どれくらいのパッチが-mmツリーにあったのでしょうか? Andrew Mortonが9月12日に出した2.6.18-rc6-mm2のリリースノートによると「この-mmリリースに含まれるパッチは計1915個になり、最高記録を更新した」と報告しています。-mmの開発も活発に進んでいるようです。
git-tar-treeの脆弱性にご用心
David Wagnerは「Linux kernel source archive vulnerable」という扇情的なタイトルで、カーネルソースのtarアーカイブに脆弱性があると指摘しました。GNU tarを使って、root権限でlinux-2.6.17.tar.gzを展開したところ、「すべてのユーザーがカーネルのソースツリーにあるディレクトリとファイルを自由に読み書きできる状態(rwxrwxrwx:0777やrw-rw-rw-:0666)になってしまい、セキュリティ上問題である」という内容でした。
そもそもGNU tarの仕様では、root権限でアーカイブを展開するとバックアップデータからのリストアだと想定し、umaskを無視するようになっています。なぜなら、バックアップデータをリストアしたときにumaskが有効になっていると、umaskの設定値の影響でアクセス権が変更されてしまうからです。
ちなみに過去10年間問題にならなかったのは、Linus Torvaldsがカーネルのソースツリーをtarで固める際、自分の一般ユーザー権限で実行していたからです。Linusは(022)というumask設定を利用して作業していました。彼のumask設定でファイルを作成すると所有権のあるユーザー以外に対して「書き込みを禁止するrwxr-xr-x(0755)やrw-r--r--(0644)」というアクセス権が設定されます。それらファイルのアーカイブをtarで作成した場合、Linusの設定した権限がtarアーカイブに保存されます。つまり、tarコマンドがたとえumaskを無視して展開しても、適切な権限が設定され、問題として表面化しなかったのです。
しかし、gitの機能であるgit-tar-treeコマンドを使用した場合はそうはいきません。ソースツリーのtarアーカイブは、gitリポジトリから直接生成されます。その生成されたtarアーカイブに含まれる権限情報は「読み込み・書き込み・実行できるrwxrwxrwx(0777)やファイルに読み込み・書き込みできるrw-rw-rw-(0666)」になっています。git-tar-treeコマンドで作成したtarアーカイブをroot権限で展開するとumaskは無視されます。つまり、「すべてのユーザーがカーネルのソースツリーにあるディレクトリとファイルを自由に読み書きできる状態」になってしまうのです。このことが今回の脆弱性問題の引き金になったのです。
この問題に対して「そもそもroot権限でカーネルのソースツリーを展開してコンパイルするのが間違いだ」とか「GNU tarのデフォルトの仕様が間違っている」などの意見が飛び交いました。しかし、最終的にはLinusがディレクトリとファイルの権限を変えてtarアーカイブを生成することで落ち着いたようです。
また、Willy Tarreauによるとgit1.4.2のgit-tar-treeコマンドで、仮想的にumaskを適用するための設定オプション「umask=」が追加されたとのことです。この機能を利用したのか、2.6.18のアーカイブファイルでは、所有権のあるユーザー以外に書き込みを制限するrwxr-xr-x(0755)やrw-r--r--(0644)になっています。
カーネルVer. |
アクセス権 |
ユーザー名 |
グループ名 |
2.6.12まで |
-rw-r--r-- (0644) |
torvalds | torvalds |
↓ |
2.6.17まで (git-tar-treeで生成) |
-rw-rw-rw- (0666) |
0 | 0 |
↓ |
2.6.18から |
-rw-r--r-- (0644) |
0 | 0 |
参考リンク: | |
2005年5月版 BitKeeperからgitへ、ソースコード管理ツール大変更 http://www.atmarkit.co.jp/flinux/rensai/watch2005/watch05a.html |
|
ファイル新規作成時のパーミッションを変更するには http://www.atmarkit.co.jp/flinux/rensai/linuxtips/474deffilepermssion.html |
強気のLinus「IRQ=0」を主張
IRQは、デバイスからの割り込みを受け取るための仕組みです。Linuxカーネルもデバイスドライバの部分でIRQを制御する必要があります。Linus Torvaldsは、FRVアーキテクチャにおけるPCIデバイスのIRQの扱いについて「『IRQがない』とするのには値を0(ゼロ)にするのが正しい」と主張しました。なぜなら、「0はC言語のif文で条件が書きやすく、『0であればIRQはない』『それ以外ならばIRQがある』という処理が一番間違いを減らせる」と説明しました。
しかし、もし仮に「IRQ=0」を利用しているデバイスが存在したとしたらどうなるでしょうか? 彼の意見は、「物理的にIRQ=0を利用しているデバイスが本当にあったとしても、別の番号に論理的に割り当ててしまえばよい」という、若干乱暴なものです。
Matthew Wilcoxによると、IRQなしの場合の番号が255とPCIの仕様書に定義されているそうです。これに基づいて「NO_IRQ」という定数をLinuxカーネル内部で定義するという話も出ていたようですが、却下されたそうです。
if (!dev->irq) |
0がIRQなしを意味する場合のif文の表記例 |
if (dev->irq == NO_IRQ) |
NO_IRQがIRQなしを意味する場合のif文の表記例 |
レジスタを利用 percpuの最新動向
2006年5月のpercpuの落とし穴発覚でお伝えしたpercpuですが、その後percpu領域のためにレジスタを利用するパッチをRusty Russelが投稿しました。
このパッチは、SMPの各CPU固有の情報を保持する領域のポインタとしてi386の%gs(注)レジスタを用います。レジスタの変更を伴うので、ptraceの仕組みの対応やタスク切り替え時の追加処理など、コアな部分に多数の変更を加える複雑なパッチです。
まだ最初のレビューの段階なのですぐにマージされるか分かりませんが、今後が楽しみです。
注:x86系アーキテクチャで利用できる「セグメントレジスタ」の1つ。GSレジスタ。 |
1/2 |
|
||||
|
連載 Linux Kernel Watch |
Linux Squareフォーラム Linuxカーネル関連記事 |
連載:Linux Kernel Watch(連載中) Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします |
|
連載:Linuxファイルシステム技術解説 ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する |
|
特集:全貌を現したLinuxカーネル2.6[第1章] エンタープライズ向けに刷新されたカーネル・コア ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する |
|
特集:/procによるLinuxチューニング[前編] /procで理解するOSの状態 Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する |
|
特集:仮想OS「User
Mode Linux」活用法 Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説 |
|
Linuxのカーネルメンテナは柔軟なシステム カーネルメンテナが語るコミュニティとIA-64 Linux IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った |
|
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|