phpにない セキュリティ機能 - yohgaki's blog · phpのinclude文は...
TRANSCRIPT
![Page 1: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/1.jpg)
PHPにないセキュリティ機能無い機能と在る機能エレクトロニック・サービス・イニシアチブ
![Page 2: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/2.jpg)
自己紹介
• 氏名:大垣 靖男(おおがき やすお)
• 職業:
• PHPコミッター
• エレクトロニック・サービスイニチアチブ代表取締役社長
• 岡山大学大学院非常勤講師/PHP技術者認定機構顧問など
• Webサイト構築関連のコンサルティングなど• テクニカル・セキュア開発(開発体制・コード検査・ツール販売・セキュリティパッチサービス)など
• ネット
• http://blog.ohgaki.net/
• yohgaki – Facebook/Twitterなど
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 2
![Page 3: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/3.jpg)
未修正、未公開の危険な脆弱性解説を期待していた方、それは有り得ません。ご了承ください。
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 3
![Page 4: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/4.jpg)
内容・既知の脆弱性・過去の脆弱性・セキュアプログラミング
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 4
![Page 5: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/5.jpg)
注意事項
このプレゼンはライトニングトークが30分続きます!
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 5
![Page 6: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/6.jpg)
実際にないセキュリティ機能
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 6
![Page 7: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/7.jpg)
何が無いのか?知れば自分で対策できる
後半のセキュアプログラミングを実践すれば、自分で何が無いのか見つけられる
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 7
![Page 8: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/8.jpg)
セッションモジュールの脆弱性
• HTTPセッションはWebアプリケーションセキュリティの要なのでロックソリッド?!
• 実は結構いい加減
• そもそもクッキーの仕組みがいい加減
• そしてセッションマネージャーの実装もいい加減
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 8
![Page 9: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/9.jpg)
セッションモジュールの脆弱性その1セッションアダプション
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 9
![Page 10: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/10.jpg)
セッションアダプション
• ここで言うセッションアダプションとはクラッシックなアダプティブなセッションマネージャーの事
• 未初期化のセッションIDを有効なセッションIDをして受け入れる脆弱性
• PHP 5.4のセッションモジュールにはuse_strict_modeが無い
• つまりアダプティブなセッション管理
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 10
JavaScriptインジェクションに脆弱なアプ
リ
消えないセッションIDクッキー設定
攻撃者は常にターゲットのログインセッションを乗っ取
り可能に
![Page 11: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/11.jpg)
ブラウザのクッキー管理もいい加減
• いい加減なクッキー管理により消えないクッキーを設定可能
• クッキーのdomain、path、secure、httponly属性の取り扱いがブラウザによって異なる
• 設定の順序によって分けの解らない動作をするブラウザもある
• 比較的最近のRFC改定によりブラウザが最も優先順位が高いとするクッキーのみが送信される
• 昔の動作であれば、同じ名前のクッキーが複数送られてきたのでサーバー側で不正なクッキーの検出が可能であったが、現在は検出不可能
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 11
![Page 12: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/12.jpg)
ブラウザのクッキー管理もいい加減
• 更に悪いことに今の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/");
![Page 13: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/13.jpg)
セッションモジュールの脆弱性その2古いセッションの削除
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 13
![Page 14: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/14.jpg)
不正確なセッション削除
• セッションアダプションと同じく10年来知られている脆弱性
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 14
session_regenerate_id();
![Page 15: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/15.jpg)
session_regenerate_id()の動作
• オプション引数なしでは古いセッションを削除しない
• session_regenerate_id(true)は直ちに古いセッションを削除する
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 15
直ちに古いセッションを削除!
これで万事OK!
これで万事OKではない
![Page 16: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/16.jpg)
直ちに古いセッションを削除はNG
• WebサーバーとWebクライアント(ブラウザ)は非同期
• Webクライアントは複数接続を利用
• ネットワーク環境は不安定(モバイル)
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 16
レースコンディション、パケットのロストで突然セッ
ションが消える
![Page 17: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/17.jpg)
不正確なセッション削除
• セッションアダプションと同じく10年来知られている脆弱性
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 17
session_regenerate_id();10年以上前にこの関数が追加された時、
セッションが消えると困るのでデフォルトでは削除しない仕様に変更
GCに任せておけば、そのうち消える
![Page 18: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/18.jpg)
GC任せのセッション削除の問題
• PHPのセッションGCは「確率ベース」
• トラフィックの少ないサイトではなかなか削除されない
• 攻撃者がセッションハイジャックしている場合、新旧両方のセッションが有効
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 18
![Page 19: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/19.jpg)
この問題への取り組み• ユーザーランドで対応が可能
• 削除フラグ+タイムスタンプで確認するだけ
• 詳しくは「間違いだらけの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
![Page 20: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/20.jpg)
不正なスクリプト/ファイルの実行防止
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 20
![Page 21: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/21.jpg)
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
![Page 22: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/22.jpg)
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!!
確実にパースエラー
単純な画像ヘッダーのチェックなら回避できるが、まともにバリデーションしていればパースエラー
![Page 23: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/23.jpg)
PHPのinclude文は読み込み・実行に脆弱
• 過去に数年間にわたり様々な改善提案
• “非”埋め込みモード:他の言語並みに安全
• 拡張子ホワイトリスト:.phar, .phpのみ実行許可
• スクリプトホワイトリスト:実行可能なスクリプトを指定
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 23
今はココです。開発者うけも比較的よくこの提案なら承認されるかも。
Opcacheにプリロードするので実行速度も向上する
![Page 24: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/24.jpg)
PHP7のタイプヒント
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 24
![Page 25: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/25.jpg)
PHP7のタイプヒントには任意精度数値がない
• データ型は単純に指定すれば良い、物ではない
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 25
Validate for expected data types
OWASP Secure Coding Practices(v2) – Input Validation
整数型のデータ型には、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
![Page 26: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/26.jpg)
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に精度指定は無い
![Page 27: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/27.jpg)
タイプヒントエラーで例外が発生
• 実際にどのような例外になるのか、現在議論中
• おそらくthrowableを継承したタイプエラー例外
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 27
例外をキャッチしないとスクリプトの実行が終了
![Page 28: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/28.jpg)
重要:データ型は指定すれば良い、という物ではない
• PHPがサポートするデータ型(整数、浮動小数点)の範囲を超えるデータにはint/floatタイプヒントを使ってはならない
• 年齢や月など確実に範囲内に収まるデータにのみint/floatタイプヒントを使う
• 全ての例外・エラーはキャッチする
• PHP7のZPPではデータ型の範囲内かチェックしエラー(例外でなく、エラーです。今のところ)が発生する
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 28
![Page 29: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/29.jpg)
整数オーバーフローを検出できない
• 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
![Page 30: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/30.jpg)
JavaScriptエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 30
![Page 31: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/31.jpg)
PHPはWeb用言語なのにJavaScriptエスケープ関数が無い
• 無いものは仕方ありません。
• 参考
• http://blog.ohgaki.net/javascript-string-escape
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 31
![Page 32: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/32.jpg)
LDAPエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 32
![Page 33: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/33.jpg)
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
![Page 34: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/34.jpg)
XPathエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 34
![Page 35: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/35.jpg)
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
![Page 36: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/36.jpg)
SQL識別子エスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 36
![Page 37: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/37.jpg)
SQL識別子エスケープが無い
• PostgreSQLモジュールにはSQL識別子エスケープ関数(pg_escape_identifier)がある
• 他のDBモジュールには無い
• DBMS自体は識別子エスケープを定義
• しかし、PostgreSQLを除いてクライアントアクセスライブラリに識別子エスケープAPIがない
• 仕様として問題
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 37
![Page 38: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/38.jpg)
JSONエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 38
![Page 39: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/39.jpg)
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
![Page 40: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/40.jpg)
JSON Numeric
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 40
![Page 41: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/41.jpg)
JSON Numeric型はint/floatに自動変換されてしまう
• intはオプションで文字列のまま取得可能
• floatは無理
• PHP7用にオプションで文字列のまま取得可能にするよう検討中
• 基本的にこのような自動変換/型の強制はセキュリティ的に問題
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 41
![Page 42: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/42.jpg)
HTMLコンテクストエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 42
![Page 43: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/43.jpg)
HTMLエスケープはあるがその他コンテクスト用エスケープが無い
• OWASP ESAPIは各コンテスト用のエスケープ(エンコード)メソッドを提供
• https://github.com/OWASP/PHP-ESAPI
• 最近は更新されていない
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 43
![Page 44: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/44.jpg)
htmlspecialcharsはデフォルトで安全でない
• PHP 5.6未満は明示的文字エンコーディング設定が必要
• PHP 5.6以降はdefault_charsetが利用される
• ‘ (シングルクオート)をデフォルトでエスケープしない
• HTML5に対応していない
• / のエスケープに対応していない。HTML5ではクオート文字なしの属性が許される
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 44
![Page 45: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/45.jpg)
OSコマンドエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 45
![Page 46: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/46.jpg)
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
![Page 47: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/47.jpg)
XMLエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 47
![Page 48: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/48.jpg)
XML用のエスケープがない
• 無いです
• htmlspecialchars/htmlentitiesが流用可能
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 48
![Page 49: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/49.jpg)
LIKEエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 49
![Page 50: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/50.jpg)
SQL文のLIKEエスケープがない
• おかしなクエリ結果が返るだけで、セキュリティ上のインパクトがあることは少ない
• しかし、余計な結果が表示されることが問題となる場合も
• そもそもDBMSがエスケープAPIを提供していない
• “%”、“_”をエスケープ
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 50
![Page 51: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/51.jpg)
正規表現メタ文字
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 51
![Page 52: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/52.jpg)
正規表現メタ文字エスケープ関数がない
• 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
![Page 53: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/53.jpg)
入力バリデーター
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 53
![Page 54: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/54.jpg)
使いやすい入力バリデーターが無い
• Filterモジュールは在る
• http://php.net/manual/ja/book.filter.php
• 入力バリデーターとして使いやすい、とは言いがたい
• フレームワークのバリデーターを使いましょう
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 54
![Page 55: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/55.jpg)
PHPに在った脆弱性PHPに無かったセキュリティ機能
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 55
![Page 56: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/56.jpg)
どんな問題が在ったのか?知れば対策できる
自分のコードのセキュリティ問題でなくても、自分のコードで対策できる
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 56
![Page 57: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/57.jpg)
タイプコンフュージョン
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 57
![Page 58: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/58.jpg)
タイプコンフュージョン
• タイプコンフュージョンとは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 Infoleak Vulnerability in unserialize()+ with SoapFault). (Dmitry)
![Page 59: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/59.jpg)
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変数の構造体
実際に変数を保存するユニオン構造体
![Page 60: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/60.jpg)
タイプコンフュージョン
ユニオン構造体はメモリ領域を
共有
つまり整数型であると仮定して処理していて、配列型が渡された場合、ハッシュのメモリアドレスが判る
ハッシュのメモリアドレスが判ると、ハッシュ構造体がデストラクタを持っていることを利用し、ヒープ領域で任意コード実行ができる。
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 60
ただし、そのメモリに書き込める別の脆弱性が必要
![Page 61: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/61.jpg)
タイプコンフュージョンは終わったか?
• PHPのモジュールは多様
• 多数の3rdパーティーモジュール
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 61
対応済みなので安心!
![Page 62: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/62.jpg)
タイプコンフュージョンは終わったか?
• PHPのモジュールは多様
• 多数の3rdパーティーモジュール
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 62
対応済みなので安心?
BeDefensive!
![Page 63: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/63.jpg)
Use After Free
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 63
![Page 64: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/64.jpg)
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 toCURLOPT_FILE/_INFILE/_WRITEHEADER). (Laruence)
- Sqlite3:. Fixed bug #66550 (SQLite prepared statement use-after-free).(Sean Heelan)
![Page 65: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/65.jpg)
Use After Free
• 開放済みメモリにアクセスしてしまう脆弱性
• 高度なメモリ破壊攻撃の一種
• スタックオーバーフローは単純なメモリ破壊攻撃
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 65
別の変数のメモリが割り当てられる
解放後のポインタを使い不正にメモリに書き込み
別の変数のメモリが開放される
メモリの解放後に
メモリマネージャーのデストラクタを書き換える
改ざんデストラクタが実行される
![Page 66: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/66.jpg)
PHPユーザーの防御策(緩和策)
出来る限り厳格な入力バリデーションを行う
• 数値データのみなら文字列でも20バイトも無い
• 20バイト以下のシェルコードは困難
• 数字だけでは無理(ただし、制御コードなしのシェルコードは可能)
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 66
CERT Top 10 セキュアコーディングプラクティス1. 入力をバリデーションする全ての信頼できないデータソースからの入力をバリデーションする。適切な入力バリデーションは非常に多くのソフトウェア脆弱性を排除できる。ほぼ全ての外部データソースに用心が必要である。これらにはコマンドライン引数、ネットワークインターフェース、環境変数やユーザーが制御可能なファイルなどが含まれる。
![Page 67: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/67.jpg)
include文に対するヌル文字インジェクション対策
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 67
![Page 68: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/68.jpg)
include文に対するヌル文字インジェクション
• 例
<?php
include(“/path/to/any.file¥0.png”);
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 68
![Page 69: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/69.jpg)
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
![Page 70: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/70.jpg)
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までがファイル名として解釈される
![Page 71: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/71.jpg)
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”なら
![Page 72: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/72.jpg)
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)
![Page 73: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/73.jpg)
他の言語での対応
• PHPの後で同様の対応が行われる
• 画像処理やSSL関連脆弱性ではこのパターン(PHPの後追い)が結構多い
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 73
![Page 74: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/74.jpg)
ヌル文字インジェクション
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 74
![Page 75: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/75.jpg)
ヌル文字インジェクションは終わったか?
• ついこの前のリリースでも脆弱性が修正される
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など
![Page 76: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/76.jpg)
ヌル文字インジェクションは終わったか?
• ストリームラッパー以外の場所での対応
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 76
diff --git a/ext/standard/file.c b/ext/standard/file.cindex 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”タイプはヌル文字を拒否
![Page 77: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/77.jpg)
ヌル文字インジェクションは終わったか?
• ストリームラッパー以外の場所での対応
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 77
diff --git a/ext/standard/file.c b/ext/standard/file.cindex 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”タイプに未対応
ならヌル文字インジェクションに脆弱になる
![Page 78: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/78.jpg)
ヌル文字インジェクションは終わったか?
• ストリームラッパー以外の場所、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
![Page 79: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/79.jpg)
ヌル文字インジェクションの技術的・セキュリティ的な根本を理解
バイナリセーフ(ヌル文字に意味がない)非バイナリセーフ(ヌル文字が文字列終端)
ヌル文字の解釈の違い → 処理に相違が発生
一文字でも意味がある文字(バイト)があるとインジェクション攻撃の可能性が発生する
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 79
![Page 80: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/80.jpg)
ヌル文字インジェクションの技術的・セキュリティ的な根本を理解
バイナリセーフ(ヌル文字に意味がない)
非バイナリセーフ(ヌル文字が文字列終端)
ヌル文字の解釈の違い → 処理に相違が発生
一文字でも意味がある文字(バイト)があると
インジェクション攻撃の可能性が発生する
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 80
基本的にこの構造は文字に意味がある
全てのインターフェースに共通
インジェクション攻撃に共通
![Page 81: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/81.jpg)
改行インジェクション
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 81
![Page 82: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/82.jpg)
ヌル文字インジェクションに類似したセキュリティ問題
• HTTPヘッダーインジェクション
• 別名:HTTPレスポンススプリッティングHTTPヘッダー分割改行インジェクション
• メールヘッダーインジェクション
• 別名:改行インジェクション
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 82
![Page 83: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/83.jpg)
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
![Page 84: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/84.jpg)
メールヘッダーインジェクション
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] [email protected]:------------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.
![Page 85: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/85.jpg)
メールヘッダーインジェクション
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のメールヘッダーインジェクション
![Page 86: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/86.jpg)
改行インジェクションとは
• 一行が意味を持つプロトコルに有効な攻撃手法
• HTTPプロトコル
• SMTPプロトコル
• その他、一行が意味を持つプロトコルほぼ全て
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 86
問題の本質を知ることが、
問題への対応・解決への近道
HTTPヘッダレスポンススプリッティング、メールヘッダーイン
ジェクションの理解は
本質の理解に比べ重要ではない
例:memcachedインジェクション
![Page 87: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/87.jpg)
改行インジェクションの技術的・セキュリティ的な根本を理解
・一行ごとに意味がある
余計な改行は余計な意味を追加する→ 余計な処理が発生
一文字でも意味がある文字(バイト)があるとインジェクション攻撃の可能性が発生する
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 87
![Page 88: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/88.jpg)
ヌル文字・改行インジェクションの技術的・セキュリティ的な根本を理解
・バイナリセーフ(ヌル文字に意味がない)
・非バイナリセーフ(ヌル文字が文字列終端)
ヌル文字の解釈の違い → 処理に相違が発生
一文字でも意味がある文字(バイト)があると
インジェクション攻撃の可能性が発生する
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 88
固定長インターフェースのインジェクション攻撃にはオーバーフロー攻撃が有効
C言語のバッファーオーバーフロー攻撃が有名だが、固定長テキストデータでも同類の攻撃が可能な場合もある
基本的にこの構造は全ての可変長インターフェースの
インジェクション攻撃に共通
![Page 89: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/89.jpg)
セキュアプログラミング防御的プログラミング
セキュア/防御的プログラミングのエッセンス
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 89
![Page 90: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/90.jpg)
あらゆる脆弱性に対策できる根本的脆弱性対策を理解する
セキュアプログラミング/セキュアコーディング/防御的プログラミングの中でも重要な契約プログラミングを紹介
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 90
![Page 91: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/91.jpg)
セキュリティ脆弱性に対する攻撃とは
システムやプログラムに対して
コード・命令を挿入し
意図しない動作をさせる
攻撃者のコード・命令を実行させる
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 91
※インジェクション攻撃の場合。認証/認可/DoSなどは別
![Page 92: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/92.jpg)
セキュリティ脆弱性に対する攻撃とは
システムやプログラムに対して
コード・命令を挿入し
意図しない動作をさせる
攻撃者のコード・命令を実行させる
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 92
※インジェクション攻撃の場合。認証/認可/DoSなどは別
セキュリティ問題となる大多数が
インジェクション攻撃
![Page 93: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/93.jpg)
セキュリティ脆弱性に対する攻撃とは
システムやプログラムに対して
コード・命令を挿入し
意図しない動作をさせる
攻撃者のコード・命令を実行させる
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 93
ここで防御するにはバグフリーが必要
アプリケーションの制御範囲外
![Page 94: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/94.jpg)
セキュリティ脆弱性に対する攻撃とは
システムやプログラムに対して
コード・命令を挿入し
意図しない動作をさせる
攻撃者のコード・命令を実行させる
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 94
防御ポイント
防御ポイント
![Page 95: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/95.jpg)
セキュリティ脆弱性に対する攻撃とは
システムやプログラムに対して
コード・命令を挿入し
意図しない動作をさせる
攻撃者のコード・命令を実行させる
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 95
入力バリデーション
エスケープエンコード
API出力バリデーション
![Page 96: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/96.jpg)
全体最適化と部分最適化
• 全体として最適化しない場合、目的が達成できない
全体最適化
• 部分最適化も重要だが、部分最適化では全体最適は実現しない
• 合成の誤謬
• http://blog.ohgaki.net/fallacy-of-composition-and-it-security
部分最適化
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 96
![Page 97: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/97.jpg)
部分最適化で全体最適化ができない理由
• 部分最適化の場合、アプリケーションロジックの中にセキュリティ対策が埋没する
• アプリケーションロジックのバグは発見しづらい
• しかも、変更が多い
• アプリ自体の仕様変更、リファクタリング(継続的開発)
• テストの主目的が「正常系」テスト
• ライブラリ/フレームワークの更新・バージョンアップ
• OS/低層ライブラリの更新・バージョンアップ
• 個々の対策を積み重ねても、全体的に対策した状態にならない
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 97
![Page 98: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/98.jpg)
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でバリデーション・エスケープは必須
![Page 99: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/99.jpg)
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 99
入力 入力入力入力入力
処理 処理 処理 処理 処理
処理 処理 処理 処理
処理 処理 処理 処理 処理
処理 処理 処理 処理
構造化プログラミングでは低いレイヤーで処理をまとめるセキュリティ処理も
古いアプリの作り方
![Page 100: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/100.jpg)
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 100
入力 入力入力入力入力
処理 処理 処理 処理 処理
処理 処理 処理 処理
処理 処理 処理 処理 処理
処理 処理 処理 処理
構造化プログラミングでは処理をま
とめる
安全な処理をしていない場合、攻撃可能に
古いアプリの作り方
![Page 101: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/101.jpg)
契約プログラミング契約のよる設計の構造
2014/10/11 PHPカンファレンス2014 101
![Page 102: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/102.jpg)
契約プログラミングの基本
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 102
入力ソース
入力処理
ロジック処理
出力処理
出力
呼び出しが契約に適合している確認
出力・状態が契約に適合しているか
確認
開発時
Assert()などを実行
契約確認なし
契約確認なし
運用時
Assert()などは実行されない
![Page 103: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/103.jpg)
2014/10/11PHPカンファレンス2014 103
入力 入力入力入力入力
処理 処理 処理 処理 処理
処理 処理 処理 処理
処理 処理 処理 処理 処理
処理 処理 処理 処理
契約プログラミングでは入力が契約を守っているか入出力で確認
万が一セキュリティ処理がなくても安全になることが多い
信頼境界線
ここで追加のセキュリティ確認も勿論OK。縦深防御(多重のセキュリティ・多層防御)
![Page 104: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/104.jpg)
2014/10/11PHPカンファレンス2014 104
入力 入力入力入力入力
入力処理 入力処理 入力処理 入力処理 入力処理
処理 処理 処理 処理
処理 処理 処理 処理 処理
出力処理 出力処理 出力処理 出力処理
信頼境界線
出力 出力出力出力出力
信頼境界線
出力処理
多くのリスクを緩和するセキュアなアーキテクチャ
![Page 105: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/105.jpg)
セキュアな入出力制御で対策・緩和できる脆弱性
入力 出力 CWE
High CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
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 During Web 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: Incorrect Calculation of Buffer Size
High CWE-134: Uncontrolled Format String
Mod CWE-190: Integer Overflow or Wraparound
Mod CWE-434: Unrestricted Upload of File with Dangerous Type
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 Untrusted Control Sphere
DiD CWE-862: Missing Authorization
2014/10/11PHPカンファレンス2014 105
![Page 106: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/106.jpg)
「入力」「出力」を確実にするだけで8割9割の脆弱性を防止・緩和可能
2014/10/11PHPカンファレンス2014 106
![Page 107: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/107.jpg)
職人技セキュリティからエンジニアリングされたセキュリティへ
2014/10/11PHPカンファレンス2014 107
![Page 108: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/108.jpg)
2014/10/11PHPカンファレンス2014 108
入力 入力入力入力入力
入力処理 入力処理 入力処理 入力処理 入力処理
処理 処理 処理 処理
処理 処理 処理 処理 処理
出力処理 出力処理 出力処理 出力処理
信頼境界線
出力 出力出力出力出力
信頼境界線
出力処理
出力処理に問題があっても
出力処理に問題があっても、結果的に安全である場合も多
い
途中の処理に問題があっても
![Page 109: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/109.jpg)
アプリの入力・出力の安全性確保はセキュアアプリの土台・基礎
2014/10/11 PHPカンファレンス2014 109
![Page 110: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/110.jpg)
継続的インテグレーション高速な開発サイクルも契約プログラミングで効率化
2014/10/11 PHPカンファレンス2014 110
![Page 111: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/111.jpg)
間違えてはならないのは契約プログラミング契約による設計でも
2014/10/11PHPカンファレンス2014 111
多層防御は必要!
![Page 112: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/112.jpg)
セキュアなプログラムの基本構造
2014/10/11PHPカンファレンス2014 112
入力ソース
入力処理
ロジック処理
出力処理
出力
バリデーションで攻撃可能範囲を限定・緩和
出力で完全に安全にできるデータは完全に安全に
エスケープ、セキュアAPI、バリデーションで
攻撃可能範囲を限定・緩和
ロジックでも必要なセキュリティ対
策は行う
多層防御
![Page 113: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/113.jpg)
普通のアプリは単純な
「入力→処理→出力」
ではない
2014/10/11PHPカンファレンス2014 113
![Page 114: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/114.jpg)
セキュアなプログラムの基本構造
2014/10/11PHPカンファレンス2014 114
入力ソース
入力処理
ロジック処理
出力処理
出力
SQLクエリ
入力ソース
入力処理
ロジック処理
出力処理
出力
クエリ結果
WebAPI
入力ソース
入力処理
ロジック処理
出力処理
出力
API結果
HTML
リクエスト
![Page 115: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/115.jpg)
アプリは複数の
「入力→処理→出力」
の組み合わせの構造
2014/10/11PHPカンファレンス2014 115
![Page 116: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/116.jpg)
ロジック処理
セキュアなプログラムの基本構造
2014/10/11PHPカンファレンス2014 116
入力ソース
入力処理
出力処理
出力
入力ソース
入力処理
ロジック処理
出力処理
出力
入力ソース
入力処理
ロジック処理
出力処理
出力
入力ソース
入力処理
ロジック処理
出力処理
出力
![Page 117: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/117.jpg)
契約プログラミング契約による設計は高性能
2014/10/11PHPカンファレンス2014 117
![Page 118: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/118.jpg)
例:文字エンコーディングのバリデーション
2014/10/11PHPカンファレンス2014 118
![Page 119: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/119.jpg)
2014/10/11PHPカンファレンス2014 119
入力ソース
入力処理
ロジック処理
出力処理
出力
ロジック処理
ロジック処理
ロジック処理
入力ソース
入力処理
ロジック処理
出力処理
出力
ロジック処理
ロジック処理
ロジック処理
バリデーション
バリデーション
バリデーション
バリデーション
バリデーション
バリデーション
![Page 120: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/120.jpg)
契約プログラミング契約による設計はセキュア
2014/10/11PHPカンファレンス2014 120
![Page 121: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/121.jpg)
2014/10/11PHPカンファレンス2014 121
入力ソース
入力処理
ロジック処理
出力処理
出力
ロジック処理
ロジック処理
ロジック処理
バリデーション
エスケープAPI
バリデーション
仮にバリデーション漏れがあったとしても
入力バリデーションが確実に行われ安全性が保障できる場合もある
個々のロジック処理でも、信頼境界線を越える入出力には「契約」の順守が求められる
↓安全性の担保が行われる
可能な限りの安全性対策を行う
![Page 122: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/122.jpg)
2014/10/11PHPカンファレンス2014 122
入力ソース
入力処理
ロジック処理
出力処理
出力
ロジック処理
ロジック処理
ロジック処理
バリデーション
エスケープAPI
バリデーション
縦深防御も忘れずに!
ロジック中にも入出力があることにも注意!
![Page 123: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/123.jpg)
ロジック処理
セキュアなプログラムの基本構造
2014/10/11PHPカンファレンス2014 123
入力ソース
入力処理
出力処理
出力
入力ソース
入力処理
ロジック処理
出力処理
出力
入力ソース
入力処理
ロジック処理
出力処理
出力
入力ソース
入力処理
ロジック処理
出力処理
出力
縦深防御も忘れずに!
ロジック中にも入出力があることにも注意!
適度な粒度(モジュール単位など)で境界防御(縦深防御)
![Page 124: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/124.jpg)
情報セキュリティ対策とは
• 対策・緩和策を積み重ねて、データ/プログラムの安全性を管理
• 安全性を管理する、とは
• リスクを管理する、であり
• 許容可能な程度までリスクを緩和する
• 万が一のインシデント発生時には原因が判るようにする
• CIAに加え、Accountabilityも重要なセキュリティ要素
• この他にAuthenticityも重要なセキュリティ要素
2014/10/11PHPカンファレンス2014 124
![Page 125: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/125.jpg)
参考にすべきセキュアコーディングガイド
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
![Page 126: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/126.jpg)
安全かつ高速な部品・サービスを作るには、契約プログラミングが有効
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 126
![Page 127: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/127.jpg)
入力バリデーションは第一のセキュリティ対策By CERT/SANS/OWASP
入力バリデーションで未知・うっかり脆弱性にも対応可能
セキュリティ対策として必ず実行
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 127
![Page 128: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/128.jpg)
PHPポケットリファレンス 第三版
• カンファレンス会場で販売中
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 128
![Page 129: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/129.jpg)
お問い合わせ・ご相談は
Web開発、セキュリティで困ったら
エレクトロニック・サービス・イニシアチブhttp://www.es-i.jp/
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 129
![Page 130: PHPにない セキュリティ機能 - yohgaki's blog · PHPのinclude文は 読み込み・実行に脆弱 •過去に数年間にわたり様々な改善提案 •“非”埋め込みモード:他の言語並みに安全](https://reader033.vdocuments.net/reader033/viewer/2022050300/5f69092ce0a3dc3f6c6e2d14/html5/thumbnails/130.jpg)
ご清聴ありがとうございました
2015/5/30(c) Electronic Service Initiative, Ltd. All rights reserved. 130