メモの日々


2005年01月15日(土) [長年日記]

[unix][dev] 「セキュアなプログラマー: 競合状態を防ぐ」 (developerWorks)

http://www.ibm.com/developerworks/jp/linux/library/l-sprace/

ファイルの取り扱いに関する注意点などが解説されている。長い。いくつか抜粋。

ロックを示す別ファイルを作る場合には、よくおかしがちな間違があります。creat()またはそのopen()に等価なもの(モードO_WRONLY | O_CREAT | O_TRUNC)を呼んでしまうことです。

何かができるかどうか判定する際に、access(2)は使わないようにします。多くの場合、攻撃者はaccess(2)コールの後で状況を変更できてしまいます。

ファイル名を使うような操作はできる限り避け、代わりにファイルのディスクリプターを使って操作を行うようにします。つまりchown()やchgrp()、chmod()など、ファイル名を使うようなファンクションの代わりに、fchown( )やfstat( )、fchmod( )などのシステム・コールを使うようにする、ということです。そうすることによって、プログラム実行中にファイルが入れ替えられること(つまり潜在的な競合状態)を防ぐことができます。

攻撃者が制御している可能性を考えれば、「..」や「.」を信用することはできません。

UNIXライクのシステムで複数ユーザーがディレクトリーにファイルを追加できる場合で、特権プログラムからそのディレクトリーにファイルを追加しようとする場合には、そのディレクトリーのsticky ビットを必ずセットするようにします。

一部のプログラムでは、一時ファイル名を作るためにmktemp(3)やtmpnam(3)を直接呼んだ後、大丈夫であろうという想定で単純にそのファイルを開くのです。これは悪い案の好例です。実際、tmpnam(3)はスレッドに対して信頼性が低く、信頼できる方法でループを扱えないので、使うべきではありません。1997年の「Single UNIX Specification」ではtmpfile(3)を使うように推奨していますが、残念ながらこれを一部の古いシステムで使うのは、安全なことではありません。

Perlプログラマーであれば、セキュアに一時ファイルを作るためのクロス・プラットフォームの手段を提供しているFile::Tempを使うべきです。ただし適切に使うためには、そのドキュメンテーションをよく注意しながら読んでください。File::Tempには、安全ではないファンクションへのインターフェースもあるのです。safe_levelをHIGHに設定しておけば追加のセキュリティー・チェックが呼び出されるので、そのように設定することを強くお勧めします。

最も悪いのは、(実は残念なことに非常によく行われるのですが)攻撃者は「$$」が何なのかを推測できないだろう、と想定して、そうしたファイルに情報をリダイレクトしてしまう方法です。

ファイルを作った直後にファイルをunlink()するようにします。こうすることでディレクトリー・エントリーは無くなり、しかしファイル自体は、そのファイルを指す最後のファイル・ディスクリプターが閉じられるまでアクセスできます。そうすれば、ファイル・ディスクリプターを受け渡しながら、プログラム内部からそのファイルにアクセスし続けることができます。ファイルのアンリンクは、コード管理の面からも多くの利点があります。つまりプログラムがどのようにクラッシュしたとしても、そのファイルは自動的に消去されます。

[java] 「実用的なGroovy: Groovyを使って、より高速にJavaコードをユニット・テストする」 (developerWorks)

Groovyをユニットテストに使うと便利だという話。ざっと読んだけどどう便利なのかよく分からなかった。

最近私は自分のユニット・テスト中毒を抑えるためにGroovyを見ているのですが、少なくとも今ままでのところ、正に驚嘆しています。この新しい言語がユニット・テストにもたらすアジリティ(agility)には興奮すべきところがあり、真剣に調べるだけの価値があります。

やること

  • プリンタ処分
  • リンク元のスリム化
  • ナンバーアナウンス解約
  • tDiaryバージョンアップ
  • FSWikiバージョンアップ
  • 2004年分決算
  • オーブンレンジ用べんり棚