カテゴリー: Development

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%防げるにも関わらずこういった状況のようです…

フォームの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に入れてほしいですね。

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

問題:まちがった自動ログイン処理の解答です。このブログエントリは最近作られたアプリケーションでは「問題」にしたような実装は行われていないはず、と期待していたのですがあっさり期待を破られたのでブログに書きました。このブログの方が詳しく書いていますけが「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;
}

PHP 5.1.3リリース

体調を崩している間にPHP 5.1.3がリリースされRC2以降に紛れ込んだ$_POST要素が配列である場合のバグ、FCGIのバグ等の為、PHP 5.1.4が直ぐにリリースされていますが、PHP 5.1.2から直った脆弱性は次の通りです。一部フライングで公開されていた物もあります。
# CVSのコミットログなどをチェックしている人にはもっと前から公開
# されている、ともいえますが。

The security issues resolved include the following:

* Disallow certain characters in session names.
* Fixed a buffer overflow inside the wordwrap() function.
* Prevent jumps to parent directory via the 2nd parameter of the tempnam() function.
* Enforce safe_mode for the source parameter of the copy() function.
* Fixed cross-site scripting inside the phpinfo() function.
* Fixed offset/length parameter validation inside the substr_compare() function.
* Fixed a heap corruption inside the session extension.
* Fixed a bug that would allow variable to survive unset().

議論の余地はあると思いますが、厳格にセキュリティ関係の修正として含めても良いかも知れない物は次の修正があります。

* Fixed tiger hash algorithm generating wrong results on big endian platforms.
* Make is_*() function account of open_basedir restrictions.
* Fixed a number of crashes in the DOM and PDO extensions.
* Make memory_limit work in Win32 systems.
* Fixed a deadlock in the sqlite extension caused by the sqlite_fetch_column_types() function.
* Fixed memory leaks in the realpath() cache.