カテゴリー: Security

セッションフィクセイションはアダプション脆弱性修正で防御可能

古いエントリを編集すると議論の流れが分かりづらくなるので、前のエントリをベースに新しいエントリを作って議論します。このエントリではアダプション脆弱性を修正すると、どのようなフィクセイション(ハイジャック)から防御されるのか解説します。安全なセッション管理には適切なユーザスクリプトが欠かせないので、全て防御できるわけではありませんが、有用性は理解頂けると思います。

 

セッションアダプションがなくてもセッションフィクセイション攻撃は可能

http://tumblr.tokumaru.org/post/37676352092/session-adoption-and-session-fixation

この議論は別々の異なる脆弱性を一緒にした議論で正しい議論とは言えません。セッションアダプション、セッションフィクセイション、セッションハイジャックとはどのような脆弱性なのか整理して議論する必要があります。議論を分り易くするため、これらの用語の定義は8年ほど前にPHPプロジェクトでこの問題が議論された時の定義を用います。

その上で、徳丸さんがツイッターで提示されたセッションフィクセイションの攻撃パターン(PDF)はアダプション脆弱性で攻撃できなくなることを解説します。論点を明確にする為、細かい部分の解説は省略しています。攻撃に必要な脆弱性は存在している事が前提です。ディフィニティブな解説では無いことを予めご理解下さい。

もっと読む

セッションアダプション脆弱性がないセッション管理が必要な理由

徳丸さんから「ブログ読みました。サンプルも動かしました。問題は分かるのですが、セッションアダプションがないPHPだと、何が改善されるのかが分かりません。教えて下さい 」とあったのでツイッターで返信するには少し長いのでこちらに書きます。まだ直していない脆弱性を詳しく解説するのはあまりよくないのですが、今なら影響を受けるアプリはほぼないと思うので構わないでしょう。

まず前提として、Webサーバと同様にJavascriptからもクッキーが設定できます。Javascriptインジェクションに脆弱なコードがサイトに1つでもあると、サイト上のセッションアダプション脆弱性をもつアプリへの攻撃が可能になります。この攻撃を緩和する対策もありますが、それはそれ、これはこれなので省略します。

セッションアダプションに脆弱なセッション管理機構で困る代表的なケースは以下の通りでしょう。

  1. ログイン時にsession_regenerate_idを呼んでない
  2. 自動ログインなど通常のセッション用以外でsession_regenerate_idを呼んでいない
  3. session_regenerate_idを呼んでいても、途中で保存している
  4. session_regenerate_idを呼んでいても、途中で実行パスが変えられる

もっと読む

PHPのセッションアダプション脆弱性は修正して当然の脆弱性

PHPのセッションアダプション脆弱性がどのように影響するのか、広く誤解されているようです。セキュリティ専門家でも正しく理解していないので、一部のPHP開発者が正しく理解しなかったのは仕方ないのかも知れません。

Webセキュリティの第一人者の一人である徳丸氏は「PHPのセッションアダプション脆弱性は脅威ではない」と書いていますが、いろいろ間違いです。私は2005年頃から現在まで様々な機会に問題であると何度も繰り返し説明しており、しばらくすれば間違いに自分で気付くのでは?と思っていたので特に反論していませんでした。しかし、まだ気づかれていないようなので、幾つかある攻撃パターンのうち解りやすい例を1つだけ紹介しておきます。

もっと読む

PROVE2の紹介動画

PROVE for PHPへ紹介動画を掲載しました。PROVEの動作・操作を3分ほどで見て頂けます。より高解像度で見れるようYouTubeにHD版もアップロードしています。

PROVE for PHPはPHPの内部動作を記録・比較し、新しいバージョンで意図通りに動作しているか確認できるテスト・ツールです。PHPプロジェクトがソースコード管理システムをGitへ移行してから、予定通り毎月新しいリリースが公開されてます。PHPを最新の状態に保つ事はセキュリティ維持の為に書かせませんが、運用中のシステムのバージョンアップは容易ではありません。PROVEはそういったバージョンアップを簡単にします。

使い方は色々あります。

  • PHPのバージョンアップ前後の動作確認
  • 再帰テスト為のリクエスト送信をWebアプリに送信
  • 実行内容を参照し問題の発生箇所を特定

PROVEはPHPの動作環境を記録した時と同じ状態にして、スクリプトを実行できます。この為、テストケースの作成はブラウザでアクセスするだけ、テストは記録したログを再生するだけで完了します。PHPのバグフィックスやセキュリティフィックスで動作が変わった場合、どこで動作が変わったのか簡単に分かります。リリースノートなどのみでは分からない動作変更も見つける事ができます。時間関数やファイル関数、データベース、ネットワークなど状態や外部リソースに依存する関数は実行をオーバーライドし、記録した時点の結果を返すことが出来ます。つまりmicrotime関数やsrand関数などに影響されずに、(PHPの動作が変わっていなければ)記録時点と同じ実行結果を得る事ができます。

PROVEのホームページで解説していない利用方法として、スマートフォンや携帯サイト開発での利用方法を紹介します。PROVEには「再帰テスト為のリクエスト送信をWebアプリに送信」する事ができます。スマートフォン、携帯サイトなどの場合、機種などの応じて異なるレスポンスを行う事が良くあります。PROVEの場合、PHPアプリにリクエストされた「リクエスト情報」がそのまま記録されます。これを再生することにより、繰り返しスマートフォンや携帯を使わずにこれらのデバイスを利用したテストを再現できます。

PROVEには前回記録した状態を再現・外部リソースに依存せずに動作する機能がありますが、この機能を利用しない状態でも利用できます。この場合、データベースやファイルなどの外部リソースをテストケース作成時と同じ状態にして実行し、PROVEによる再現機能を使わずにより広い範囲のPHP機能のテストを行う事も可能です。

プロキシやブラウザでWebアプリケーションの動作を記録するテストシステムと比べると、PHP内部の動作を全て記録するPROVEのテストは比較にならない程強力です。

PROVEの基本機能

  • ブラウザからのリクエストの記録
  • リクエストを処理した際のPHP動作の記録
    • 全てのリクエスト情報(POST、GET、COOKIEなど)
    • 出力(出力関数単位で習得可能)
    • 関数呼び出し
    • 関数戻り値
    • セッション情報
  • 記録したリクエストの再生
    • 記録した時点の状態を再現
    • 指定した関数のみ状態を再現
    • 記録時点の状態を再現せずに実行
  • 実行差分の参照
  • 記録したログの参照

新しいPROVE2のベータ版が公開中です。ご興味がある方は是非一度お試しください。

ホームページ

ベータ版ダウンロード

 

PROVE for PHP Version 1.1.0

PROVE for PHP Version 1.1.0を公開しました。特に重要な変更はログデータ構造の変更と各種オーバーライド機能の調整です。

今までext3/ext4ファイルシステムの場合、ディスク容量を使い切る前にパフォーマンスが低下してしまい大きなデータを保存できませんでした。データ構造を見直す事により大きなデータでも安定して動作するようになっています。

もっと読む

PHPのセッションアダプション脆弱性克服への道のり

PHP Advent Calender用のエントリです。

PHPのセッション管理は非常に簡単です。セッションをsession_start()で開始して$_SESSION配列を使うだけです。便利で簡単なセッションモジュールですがセッションアダプションに脆弱であるため、一般に言われてる「ログインする時にはsession_regenerate_id()を呼ぶ」コーディングではセッションアダプションに脆弱になってしまいます。

まずは危険性と対策を紹介します。 もっと読む

PROVE for PHP 1.0.3を公開

私の会社で開発・販売しているPROVE for PHPを更新し、PDOオブジェクトに対応したPROVE for PHP 1.0.3の配布を開始しました。PDOオブジェクトに対応したので幅広いアプリケーションで利用できます。PROVEは非商用の個人利用の場合、無償で利用できます。問題などございましたらツイッターやメールなどでフィードバックを頂けると助かります。

http://www.provephp.com/ja/download

PROVE for PHPとはPHPの動作を詳細に記録・比較し、PHPとPHPアプリのバージョンアップが安全に行えるか簡単にチェックできるツールです。開発中のリグレッションテストツールとして利用できます。

近日中にこのブログでもいろいろな使い方を紹介したいと思っています。

追記: RHEL5系(CentOS5など)で利用できるPHP53パッケージ用RPMのダウンロードも開始しました。

DOMベースXSSの検出ツール

久しぶりにブログを更新すると色々書きたくなるものですね。ということでまだこのブログでは紹介したことがないDOMベースXSSのオープンソースツール、DOMinatorを紹介します。最近の商用ツールも類似の機能をサポートしています。

http://code.google.com/p/dominator/

DOMベースXSS: JavascriptはDOMを利用してHTMLを動的に変更できます。この機能を利用するとブラウザ側のJavascriptで動的に変化するWebサイトを構築できます。HTMLなどを修正するとデータにユーザが入力が含まれているとプログラマが意図しないJavascriptが実行できます。

要はクライアントサイドのJavascriptインジェクション攻撃の事です。

Javascriptは非常に柔軟な言語で便利な反面、セキュリティチェックが非常に難しい言語でもあります。DOMinatorはJavascriptの柔軟性を上手く利用して、DOMベースのXSSを検出します。Javascriptの入出力を監視し、DOMベースXSSが可能である箇所を見つけ出します。百聞は一見に如かず。デモ動画を見ればDominatorを使ったDOMベースXSSチェックがどのように便利であるのか分かります。

http://www.youtube.com/watch?v=f_It469LUFM

(動画に音声はありません。説明はTEXTエディタに書いてあるのでHDにして最大画面にして見てください)

どうですか?ソースコードを読んで解析するより何倍、いえ何十倍も楽にDOMベースのXSSを検出できました。

簡単そうに見えますが、使いこなすには色々コツと知識が必要です。既に情報が古くなっていますが

http://code.google.com/p/domxsswiki/

http://code.google.com/p/domxsswiki/wiki/LocationSources

などを利用してJavascriptインジェクションが可能か調べると、サイトが脆弱であるか分かります。あまり使いこなし方が分からなくても有用なツールです。Javascriptで動的なサイトを構築している方、特にユーザがコントロールできる情報使いJavascriptでページを操作している方は一度DOMinatorを使ってみると良いでしょう。

ところで、PROVE for PHPのマイナーバージョンアップをしました。PDOなどの内部オブジェクトの対応はまだですが、Webコンソールを改善しました。(まだまだ改善が必要で、どんどん改善します)PROVEもDOMinatorに似ていると言えば似ていると言えます。PHPの内部動作を詳細に記録し、差分を取ることでPHPやアプリが正しく動作している事が確認できます。サイトにはVMwareイメージもあるので試してみてください。バグを見つけたら教えてください!

PROVE for PHP Ver 1.0

まだまだ完成度を高める必要がありますが、PHPのリグレッションテストツールのPROVE for PHPのダウンロードを開始しました。

http://www.provephp.com/

PHPのテストスイートの設定を忘れていてPDOオブジェクトのサポートできてない事に直前に気がついたのでPDOには対応していません。これは出来るだけ早急に対応します。

Dokuwikiなどでは普通に使えます。VMwareイメージも用意しているので試してみてください。

非常用の個人利用は無料です。商用利用はご購入ください。開発に役立ちます!

PROVE for PHP 0.4.0-dev リリース

PROVE for PHP 0.4.0をリリースしました。

  • IOをプラグイン化(将来PostgreSQLなどに対応)
  • prove_seek_function_call()を追加
  • ハードリンクによるコピーに対応(高速化)
  • prove_rename_function()の無効化(PHP 5.3のZend Engineの仕様変更により関数名変更はメモリエラーが発生するため)
  • ログフォーマットを更新。バージョン情報を追加。

もともとIO部分はプラグイン化するつもりだったのですが、ファイルに最適化し過ぎていた部分があったため大幅にリファクタリングしました。機能追加よりも今後の機能拡張を容易にするための変更がメインです。内部構造をかなり変更したのでバグが残っているかも知れません。もし見つけたら教えて頂けると助かります。

もうバージョンアップで困らない – PROVE for PHP

昨年のPHPカンファレンスで紹介したPORVE for PHP 開発版の公開を始めました。PROVE for PHPはこんなテストが出来ます。

  • PHPをアップデートしてアプリに影響が無い事を検証する
  • PHPアプリをアップデートしても以前と同じように動作する事を検証する

使い方もとても簡単です。

  • テストケースの作成はブラウザからアプリを利用するだけ
  • ロードバランサを用いて実運用サーバからのテストケースも作成可能
  • テストの実行はプログラムを実行するだけ
  • 違いが在った場所はプログラムの何処か確実&簡単に判明

http://www.provephp.com/

もっと読む

OSC Tokyo プレゼンファイルの公開について – OSC高知以後に

OSC Tokyo Fallでは多くの方にプレゼンテーション(SQLインジェクション”ゼロ”のPostgreSQL利用法 – 今更聞けないSQLインジェク ションの現実と対策)を聞いて頂きありがとうございました。気に入って頂けた方も多かったようで何よりです。

何人もの方から「プレゼンファイルは公開するのか?」「プレゼンファイルを公開してほしい」聞いています。

もう直ぐ開催するOSC高知で同じプレゼンを行います。ネタばれプレゼンするのも恥ずかしいのでOSC高知の後にプレゼンファイルは公開します。

11/14(土)
http://www.ospn.jp/osc2009-kochi/

中国/関西からだと高速バスが便利かも。
岡山からは10時前には着くようです。
http://www.jr-shikoku.co.jp/bus/businfo/ryoma_ex/okayama.asp

北や難波から朝でると昼くらいには現地に着きます。
http://www.jr-shikoku.co.jp/bus/businfo/kochi_ex/index.asp

四国や近県の方(関西、中国の方)はOSC高知に是非お越し下さい!

OSC Tokyo – 今更聞けないSQLインジェクションの現実と対策

明日のOSC東京Fallでは「SQLインジェクション”ゼロ”のPostgreSQL利用法 – 今更聞けないSQLインジェク ションの現実と対策」と題したセッションを日本PostgreSQLユーザ会の講師として話をさせて頂きます。

SQLインジェクションはとうの昔に枯れた話題と思われていますが、古くても今の問題です。何年か前、日本PostgreSQLユーザ会のセミナーで手作業でのブラインドSQLインジェクションのデモをした事がありますが今回はツールを使ったデモもあります。書いている間に当初作ろうと思っていたプレゼンとは異なる物なってしまいました。多少紹介から期待する内容とは異なっているかも知れません。既にSQLインジェクションについては十分知っている方でも、それなりに(?)楽しめる内容になっていると思います。おかげ様で満員だそうですが、飛び込みでも少しは入れるのかな?

45分なのに60枚もスライドがある上、デモもあります。かなりハイペースで話すことになります。ネットで直ぐに見つかるような基本的な事はあまり書かなかったのですが、無いようで書くとSQLインジェクションについて色々在る物です。多少スライドは飛ばす事になります。

ほぼ同じ内容でOSC高知でも話をさせて頂く予定です。
来たくても来れなかった方は是非高知でお会いしましょう。

PHP 5.2.11用のStrict Session Patch

PHP 5.2.11用のStrict Session Patchを公開しました。

http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2FStrictSession

これが無いとセッション管理が面倒です。 どう面倒なのかは既に何度も書いているので省略します。(本当は面倒なだけではないのですが.. )最新リリースの追随がいつも遅れているので、もし作った方は送って頂けると助かります。

もし問題を発見した場合は教えて下さい。直します。

このパッチを使っているサイト例はこのブログです :)