パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

JavaScriptをPNGに圧縮するテクニック」記事へのコメント

  • by Anonymous Coward on 2015年05月14日 10時03分 (#2814066)

    PNG偽装のスクリプト上げられるって
    中々に穴が開きそうな気がするんですが

    JavascriptでPNGからスクリプト抽出&実行できる環境に
    アップローダーの組み合わせみたいな

    アップロードディレクトリを
    public_htmlの外においている安全策も
    PHPには有効でしょうけど
    クライアントで実行されるスクリプトには無力なような

    デモサイトを自前で公開する方は
    よく考えて実装したほうがよさげ

    • > PNG偽装のスクリプト上げられるって
      > 中々に穴が開きそうな気がするんですが

      いや、もう穴自体はあいてますよ。
      ていうか、JavaScriptコードがエンコードされたファイルはあくまで画像ファイルですので、そこからJavaScriptコードの抽出処理を行わなければまったくの無害です。

      問題は、どうやってコード抽出処理を行うか。
      ストーリーのリンク先で説明されていますが、このJS圧縮PNGは、自己展開実行機能を持たせることも可能としています。その原理は、

      ・IEはContent-Typeを無視し、データの中身を見てファイル種別を判断する
      ・そのためPNGのヘッダ情報に(コメントデータとして)HTMLのタグっぽいものを埋め込んでおくと、HTMLデータと誤認する
      ・そこで、PNGのヘッダに、HTMLとして「画像変換されたコードを抽出実行するJavaScriptコード」を埋めこんでおくと、
      ・画像のURLを直接ブラウザで開くと、HTMLと解釈されて抽出コードが稼働し、画像化されたコードも実行される

      という流れ。この前半部分、最初に展開コードの実行をキックする流れ自体は、「JSをPNGに変換する部分」とは無関係な技です。

      つまり、今回のネタとは関係なく、「画像ファイルをアップロードできるアップローダ」で、「アップロードしたそのまま生の画像」を「(imgタグ経由ではなく)URL指定でブラウザから直接開くことができる」場合、
      余所のサイトから、 a href="画像URL"> といった画像直リンクを踏ませることで、
      スクリプトインジェクションが可能になる、ということです。

      インジェクションさせないためには、アップローダとして、
      ・画像アップローダでは、(拡張子偽装がされていないかどうか)実データの形式チェック
      は必須ですが、それに加えて、
      ・ファイルのブラウザ直接表示はさせない(Content-Dispositionなどのヘッダを付けて、ダウンロードさせる)
      ・画像は、アップロードしたファイルそのままではなく、不要なヘッダは捨てるフィルタ処理を行う
      ・REFERチェックなどで、画像直リンクは許さない
      などといった対策は必要でしょう。

      #一番のガンは、Content-Typeを無視するIEですが…

      親コメント
      • by Anonymous Coward

        Macで開発してるっぽいのに、なんでIEの話が出てくるん?

        • すみません、自己展開処理については説明を誤読してました。
          JavaScriptコードを埋め込んだPNGファイルを、拡張子 html にして(Content-Type: text/html にして)、ブラウザに送り込んでますね。
          これなら、IEに限らずブラウザ汎用で動作します。

          でも、元コメの「穴があくんじゃないのか」という疑問に対しては、
          画像として特殊なことはしてませんので、だからどうしたということは特になく、
          そもそも「HTMLデータを送りこめてる」時点で大穴、ということになります。

          親コメント
          • by Anonymous Coward

            気になるのは、これが PNG だからという理由でセキュリティソフトのチェックをすり抜けるかどうかです。

      • by Anonymous Coward

        >ストーリーのリンク先で説明されていますが
        IEの話なんてどこに書いてあるんです?

        • 確かに、リンク先の説明はブラウザ汎用っぽい文章になっており、IEの話なんて書かれてないんですが、実際のところそれが動作するのはIEだけです。
          それ以外のブラウザ(少なくともFirefoxとChromeとOperaとSafari)は、ちゃんとContent-Typeを見て動作しますので、Content-Typeを画像と偽装したHTMLデータがHTMLとしてレンダリングされることはありません。

          親コメント
          • by Anonymous Coward

            いや、リンク先のデモ画像もMacのブラウザ(絶対IEではない)だろ...
            IE憎しで頭おかしくなってないか?

    • by Anonymous Coward

      どうもPNGバイナリ中に任意文字列として埋めたHTMLとその中のスクリプトで起動するようなので、アップロードされたファイルをHTMLとして解釈されなければ大丈夫だと思います。

      ……そういえば、コンテントタイプ無視してHTMLっぽければHTMLとして解釈するWebブラウザも居ましたね。

計算機科学者とは、壊れていないものを修理する人々のことである

処理中...