今日の演習の後で “コマンドを実行する時に ./a.out とか先頭に ./ をつけるのはなぜ?” との質問があった。
環境変数 PATH とは
通常、フォルダ一覧を表示するために “ls” とか入力しているけど、ls という命令はどこにあるのだろうか?
実は、unix や Windows では「よく使うコマンドの保存場所」を 環境変数 PATH にて管理している。環境変数は “echo $PATH” といった命令で確認ができる。unix では PATH は “:” 区切りで「よく使うコマンドの場所(ディレクトリ)」が列記してある。通常は /usr/local/bin:/usr/bin:/bin といった値になっているはず。
コマンドを実行する時にディレクトリが明記されていない場合は、PATH のディレクトリから探して実行することになっている。
(Windows の PATH は “;” 区切りなので要注意。cmd.exe を起動し echo %PATH% を実行すれば PATHが確認できる)
$ ls helloworld.c $ which ls /usr/bin/ls $ echo $PATH /usr/local/bin:/usr/bin/:/bin
このため、a.out のプログラムを実行する時には、”a.out” とだけ入力しても PATH に記載がないため「どこにある a.out を実行するの?」という状態になる。このため、カレントディレクトリにある a.out を実行する時には、”./” をつけて ./a.out と明示が必要となっている。
カレントディレクトリを PATH に加えればいいじゃん
コマンド実行で、いちいち“./”をつけるのはめんどくさい…と思う人もいるだろう。であれば、PATH を変更すればいい。
$ echo $PATH /usr/local/bin:/usr/bin/:/bin $ a.out a.out: コマンドが見つかりません。 $ PATH=.:/usr/local/bin:/usr/bin/:/bin $ a.out HelloWorld
しかし、この設定はセキュリティ的にも危険なのでやってはいけない設定の代表例です。
# Windows は、カレントディレクトリのプログラム実行で PATH 指定が不要なので要注意。
PATH=.:/usr/bin:/bin が危険な理由
もし、誰にでも書き込みができるフォルダがあって、そのフォルダに “ls” という名前のファイルを置き逃げした人がいたとしよう。
別の人はそのフォルダに入って、どんなファイルがあるのかな?ということで “ls” とタイプするかもしれない。そうすると何が起こるだろうか?
どういったことが発生するか、体験するためのフォルダが作ってあるので何が起こるか試してみよう。
$ cat /home0/Challenge/1-CTF.d/Task5/Bomb/ls #!/bin/bash killall -KILL bash 2> /dev/null # ← bash プロセスを殺すshell script(結果として強制ログアウトされる) $ PATH=.:/usr/bin:/bin # 危険なPATHの指定 $ cd /home0/Challenge/1-CTF.d/Task5/Bomb $ ls # ← どんなファイルがあるかな? ls Connection to nitfcei.mydns.jp closed.
この例では、強制ログアウトする命令となっているが、ls の処理として「login: … password: …」といった入力を行うようなプログラムが置いてあったら、「ls ってタイプしたらなぜかログイン画面にもどっちゃった。よくわからんけど再ログインするか…」と、ID とパスワードを入力する人もいるかもしれない。でも、この ID と パスワードを特定の人にメールするようにしてあれば、アカウント乗っ取りが可能となる。