rcmdnk's blog
Last update

20140224_curl_200_200

GitHubで公開しているレポジトリの中で、いくつか cURLを使ってインストールスクリプトを取ってきてインストールする 方法を入れてる物がありますが、 昨日書いたreddit のところでも指摘されてる様に、場合によっては危険だったりします。

Sponsored Links

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、 この様なインストール方法を取ってる場合、少しやり方が代わったケースがあります。

Homebrewなんかがそれに当りますが、今は3

$ 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:

Protect yourself from the hidden dangers of curl <url> | sh

上のページでは下の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を見て表示する内容を変える様なページを 動的に作ってる場合です。

djm/pipe-to-sh-poc

この場合、多少疑わしいサイトだ、と思って調べる癖があって、 確認出来なければインストールしない、というような人でも、 逆に安心しておかしな物を入れてしまう可能性があります。 (勿論、何も考えずにインストールする人はそれ以前の問題ですが。。。)

上のスクリプトを説明してるページ ではこれを回避するために、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と検索すると正しいものが表示されずに 変なダウンロードページが表示されるとか

なぜhao123に汚染されるのか - ex

Adobeや他のソフトでも同じような事が起こったりとか 他の検索エンジンでも同じことが起こったりとか

広告でスパムが表示されると聞いたので検索エンジンで色んなワードを入れてみた - 戯れ言

アドセンスですら

Adsenseで表示される「Download」広告が恐ろしい4つの理由と、その対策。

これらの場合には、URL見てある程度怪しいかどうか見るしか無いわけで、 余り有名でないソフトだと判断仕様がない場合も。 まあ、そんな場合にはそもそも確認出来るまで使うな、ということですが。

それに比べれば、スクリプトさえ落として来てやること理解出来て、 単純な作業なら安心して入れられるcurlの方法はまだ、安全かな、と。 (まあ、そもそもインストールする対象がぜんぜん違うものでしょうし、 コンパイルしたり色々複雑な作業を行う様な巨大なスクリプトだと ぱっと見では判り辛いですが。。。)

追記ここまで

Sponsored Links
  1. ここで使ってるオプションは

    -f, --fail:
        サーバーエラーが起こった時に何も出力しないで終了する。
    -s, --silent:
        silentモード。進行状況などの出力をしない。
    -S: --show-error:
        silentモードと同時に使用するとエラーについてだけ表示する。
    -L: --location:
        ページがリダイレクトされてる場合、リダイレクト先まで取りに行く。
        (デフォルトはリダイレクトされてるとリダイレクト先は見に行かない。)
    

  2. GistのURLが変わった

  3. shでは無いですがrubyのスクリプトを直接実行

  4. rm -rf ~/してみたり…

  5. vipeはmoreutils というDebianのパッケージに入っているコマンドで、 パイプとして挟むと入力をエディタで編集して出力として渡す事が出来ます。 Homebrewなんかで探すときはvipeではなくmoreutilsで検索すると出てくるので、 このパッケージごと入れます。

  6. One way “curl pipe sh” install scripts can be dangerous [proof concept]

  7. もしくは-o <file>でファイル名を指定して保存とか、wgetで取ってきたり

Sponsored Links

« redditにスクリプトを晒してみた はてなブックマークされてる不思議なページ »