Webアプリの入力はバリデーションできない、と誤解している方は少なく無いようです。システム開発に関わる人でなければ誤解していても構わないのですが、システム開発者が誤解していると安全なシステムを作ることは難しいでしょう。
Webアプリの入力はバリデーションできない、と誤解している開発者にも理解できるよう噛み砕いて解説してみます。
Webアプリの入力はバリデーションできない、と誤解している方は少なく無いようです。システム開発に関わる人でなければ誤解していても構わないのですが、システム開発者が誤解していると安全なシステムを作ることは難しいでしょう。
Webアプリの入力はバリデーションできない、と誤解している開発者にも理解できるよう噛み砕いて解説してみます。
JavaScriptの文字列をエスケープのエントリでJavaScript文字列をエスケープ後に直接出力するより、DOMから取得してはどうか?という提案があったのでエントリを作成しました。
少し設計よりの話を書くとそれに関連する話を書きたくなったので出力の話は後日書きます。
契約による設計(契約プログラミング)(Design by Contract – DbC)は優れた設計・プログラミング手法です。契約による設計と信頼境界線について解説します。
(さらに…)
サーバー側のプログラムでJavaScriptの文字列にデータを出力するケースはよくあります。このような場合、エスケープ処理を行うことが必須です。
JavaScript文字リテラルは次のように定義されています。(ECMAScript 5.1)
SQLのリテラルはエスケープが必要であることは広く認知されていると思います。しかし、識別子のエスケープはあまり広く認知されていないように思います。
PostgreSQLの場合、識別子のエスケープAPI(libpqのPQescapeIdentifier)が提供されておりPHPでもpg_escape_identifier()として利用できます。PostgreSQLの場合は”(ダブルクオート)で識別子を囲むことにより、ダブルクォート無しでは利用できない文字(例えば日本語)も識別子に利用できるようになります。
(さらに…)
多分、WindowsにRails4をインストールしようとして困っている方も多い(?)と思うので簡単にエントリを書きました。
Rails4をWindowsで使うにはWindows版のRuby 2.0とDevKitがあれば良いとあったのでこれらをインストールした後に
gem install rails
を実行するとしばらくするとインストールが完了したが、テストアプリを作り実行しようとしたら (さらに…)
やっとPHPのセッションアダプション脆弱性を修正するパッチとプルリクエストを作りました。議論は済んでいるのでパッチを検証、調整してマージするだけです。
PHPに限らず、未初期化のセッションIDを正規のセッションIDとして受け入れてしまうセッション管理機構があります。(Javaとか)
サイトで稼働している全てのアプリが正しいセッション管理(ログイン後にセッションID作り直す。ログオフで廃棄。一定時間経過後、セッションIDを再生成)を実行していれば良いのですが、共有環境や複数のアプリが使われる事が多いPHPでは特にリスクが高くなっています。
未初期化のセッションIDを受け入れてしまうセッション管理機構は脆弱だと言って良いと考えています。セキュリティのベストプラクティスには確立されたセキュリティ手法(ベストプラクティス)はそのまま使うべき、というプラクティスがあります。つまり、信頼できるフレームワークのセッション管理機構をそのまま使いなさい、がベストプラクティスという事です。しかし、フレームワークとしてURLへのセッションID埋め込みをサポートしているのに、簡単に直せるセッションアダプションを修正しないフレームワークは到底「ベストプラクティスを実装している」と言える状態ではないと考えています。
セッションアダプション脆弱性についてはPHPのWiki(英語のみ)に書いています。詳しくは以下のWikiを参照してください。
PHP 5.5.0がリリースされました。
PHP 5.5のリリースにともないPHP 5.3の開発は終了し、今後一年間セキュリティフィックスのみが提供されます。
PHP 5.3/5.4で動作するPHPアプリケーションのほとんどはそのまま動作しますが、非互換な変更を含むリリースです。ChangeLogやマイグレーションガイドを利用してアップグレードが必要です。
個人的に特にお勧めしたい新機能はPHP 5.5から含まれるcrypt関数のラッパー関数であるpassword_hash関数です。この関数を利用すると、PHPのバージョンアップをするだけで互換性を維持しつつ最適なパスワードのハッシュ化が可能になります。
バイトコードキャッシュモジュールであるOpcacheも標準モジュールとして配布されるようになりました。OpcacheはZendOptimizer+としてZend社が商用製品として配布していましたが、Zend社から提供され標準バンドルされることになりました。APCとは全く別のモジュールなので注意してください。OpcacheはソースコードからビルドすればPHP5.3/5.4でも利用できます。
気になる性能ですが様々な最適化で少し速くなっています。
OpcacheはAPCより多少性能が良いです。元々Zend社が作っていたので特にZendFrameworkとは相性が良いようです。
ところでセッションアダプション脆弱性の修正は時間ができたらマージできる物を用意します。と、いうことでまだ少しお待ちください。
5月24日(金)に開催されたWeb担当者向けのセミナーの「Webノウハウシェア2013」にBOSS-CON JAPANのPHP Security AlianceのCTOとして講演してきました。その講演のスライドです。
http://www.slideshare.net/yohgaki/boss-conphp
Javascriptを利用した内部ネットワークのスキャンが可能である事は良く知られていると思います。ここ数年セキュリティ研究者は更に企業ネットワーク内の奥深くに侵入する手法を研究しています。
企業内のシステムはインターネットに公開するシステムに比べると甘いセキュリティ対策が採用される事が多いですが、インターネットと同様のセキュリティ対策を行わないと思わぬリスクが発生します。特にSSRFの脅威は広範囲に渡ります。正しく理解しておく必要があります。
追記:PHPユーザに取って重要な事の1つを紹介しておきます。
PHP-FPMを利用する場合、php_admin_value, php_admin_flagでphp.iniを設定する方が良いでしょう。手元のFedora18のNginx+PHP-FPMでPoCをそのまま実行した所、エラーになって攻撃は成功しませんでしたが、php.iniの設定をリモートから変更できるとする情報もあります。
追記:ブログアプリ変更でリンクが無くなっていたので、SlideShareの方に公開しました。
岡山PHP勉強会で使ったスライドです。
最近の使い方だとMacBookはプレゼン、メモ、メール、それから時々コンパイルの確認とデバッグくらいに使っていす。
使えるところまでこのままの環境で使おう、と思っていたのですがHDD(512GB)がなんだか怪しそうだったので新しいHDD(1TB)に入れ替えました。起動できるHDDもあるのでWin/OSXの両方のOSをアップグレードしました。
1/19日に開催されたオープンセミナー広島2013にスピーカーとして参加しました。その資料を公開します。
徳丸さんがセッションアダプションをなくしても、セッションハイジャックが出来るのでsession_regenerate_id(true) (trueを付けると古いセッションデータは削除される)をしなければならないという記事を書かれています。
セッションアダプションがなくてもセッションフィクセイション攻撃は可能
http://tumblr.tokumaru.org/post/37676352092/session-adoption-and-session-fixation
まず結論を書きます。徳丸さんが「セッションフィクセイション攻撃は可能」と言われているのは間違いです。正しくは「セッションハイジャックが可能」です。
この議論は別々の異なる脆弱性を一緒にした議論で正しい議論とは言えません。セッションアダプション、セッションフィクセイション、セッションハイジャックとはどのような脆弱性なのか整理して議論する必要があります。
PostgreSQL Advent Calender 2012用のエントリです。
PostgreSQLや他のDBMSを利用していてプリペアードクエリを知らない方は居ないと思いますが、プリペアードクエリを使いこなす為のTIPSです。役に立つかどうか、は多少疑問ですが、内部がどうなっているか知っているとなにかの役に立つかも知れません。時間的制約で多少端折っているところは勘弁してください。
完全なSQLインジェクション対策は以下を参照してください。
https://blog.ohgaki.net/complete-sql-injection-counter-measure
PROVE2エンタープライズ版の先行販売を12/25日までの期間・数量限定で行なっています。PHP5.1/5.2をご利用中でPROVE2を運用・開発に組み込みたいとお考えの方は是非この機会にご購入ください。