1
#!/bin/bash
ipaddr=${1}
rdlnk=$(readlink /proc/$$/fd/0)
user=""
passwd=""
function get_input() {
if grep -Eq "^pipe:|deleted" <<< "${rdlnk}" || [[ -p "${rdlnk}" ]]; then
while IFS= read -r piped_input || break; do
[[ -z "${ipaddr}" ]] && ipaddr="${piped_input}" && continue
[[ -z "${user}" ]] && user="${piped_input}" && continue
[[ -z "${passwd}" ]] && passwd="${piped_input}" && continue
done
fi
echo "Got that IP address you gave me to work on: ${ipaddr}"
[[ -n "${user}" ]] && echo "[... and that user: ${user}]"
[[ -n "${user}" ]] && echo "[... and that users password: ${passwd}]"
}
get_input
exit 0
を悪用通常、それは大丈夫です:バッシュ子/親パイプの継承が
$> process_ip.bsh 71.123.123.3
Got that IP address you gave me to work on: 71.123.123.3
しかし、パイプで連結されたループに親を入れて、気をつけてください:
$ echo -en "71.123.123.3\nroot\ntoor\n" | while read a; do echo "Parent loop, processing: ${a}"; grep -q '^[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' <<< "${a}" && ./process_ip.bsh "$a"; done
Parent loop, processing: 71.123.123.3
Got that IP address you gave me to work on: 71.123.123.3
[... and that user: root]
[... and that users password: toor]
痛いです。親はそのパイプからその子にIPアドレスを提供したがっていました。子プロセスへのフォーク時に、親プロセスが機密データを持つオープンパイプを維持しなければならないと仮定します。どのようにこれを防ぐことができますか?
もちろん、正解は決してクリアテキストのパスワードを使用することはありませんが、親と子が同じユーザーIDで実行されているとすれば、問題は何ですか?ユーザーは、root以外のユーザーIDで実行されているプロセスにのみアクセスできます。プロセスへのアクセス権を得ることができれば、これだけでなくクリアテキストデータを見るいくつかの方法があります。 – cdarke
しかし、親は子を起動します。親プロセスが未知の子プログラムを起動するのはなぜですか?ところで、多くのUNIX系オペレーティングシステムではシンボリックリンクが利用できません。これはLinux上でのみ動作すると思います。たとえば、OS Xには/ procがありません。 – cdarke
'strace -p $ PPID'や' gdb bash $ PPID'のようなものを起動すると、もっともっと見ることができます。 – cdarke