2017の25日目です。前回は@watanabejunyaさんの「PHPでニューラルネットワークを実装してみる」でした。2017が発表され、ウェブのセキュリティ業界がざわついています。いうのも、2013年版までは入っていたCSRFが外され、以下の2つの脅威が選入されたからです。Deserialization)入門」という記事を書いていますので、そちらを参照ください。本稿では、XML外部実体参照(以下、XXEと表記)について説明します。XXEとはXXEは、XMLデータを外部から受け取り解析する際に生じる脆弱性です。具体的には、XMLの外部実体参照により起こります。ここで、XMLの実体(entity)は以下のように宣言するものです。例はWikipediaから拝借しました。いう形(実体参照)で参照します。World」だとすると、上記のXMLの実体参照は以下のように展開されます。World</ext></foo>ということは、XMLを受け付けるプログラムに外部実体宣言を含むXMLを食わせれば、ウェブサーバー内の任意のファイルを読み込み表示するという、あたかもディレクトリトラバーサルのような攻撃ができることになります。これがXXEの基本形です。サンプルプログラムここでXXE脆弱なサンプルを紹介します。年賀状の季節ですので、住所録を想定して、XML形式ファイルで個人情報をアップロードして登録するプログラムを用います。XMLファイルをアップロードするHTML。type="submit"/></form>XMLを受け取り登録する(実際には登録内容を表示するだけ)のプログラム。<br></body>ここで攻撃例として、以下のXMLファイルをアップロードします。<address>&pass;</address></user>表示は以下となります。root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/bin/shbin:x:2:2:bin:/bin:/bin/shsys:x:3:3:sys:/dev:/bin/sh【以下略】/etc/passwdの内容が表示されていることが分かります。7で提供されているlibxml2のバージョンが2.8.0というXXE対策のされていないバージョンだからです。libxml2の2.9.0以降は、外部実体をデフォルトでは読み込まないようにするという制限が加わり、上記の脆弱性デモは成功しなくなります。Debian7でもlibxml2に最新のパッチが当たっている環境では大丈夫です。Debianに限らず、CentOS(6以上)、Ubuntu(12.04以降)でも全てのパッチが当たっていれば大丈夫です。PHPでは、XXEは基本的に「プラットフォームの問題」といえます。新しいlibxml2でもXXE脆弱にする方法では、libxml2が2.9以降なら絶対安全かというと、アプリケーションレベルで外部実体を読み込む設定にしていれば、当然脆弱になります。上記のスクリプトだと、以下の追加によりそれは可能です。先程の攻撃スクリプトでは、ウェブサーバー上のファイルを読み出す攻撃を紹介しました。これ以外にhttp:等のURLを指定して、別サーバーの情報を読み出すという攻撃ができます。Forgery)と呼ばれ、外部から直接アクセスできないサーバー・機器への攻撃用の踏み台として用いることが可能です。攻撃シナリオとして、ある人が自宅のPCを外部にウェブ公開している場合に、そのサイト経由で自宅リモートルータに侵入する実験をしてみます。"http://192.168.0.1">実際の攻撃では、以下の2点の課題があります。ルーターの認証を突破する必要がある外部実体が展開された結果が正しいXMLになっている必要があるこの2点を解決する方法ですが、まず認証の突破は、ルーターのパスワードがわかっていれば(あるいは辞書攻撃により)、URLに埋め込む形で以下のように指定することができます。PASSWORDを例として想定しています。http://admin:PASSWORD@192.168.0.1/次に、XML形式としての妥当性ですが、PHPでXXE攻撃する場合、以下のようにPHPフィルタを用いてBASE64エンコードするという技が知られています。"php://filter/read=convert.base64-encode/resource=http://admin:PASSWORD@192.168.0.1/">これを用いて、自宅のAtermを攻撃してみました。詳細は省略しますが、上記手法により、無線LANの事前共有鍵を盗むことができました。ウェブサーバーを踏み台として、外部からは直接アクセスできないルーターの管理画面にアクセスができたことになります。この種の攻撃を防止するには、XXE脆弱性の排除は当然として、ルーターのパスワードを強固にする事が重要です。これは、DNSリバインディング攻撃にも有効な対策です。対策PHPの場合XXE対策は、既に述べたように、libxml2をバージョン2.9以降にするか、対策パッチを適用することです。Linux上にウェブサーバーを設置している場合は、最新のパッチがあたっていることを確認して下さい。加えて、アプリケーション側で明示的に外部実体の読み込みを許可していない必要があります。今まで説明していない対策として、以下の関数呼び出しによる方法があります。libxml_disable_entity_loader(true);これですと、libxml2のバージョンやアプリケーションの他の設定に関わらず、常に外部実体の読み込みが禁止されます。単独で安全な設定になるので推奨したいところですが、強力過ぎて副作用もあります。メソッドの呼び出しもエラーになってしまうのです。正常系が動かなくなるケースがあります。これに対応するには、loadメソッドを避け、別の方法でXMLファイルを読み込んでから、その文字列をloadXMLメソッドで解析します。下記の例では、file_get_contentsで読み込んだXMLファイルをloadXMLメソッドで解析しています。$doc->loadXML($xmlstr);まとめPHPにおけるXXE脆弱性について説明しました。10に選入されたと知って「なぜ今時?」と思いましたが、Javaの場合はデフォルトでXXEが有効になるので、PHPはたまたま安全なケースが多いということなのでしょう。仮にXXE脆弱な場合、PHPは攻撃のバリエーションが増え、危険度が増加する可能性があります。ウェブサイト運営という観点からは、libxml2を最新の状態にするという対策で通常は問題ないかと思います。一般に公開するソフトウェアを開発する場合は、libxml2が古い環境を想定して、以下のいずれかによる対策をお勧めします。2017の14日目です。~今年一年の振り返り~」でした。ssmjpにちなみ、2017年に登壇した勉強会についてスライドとともに振り返りたいと思います。セキュリティとUXの◯◯な関係アレなタイトルですが、副題も「すれ違い続けた二人の運命の邂逅~セキュリティとUXは本当にトレードオフなのか」となっております。セキュリティ対策の都市伝説を暴く登壇者は、BA(当時)の太田良典さんとヤフーの日野隆史さん、私でした。私からは、「セキュリティ対策の都市伝説を暴く」と題して、UIを損なうセキュリティ対策が本当に必要なのかというお話をしました。Tokumaru聴講された方のブログ記事をいくつか紹介します。神戸の特別講演を依頼されたものです。Webアプリセキュリティの基礎をというご要望でしたので、そのような内容になっています。HAKATAYAPC::Fukuokaでゲスト講演を担当しました。この時は何をしゃべるか悩み抜いた末、40分で技術的にまとまった話をするのは無理、ということから、最近のウェブサイト侵入の事件をデモつきでひたすら紹介するというネタに走ったところ、なんとベストスピーカー賞を頂戴してしまいました。第1回ローカルチャプターミーティングOWASP名古屋チャプターの記念すべき第1回チャプターミーティングで講演させていただきました。ウェブセキュリティの基礎というご依頼でしたが、少しネタに走りまして、たにぐちまことさん著の「よくわかるPHPの教科書」に含まれる脆弱性を題材にして、一通りのウェブアプリケーション脆弱性を説明するという趣向でした。具体的には、SQLインジェクション、CSRF、XSS、ファイルアップロードの問題について、この書籍の脆弱性(初期の版のもの)を使って説明しています。サポーターズCoLabサポーターズさんの依頼により若手エンジニアのためのセキュリティ講座という講演を実施しました。後半では、セキュリティエンジニアのお仕事、徳丸自身のキャリア、いつまでも現役エンジニアでいつづけるために...などのお話をしています。TokumaruPHPカンファレンス2017PHPでは例年講演させていただいておりますが、今年はセキュアコーディングのお話をしました。簡単に要約すると、「従来は、外部からの値は信頼できないものとして扱うべきという原則が言われていたが、ソフトウェアは複雑なので、どの値が外部由来かどうかは簡単に判別できないので、内部・外部に関わらず信頼できないものとして扱うことを原則とすべきではないか」というお話です。TokumaruデバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう弊社(EGセキュアソリューションズ株式会社)で実施した勉強会です。デバッガを用いてWordPress本体やプラグインの脆弱性を追っかけることにより、脆弱性の中身を深く知ろうという趣旨のものです。Tokumaruブログ枠で参加された方のブログ記事を一部紹介します。光軒の集い2017年11月の#ssmjp以前「秀丸マクロを生成する秀スクリプトという言語処理系を作った」という記事を書きましたが、その内容について講演させていただきました。Tokumaru秀スクリプトのデモ動画を貼っておきます。こちらは、秀スクリプトでスクレイピングをするデモです。いうことで、今年も多くの勉強会で登壇させていただきました。来年もよろしくお願い致します。