GitHubで公開しているレポジトリの中で、いくつか cURLを使ってインストールスクリプトを取ってきてインストールする 方法を入れてる物がありますが、 昨日書いたreddit のところでも指摘されてる様に、場合によっては危険だったりします。
cURLを使ったインストール方法
上のレポジトリのスクリプトは
$ curl -fsSL https://raw.github.com/rcmdnk/sentaku/install/install.sh| sh
とすることでインストール出来ます。
cURLは基本的にURLで指定された場所の物を取ってくるコマンドですが、
それをそのままsh
に渡すことでinstall.sh
をローカルで実行することになります
1
。
上のインストールスクリプトでは/usr/local/etc
, bin
に上のレポジトリから
スクリプトをコピーして入れていれています。
追記
そう言えば、GitHubに関して言えば、少し前にraw
に関するディレクトリ構造が変わったりして
2、
この様なインストール方法を取ってる場合、少しやり方が代わったケースがあります。
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
と最後のinstall
がファイル名で、ここまで指定してますが、以前は
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go)"
とそのブランチ名まででした。
これは、以前は、ブランチ名(もしくは+ディレクトリ名)をraw
のURLで開くと、
(おそらく名前で)ソートされて一番最初にくるファイルが開かれてました。
上のHomebrewの場合はディレクトリにinstall
と言うファイルしか無いので
go
と言うブランチ名までだけでinstall
にリダイレクトされてました。
ただ、raw
の構造がちょこちょこ変わった後(?)、
この様なブランチ名やディレクトリ名だけでは404 not foundになるようになりました。
(上のgo
までのURLを開くとそうなります。)
なので、もし、なんらかそう言った方法でrawのファイルを人に教えてる場合は変更する必要がありますし、 指定されたものが見つからない場合は上の様なケースがあるかもしれません。
追記ここまで
cURLを使ったインストール方法の問題点
cURLを使った上の様なインストール方法を危険だ!と言った話を時々見ます。
スクリプトが悪意を持ったコマンドを4
簡単に実行できてしまうのがまず問題なんですが、
ただ、これだけだと他のpkg
(Mac)やexe
(Windows)でのインストール方法も
勿論同じ危険性があります。
しかし、cULRでの場合、スクリプトがURL先にあるので、これをブラウザで確認出来ます。
この、確認出来る、というのが逆に仇となります。
Ref:
上のページでは下のURLのスクリプトが紹介されています。
$ curl -s http://pipe-to-sh-poc.herokuapp.com/install.sh | sh
http://pipe-to-sh-poc.herokuapp.com/install.sh
このURLをブラウザで開くとYou may be OK...
とecho
するだけの特に問題の無いスクリプトがブラウザに表示されると思います。
ただ、これをターミナル等からcURLを使ってみると全く違う物が見れると思います。
(取り敢えずこのURLは特に悪さはしませんが、心配な場合はsh
の代わりにcat
して
取ってきた中身をただ見るだけにしてみてください。)
これは、サイト側がUser Agentを見て表示する内容を変える様なページを 動的に作ってる場合です。
この場合、多少疑わしいサイトだ、と思って調べる癖があって、 確認出来なければインストールしない、というような人でも、 逆に安心しておかしな物を入れてしまう可能性があります。 (勿論、何も考えずにインストールする人はそれ以前の問題ですが。。。)
上のスクリプトを説明してるページ ではこれを回避するために、vipe5 を挟んだり、vipeの様に途中でエディタで確認する作業を挟む cURLのラッパースクリプトを作ることが紹介されています。
もしくは、
$ curl -s http://pipe-to-sh-poc.herokuapp.com/install.sh | cat
の様に、取ってきたスクリプトを一度実行せずにcat
で確認したり
6
$ curl -sO http://pipe-to-sh-poc.herokuapp.com/install.sh
とO
オプションを使ってローカルに保存
7
して確認してからそのファイルを実行したりすれば安全です(内容を完全に理解出来れば)。
これらの確認を行えば普通のバイナリのインストーラーよりは確実に安全になります。
という訳で、cURLを使ったインストール方法は、 ちょっと疑わしいサイトを気にしてる、程度だと逆に安心させられて 悪意あるスクリプトを実行させられてしまう可能性があるので危険だ、というわけです。
ただし、GitHubにあるファイルなんかだと、この様な偽装をすることは無理(だと思う) なので使うのもありかな、とは思っています。
追記
reddit で指摘されたのですが、 こういった悪意のあるセキュリティー問題の他にも、 スクリプトを取ってくる時にコネクションの問題等でスクリプトを中途半端に取ってきてしまい、 例えば
rm -rf ~/tmp/tmpdir/
の様なコマンドがあった場合、これが
rm -rf ~/
と言う形で実行されてしまう可能性があります。
余程大きなスクリプトでない限りほとんど今のネットワーク状況で起こらないことかと思いますが、 可能性としてはある、と。
なので、やはり、この様なスクリプトでのインストールに関しては、 一手間かけて、一度ダウンロードして手元にスクリプトを持ってきて、 確認してからインストールするべき、と言うことで。
追記ここまで
勿論、どんなものでも偽装される可能性はあるので少しでも怪しそうなら 使うのは辞めるべきですが。
追記
そういえば丁度広告関連で変なインストーラーが示される、って話が話題になってますね。
Bing(Yahoo!プロモーション)だとChromeと検索すると正しいものが表示されずに 変なダウンロードページが表示されるとか
Adobeや他のソフトでも同じような事が起こったりとか 他の検索エンジンでも同じことが起こったりとか
広告でスパムが表示されると聞いたので検索エンジンで色んなワードを入れてみた - 戯れ言
アドセンスですら
Adsenseで表示される「Download」広告が恐ろしい4つの理由と、その対策。: http://tipstour.net/blog/6029
これらの場合には、URL見てある程度怪しいかどうか見るしか無いわけで、 余り有名でないソフトだと判断仕様がない場合も。 まあ、そんな場合にはそもそも確認出来るまで使うな、ということですが。
それに比べれば、スクリプトさえ落として来てやること理解出来て、 単純な作業なら安心して入れられるcurlの方法はまだ、安全かな、と。 (まあ、そもそもインストールする対象がぜんぜん違うものでしょうし、 コンパイルしたり色々複雑な作業を行う様な巨大なスクリプトだと ぱっと見では判り辛いですが。。。)
追記ここまで
-
ここで使ってるオプションは
-f, --fail: サーバーエラーが起こった時に何も出力しないで終了する。 -s, --silent: silentモード。進行状況などの出力をしない。 -S: --show-error: silentモードと同時に使用するとエラーについてだけ表示する。 -L: --location: ページがリダイレクトされてる場合、リダイレクト先まで取りに行く。 (デフォルトはリダイレクトされてるとリダイレクト先は見に行かない。)
shでは無いですがrubyのスクリプトを直接実行 ↩
rm -rf ~/
してみたり… ↩-
vipeはmoreutils というDebianのパッケージに入っているコマンドで、 パイプとして挟むと入力をエディタで編集して出力として渡す事が出来ます。 Homebrewなんかで探すときは
vipe
ではなくmoreutils
で検索すると出てくるので、 このパッケージごと入れます。 ↩ -
One way “curl pipe sh” install scripts can be dangerous [proof concept] ↩
もしくは
-o <file>
でファイル名を指定して保存とか、wgetで取ってきたり ↩