2016-08-25 4 views
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アドレスを提供したがっていました。子プロセスへのフォーク時に、親プロセスが機密データを持つオープンパイプを維持しなければならないと仮定します。どのようにこれを防ぐことができますか?

+0

もちろん、正解は決してクリアテキストのパスワードを使用することはありませんが、親と子が同じユーザーIDで実行されているとすれば、問題は何ですか?ユーザーは、root以外のユーザーIDで実行されているプロセスにのみアクセスできます。プロセスへのアクセス権を得ることができれば、これだけでなくクリアテキストデータを見るいくつかの方法があります。 – cdarke

+0

しかし、親は子を起動します。親プロセスが未知の子プログラムを起動するのはなぜですか?ところで、多くのUNIX系オペレーティングシステムではシンボリックリンクが利用できません。これはLinux上でのみ動作すると思います。たとえば、OS Xには/ procがありません。 – cdarke

+0

'strace -p $ PPID'や' gdb bash $ PPID'のようなものを起動すると、もっともっと見ることができます。 – cdarke

答えて

0

​​は、他のプロセスと同様に、親から標準入力を継承します。この行

rdlnk=$(readlink /proc/$$/fd/0) 

あなたはそう思わないと思います。スクリプトは親からの標準入力を継承しているため、親が標準入力に使用しているファイルの名前のみが含まれています。 (.process_ip.bshは、単に別のプロセスではなく、親によって起動サブシェルであるため、$$は、現在のシェルのプロセスIDです。)

あなたは​​への入力をリダイレクトした場合、あなたはそれが受け取るものの完全に制御しています。

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" < /dev/null 
done <<EOF 
71.123.123.3 
root 
toor 
EOF 
関連する問題