カテゴリー: Development

  • PHP 5.2.1リリース

    情報としては古くなっていますが、念のため書きます。PHP 5.2.1がリリースされています。

    JP-CERTのアドバイザリ(JPCERT/CC REPORT 2007-02-07)にMODxのXSSが記載されていましたがこっちの方が重要性は高いと思われます。次のアドバイザリでは記載されるかもしれませんが、例によってPHP4は置き去りにされているので、記載されない可能性も高いと思います。私が編集者だったらどうするかかなり迷います。
    # MODxはコードをチラッとみただけで試すのを諦めたのですが
    # いろいろあるようですね。

    時間ができたらCode Blogの方にいろいろ書いてみたいと思っています。
    # いつできるか?が問題だったり….

  • SHA1でハッシュ化したパスワードは危険になった

    パスワードを平文で保存するのは論外で、MD5やSHA1でハッシュ化するのは当たり前です。しかし、SHA1を2000倍早くクラックする方法などが発見され「SHA1は脆弱だ」(ちなみにMD5はもっと危険)とされてからしばらく経ちます。アメリカ政府や大手企業はSHA1は使わない、としています。

    Slashdot.orgにまた載っているので更に高速化できた、ということか?

    参考:

    (さらに…)

  • Ultramonky L7 0.5.0リリース

    最近時々Users-MLにメールが流れています。Ultramonky L7(L7:Layer7スイッチ、HTTPプロトコル・Webアプリケーションレベルでの負荷分散機能)はがんばってもらいたいプロジェクトなので転載します。

    ultramonkey-l7-usersの皆様へ

    こんにちは。
    渡丸と申します。

    UltraMonkey-L7のSNMP対応版(Ver.0.5.0
    )リリースの
    公開につきまして、以下の通りお知らせします。
    (先ほどSourceForge.jpのUM-L7ニュース欄にも掲載しました。
    http://sourceforge.jp/forum/forum.php?forum_id=10716 )

    追加のプロトコルモジュールとして、以下のモジュールを追加した
    – l7vs-0.5.0-0
    – l7directord-0.5.0-0
    を作成しました。

    cpassive … Cookieパーシステンスpassiveモジュール
            振分先サーバにてcookie情報を付与することで
            セッション管理するモジュール
    crewrite … Cookieパーシステンスrewriteモジュール
            振分先サーバにて空のcookieを付与し、
            UltraMonkey-L7でcookie情報を変更することで
            セッション管理するモジュール
    cinsert  … Cookieパーシステンスinsertモジュール
            UltraMonkey-L7でcookie情報を付与することで
            セッション管理するモジュール
    chash   … Cookieパーシステンスhashモジュール
            振分先サーバにてcookie情報を付与し、
            UltraMonkey-L7でcookie情報の一部を管理することで
            セッション管理するモジュール
    urla   … URLパーシステンスモジュール
            HTTPレスポンスのボディ部のURL情報より
            セッション管理するモジュール

    また、追加機能として、以下の機能を追加しました。

    閾値による振分回避機能 … 設定している閾値を超えた場合、
                  他のサーバ(Sorryサーバ)へ振り分ける機能

    レプリケーション機能  … セッション情報を冗長化しているサーバと
                  同期をとる機能

    ドキュメント類は、後日修正して、ご連絡させていただきます。
    ご要望、コメント等ございましたら、ご連絡願います。

    _______________________________________________
    Ultramonkey-l7-users mailing list
    Ultramonkey-l7-users@lists.sourceforge.jp
    http://lists.sourceforge.jp/mailman/listinfo/ultramonkey-l7-users

  • SANS TOP20

    SANS TOP20が更新されています。

    Cross Platformの一位が「Web Applications」になっています。PHP以外のWebアプリにもセキュリティ上の問題が数多くあることに気が付いたと言うことでしょう。といっても解説はPHPが対象となっています。HTTP Response Splittingは最近のPHPでは不可能になっていますが記載されています。(header関数でCR,LFは送信できないよう仕様変更されている。最近ではPythonで作られているtracにHTTP Response Splitting脆弱性が見付かっている)

    PHP以外のアプリでも問題が多い事を示している統計情報もあります。例えば、これなど
    http://internet.watch.impress.co.jp/cda/news/2006/07/24/12759.html
    対象はJavaのWebアプリが多いと聞いています。

    XSSと異なり、SQLインジェクションなどは100%防げるにも関わらずこういった状況のようです…

  • Selenium: オープンソースのWebアプリテストツール

    結構便利そう。

    ホーム:
    http://www.openqa.org/selenium-core/

    デモ:
    http://www.openqa.org/selenium-core/demos.html

    ダウンロード:
    http://www.openqa.org/selenium-core/download.action

  • フォームの2重送信はセキュリティ問題か?

    備考:前のエントリのコメントに対してこのエントリを作成しました。

    セキュリティ対策の3大要素の一つとしてデータの整合性(Integrity)があります。3要素は私が勝手に決めたことではなくISO規格でも決まっています。

    個別のアプリでの解釈の問題になりますが、データの整合性に重複送信が含まれない、と考えるのであればコメントされている通り「発想が変」と言う考え方になるかもしれません。重要なデータでなければ(例えばブログへのコメントなど)安全性とは無関係といってもあまり差し支えないです。しかし、注文や送金などのデータでは致命的です。

    # 認証システムが無いサイト(必要ないサイト)
    # に「認証システムが無い」からといって「セキュリ
    # ティ問題だ」と騒ぐ必要がないのと同じでデータ整
    # 合性が必要ないサイトではセキュリティ問題になり
    # ません。だからと言ってデータ整合性の問題が
    # セキュリティ問題でなくなる訳ではありません。

    従ってデータの整合性が必要でないサイトやアクセシビリティを気にしないサイトであればREFERERでCSRF対策したサイトでも、2重送信対策をしていないサイトでも問題ないといえるでしょう。データの整合性がセキュリティ問題でないサイトも多くありますが一般的にはセキュリティ問題といっても差し支えないと考えています。(認証の問題がセキュリティ問題であると同じように、データの整合性もセキュリティ問題ということです)

    # REFERERを送ってこないクライアントからは
    # 接続を受け付けなければアクセシビリティ
    # の問題になります。

    安全性が低いサイト、アクセシビリティが低いサイトを作ることは自由です。しかし、お勧めできるサイトでないと考えています。完全なCSRF対策(と2重送信対策)を施したサイト作っても手間はほとんど変わりません。これらの理由からREFERERを利用したCSRF対策、ハッシュ値等を利用した2重送信対策は不完全・不適切な対策であると考えています。

  • refererでCSRF(XSRF)対策…

    フォームにランダムで一意なIDを割り当てる方式も十分簡単だと思いますがREFERERでCSRF対策を行っているサイトが結構あるようですね…

    FlashでREFERERが書き換えられる問題は別次元の問題だとしても、REFERER自体ブラウザが送信するデータであるため元々信頼できるデータでは無いです。随分前からクライアントレベルのセキュリティ対策ソフトウェアの中にはREFERERヘッダを削除する物もあります… 社内サーバから外部リンクをクリックした場合に社内サーバのURLが外部に洩れないようにREFERERヘッダを削除するプロキシもあります…

    一般的な環境からなら使えるから(ある程度安全)といってセキュリティ対策にREFERERを使用するのは良くない考え方です。

    ところでREFEERERでCSRF対策を行っているサイトは同じフォームの重複送信対策はされているのでしょうか?送信されたデータのハッシュを取って同じだったら重複とみなすとか?(この手のサイトは「2回以上送信ボタンを押さないでください」と設計ミスが明記されていることが多いです…書いてないサイトも多いと思います)

  • httpOnlyをFirefoxで

    PHP 5.2.0のsetcookie/setrawcookie関数からhttpOnly属性をクッキーにつける事ができるようになりました。httpOnly属性はMicrosoftが独自に拡張した仕様で、JavaScriptからクッキーの値を使用できなくする機能です。httpsでのみクッキーを送信するsecure属性に似ています。

    Microsoftの独自拡張なのでIEでは利用できましたがFirefoxでは利用できません。しかし、アドオンを使用することでhttpOnly属性をFirefoxでも利用できるようです。

    httpOnly
    by Stefan Esser

    Adds httpOnly cookie support to Firefox by encrypting cookies marked as httpOnly on the browser side, so that JavaScript cannot read them.

    Hardened PHP ProjectのSfefanさんが作者です。

    XSSで自分のセッションを盗まれるリスクが低減できるのでお勧めのアドオンだと思います。

  • 新しいWiki – QEDWiki

    リンクをクリックするとデモが見れます。久しぶりにZendFrameworkのホームページを見てこのデモがある事に気が付きました。

    IBMの方がZendFrameworkを利用して作っているらしいです。AJAXはもちろんですが、Wikiコマンドと言うシンプルな言語でいろいろ拡張できるようになっている様です。ドラッグアンドドロップで設定するGoogleマップと天気予報の連携のデモがあります。UIのほとんどはDojoを使っているのだと思われます。(ソースか実物を見ないと分かりませんが)

    確かに便利そうにも見えますがWikiコマンドには括弧が多すぎな気もします。Lisp好きな方がデザインしたのかも知れませんね。

  • Zend FrameworkのZend_Db

    このブログでZend Frameworkの事はほとんど書いていませんが、セキュリティ関係のところを少しだけ書きます。

    Zend Frameworkはまだまだ作りかけ、と開発元が言っているだけあって、セキュリティに関係する部分も作りかけだったりします。

    例えば、mysqliアダプタは適切にエスケープ処理されていますが、Oracleアダプタのエスケープ処理は全く行われていません。DB2のアダプタの場合、”でくくられるべき所がくくられていなかったりします。

    Zend Frameworkとは関係ありませんが、PostgreSQLのPDOドライバは出来が悪いので事実上PostgreSQLでZend_Dbは使えません。
    # 一見使えるように見えますがメモリ管理に問題がある
    # らしく、はまる可能性があります。

    PHPカンファレンスで「Zend Frameworkを使っている方?」と聞かれて、手を上げたのは私の他数名だったので大丈夫とは思いますが、実際のシステムに使うにはコードをよく読んでから使わないと思わない落とし穴にはまる事になります。

    秋の1.0リリースかリリース候補では修正されていると思いますが、今のところこんな感じです。

  • Dojo Javascript Toolkit

    IBMが更にDojoを支援するらしいです。

    Dojo Toolkit enabling internationalization of applications and making them fully accessible to persons with disabilities through a variety of assistive technologies,

    Ajaxを使うとアクセシビリティが問題になりますが、アクセシビリティも考慮すると言うことらしいです。デモはなかなか良くできています。この近いうちにこのツールキットを使ってなにか作ってみよう。

  • 遅ればせながらXAMPPをインストールしてみた

    随分前からXAMPP(ザンプ、と読むらしい。間違っていたら教えてください。)は知っていたのですが使ったことがありませんでした。基本的な開発環境はLinux、ターゲットもLinuxなので特に必要性が無かったからです。最近は時間や場所の都合からもWindows環境でもある程度の開発環境を維持する必要があったため、XAMPPを入れてみました。インストールするにあたってApache, PHP, MySQLは最初にアンインストールしておきました。

    XAMPPはApache、MySQL、PHP(最後のPは何? PEARがインストールされるのPEARのP?、PerlもあるのでPerl? ドイツ語のWikipediaによるとPerlのPらしい)をまとめてセットアップする仕組みです。パッケージを集めて簡単に使えるようしているLinuxのディストリビューションのようなイメージのパッケージです。

    XAMPP自体は

    – Windows
    – Mac OSX
    – Linux
    – Solaris

    に対応していて、以下のパッケージが含まれています。

    – Apache (DAV,SSLも)
    – MySQL
    – PHP(PHP4とPHP5、全てのモジュール)+ PEAR
    – FileZilla(FTPサーバとクライアント)
    – Mercury(メールサーバ、SMTP、POP、IMAP)

    をまとめてインストールしてくれます。全てのパッケージをC:\Program Files\xampp以下のディレクトリにインストールします。メールサーバであるMercuryを理解しないで動作させるとSPAMメールの踏み台にされるのでデフォルトでは有効に設定されないようです。普通はインストールはしても動作はさせない方が良いでしょう。

    各パッケージは基本的に最新の安定版が利用されているようです。Apacheの最新安定版は2.2系列なのでApache 2.2がインストールされます。

    PHPのサンプルスクリプトの他にphpMyAdmin、Webalizerもインストールされデフォルトのページからアクセスできるようになっています。

    PHP4とPHP5はスイッチして使えるようになっていてこれは便利です。MomongaのPHPもスイッチできるようにしてしまおうかな、と思ってしまいました。

    インストールしてみた感想は「超簡単」です。何も知らなくても直ぐ使える最新環境がインストールできます。ネットで検索した限りでは「バージョンアップが速過ぎてついていけない」と言う声もありますが、基本的には開発開始時点での最新版を使う方が良いのでバージョンアップが速いのはデメリットと言うよりメリットだと思います。基本的にデフォルトでインストールすれば危ないサービス(メールサーバなど)も起動する事はありません。(Apache+PHPだけで「十分危ない」とも言えますが…. Apache、PHPをインストールする事が「危ない」という意味ではなく「Webサーバ+サーバサイドプログラミング全般が危ない」と言う意味です。念のため)

    一つだけ気になったのはインストール直後にアクセスした http://localhost の言語がドイツ語になっていた事です。ドイツ語は分からないのでソースをみてlang.tmpに”de”が指定されていたのを”en”に変えて英語表示に出来ました。ファイルのアクセス権限の問題で書き換えが出来なかっただけと思いますが、面倒なのであまり調べず直接書き換えてしまいました。インストーラは日本語でしたがWebページには日本語訳は無いようです。

    あとApacheに慣れていない方がはまり易い(?)のはセキュリティ対策の為にApacheの設定が厳しく設定されている事かもしれません。

    C:\Program Files\xampp\apache\conf\extra\httpd-vhosts.conf

    にVirtual Hostの設定を書くようになっている(私は元々LinuxのApacheの設定でもvhosts.confを作って分けているので好感)ですが、Directory設定を使って制限を変えておかないとアクセス自体も拒否されます。XAMPPのデフォルト状態では+Indexes等が指定できなくて不便です。私はhttp-vhosts.confを以下の様に設定しました。開発&テスト用に便利な設定であってセキュアな設定ではありません。念のため。

    NameVirtualHost *:80

    <VirtualHost *:80>
    ServerAdmin webmaster@xampp
    DocumentRoot “C:/Program Files/xampp/htdocs
    ServerName localhost
    ErrorLog logs/xampp-error_log
    CustomLog logs/xampp-access_log common
    </VirtualHost>

    < Directory “C:/www”>
    AllowOverride All
    Order allow,deny
    Allow from all

    Options +Indexes
    </Directory>

    <VirtualHost *:80>
    ServerAdmin webmaster@dev
    DocumentRoot “C:/www”
    ServerName dev
    ErrorLog logs/dev-error_log
    CustomLog logs/dev-access_log common
    </VirtualHost>

    PostgreSQLもWindows版が出来てかなり経つ事だしXAMPPに入れてほしいですね。

  • PHP 4.4.3RC1

    PHP 4.4.3RC1がテスト中です。
    PHP 4を使われている方、テストをお勧めします。

  • 解答:まちがった自動ログイン処理

    問題:まちがった自動ログイン処理の解答です。このブログエントリは最近作られたアプリケーションでは「問題」にしたような実装は行われていないはず、と期待していたのですがあっさり期待を破られたのでブログに書きました。このブログの方が詳しく書いていますけが「Webアプリセキュリティ対策入門」にも正しい自動ログイン処理を書いています。

    参考:自動ログイン以外に2要素認証も重要です。「今すぐできる、Webサイトへの2要素認証導入」こちらもどうぞ。HMACを利用した安全なAPIキーの送受信も参考にどうぞ。

    (さらに…)

  • 問題:間違った自動ログイン処理

    問題:以下のコードはセキュリティ上大きな問題となる脆弱な処理が含まれています。セキュリティ上のベストプラクティス、他の自動ログインの実装方法と比較し、以下のコードの脆弱性を詳しく述べよ。

    if (serendipity_authenticate_author(
      $serendipity['POST']['user'], 
      $serendipity['POST']['pass'], false, $use_external)) {
      if (empty($serendipity['POST']['auto'])) {
        serendipity_deleteCookie('author_information');
        return false;
      } else {
        $package = serialize(
                   array('username' => 
                            $serendipity['POST']['user'],
                         'password' => 
                            $serendipity['POST']['pass']));
        serendipity_setCookie('author_information', 
                               base64_encode($package));
        return true;
      }
      // Now try login via COOKIE data
    }

    解答:次のブログエントリで解説します。(解説の必要は無いかもしれませんが)

    備考:実際のブログアプリケーションのコードの一部です。このブログ(b2evolution)のログインコードも問題がありますが上記コードよりはましです。

    追記:serendipity_setCookieがどのように定義されているかが分からないと正確に答えられないので張り付けます。このブログアプリケーションの開発元には適切な自動ログインの実装方法と共にレポートする予定です。

    /**
     * Set a Cookie via HTTP calls, and update $_COOKIE plus $serendipity['COOKIE'] array.
     *
     * @access public
     * @param   string      The name of the cookie variable
     * @param   string      The contents of the cookie variable
     * @return null
     */
    function serendipity_setCookie($name,$value) {
      global $serendipity;
    
      setcookie("serendipity[$name]", $value, 
                time()+60*60*24*30, 
                $serendipity['serendipityHTTPPath']);
      $_COOKIE[$name] = $value;
      $serendipity['COOKIE'][$name] = $value;
    }