web-dev-qa-db-ja.com

bash / POSIXシェルで変数を引用するのを忘れることのセキュリティへの影響

Unix.stackexchange.comをしばらくフォローしている場合は、Bourne/POSIXシェル(z [sshは例外])のリストコンテキスト(echo $varのように)で変数を引用符で囲まないでおくと、非常に特別な意味があり、非常に正当な理由がない限り実行すべきではありません。

ここでは多くのQ&Aで詳しく説明されています(例: 空白文字やその他の特殊文字でシェルスクリプトが詰まるのはなぜですか?二重引用符が必要な場合 、- Shell変数の展開とglobの影響とそれに分割引用vs引用符なしの文字列展開

70年代後半のBourne Shellの最初のリリースからそうであり、Korn Shell( David Kornの最大の後悔(質問#7) )またはbashによって変更されていません。ほとんどがKornシェルをコピーし、それがPOSIX/Unixで指定されている方法です。

今でも、多くの回答がここにあり、変数が引用されていないシェルコードが公開されていることもあります。あなたは人々が今までに学んだと思っていたでしょう。

私の経験では、変数の引用を省略している人は主に3種類あります。

  • 初心者。確かにそれは完全に直感的ではない構文であるため、それらは言い訳することができます。そして、彼らを教育することがこのサイトでの私たちの役割です。

  • 忘れっぽい人。

  • 確かにボーンシェルの作者はすべての変数を引用するつもりはなかったと思うハンマーを繰り返した後でも納得しない人.

この種の行動に関連するリスクを明らかにすれば、おそらく彼らを説得できるでしょう。

変数の引用を忘れた場合に起こり得る最悪の事態は何ですか。本当にそれ悪いのですか?

ここでは、どのような脆弱性について話しているのですか?

どのような状況で問題になるのでしょうか?

214

私はステファンの答えに懐疑的でしたが、悪用することは可能です$#

$ set `seq 101`

$ IFS=0

$ echo $#
1 1

または$ ?:

$ IFS=0

$ awk 'BEGIN {exit 101}'

$ echo $?
1 1

これらは人為的な例ですが、可能性は存在します。

11
Steven Penny