@INC問題、モジュールパスの先頭にカレントディレクトリ「.」があるとどんな危険があるのか考えてみた

Perl 5.26ではモジュールの検索パスである@INCの先頭からカレントディレクトリ「.」が削除される。セキュリティ対策のためという説明があるのだけれど、実際にどんな場面で危険があるのかということを考えてみた。

他のユーザーが書き込み可能なディレクトリをカレントディレクトリにした場合が危ない

たとえば次のスクリプト(test.pl)を考えてみよう。

chdir '/tmp';

require File::Path;

このスクリプトは「/tmp」というディレクトリにカレントディレクトリをまず変更している。

ここで重要なことは「/tmp」というディレクトリは、他のユーザーも読み書きできるということだ。

他のユーザーが、書き込み可能であるということは「Find/Path.pm」というファイルを置くことができるということだ。(参考:File::Path)

モジュールの読み込みパスの先頭にカレントディレクトリ「.」が存在する場合は、まず最初に、カレントディレクトリに存在するモジュールを読み込もうとする。

するとこのスクリプトはカレントディレクトリである「/tmp」に存在する「Find/Path.pm」を読もうとする。

「Find/Path.pm」の中身を、攻撃用のプログラムにすれば「test.pl」は意図せずに「/tmp」の中の「Find/Path.pm」を実行してしまうことになる。

これは「信用できない検索パスの脆弱性」という問題のようだ。

「/tmp」以外でも他のユーザーが書き込み可能なディレクトリをカレントディレクトリにするようなスクリプトは、この脆弱性を持つといえる。

追記

何回も「.」が@INCの先頭に追加されていると書いてきましたが、「.」が末尾に追加されているの間違いでした。Twitterで指摘をもらいました。