
スクリプトを実行すると、シェルスクリプト(bashスクリプト)の$ 0パラメータを明示的に変更できますか?
次のスクリプトを考えてみましょう。
readonly SCRIPT_HELP="$(cat <<EOF
Usage: $(basename "$0") [-h]
EOF
)"
echo "${SCRIPT_HELP}"
$(basename...
いくつかのユーザー提供のコード(潜在的に有害である)で評価を実行するために、このbashスクリプトに引数0として他のものを渡すことはできますか?
通常、特定のシェルスクリプトでパラメータ0が適切に削除されないという事実を利用することは可能ですか?
答え1
$0
スクリプト呼び出し側が望むものは何でも構いません。これは、呼び出し元がどこにでもコピーまたはリンクできるスクリプトへのパスです。
ただし、スクリプトが呼び出し元よりも多くの権限で実行されない限り、それ自体は脆弱性ではありません。スクリプト実行ファイルに権限がない場合、呼び出し側は別のプログラムを実行できます。発信者自身に権限があり、他の発信者を転送するように説得できる場合$0
。
スクリプトが特権で実行される場合、状況は$0
特権の昇格に使用される方法によって異なります。 setuid 実行可能ファイルを指すシンボリックリンクを介して呼び出されると、スクリプトは任意である可能性があり$0
ます(ただし、ほとんどのシステムは setuid 実行可能ファイルを拒否します)。
この特別なケースでは、ほとんどの場合、セキュリティ関連の欠如にもかかわらず、スクリプトでランダムな.$0
二重引用符を使用する"$0"
と、値がそのまま使用されます(引用符がない場合は$0
ワイルドカードパターンのリストとして扱われます)。ただし、basename
コマンドが値をパラメータとして扱う場合、値がで始まるかどうかによって異なります-
。値がa -
(だけでなく-
)で始まる場合、これはオプションです。少なくともGNUの場合、basename
オプションではない引数は必須であるため、次から始まる単一の引数で呼び出すと-
エラーが発生します。しかし、これは他のコマンドの場合より大きな問題です。。で始まる値を含む任意の値を処理するには、引数の-
前に次のオプションがないことを示します。--
basename -- "$0"
答え2
$0
それが何であるかを決めるのは些細なことです。リンクを作成する:
$ cat foo.sh
#! /bin/bash
readonly SCRIPT_HELP="$(cat <<EOF
Usage: $(basename "$0") [-h]
EOF
)"
echo "${SCRIPT_HELP}"
$ ./foo.sh
Usage: foo.sh [-h]
EOF
$ ln -s foo.sh bar.sh
$ ./bar.sh
Usage: bar.sh [-h]
EOF
この特別なケースではありません。大きな利点を得るために悪用することはできないと思います。使用時に参照され、入れ子になった"$0"
コマンドSCRIPT_HELP
の置き換えとここで参照されますが、まだ参照されますが編集されませんeval
。
$ ln -s ./foo.sh '"; echo rm -rf ~; echo"'
$ ./\"\;\ echo\ rm\ -rf\ \~\;\ echo\"
Usage: "; echo rm -rf ~; echo" [-h]
EOF