ホーム > GNU/Linux > perlのsystem/open(パイプモード)の挙動

perlのsystem/open(パイプモード)の挙動

CVE-2014-6271周りでいろいろ調査してた時に知ったことです。
perlを触って10年近く経ちますが初めて知った事実。

system、open(2引数/3引数問わずパイプを開く場合)、“(バッククォートによるコマンド実行)では
「シェルを通すのでメタ文字のエスケープが必要」というのはよく知られた事実です。
当然「必ずシェルを通すもの」と思っていたのですが、これは間違いで「シェルのメタ文字を含む場合はシェルに渡るが含まない場合はシェルを通さない」が正しいそうです。

つまり、

system("ls");

はシェルを通さないのでCVE-2014-6271の影響を受けないが、

system("ls;");

とした瞬間にシェルを通すようになり、それがbashであればCVE-2014-6271の影響を受けるようになります。

最初はこれに気付かずに`sleep 0`とかで検証して「ああ、perlのsystem系は大丈夫だな」と勘違いしていたのですがそんなことはないです。
特にありがちなのは”(ダブルクォート)とかでしょうかね。

CGI版phpやらrubyやらpythonなんかは触ってないので同じような挙動をするのか毎回シェルが上がるのか分かりません。

おそらく、実装された当時はシェル立ち上げの負荷が馬鹿にならなかった時代で、できるだけ直接起動したかった、という事情なんじゃないかなーと。

広告
カテゴリー:GNU/Linux
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。