Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl

@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で指摘をもらいました。

  • Perlとはテキスト処理の記述性とパフォーマンスに優れ、正規表現が言語に組み込まれているプログラミング言語です。
  • Linuxサーバーでのフィルタリングプログラム、複数行の文字列を処理、ファイル内容の検索・置換などが得意
  • Perlはgitopensslなど広く普及したUnix/Linuxミドルウェアの補助ツールとして採用実績あり。後方互換性とポータビリティの高さがひとつの理由と推測。
  • 大量のテキストを扱うWeb開発も得意。ロングテールSEOを意識したWebサイト、アドテクやソーシャルゲームでの50ms以内のJSONの生成など。