Hatena::ブログ(Diary)

kazuhoのメモ置き場

2013-03-23

なぜPHPでrequire("http://...")したらセキュリティホールなのに、Goならいいのか

go言語なんか import "http://github.com/mattn/xxx " だったりする。rubyもそういうの面白いかもしれない。require "http://github.com/mattn/xxx "みたいな。

ミスター 松茸ご飯さんのツイート: "go言語なんか import "http://t.co/9qiwho7OMZ" だったりする。rubyもそういうの面白いかもしれない。require "http://t.co/9qiwho7OMZ"みたいな。"

@mattn_jp それコンパイル型言語なら許されるけどスクリプト型だとセキュリティホールとされるものでは? (e.g. PHP)

Kazuho Okuさんのツイート: "@mattn_jp それコンパイル型言語なら許されるけどスクリプト型だとセキュリティホールとされるものでは? (e.g. PHP)"

というやり取りについて、補足します。

まず、前提となる要請について。

  • インタプリタ型言語においては、実行時にどのようなコードが動くか(requireが行われることにより)確定される
    • つまり、リモートコードを取得して実行する場合は、そのコードが不変であるか、あるいは、その管理者が発行したものであることを検証できる必要がある*2

以上の要請に基づいて、インタプリタ型言語で URL を require する是非について考える。

  • httpは経路上で改ざんされる可能性があるので公理を満たせない
  • httpsは経路上で改ざんされる可能性はない
    • だが、ドメインは人(個人あるいは組織)と等価ではなく、転売あるいは失効するもの*3
    • したがって、httpsの場合も前提における「許可の単位」に関する要求を満たせない

よって、インタプリタ型言語にhttpあるいはhttpsのURLを指定してrequireする機能がある(使われる)とすれば、それは脆弱性である*4

という結論に至るというのが僕の理解です。

githubをrequire(import)するソースとして使えるかという問題については、githubが倒産せずgithub.comが未来永劫githubの所有物でありつづけるという点に加え、github.com/fooが他のユーザーのものとならない、という要求を満たせるのか、という点も検討する必要があると思います。

一方で、上記要請を満たせるような方式であれば、インタプリタ型言語において動的にコードをダウンロードして実行する機構を設けても構わないと僕は考えますし、実際そうすることにメリットも想定できる(たとえば、バグの修正されたライブラリを自動的にダウンロードして実行してくれる等)と思います。

*1:2013/03/24加筆。ありがとうございます → http://twitter.com/umitanuki/status/315503956358987776

*2:コード証明書

*3:コード証明書とサーバ証明書の違いとは何か、ということ

*4ローカルアドレスを指定してる場合等の議論は省きます

通りすがりのプログラマ通りすがりのプログラマ 2013/03/24 22:42 ブラウザ上のJavaScriptで多用されているJSONPなどは、上記で言及されている「セキュリティホール」に該当するものだと思います。こればっかりは、妥当性、安全性は設計者に委ねられているとしか言えないんじゃないですかね。

kazuhookukazuhooku 2013/03/25 16:45 コメントありがとうございます。

通常のプログラミング言語では、配布されたプログラムがその後任意の時点でユーザーによって実行されます。
それに対し、ウェブブラウザ上で動作するJavaScriptの場合は、配布と実行のタイミングが同時なので、JSONP等の仕様が脆弱であるとは僕は考えません(httpの場合の経路上の安全性問題を除く)。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kazuhooku/20130323/1364039729