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プログラミングちゃんねるのご紹介

Perlの書籍
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
    この私、Perlゼミの作者が執筆しています。
    ご購入、口コミ歓迎。
  • Perlの書籍 »
自己紹介
木本裕紀

「今日も元気だ! Perlで元気!」

Perlプログラミングちゃんねる

Youtubeチャンネル登録、いいね、コメント歓迎

Twitter
フォロー、いいね、リツート、コメント歓迎

kimoto.yuki@gmail.com
応援メッセージ、質問、間違い報告歓迎

Perl総合研究所