POSIXにおけるShebangの解釈についてのシェルショッカーとの議論まとめ
POSIXでのShebangの解釈
シェルショッカーとの議論
POSIXでshell scriptって、そもそも#! の動作がきていされてなかった気が / “恐怖!シェルショッカーの POSIX原理主義シェルスクリプト” htn.to/BWG2wx
2016-03-22 05:47:18.@kazuho それは聞き捨てならんな。まず#!がファイル先頭に出てきた時の動作はexecveのman pubs.opengroup.org/onlinepubs/969… に、その後shに制御が渡されてからの動作はシェル文法の頁 pubs.opengroup.org/onlinepubs/969… に記述があるが。
2016-03-23 15:58:34.@shellshoccarjpn #!が先頭にある場合execveがshを呼ぶことは保証されるが、そのファイルを受け取ったshが#!をどう解釈するかは pubs.opengroup.org/onlinepubs/969… にあるとおり unspecified なのでは? つまりサーバが爆発するかも
2016-03-23 16:08:28あー正確にいうと、#! がついてようがついてなかろうが実行可能形式じゃないファイルを execve した場合 sh に渡すことが POSIX 的には OK で、それを sh がどう解釈すべきかは規定されていない
2016-03-23 16:10:30つまりPOSIXは「ファイルが実行形式じゃなければsh scriptに決まってるだろ」というような処理系を許容していて、そういう処理系においてはsh以外を用いてスクリプトを書くことがないから #! に関する仕様は POSIX に含まれていない
2016-03-23 16:13:06#! について、例えば「○○のように処理すべき、あるいはコメントとして無視しろ」という規定があれば #! /bin/sh は POSIX においてポータブルだと言えるんだろうと思うんだけど
2016-03-23 16:16:22@kazuho これ、execlp()とexecvp()に限定されてるので、execve() とかじゃシェル呼び出せなくてもいいっぽいですね。UNIX v7 の頃からそうなってて、へーって感じ(昔どこかで見た気もするけど忘れてました)tuhs.org/cgi-bin/utree.…
2016-03-23 16:19:39.@kazuho 確かにそこのunspecifiedという単語には引っかかったのだ。だが「#!で呼び出したインタープリターの動作に依存するので結果はunspecifiedだ」と言いたいのだろうと我らは汲み取ったぞ。#!があった時のみ爆破してもよいなどと言いたかろうとは思えんからな
2016-03-23 16:33:06.@shellshoccarjpn #!がある場合に、その値に基づいてインタプリタを呼び出さなければならないなんて規定はありませんよ
2016-03-23 16:34:33.@kazuho ほほう、なかなか興味深いことを言うな。ならば@kazuhoよ、そのようにPOSIXの文章が曖昧に書かれていることについて、それはPOSIX文書の欠陥だと思うか?それとも意図的に爆発でも何でも自由にさせられる余地を残したと思うか?
2016-03-23 16:42:31@shellshoccarjpn このあたりが答えでは? twitter.com/AoiMoe/status/…
2016-03-23 16:44:07POSIX的には実行ファイル形式を規定してない以上、shebangみたいなマジックナンバーを記述できる余地がない
2016-03-23 16:41:17POSIX的には実行ファイル形式を規定してない以上、shebangみたいなマジックナンバーを記述できる余地がない
2016-03-23 16:41:17POSIX.1-2008 では execve で指定されたファイルが実行形式でない場合、sh に渡すか、あるいは #! の値を見てインタプリタを直接起動することが求められていると思う
2016-03-23 16:50:10.@kazuho なるほどな。確かに、a.outやらELFやらをPOSIX文書で探してみたが見つけられなかった。POSIXは実在の実装ありきで後から整備された規格ゆえ、実行ファイル形式への言及が抜けてしまったのかもしれんな。だがそれなら改訂を機に追記してもらいたいものだがな。
2016-03-23 17:01:37.@kazuho 我ら同様に侵略を目論むどこかの部隊の曹長のようだな。関係ないが、POSIXの興味深い話を聞かせてもらった礼に、一ついいことを教えてやる!このうがい薬はうまいらしいぞ。family.saraya.com/products/colol…
2016-03-23 17:17:05POSIXでのファイル実行時の動作
shebangがないシェルスクリプトをexecveに渡すとエラー返すので必要に応じて自分で/bin/shを蹴るというのが今のUNIX系OSの作法だが、こんなのもPOSIXには規定できる余地がない
2016-03-23 16:47:13@AoiMoe いや、それは "now required by POSIX.1-2008" かと。see pubs.opengroup.org/onlinepubs/969… の rationale
2016-03-23 16:49:03@AoiMoe いや本体にもあります。execのIn the cases where the other members of the exec family of functions would fail から始まる文
2016-03-23 17:04:53@kazuho ああそうか、PATH見る系の奴はそういう風に規定されてないと現実の実装との齟齬が出るので、わざわざそう書いてあるんですね。
2016-03-23 17:13:54