Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
PHPにない
セキュリティ機能
無い機能と在る機能
エレクトロニック・サービス・イニシアチブ
自己紹介
• 氏名:大垣 靖男(おおがき やすお)
• 職業:
• PHPコミッター
• エレクトロニック・サービスイニチアチブ代表取締役社長
• 岡山大学大学院非常勤講師/PHP技術者認定機構顧問など
• Webサイト構築関連のコンサルティン...
未修正、未公開の危険な
脆弱性解説を期待していた
方、それは有り得ません。
ご了承ください。
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 3
内容
・既知の脆弱性
・過去の脆弱性
・セキュアプログラミング
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 4
注意事項
このプレゼンは
ライトニングトークが
30分続きます!
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 5
実際にないセキュリティ機能
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 6
何が無いのか?
知れば自分で対策できる
後半のセキュアプログラミングを実践すれば、
自分で何が無いのか見つけられる
2015/5/30(c) Electronic Service Initiative, Ltd. All rights rese...
セッションモジュールの脆弱性
• HTTPセッションはWebアプリケーションセキュリティの要
なのでロックソリッド?!
• 実は結構いい加減
• そもそもクッキーの仕組みがいい加減
• そしてセッションマネージャーの実装もいい加減
2015/5...
セッションモジュールの脆弱性
その1
セッションアダプション
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 9
セッションアダプション
• ここで言うセッションアダプションとはクラッシックなアダプ
ティブなセッションマネージャーの事
• 未初期化のセッションIDを有効なセッションIDをして受け入れる
脆弱性
• PHP 5.4のセッションモジュールには
...
ブラウザのクッキー管理もいい加減
• いい加減なクッキー管理により消えないクッキーを設定可能
• クッキーのdomain、path、secure、httponly属性の取り
扱いがブラウザによって異なる
• 設定の順序によって分けの解らない動作...
ブラウザのクッキー管理もいい加減
• 更に悪いことに今のRFCだと、一つのレスポンスに同じ
クッキー名のSet-Cookieヘッダは一つのレスポンスしか
返せない(ことになっている)
• 知る限りところ複数かつ同名のSet-Cookieヘッダを...
セッションモジュールの脆弱性
その2
古いセッションの削除
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 13
不正確なセッション削除
• セッションアダプションと同じく10年来知られている脆弱性
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 14
sessio...
session_regenerate_id()の動作
• オプション引数なしでは古いセッションを削除しない
• session_regenerate_id(true)は直ちに古いセッ
ションを削除する
2015/5/30(c) Electron...
直ちに古いセッションを削除はNG
• WebサーバーとWebクライアント(ブラウザ)は非同期
• Webクライアントは複数接続を利用
• ネットワーク環境は不安定(モバイル)
2015/5/30(c) Electronic Service In...
不正確なセッション削除
• セッションアダプションと同じく10年来知られている脆弱性
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 17
sessio...
GC任せのセッション削除の問題
• PHPのセッションGCは「確率ベース」
• トラフィックの少ないサイトではなかなか削除されない
• 攻撃者がセッションハイジャックしている場合、新旧両
方のセッションが有効
2015/5/30(c) Elec...
この問題への取り組み
• ユーザーランドで対応が可能
• 削除フラグ+タイムスタンプで確認するだけ
• 詳しくは「間違いだらけのHTTPセッション管理とその対策」
• http://blog.ohgaki.net/design-bugs-in-...
不正なスクリプト/ファイルの
実行防止
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 20
include($_GET)
• PHPは埋め込み型言語なので
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 21
Include(‘/etc/pas...
include($_GET)
• 他の言語で同じようなことをする“非”埋め込み型なので
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 22
Inclu...
PHPのinclude文は
読み込み・実行に脆弱
• 過去に数年間にわたり様々な改善提案
• “非”埋め込みモード:他の言語並みに安全
• 拡張子ホワイトリスト:.phar, .phpのみ実行許可
• スクリプトホワイトリスト:実行可能なスクリ...
PHP7のタイプヒント
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 24
PHP7のタイプヒントには
任意精度数値がない
• データ型は単純に指定すれば良い、物ではない
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 25
V...
PHP7は任意精度整数、浮動小数
点型のタイプヒントがない
• 特に32ビットCPUのPHPは符号付32ビット整数しか
サポートしないので影響が大きい
2015/5/30(c) Electronic Service Initiative, Lt...
タイプヒントエラーで例外が発生
• 実際にどのような例外になるのか、現在議論中
• おそらくthrowableを継承したタイプエラー例外
2015/5/30(c) Electronic Service Initiative, Ltd. All ...
重要:データ型は指定すれば良い、
という物ではない
• PHPがサポートするデータ型(整数、浮動小数点)
の範囲を超えるデータにはint/floatタイプヒントを使っ
てはならない
• 年齢や月など確実に範囲内に収まるデータにのみ
int/fl...
整数オーバーフローを検出できな
い
• Webシステムの入力は基本「文字列」
• ブラウザ
• データベース(LDAPなどを含む)
• JSON/XML
• 大きすぎる整数はキャスト後に
PHP_INT_MAX/PHP_INT_MINのどちらか...
JavaScriptエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 30
PHPはWeb用言語なのに
JavaScriptエスケープ関数が無い
• 無いものは仕方ありません。
• 参考
• http://blog.ohgaki.net/javascript-string-escape
2015/5/30(c) Ele...
LDAPエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 32
LDAPエスケープが無い、無かった
• PHP 5.5までLDAPエスケープ関数が無い
• LDAPエスケープにはFilterコンテクストとDNコンテクス
トのエスケープが必要
• ldap_escape関数はPHP 5.6から
• 参考
• ...
XPathエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 34
XPathエスケープが無い
• XPath 1.0の定義には、そもそもエスケープ方法が定
義されていない
• XPath 1.0の仕様は壊れている
• 参考
• http://blog.ohgaki.net/xpath-query-1
• ht...
SQL識別子エスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 36
SQL識別子エスケープが無い
• PostgreSQLモジュールにはSQL識別子エスケープ関
数(pg_escape_identifier)がある
• 他のDBモジュールには無い
• DBMS自体は識別子エスケープを定義
• しかし、Postg...
JSONエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 38
JSONエスケープはある
• しかし、デフォルトで安全ではない
• 参考
• http://blog.ohgaki.net/json-escape
• http://blog.ohgaki.net/php7-json-decode-json-
...
JSON Numeric
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 40
JSON Numeric型は
int/floatに自動変換されてしまう
• intはオプションで文字列のまま取得可能
• floatは無理
• PHP7用にオプションで文字列のまま取得可能にするよう検討中
• 基本的にこのような自動変換/型の強...
HTMLコンテクスト
エスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 42
HTMLエスケープはあるがその他
コンテクスト用エスケープが無い
• OWASP ESAPIは各コンテスト用のエスケープ(エン
コード)メソッドを提供
• https://github.com/OWASP/PHP-ESAPI
• 最近は更新され...
htmlspecialcharsは
デフォルトで安全でない
• PHP 5.6未満は明示的文字エンコーディング設定が
必要
• PHP 5.6以降はdefault_charsetが利用される
• ‘ (シングルクオート)をデフォルトでエスケープ...
OSコマンド
エスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 45
OSコマンドの完全なエスケープは
非常に困難
• 多数のOS、シェル+コマンド引数パーサー
• escape_shell_argsも完璧ではない
• 参考
• http://blog.ohgaki.net/os-command-escape-
...
XMLエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 47
XML用のエスケープがない
• 無いです
• htmlspecialchars/htmlentitiesが流用可能
2015/5/30(c) Electronic Service Initiative, Ltd. All rights rese...
LIKEエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 49
SQL文のLIKEエスケープがない
• おかしなクエリ結果が返るだけで、セキュリティ上のインパクト
があることは少ない
• しかし、余計な結果が表示されることが問題となる場合も
• そもそもDBMSがエスケープAPIを提供していない
• “%”...
正規表現メタ文字
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 51
正規表現
メタ文字エスケープ関数がない
• quotemeta関数はあるがこれでは不十分
• http://php.net/manual/ja/function.quotemeta.php
• PCRE用には専用関数がある
• http://p...
入力バリデーター
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 53
使いやすい
入力バリデーターが無い
• Filterモジュールは在る
• http://php.net/manual/ja/book.filter.php
• 入力バリデーターとして使いやすい、とは言いがたい
• フレームワークのバリデーターを...
PHPに在った脆弱性
PHPに無かったセキュリティ機能
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 55
どんな問題が在ったのか?
知れば対策できる
自分のコードのセキュリティ問題でなくても、
自分のコードで対策できる
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reser...
タイプコンフュージョン
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 57
タイプコンフュージョン
• タイプコンフュージョンとはPHP組み込み関数が変数型
を間違えて処理してしまう脆弱性
• 最近、頻繁に修正されている脆弱性
• 例えば、内部関数が整数型を期待しているのに、ユー
ザーが配列型を渡す
2015/5/30...
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 59
typedef union _zvalue_value {
long lval; /* long ...
タイプコンフュージョン
ユニオン構造体
はメモリ領域を
共有
つまり整数型で
あると仮定して
処理していて、
配列型が渡され
た場合、ハッ
シュのメモリア
ドレスが判る
ハッシュのメモ
リアドレスが判
ると、ハッシュ
構造体がデスト
ラクタを持...
タイプコンフュージョンは終わった
か?
• PHPのモジュールは多様
• 多数の3rdパーティーモジュール
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved...
タイプコンフュージョンは終わった
か?
• PHPのモジュールは多様
• 多数の3rdパーティーモジュール
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved...
Use After Free
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 63
Use After Free
• PHP 5.4.40のNEWSより
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 64
- cURL:
. Fixe...
Use After Free
• 開放済みメモリにアクセスしてしまう脆弱性
• 高度なメモリ破壊攻撃の一種
• スタックオーバーフローは単純なメモリ破壊攻撃
2015/5/30(c) Electronic Service Initiative,...
PHPユーザーの防御策(緩和策)
出来る限り厳格な
入力バリデーションを行う
• 数値データのみなら文字列でも20バイトも無い
• 20バイト以下のシェルコードは困難
• 数字だけでは無理(ただし、制御コードなしのシェルコードは可能)
2015...
include文に対する
ヌル文字インジェクション対策
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 67
include文に対する
ヌル文字インジェクション
• 例
<?php
include(“/path/to/any.file¥0.png”);
2015/5/30(c) Electronic Service Initiative, Ltd. A...
include文に対する
ヌル文字インジェクション対策??
• 例
<?php
//ファイルアップロード処理のどこかで
//拡張子が画像かチェック
if (!preg_match(“.png¥z”, $_GET[“module”)) {
die...
include文に対する
ヌル文字インジェクション対策
<?php
include(“/path/to/any.file¥0.png”);
include文の実態はC言語の
ファイル関数
つまり非バイナリセーフ
2015/5/30(c) Ele...
include文に対する
ヌル文字インジェクション対策??
<?php
//ファイルアップロード処理のどこかで
//拡張子が画像かチェック
if (!preg_match(“.png¥z”, $_GET[“module”)) {
die(“Do...
include文に対する
ヌル文字インジェクション対策
<?php
include(“/path/to/any.file¥0.png”);
2015/5/30(c) Electronic Service Initiative, Ltd. All...
他の言語での対応
• PHPの後で同様の対応が行われる
• 画像処理やSSL関連脆弱性ではこのパターン(PHP
の後追い)が結構多い
2015/5/30(c) Electronic Service Initiative, Ltd. All ri...
ヌル文字インジェクション
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 74
ヌル文字インジェクションは終わった
か?
• ついこの前のリリースでも脆弱性が修正される
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 75
14 M...
ヌル文字インジェクションは
終わったか?
• ストリームラッパー以外の場所での対応
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 76
diff --...
ヌル文字インジェクションは
終わったか?
• ストリームラッパー以外の場所での対応
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 77
diff --...
ヌル文字インジェクションは
終わったか?
• ストリームラッパー以外の場所、ZPPの“p”タイプに未
対応のケースを考慮しなければならない
2015/5/30(c) Electronic Service Initiative, Ltd. All...
ヌル文字インジェクションの
技術的・セキュリティ的な根本を理解
バイナリセーフ(ヌル文字に意味がない)
非バイナリセーフ(ヌル文字が文字列終端)
ヌル文字の解釈の違い → 処理に相違が発生
一文字でも意味がある文字(バイト)があ
るとインジェク...
ヌル文字インジェクションの
技術的・セキュリティ的な根本を理解
バイナリセーフ(ヌル文字に意味がない)
非バイナリセーフ(ヌル文字が文字列終端)
ヌル文字の解釈の違い → 処理に相違が発生
一文字でも意味がある文字(バイト)があると
インジェク...
改行インジェクション
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 81
ヌル文字インジェクションに
類似したセキュリティ問題
• HTTPヘッダーインジェクション
• 別名:
HTTPレスポンススプリッティング
HTTPヘッダー分割
改行インジェクション
• メールヘッダーインジェクション
• 別名:
改行インジェ...
HTTPヘッダーインジェクション
• header()/setcookie()関数で対策済み
• PHPからHTTPヘッダーを送る手段は
header()/setcookie()しかない(基本的には)
• 自分でソケット作ったり、cURLでリク...
メールヘッダーインジェクション
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 84
• mail関数にはメールヘッダーインジェクション脆弱性が
残され...
メールヘッダーインジェクション
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 85
• https://bugs.php.net/bug.php?id...
改行インジェクションとは
• 一行が意味を持つプロトコルに有効な攻撃手法
• HTTPプロトコル
• SMTPプロトコル
• その他、一行が意味を持つプロトコルほぼ全て
2015/5/30(c) Electronic Service Initi...
改行インジェクションの
技術的・セキュリティ的な根本を理解
・一行ごとに意味がある
余計な改行は余計な意味を追加する
→ 余計な処理が発生
一文字でも意味がある文字(バイ
ト)があるとインジェクション攻撃
の可能性が発生する
2015/5/30...
ヌル文字・改行インジェクションの
技術的・セキュリティ的な根本を理解
・バイナリセーフ(ヌル文字に意味がない)
・非バイナリセーフ(ヌル文字が文字列終端)
ヌル文字の解釈の違い → 処理に相違が発生
一文字でも意味がある文字(バイト)があると
...
セキュアプログラミング
防御的プログラミング
セキュア/防御的プログラミングのエッセンス
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 89
あらゆる脆弱性に対策できる
根本的脆弱性対策を理解する
セキュアプログラミング/セキュアコーディング/防御的プログ
ラミングの中でも重要な契約プログラミングを紹介
2015/5/30(c) Electronic Service Initiati...
セキュリティ脆弱性に対する攻撃とは
システムやプログラムに対して
コード・命令を挿入し
意図しない動作をさせる
攻撃者のコード・命令を実行させ
る
2015/5/30(c) Electronic Service Initiative, Ltd....
セキュリティ脆弱性に対する攻撃とは
システムやプログラムに対して
コード・命令を挿入し
意図しない動作をさせる
攻撃者のコード・命令を実行させ
る
2015/5/30(c) Electronic Service Initiative, Ltd....
セキュリティ脆弱性に対する攻撃とは
システムやプログラムに対
して
コード・命令を挿入し
意図しない動作をさせる
攻撃者のコード・命令を実
行させる
2015/5/30(c) Electronic Service Initiative, Ltd...
セキュリティ脆弱性に対する攻撃とは
システムやプログラムに対
して
コード・命令を挿入し
意図しない動作をさせる
攻撃者のコード・命令を実
行させる
2015/5/30(c) Electronic Service Initiative, Ltd...
セキュリティ脆弱性に対する攻撃とは
システムやプログラムに対
して
コード・命令を挿入し
意図しない動作をさせる
攻撃者のコード・命令を実
行させる
2015/5/30(c) Electronic Service Initiative, Ltd...
全体最適化と部分最適化
• 全体として最適化しない場合、目的が達成でき
ない
全体最適化
• 部分最適化も重要だが、
部分最適化では全体最適は実現しない
• 合成の誤謬
• http://blog.ohgaki.net/fallacy-of-c...
部分最適化で
全体最適化ができない理由
• 部分最適化の場合、アプリケーションロジックの中に
セキュリティ対策が埋没する
• アプリケーションロジックのバグは発見しづらい
• しかも、変更が多い
• アプリ自体の仕様変更、リファクタリング(継続...
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 98
Webアプリ
情報
HTML/CSS
FW/API
OSコマンド
パス
SQL/Xpath/
LD...
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 99
入力 入力入力入力入力
処理 処理 処理 処理 処理
処理 処理 処理 処理
処理 処理 処理 処...
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 100
入力 入力入力入力入力
処理 処理 処理 処理 処理
処理 処理 処理 処理
処理 処理 処理 ...
契約プログラミング
契約のよる設計の構造
2014/10/11 PHPカンファレンス2014 101
契約プログラミングの基本
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 102
入力ソース
入力処理
ロジック処理
出力処理
出力
呼び出しが契約に
...
2014/10/11PHPカンファレンス2014 103
入力 入力入力入力入力
処理 処理 処理 処理 処理
処理 処理 処理 処理
処理 処理 処理 処理 処理
処理 処理 処理 処理
契約プログラミン
グでは入力が契約
を守っているか入
...
2014/10/11PHPカンファレンス2014 104
入力 入力入力入力入力
入力処理 入力処理 入力処理 入力処理 入力処理
処理 処理 処理 処理
処理 処理 処理 処理 処理
出力処理 出力処理 出力処理 出力処理
信頼境界線
出力 ...
セキュアな入出力制御で
対策・緩和できる脆弱性
入力 出力 CWE
High CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('PathTraversal...
「入力」「出力」を確実にする
だけで8割9割の
脆弱性を防止・緩和可能
2014/10/11PHPカンファレンス2014 106
職人技セキュリティから
エンジニアリングされた
セキュリティへ
2014/10/11PHPカンファレンス2014 107
2014/10/11PHPカンファレンス2014 108
入力 入力入力入力入力
入力処理 入力処理 入力処理 入力処理 入力処理
処理 処理 処理 処理
処理 処理 処理 処理 処理
出力処理 出力処理 出力処理 出力処理
信頼境界線
出力 ...
アプリの入力・出力の
安全性確保は
セキュアアプリの
土台・基礎
2014/10/11 PHPカンファレンス2014 109
継続的インテグレーション
高速な開発サイクルも
契約プログラミングで
効率化
2014/10/11 PHPカンファレンス2014 110
間違えてはならないのは
契約プログラミング
契約による設計でも
2014/10/11PHPカンファレンス2014 111
多層防御は必要!
セキュアなプログラムの基本構造
2014/10/11PHPカンファレンス2014 112
入力ソース
入力処理
ロジック処理
出力処理
出力
バリデーションで
攻撃可能範囲を
限定・緩和
出力で完全に安全
にできるデータは
完全に安全に
エスケ...
普通のアプリは単純な
「入力→処理→出力」
ではない
2014/10/11PHPカンファレンス2014 113
セキュアなプログラムの基本構造
2014/10/11PHPカンファレンス2014 114
入力ソース
入力処理
ロジック処理
出力処理
出力
SQLクエリ
入力ソース
入力処理
ロジック処理
出力処理
出力
クエリ結果
WebAPI
入力ソース...
アプリは複数の
「入力→処理→出力」
の組み合わせの構造
2014/10/11PHPカンファレンス2014 115
ロジック処理
セキュアなプログラムの基本構造
2014/10/11PHPカンファレンス2014 116
入力ソース
入力処理
出力処理
出力
入力ソース
入力処理
ロジック処理
出力処理
出力
入力ソース
入力処理
ロジック処理
出力処理
出力...
契約プログラミング
契約による設計は
高性能
2014/10/11PHPカンファレンス2014 117
例:文字エンコーディング
のバリデーション
2014/10/11PHPカンファレンス2014 118
2014/10/11PHPカンファレンス2014 119
入力ソース
入力処理
ロジック処理
出力処理
出力
ロジック処理
ロジック処理
ロジック処理
入力ソース
入力処理
ロジック処理
出力処理
出力
ロジック処理
ロジック処理
ロジック処理...
契約プログラミング
契約による設計は
セキュア
2014/10/11PHPカンファレンス2014 120
2014/10/11PHPカンファレンス2014 121
入力ソース
入力処理
ロジック処理
出力処理
出力
ロジック処理
ロジック処理
ロジック処理
バリデーション
エスケープ
API
バリデーション
仮にバリデーション漏
れがあったとしても...
2014/10/11PHPカンファレンス2014 122
入力ソース
入力処理
ロジック処理
出力処理
出力
ロジック処理
ロジック処理
ロジック処理
バリデーション
エスケープ
API
バリデーション
縦深防御も忘れずに!
ロジック中にも入出...
ロジック処理
セキュアなプログラムの基本構造
2014/10/11PHPカンファレンス2014 123
入力ソース
入力処理
出力処理
出力
入力ソース
入力処理
ロジック処理
出力処理
出力
入力ソース
入力処理
ロジック処理
出力処理
出力...
情報セキュリティ対策とは
• 対策・緩和策を積み重ねて、
データ/プログラムの安全性を管理
• 安全性を管理する、とは
• リスクを管理する、であり
• 許容可能な程度までリスクを緩和する
• 万が一のインシデント発生時には原因が判るようにする...
参考にすべき
セキュアコーディングガイド
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 125
• CERT Secure Coding Standa...
安全かつ高速な
部品・サービスを作るには、
契約プログラミングが有効
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 126
入力バリデーションは
第一のセキュリティ対策
By CERT/SANS/OWASP
入力バリデーションで
未知・うっかり脆弱性にも対応可能
セキュリティ対策として必ず実行
2015/5/30(c) Electronic Service Init...
PHPポケットリファレンス 第三版
• カンファレンス会場で販売中
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 128
お問い合わせ・ご相談は
Web開発、セキュリティで困ったら
エレクトロニック・サービス・イニシアチブ
http://www.es-i.jp/
2015/5/30(c) Electronic Service Initiative, Ltd. Al...
ご清聴
ありがとうございました
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 130
Próxima SlideShare
Cargando en…5
×

PHPにないセキュリティ機能

21.971 visualizaciones

Publicado el

PHPカンファレンス関西2015での私のセッション「PHPに無いセキュリティ機能」のスライドです。

何が無いのか、知っていれば対応できます。
何が問題になっているのか、知っていれば対応できます。

セキュリティ対策は職人技敵(脆弱性対策をコード中に散りばめ、全体を把握しないと安全にできない作り方)ではなく、CERT/SANS/OWASPが推奨するセキュリティ対策を行い、エンジニアリング的(科学的、体系的な作り方)を行う方が簡単かつより安全、高品質なアプリケーションを作れます。

PDFをダウンロードしたい方はブログをご覧ください。
http://blog.ohgaki.net/missing-security-related-parts-of-php

Publicado en: Software

PHPにないセキュリティ機能

  1. 1. PHPにない セキュリティ機能 無い機能と在る機能 エレクトロニック・サービス・イニシアチブ
  2. 2. 自己紹介 • 氏名:大垣 靖男(おおがき やすお) • 職業: • PHPコミッター • エレクトロニック・サービスイニチアチブ代表取締役社長 • 岡山大学大学院非常勤講師/PHP技術者認定機構顧問など • Webサイト構築関連のコンサルティングなど • テクニカル・セキュア開発(開発体制・コード検査・ツール販売・セキュリ ティパッチサービス)など • ネット • http://blog.ohgaki.net/ • yohgaki – Facebook/Twitterなど • yohgaki@ohgaki.net 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 2
  3. 3. 未修正、未公開の危険な 脆弱性解説を期待していた 方、それは有り得ません。 ご了承ください。 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 3
  4. 4. 内容 ・既知の脆弱性 ・過去の脆弱性 ・セキュアプログラミング 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 4
  5. 5. 注意事項 このプレゼンは ライトニングトークが 30分続きます! 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 5
  6. 6. 実際にないセキュリティ機能 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 6
  7. 7. 何が無いのか? 知れば自分で対策できる 後半のセキュアプログラミングを実践すれば、 自分で何が無いのか見つけられる 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 7
  8. 8. セッションモジュールの脆弱性 • HTTPセッションはWebアプリケーションセキュリティの要 なのでロックソリッド?! • 実は結構いい加減 • そもそもクッキーの仕組みがいい加減 • そしてセッションマネージャーの実装もいい加減 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 8
  9. 9. セッションモジュールの脆弱性 その1 セッションアダプション 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 9
  10. 10. セッションアダプション • ここで言うセッションアダプションとはクラッシックなアダプ ティブなセッションマネージャーの事 • 未初期化のセッションIDを有効なセッションIDをして受け入れる 脆弱性 • PHP 5.4のセッションモジュールには use_strict_modeが無い • つまりアダプティブなセッション管理 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 10 JavaScriptインジェク ションに脆弱なアプ リ 消えないセッション IDクッキー設定 攻撃者は常にター ゲットのログイン セッションを乗っ取 り可能に
  11. 11. ブラウザのクッキー管理もいい加減 • いい加減なクッキー管理により消えないクッキーを設定可能 • クッキーのdomain、path、secure、httponly属性の取り 扱いがブラウザによって異なる • 設定の順序によって分けの解らない動作をするブラウザもある • 比較的最近のRFC改定によりブラウザが最も優先順位が高 いとするクッキーのみが送信される • 昔の動作であれば、同じ名前のクッキーが複数送られてきたの でサーバー側で不正なクッキーの検出が可能であったが、現 在は検出不可能 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 11
  12. 12. ブラウザのクッキー管理もいい加減 • 更に悪いことに今のRFCだと、一つのレスポンスに同じ クッキー名のSet-Cookieヘッダは一つのレスポンスしか 返せない(ことになっている) • 知る限りところ複数かつ同名のSet-Cookieヘッダを無視するブ ラウザは知らない(今は無視するかも?) • つまり、以下のようなオフェンシブクッキーを削除するコー ドはRFC的には違反 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 12 setcookie('foo', '', 1 , "/"); setcookie('foo', '', 1 , "/myapp/"); setcookie('foo', '', 1 , "/myapp/login/"); setcookie('foo', '', 1 , "/myapp/login/reset_cookie/");
  13. 13. セッションモジュールの脆弱性 その2 古いセッションの削除 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 13
  14. 14. 不正確なセッション削除 • セッションアダプションと同じく10年来知られている脆弱性 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 14 session_regenerate_id();
  15. 15. session_regenerate_id()の動作 • オプション引数なしでは古いセッションを削除しない • session_regenerate_id(true)は直ちに古いセッ ションを削除する 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 15 直ちに古いセッションを削除! これで万事OK! これで万事OKではない
  16. 16. 直ちに古いセッションを削除はNG • WebサーバーとWebクライアント(ブラウザ)は非同期 • Webクライアントは複数接続を利用 • ネットワーク環境は不安定(モバイル) 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 16 レースコンディション、パ ケットのロストで突然セッ ションが消える
  17. 17. 不正確なセッション削除 • セッションアダプションと同じく10年来知られている脆弱性 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 17 session_regenerate_id(); 10年以上前にこの関数が追加された時、 セッションが消えると困るのでデフォルト では削除しない仕様に変更 GCに任せておけば、その うち消える
  18. 18. GC任せのセッション削除の問題 • PHPのセッションGCは「確率ベース」 • トラフィックの少ないサイトではなかなか削除されない • 攻撃者がセッションハイジャックしている場合、新旧両 方のセッションが有効 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 18
  19. 19. この問題への取り組み • ユーザーランドで対応が可能 • 削除フラグ+タイムスタンプで確認するだけ • 詳しくは「間違いだらけのHTTPセッション管理とその対策」 • http://blog.ohgaki.net/design-bugs-in-http-session- management • 実はPHP5.6用のパッチは準備済みだった • ここ数年間、セッションIDの削除がGC任せである問題に取り組 んでいる • 提案したが「この問題とセキュリティ対策の本質」を理解されず 却下 • 現在は理解が進みPHP7には入るかも知れない 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 19
  20. 20. 不正なスクリプト/ファイルの 実行防止 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 20
  21. 21. include($_GET) • PHPは埋め込み型言語なので 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 21 Include(‘/etc/passwd’); // OK!! Include(‘/www/html/upload/evil.gif’); // OK!! パスワードファイルの 中身が出力される イメージファイルの中の PHPスクリプトの実行もOK
  22. 22. include($_GET) • 他の言語で同じようなことをする“非”埋め込み型なので 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 22 Include(‘/etc/passwd’); // NG!! Include(‘/www/html/upload/evil.gif’); // NG!! 確実にパースエラー 単純な画像ヘッダーのチェックなら 回避できるが、まともにバリデー ションしていればパースエラー
  23. 23. PHPのinclude文は 読み込み・実行に脆弱 • 過去に数年間にわたり様々な改善提案 • “非”埋め込みモード:他の言語並みに安全 • 拡張子ホワイトリスト:.phar, .phpのみ実行許可 • スクリプトホワイトリスト:実行可能なスクリプトを指定 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 23 今はココです。開発者うけも比較的よく この提案なら承認されるかも。 Opcacheにプリロードするので実行速度 も向上する
  24. 24. PHP7のタイプヒント 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 24
  25. 25. PHP7のタイプヒントには 任意精度数値がない • データ型は単純に指定すれば良い、物ではない 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 25 Validate for expected data types OWASP Secure Coding Practices(v2) – InputValidation 整数型のデータ型には、signed/unsignedがありchar/byte/ short/word/int/longなどがある 浮動小数点型にも通常の倍精度のみでなく、四倍精度もある 32ビットCPUのPHPは符号付32ビット整数、64ビットCPUは 符号付64ビット整数 http://blog.ohgaki.net/owasp-secure-coding-practices-quick-reference-guide
  26. 26. PHP7は任意精度整数、浮動小数 点型のタイプヒントがない • 特に32ビットCPUのPHPは符号付32ビット整数しか サポートしないので影響が大きい 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 26 function getMyTableByID(int $id) { // データベースからレコードを取得 } DBのIDは普通は 64ビット整数 JSONデータ?numericに精度指定は無い
  27. 27. タイプヒントエラーで例外が発生 • 実際にどのような例外になるのか、現在議論中 • おそらくthrowableを継承したタイプエラー例外 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 27 例外をキャッチしないと スクリプトの実行が終了
  28. 28. 重要:データ型は指定すれば良い、 という物ではない • PHPがサポートするデータ型(整数、浮動小数点) の範囲を超えるデータにはint/floatタイプヒントを使っ てはならない • 年齢や月など確実に範囲内に収まるデータにのみ int/floatタイプヒントを使う • 全ての例外・エラーはキャッチする • PHP7のZPPではデータ型の範囲内かチェックしエラー(例外で なく、エラーです。今のところ)が発生する 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 28
  29. 29. 整数オーバーフローを検出できな い • Webシステムの入力は基本「文字列」 • ブラウザ • データベース(LDAPなどを含む) • JSON/XML • 大きすぎる整数はキャスト後に PHP_INT_MAX/PHP_INT_MINのどちらかになる • PHP_INT_MAX/PHP_INT_MINをオーバーフロー として取り扱うと簡単 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 29
  30. 30. JavaScriptエスケープ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 30
  31. 31. PHPはWeb用言語なのに JavaScriptエスケープ関数が無い • 無いものは仕方ありません。 • 参考 • http://blog.ohgaki.net/javascript-string-escape 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 31
  32. 32. LDAPエスケープ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 32
  33. 33. LDAPエスケープが無い、無かった • PHP 5.5までLDAPエスケープ関数が無い • LDAPエスケープにはFilterコンテクストとDNコンテクス トのエスケープが必要 • ldap_escape関数はPHP 5.6から • 参考 • http://php.net/manual/ja/function.ldap- escape.php 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 33
  34. 34. XPathエスケープ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 34
  35. 35. XPathエスケープが無い • XPath 1.0の定義には、そもそもエスケープ方法が定 義されていない • XPath 1.0の仕様は壊れている • 参考 • http://blog.ohgaki.net/xpath-query-1 • http://blog.ohgaki.net/xpath-query-2 • http://blog.ohgaki.net/reason-why-xpath1-0-is- broken • XPath 2.0ではエスケープ仕様が追加された 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 35
  36. 36. SQL識別子エスケープ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 36
  37. 37. SQL識別子エスケープが無い • PostgreSQLモジュールにはSQL識別子エスケープ関 数(pg_escape_identifier)がある • 他のDBモジュールには無い • DBMS自体は識別子エスケープを定義 • しかし、PostgreSQLを除いてクライアントアクセスライ ブラリに識別子エスケープAPIがない • 仕様として問題 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 37
  38. 38. JSONエスケープ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 38
  39. 39. JSONエスケープはある • しかし、デフォルトで安全ではない • 参考 • http://blog.ohgaki.net/json-escape • http://blog.ohgaki.net/php7-json-decode-json- encode-problem 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 39
  40. 40. JSON Numeric 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 40
  41. 41. JSON Numeric型は int/floatに自動変換されてしまう • intはオプションで文字列のまま取得可能 • floatは無理 • PHP7用にオプションで文字列のまま取得可能にするよう検討中 • 基本的にこのような自動変換/型の強制はセキュリティ的 に問題 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 41
  42. 42. HTMLコンテクスト エスケープ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 42
  43. 43. HTMLエスケープはあるがその他 コンテクスト用エスケープが無い • OWASP ESAPIは各コンテスト用のエスケープ(エン コード)メソッドを提供 • https://github.com/OWASP/PHP-ESAPI • 最近は更新されていない 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 43
  44. 44. htmlspecialcharsは デフォルトで安全でない • PHP 5.6未満は明示的文字エンコーディング設定が 必要 • PHP 5.6以降はdefault_charsetが利用される • ‘ (シングルクオート)をデフォルトでエスケープしな い • HTML5に対応していない • / のエスケープに対応していない。HTML5ではクオート文字な しの属性が許される 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 44
  45. 45. OSコマンド エスケープ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 45
  46. 46. OSコマンドの完全なエスケープは 非常に困難 • 多数のOS、シェル+コマンド引数パーサー • escape_shell_argsも完璧ではない • 参考 • http://blog.ohgaki.net/os-command-escape- shell-spec-command-implementation • pcntl_execはコマンドと引数を分離して実行 • 内部的にexecv, execveを利用 • shell_execなどで使えるように提案中 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 46
  47. 47. XMLエスケープ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 47
  48. 48. XML用のエスケープがない • 無いです • htmlspecialchars/htmlentitiesが流用可能 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 48
  49. 49. LIKEエスケープ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 49
  50. 50. SQL文のLIKEエスケープがない • おかしなクエリ結果が返るだけで、セキュリティ上のインパクト があることは少ない • しかし、余計な結果が表示されることが問題となる場合も • そもそもDBMSがエスケープAPIを提供していない • “%”、“_”をエスケープ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 50
  51. 51. 正規表現メタ文字 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 51
  52. 52. 正規表現 メタ文字エスケープ関数がない • quotemeta関数はあるがこれでは不十分 • http://php.net/manual/ja/function.quotemeta.php • PCRE用には専用関数がある • http://php.net/manual/ja/function.preg-quote.php • mbstring用には専用関数がない • PCRE用が流用できる • SQLのLIKE文と同じく、余計な結果が返ることが問題とな る場合がある • エスケープしないと正規表現ライブラリ脆弱性攻撃に利用さ れる 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 52
  53. 53. 入力バリデーター 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 53
  54. 54. 使いやすい 入力バリデーターが無い • Filterモジュールは在る • http://php.net/manual/ja/book.filter.php • 入力バリデーターとして使いやすい、とは言いがたい • フレームワークのバリデーターを使いましょう 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 54
  55. 55. PHPに在った脆弱性 PHPに無かったセキュリティ機能 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 55
  56. 56. どんな問題が在ったのか? 知れば対策できる 自分のコードのセキュリティ問題でなくても、 自分のコードで対策できる 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 56
  57. 57. タイプコンフュージョン 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 57
  58. 58. タイプコンフュージョン • タイプコンフュージョンとはPHP組み込み関数が変数型 を間違えて処理してしまう脆弱性 • 最近、頻繁に修正されている脆弱性 • 例えば、内部関数が整数型を期待しているのに、ユー ザーが配列型を渡す 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 58 +-Core: + . Additional fix for bug #69152 (Type confusion vulnerability in + exception::getTraceAsString). (Stas) +- SOAP: + . Fixed bug #69152 (Type Confusion InfoleakVulnerability in unserialize() + with SoapFault). (Dmitry)
  59. 59. 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 59 typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value; struct _zval_struct { /*Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; }; PHP 7のZVAL(PHP変数の構造体)の定義 これがPHP変数の構造体 実際に変数を保存する ユニオン構造体
  60. 60. タイプコンフュージョン ユニオン構造体 はメモリ領域を 共有 つまり整数型で あると仮定して 処理していて、 配列型が渡され た場合、ハッ シュのメモリア ドレスが判る ハッシュのメモ リアドレスが判 ると、ハッシュ 構造体がデスト ラクタを持って いることを利用 し、ヒープ領域 で任意コード実 行ができる。 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 60 ただし、そのメモリに書き 込める別の脆弱性が必要
  61. 61. タイプコンフュージョンは終わった か? • PHPのモジュールは多様 • 多数の3rdパーティーモジュール 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 61 対応済みなので安心!
  62. 62. タイプコンフュージョンは終わった か? • PHPのモジュールは多様 • 多数の3rdパーティーモジュール 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 62 対応済みなので安心? Be Defensive!
  63. 63. Use After Free 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 63
  64. 64. Use After Free • PHP 5.4.40のNEWSより 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 64 - cURL: . Fixed bug #69316 (Use-after-free in php_curl related to CURLOPT_FILE/_INFILE/_WRITEHEADER). (Laruence) - Sqlite3: . Fixed bug #66550 (SQLite prepared statement use-after-free). (Sean Heelan)
  65. 65. Use After Free • 開放済みメモリにアクセスしてしまう脆弱性 • 高度なメモリ破壊攻撃の一種 • スタックオーバーフローは単純なメモリ破壊攻撃 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 65 別の変数のメモリ が割り当てられる 解放後のポインタ を使い不正にメモ リに書き込み 別の変数のメモリ が開放される メモリの解放後に メモリマネージャーのデス トラクタを書き換える 改ざんデストラクタが実行 される
  66. 66. PHPユーザーの防御策(緩和策) 出来る限り厳格な 入力バリデーションを行う • 数値データのみなら文字列でも20バイトも無い • 20バイト以下のシェルコードは困難 • 数字だけでは無理(ただし、制御コードなしのシェルコードは可能) 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 66 CERT Top 10 セキュアコーディングプラクティス 1. 入力をバリデーションする 全ての信頼できないデータソースからの入力をバリデーションする。 適切な入力バリデーションは非常に多くのソフトウェア脆弱性を排除 できる。ほぼ全ての外部データソースに用心が必要である。これらに はコマンドライン引数、ネットワークインターフェース、環境変数や ユーザーが制御可能なファイルなどが含まれる。
  67. 67. include文に対する ヌル文字インジェクション対策 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 67
  68. 68. include文に対する ヌル文字インジェクション • 例 <?php include(“/path/to/any.file¥0.png”); 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 68
  69. 69. include文に対する ヌル文字インジェクション対策?? • 例 <?php //ファイルアップロード処理のどこかで //拡張子が画像かチェック if (!preg_match(“.png¥z”, $_GET[“module”)) { die(“Do not upload other than .png”; } <?php $module = $_GET[‘module’]; include(PATH_MODULE . $module); 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 69
  70. 70. include文に対する ヌル文字インジェクション対策 <?php include(“/path/to/any.file¥0.png”); include文の実態はC言語の ファイル関数 つまり非バイナリセーフ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 70 PHPの変数は バイナリセーフ つまり、¥0までがファイル 名として解釈される
  71. 71. include文に対する ヌル文字インジェクション対策?? <?php //ファイルアップロード処理のどこかで //拡張子が画像かチェック if (!preg_match(“.png¥z”, $_GET[“module”)) { die(“Do not upload other than .png”; } <?php $module = $_GET[‘module’]; include(PATH_MODULE . $module); 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 71 preg_matchはバイナリセーフ。¥0 も普通の文字として解釈される PHP変数はバイナリセーフ。$_GET なら%00は¥0文字として解釈 される include文は非バイナリセーフ “../../../etc/password%00.png”なら
  72. 72. include文に対する ヌル文字インジェクション対策 <?php include(“/path/to/any.file¥0.png”); 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 72 PHP5.3.4からストリームラッパー でヌル文字を不許可 http://attack/script.php%00.png なども不許可 - Security enhancements: . Paths with NULL in them (foo¥0bar.txt) are now considered as invalid. (Rasmus)
  73. 73. 他の言語での対応 • PHPの後で同様の対応が行われる • 画像処理やSSL関連脆弱性ではこのパターン(PHP の後追い)が結構多い 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 73
  74. 74. ヌル文字インジェクション 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 74
  75. 75. ヌル文字インジェクションは終わった か? • ついこの前のリリースでも脆弱性が修正される 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 75 14 May 2015 PHP 5.4.41 . Fixed bug #69418 (CVE-2006-7243 fix regressions in 5.4+). (Stas) <?php include(“/path/to/any.file¥0.png”); PHP5.3.4からストリームラッパー でヌル文字を不許可 http://attack/script.php%00.png なども不許可 ストリームラッパー以外での場所では対応していなかった。 例)unlinkなど
  76. 76. ヌル文字インジェクションは 終わったか? • ストリームラッパー以外の場所での対応 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 76 diff --git a/ext/standard/file.c b/ext/standard/file.c index 708c3e2..21e1e53 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -813,7 +813,7 @@ PHP_FUNCTION(tempnam) char *p; int fd; - if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "ps", &dir, &dir_len, &prefix, &prefix_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "pp", &dir, &dir_len, &prefix, &prefix_len) == FAILURE) { return; } ZPPを拡張し”p”タイプを追加 ”p”タイプはヌル文字を拒否
  77. 77. ヌル文字インジェクションは 終わったか? • ストリームラッパー以外の場所での対応 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 77 diff --git a/ext/standard/file.c b/ext/standard/file.c index 708c3e2..21e1e53 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -813,7 +813,7 @@ PHP_FUNCTION(tempnam) char *p; int fd; - if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "ps", &dir, &dir_len, &prefix, &prefix_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "pp", &dir, &dir_len, &prefix, &prefix_len) == FAILURE) { return; } ZPPを拡張し”p”タイプを追加 ”p”タイプはヌル文字を拒否 3rdパーティモジュールなど ZPP拡張の”p”タイプに未対応 ならヌル文字インジェクション に脆弱になる
  78. 78. ヌル文字インジェクションは 終わったか? • ストリームラッパー以外の場所、ZPPの“p”タイプに未 対応のケースを考慮しなければならない 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 78 以下の物は個別に確認しなければならない • ヌル文字(%00)をチェックする • 改行文字(%0d, %0a, ¥r, ¥n) • パスを変更する文字列(../ および ..¥)をチェックする。 • UTF-8の拡張文字セットがサポートされている場合、 %c0%ae%c0%ae/ など別形式の形もチェックする (Canonicalizeを利用し重複エンコーディングや他の不明瞭化攻撃 に対応する) (訳注:../ や ..¥ を取り除きなさい、ではありません。単純に取り 除くだけだと簡単に攻撃できます) OWASP Secure Coding Practices http://blog.ohgaki.net/owasp-secure-coding-practices-quick-reference-guide
  79. 79. ヌル文字インジェクションの 技術的・セキュリティ的な根本を理解 バイナリセーフ(ヌル文字に意味がない) 非バイナリセーフ(ヌル文字が文字列終端) ヌル文字の解釈の違い → 処理に相違が発生 一文字でも意味がある文字(バイト)があ るとインジェクション攻撃の可能性が発生 する 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 79
  80. 80. ヌル文字インジェクションの 技術的・セキュリティ的な根本を理解 バイナリセーフ(ヌル文字に意味がない) 非バイナリセーフ(ヌル文字が文字列終端) ヌル文字の解釈の違い → 処理に相違が発生 一文字でも意味がある文字(バイト)があると インジェクション攻撃の可能性が発生する 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 80 基本的にこの構造は文字に意味 がある 全てのインターフェースに共通 インジェクション攻撃に共通
  81. 81. 改行インジェクション 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 81
  82. 82. ヌル文字インジェクションに 類似したセキュリティ問題 • HTTPヘッダーインジェクション • 別名: HTTPレスポンススプリッティング HTTPヘッダー分割 改行インジェクション • メールヘッダーインジェクション • 別名: 改行インジェクション 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 82
  83. 83. HTTPヘッダーインジェクション • header()/setcookie()関数で対策済み • PHPからHTTPヘッダーを送る手段は header()/setcookie()しかない(基本的には) • 自分でソケット作ったり、cURLでリクエストを送ったりすると、当 然自分でHTTPヘッダーを取り扱うことになる • 新しいRFCでは複数行にまたがる単一HTTPヘッダー は許可されていない • IEは既にこのタイプのヘッダーは無視している • HTTPヘッダーに改行を許さない、でOK 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 83
  84. 84. メールヘッダーインジェクション 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 84 • mail関数にはメールヘッダーインジェクション脆弱性が 残されている • https://github.com/php/php-src/pull/1273 • https://bugs.php.net/bug.php?id=68776 [2015-01-09 09:59 UTC] yohgaki@php.net Description: ------------ mb_send_mail() parses additional headers and stores into hash. During the parse process, invalid headers are discarded. However, mail() simply check ¥0 and strip trailing ¥r¥n. Therefore, mail() is vulnerable to mail header injections via additional header parameter.
  85. 85. メールヘッダーインジェクション 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 85 • https://bugs.php.net/bug.php?id=68776 はセキュリティバグとして処理されていない • PHPコミッターはどう考えているのか? • 入力バリデーションは当たり前 • PHP本体だけでなく3rdパーティモジュールもある • そもそもPHPプログラム/ライブラリ/フレームワークの脆弱性も考 慮すべき • 例)ZendFramework 1.xのメールヘッダーインジェクション
  86. 86. 改行インジェクションとは • 一行が意味を持つプロトコルに有効な攻撃手法 • HTTPプロトコル • SMTPプロトコル • その他、一行が意味を持つプロトコルほぼ全て 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 86 問題の本質を知ることが、 問題への対応・解決への近道 HTTPヘッダレスポンススプリッ ティング、メールヘッダーイン ジェクションの理解は 本質の理解に比べ重 要ではない 例:memcachedインジェクション
  87. 87. 改行インジェクションの 技術的・セキュリティ的な根本を理解 ・一行ごとに意味がある 余計な改行は余計な意味を追加する → 余計な処理が発生 一文字でも意味がある文字(バイ ト)があるとインジェクション攻撃 の可能性が発生する 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 87
  88. 88. ヌル文字・改行インジェクションの 技術的・セキュリティ的な根本を理解 ・バイナリセーフ(ヌル文字に意味がない) ・非バイナリセーフ(ヌル文字が文字列終端) ヌル文字の解釈の違い → 処理に相違が発生 一文字でも意味がある文字(バイト)があると インジェクション攻撃の可能性が発生する 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 88 固定長インターフェースの インジェクション攻撃には オーバーフロー攻撃が有効 C言語のバッファーオーバーフロー攻撃が有名だが、 固定長テキストデータでも同類の攻撃が可能な場合もある 基本的にこの構造は全ての 可変長インターフェースの インジェクション攻撃に共通
  89. 89. セキュアプログラミング 防御的プログラミング セキュア/防御的プログラミングのエッセンス 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 89
  90. 90. あらゆる脆弱性に対策できる 根本的脆弱性対策を理解する セキュアプログラミング/セキュアコーディング/防御的プログ ラミングの中でも重要な契約プログラミングを紹介 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 90
  91. 91. セキュリティ脆弱性に対する攻撃とは システムやプログラムに対して コード・命令を挿入し 意図しない動作をさせる 攻撃者のコード・命令を実行させ る 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 91 ※インジェクション攻撃の場合。認証/認可/DoSなどは別
  92. 92. セキュリティ脆弱性に対する攻撃とは システムやプログラムに対して コード・命令を挿入し 意図しない動作をさせる 攻撃者のコード・命令を実行させ る 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 92 ※インジェクション攻撃の場合。認証/認可/DoSなどは別 セキュリティ問題となる大多数 が インジェクション攻撃
  93. 93. セキュリティ脆弱性に対する攻撃とは システムやプログラムに対 して コード・命令を挿入し 意図しない動作をさせる 攻撃者のコード・命令を実 行させる 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 93 ここで防御するには バグフリーが必要 アプリケーション の制御範囲外
  94. 94. セキュリティ脆弱性に対する攻撃とは システムやプログラムに対 して コード・命令を挿入し 意図しない動作をさせる 攻撃者のコード・命令を実 行させる 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 94 防御ポイント 防御ポイント
  95. 95. セキュリティ脆弱性に対する攻撃とは システムやプログラムに対 して コード・命令を挿入し 意図しない動作をさせる 攻撃者のコード・命令を実 行させる 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 95 入力バリデーション エスケープ エンコード API 出力バリデーション
  96. 96. 全体最適化と部分最適化 • 全体として最適化しない場合、目的が達成でき ない 全体最適化 • 部分最適化も重要だが、 部分最適化では全体最適は実現しない • 合成の誤謬 • http://blog.ohgaki.net/fallacy-of-composition-and-it- security 部分最適化 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 96
  97. 97. 部分最適化で 全体最適化ができない理由 • 部分最適化の場合、アプリケーションロジックの中に セキュリティ対策が埋没する • アプリケーションロジックのバグは発見しづらい • しかも、変更が多い • アプリ自体の仕様変更、リファクタリング(継続的開発) • テストの主目的が「正常系」テスト • ライブラリ/フレームワークの更新・バージョンアップ • OS/低層ライブラリの更新・バージョンアップ • 個々の対策を積み重ねても、全体的に対策した状態にな らない 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 97
  98. 98. 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 98 Webアプリ 情報 HTML/CSS FW/API OSコマンド パス SQL/Xpath/ LDAP/etc JavaScript GET/POST/ HEADER Web サービス 信頼境界線 信頼境界線を越える“もの” は“安全性の担保”が必要 つまり、入出力制御 これらはテキストI/Fでバリデーション・エスケープは必須
  99. 99. 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 99 入力 入力入力入力入力 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 構造化プログラミン グでは低いレイヤー で処理をまとめる セキュリティ処理も 古いアプリの 作り方
  100. 100. 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 100 入力 入力入力入力入力 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 構造化プログラミ ングでは処理をま とめる 安全な処理をし ていない場合、 攻撃可能に 古いアプリの 作り方
  101. 101. 契約プログラミング 契約のよる設計の構造 2014/10/11 PHPカンファレンス2014 101
  102. 102. 契約プログラミングの基本 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 102 入力ソース 入力処理 ロジック処理 出力処理 出力 呼び出しが契約に 適合している確認 出力・状態が契約 に適合しているか 確認 開発時 Assert()などを実行 契約確認なし 契約確認なし 運用時 Assert()などは実行されない
  103. 103. 2014/10/11PHPカンファレンス2014 103 入力 入力入力入力入力 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 契約プログラミン グでは入力が契約 を守っているか入 出力で確認 万が一セキュリ ティ処理がなく ても安全になる ことが多い 信頼境界線 ここで追加のセキュリティ確認も勿論OK。縦深防御(多重のセキュリティ・多層防御)
  104. 104. 2014/10/11PHPカンファレンス2014 104 入力 入力入力入力入力 入力処理 入力処理 入力処理 入力処理 入力処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 出力処理 出力処理 出力処理 出力処理 信頼境界線 出力 出力出力出力出力 信頼境界線 出力処理 多くのリスクを緩 和するセキュアな アーキテクチャ
  105. 105. セキュアな入出力制御で 対策・緩和できる脆弱性 入力 出力 CWE High CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('PathTraversal') Mod High CWE-78: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') Mod High CWE-79: Improper Neutralization of Input DuringWeb Page Generation ('Cross-site Scripting') Mod High CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection') Mod CWE-120: Buffer Copy without Checking Size of Input ('Classic Buffer Overflow') Mod CWE-131: IncorrectCalculation of Buffer Size High CWE-134: Uncontrolled Format String Mod CWE-190: Integer Overflow orWraparound Mod CWE-434: UnrestrictedUpload of File with DangerousType Mod Mod CWE-601: URL Redirection to Untrusted Site ('Open Redirect') Mod High CWE-676: Use of Potentially Dangerous Function Ltd CWE-732: Incorrect Permission Assignment for Critical Resource Mod CWE-807: Reliance on Untrusted Inputs in a Security Decision High CWE-829: Inclusion of Functionality from UntrustedControl Sphere DiD CWE-862: Missing Authorization 2014/10/11PHPカンファレンス2014 105
  106. 106. 「入力」「出力」を確実にする だけで8割9割の 脆弱性を防止・緩和可能 2014/10/11PHPカンファレンス2014 106
  107. 107. 職人技セキュリティから エンジニアリングされた セキュリティへ 2014/10/11PHPカンファレンス2014 107
  108. 108. 2014/10/11PHPカンファレンス2014 108 入力 入力入力入力入力 入力処理 入力処理 入力処理 入力処理 入力処理 処理 処理 処理 処理 処理 処理 処理 処理 処理 出力処理 出力処理 出力処理 出力処理 信頼境界線 出力 出力出力出力出力 信頼境界線 出力処理 出力処理に問題が あっても 出力処理に問題が あっても、結果的に 安全である場合も多 い 途中の処理に問題 があっても
  109. 109. アプリの入力・出力の 安全性確保は セキュアアプリの 土台・基礎 2014/10/11 PHPカンファレンス2014 109
  110. 110. 継続的インテグレーション 高速な開発サイクルも 契約プログラミングで 効率化 2014/10/11 PHPカンファレンス2014 110
  111. 111. 間違えてはならないのは 契約プログラミング 契約による設計でも 2014/10/11PHPカンファレンス2014 111 多層防御は必要!
  112. 112. セキュアなプログラムの基本構造 2014/10/11PHPカンファレンス2014 112 入力ソース 入力処理 ロジック処理 出力処理 出力 バリデーションで 攻撃可能範囲を 限定・緩和 出力で完全に安全 にできるデータは 完全に安全に エスケープ、セキュアAPI、 バリデーションで 攻撃可能範囲を限定・緩和 ロジックでも必要 なセキュリティ対 策は行う 多層防御
  113. 113. 普通のアプリは単純な 「入力→処理→出力」 ではない 2014/10/11PHPカンファレンス2014 113
  114. 114. セキュアなプログラムの基本構造 2014/10/11PHPカンファレンス2014 114 入力ソース 入力処理 ロジック処理 出力処理 出力 SQLクエリ 入力ソース 入力処理 ロジック処理 出力処理 出力 クエリ結果 WebAPI 入力ソース 入力処理 ロジック処理 出力処理 出力 API結果 HTML リクエスト
  115. 115. アプリは複数の 「入力→処理→出力」 の組み合わせの構造 2014/10/11PHPカンファレンス2014 115
  116. 116. ロジック処理 セキュアなプログラムの基本構造 2014/10/11PHPカンファレンス2014 116 入力ソース 入力処理 出力処理 出力 入力ソース 入力処理 ロジック処理 出力処理 出力 入力ソース 入力処理 ロジック処理 出力処理 出力 入力ソース 入力処理 ロジック処理 出力処理 出力
  117. 117. 契約プログラミング 契約による設計は 高性能 2014/10/11PHPカンファレンス2014 117
  118. 118. 例:文字エンコーディング のバリデーション 2014/10/11PHPカンファレンス2014 118
  119. 119. 2014/10/11PHPカンファレンス2014 119 入力ソース 入力処理 ロジック処理 出力処理 出力 ロジック処理 ロジック処理 ロジック処理 入力ソース 入力処理 ロジック処理 出力処理 出力 ロジック処理 ロジック処理 ロジック処理 バリデーション バリデーション バリデーション バリデーション バリデーション バリデーション
  120. 120. 契約プログラミング 契約による設計は セキュア 2014/10/11PHPカンファレンス2014 120
  121. 121. 2014/10/11PHPカンファレンス2014 121 入力ソース 入力処理 ロジック処理 出力処理 出力 ロジック処理 ロジック処理 ロジック処理 バリデーション エスケープ API バリデーション 仮にバリデーション漏 れがあったとしても 入力バリデーションが 確実に行われ安全性が 保障できる場合もある 個々のロジック処理でも、 信頼境界線を越える入出 力には「契約」の順守が 求められる ↓ 安全性の担保が行われる 可能な限りの安全性対 策を行う
  122. 122. 2014/10/11PHPカンファレンス2014 122 入力ソース 入力処理 ロジック処理 出力処理 出力 ロジック処理 ロジック処理 ロジック処理 バリデーション エスケープ API バリデーション 縦深防御も忘れずに! ロジック中にも入出力 があることにも注意!
  123. 123. ロジック処理 セキュアなプログラムの基本構造 2014/10/11PHPカンファレンス2014 123 入力ソース 入力処理 出力処理 出力 入力ソース 入力処理 ロジック処理 出力処理 出力 入力ソース 入力処理 ロジック処理 出力処理 出力 入力ソース 入力処理 ロジック処理 出力処理 出力 縦深防御も忘れずに! ロジック中にも入出力 があることにも注意! 適度な粒度(モジュー ル単位など)で境界防 御(縦深防御)
  124. 124. 情報セキュリティ対策とは • 対策・緩和策を積み重ねて、 データ/プログラムの安全性を管理 • 安全性を管理する、とは • リスクを管理する、であり • 許容可能な程度までリスクを緩和する • 万が一のインシデント発生時には原因が判るようにする • CIAに加え、Accountabilityも重要なセキュリティ要素 • この他にAuthenticityも重要なセキュリティ要素 2014/10/11PHPカンファレンス2014 124
  125. 125. 参考にすべき セキュアコーディングガイド 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 125 • CERT Secure Coding Standard • http://blog.ohgaki.net/cert-top-10-secure-coding- standard • CWE/SANS TOP 25 • http://blog.ohgaki.net/sans-cwe-top-25-monster- mitigation • OWASP Secure Coding Practices • http://blog.ohgaki.net/owasp-secure-coding- practices-quick-reference-guide
  126. 126. 安全かつ高速な 部品・サービスを作るには、 契約プログラミングが有効 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 126
  127. 127. 入力バリデーションは 第一のセキュリティ対策 By CERT/SANS/OWASP 入力バリデーションで 未知・うっかり脆弱性にも対応可能 セキュリティ対策として必ず実行 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 127
  128. 128. PHPポケットリファレンス 第三版 • カンファレンス会場で販売中 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 128
  129. 129. お問い合わせ・ご相談は Web開発、セキュリティで困ったら エレクトロニック・サービス・イニシアチブ http://www.es-i.jp/ 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 129
  130. 130. ご清聴 ありがとうございました 2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 130

×