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)になっています。

参考:tar.gzファイルの中身の権限で見るカーネルの変遷
カーネル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がある』という処理が一番間違いを減らせる」と説明しました。

 しかし、もし仮に「IRQ0」を利用しているデバイスが存在したとしたらどうなるでしょうか? 彼の意見は、「物理的にIRQ0を利用しているデバイスが本当にあったとしても、別の番号に論理的に割り当ててしまえばよい」という、若干乱暴なものです。

 Matthew Wilcoxによると、IRQなしの場合の番号が255とPCIの仕様書に定義されているそうです。これに基づいて「NO_IRQ」という定数をLinuxカーネル内部で定義するという話も出ていたようですが、却下されたそうです。

if (!dev->irq) 
        return -ENODEV;
0がIRQなしを意味する場合のif文の表記例

if (dev->irq == NO_IRQ)
        return -ENODEV;
NO_IRQがIRQなしを意味する場合のif文の表記例

レジスタを利用 percpuの最新動向

 2006年5月のpercpuの落とし穴発覚でお伝えしたpercpuですが、その後percpu領域のためにレジスタを利用するパッチをRusty Russelが投稿しました。

 このパッチは、SMPの各CPU固有の情報を保持する領域のポインタとしてi386の%gsレジスタを用います。レジスタの変更を伴うので、ptraceの仕組みの対応やタスク切り替え時の追加処理など、コアな部分に多数の変更を加える複雑なパッチです。

 まだ最初のレビューの段階なのですぐにマージされるか分かりませんが、今後が楽しみです。

注:x86系アーキテクチャで利用できる「セグメントレジスタ」の1つ。GSレジスタ。

1/2

Index
Linux Kernel Watch 10月版
 カーネルのビルドエラーで責任者がクビに!?
Page 1
 2.6.19大規模マージ計画始動
 git-tar-treeの脆弱性にご用心
 強気のLinus「IRQ=0」を主張
 レジスタを利用 percpuの最新動向
  Page 2
 バグ発見の鍵は利用者の絶対数にあり
 責任者はクビ? stableビルドエラー騒動

連載 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カーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


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

注目のテーマ

Linux & OSS 記事ランキング

本日 月間