Symfony のセキュリティリリースハンドリングがチョベリグになった話 (Symfony Advent Calender 2012 JP - 23日目)

Symfony Advent Calendar 2012 JP の 23 日目です。なんか 17 日目で川原君から

Note: Security Fix 周りの問題については、後日 @co3k が取り扱うようです。

Symfony Advent Calendar JP 2012 - Day 17 — Symfony Advent Calendar 2012 - Day 17 v1.0 documentation

と突然の CM (AA 略) をいただいていましたが、問題というか、 Symfony のセキュリティリリースハンドリング周りがちょこっと改善いたしましたのよ的な話をしていこうかと思います。

どう改善されたのサ

2012/12/18 に Symfony の公式ブログにて、 Security Issue Management Improvements というエントリが公開され、次のような改善をおこなったと報告されています。

  • ブログに「SECURITY ADVISORIES」というカテゴリを設け、過去のセキュリティリリースを 一覧できるように した
  • セキュリティ上の問題を解決するプロセスを一新した (後述)
  • http://symfony.com/security という URL から、ドキュメント内でセキュリティに関して説明されている "Security Issues" という章に容易にアクセスできるようにした
  • "Security Issues" の章に "Security Advisories" という節を設け、過去のセキュリティリリースを一覧できるようにした
  • メーリングリストから送られるメールのフッタに http://symfony.com/security への案内が含まれるようになった

そもそも今までのセキュリティリリースってどうだったのサ

この改善のきっかけとなったのは、 [symfony-devs] ML において Kousuke Ebihara という人が 2012/12/05 に投稿した、 "Improve security release announcement" というポストです。

ここでは、まず、先日の Security release: symfony 1.4.20 released - Symfony の問題点について触れられています。

これは sfForm の実装上の問題により Web サーバに読み取り権限のあるすべてのファイルが外部に漏洩してしまうという脆弱性 [1] の修正版リリース告知だったわけですが、このリリースがおこなわれたのが "Sun, 25 Nov 2012 11:07:00 +0100"で、タイムゾーンが UTC+14 である ライン諸島トケラウ という聞いたこともない場所 [2] を除いて日曜日だったのです (ちなみに UTC-12 の地域は土曜日でしたが、この地域には人が住んでいないのですね。へー)。

土曜日や日曜日 (特定の国や地域等に限定できるなら祝日なども) など、一般的な営業日でない日にセキュリティリリースがおこなわれてしまうと、影響を受けるシステム等の管理者が早急に対策をおこなえない等の問題が生じることになりますから、好ましくありません。この脆弱性はゼロデイではないようですので、月曜日になるのを待った上で公開することは充分できたはずですね。

それから、 symfony 1.0 以降の過去のセキュリティリリース告知に関して、以下のような問題点があると指摘されています [3]

  • どのような脆弱性なのか説明されておらず、ユーザが脅威やリスクについて評価できない (3 件)
  • 特定の DBMS や特定機能を使用している場合にのみ影響を受ける脆弱性であるにもかかわらず、その旨の説明がない (2 件)
  • タイトルでセキュリティリリースであることが示されておらず、通常のリリースと区別ができない (4 件)
  • 報告者のクレジットがない (1 件)
  • タイトルと本文の両方でセキュリティリリースであることが示されておらず、通常のリリースと区別ができない (1 件)

これらの問題点が示された上で、「Symfony のセキュリティリリースは属人的なところがあるのではないか (announcements of symfony security release are dependent on individual thinks or knowledge)」と評されています。

その上で、以下のような提案やアドバイスがおこなわれています。

どんなプロセスになったのサ

この指摘や提案を受け、 lead の Fabien Potencier 氏より、「意見をベースに改善のための取り組みをはじめた」ことと、「第一歩として諸々施策を実施した」ことが報告されました。その「第一歩」が最初に触れたブログエントリで示されている内容になります。

その施策のひとつに、「セキュリティ上の問題を解決するプロセスを一新した」というものがありました。これは一体どういうものか、については https://github.com/symfony/symfony-docs/pull/2019 の pull request から知ることができますが、以下にかいつまんで説明します。

ブログエントリに含むべき内容の定義

今後効果されるセキュリティリリースでは、基本的に以下の内容が告知エントリに含まれるようになります。

  • 「Security release」という文字列を含むタイトル
  • 脆弱性の説明
  • 影響を受けるバージョン
  • 有効な exploit
  • パッチ、アップグレード方法、回避方法の説明
  • クレジット

『ソフトウエア製品開発者による脆弱性対策情報の公表マニュアル』の「3.1. 脆弱性対策情報の公表項目」にて好ましいとされている項目に近い内容が含まれることになりますね。

ともあれ、これがドキュメント化されたことで、先に示した問題点のほとんどが恒久的に解決することになるだろうと考えられます。本当によかったです。

Symfony ユーザのみなさんは、最低限、とりあえず「Security release」という文字列がタイトルに含まれるブログエントリだけは見逃さないようにしておけばよいということになります。たとえば RSS を適宜チェックしてセキュリティリリースがあればメール飛ばすようにするとかそんな感じですかねー。というかブログカテゴリで絞り込んだ RSS とかほしいですよねー。ねー。

手順の追加

pull request の Diff からわかるように、元々セキュリティ上の問題への対応手順は存在していました。今回の改善で、いくつか手順の追加や具体化がおこなわれることになり、

  1. 報告者に報告を受領した旨通知
  2. パッチの作成
  3. Symfony の公式ブログ向けに、脆弱性に関するセキュリティ告知を作成
  4. レビューのため、パッチとリリース告知を報告者に送信 (Zend Framework の Pádraic Brady 氏による提案により追加)
  5. メンテナンスしているすべてのバージョンの Symfony にパッチを適用
  6. 影響を受けるすべてのバージョン向けに新しいバージョンをパッケージング
  7. 告知を Symfony の公式ブログにて公開 (これは "Security Advisories" カテゴリに追加されなければならない)
  8. ドキュメント中の セキュリティアドバイザリ一覧 の更新. [5]

「6. 影響を受けるすべてのバージョン向けに新しいバージョンをパッケージング」が「未サポートバージョンも含むのか否か」について先述の ML のスレッドで確認していますがいまのところ返答がありません。ただ、「5. メンテナンスしているすべてのバージョンの Symfony にパッチを適用」としているので、たぶん含まれないのでしょう。ということではっきりとは明言されていないのですが、 http://symfony.com/doc/current/contributing/community/releases.html にて公表されているメンテナンス期間の終了と共にセキュリティ上の問題への対応も (例外扱いとはならずに) 終わると理解してよさそうです。過去のバージョンを使い続ける決断をする人は、この点をよく理解しておく必要があります。

セキュリティリリースは土曜日と日曜日には実施しない

この点も明記されることになりました。「どのタイムゾーンにおける『土曜日』と『日曜日』なのか」は書かれていませんが、まあフランスのタイムゾーンであるところの UTC+1 なんじゃないでしょうか。日本的には悪くない時間になると思うので個人的にはよいと思います。

ただし、既に脆弱性に関する情報が公開されている場合を除きます。この場合は本当に緊急事態なので、対応完了後即座にリリースされることになるでしょう。そのような機会が訪れないことを祈りたいですね。

改善後の実例

この改善がおこなわれたあと、謀ったように Security release: Symfony 2.0.20 and 2.1.5 released - Symfony が公開されました。

クレジットには Victor Berchet という方が報告したとあり、どこかで見たことある名前だな……と思ったら、この方、先述の ML のスレッドに投稿されていましたね。

Good to see that security concerns are taken seriously. (拙訳: セキュリティに関して真摯に取り組むのはよいことですね)

Though I hope we won't have to use the new process too soon... nor too late. (拙訳: とはいえ、あまり早くに新しいプロセスが使われることがないことを祈ります……遅すぎることもなくね)

Improve security release announcement

こ、これは……高度なギャグ (というか皮肉?) なのかそれとも偶然なのか、すごくすごく気になるんですけど。

それはさておき新フォーマットでのリリース告知を見てみましょう。

——な、なんかごちゃごちゃしているような……? これは脆弱性が 2 つ含まれているからでしょうか? というか各セクションの h1 要素が小さすぎる気がするのですけど……

内容は特に不足なく、わかりやすいセキュリティリリースに仕上がっていると思うので、改善できるようであれば改善してほしい/改善したいですねえ。

ちなみに PHP の他のフレームワークはどうなのサ

他のフレームワークのセキュリティリリースはどんな感じかなということで見てみました。

ただ、他のフレームワークとなるとあまり詳しくないので、認識に誤りが含まれているかもしれませんがご容赦ください。何か間違い等あれば (この節に限りませんが) 遠慮なくご指摘ください!

Zend Framework

さすがというかなんというか、 Zend Framework は頑張ってますね。

いくつかアドバイザリを眺めましたが、素晴らしい出来だと思います。なにも言うべきことはありませんが、強いて言うなら、 ZF2012-05: Potential Proxy Injection Vulnerabilities in Multiple Zend Framework 2 Components - Advisories - Security - Zend Framework の <title> が間違っている件を 12/20 に報告しているはず なので早く直していただけませんかね……、ということぐらいでしょうか。

CakePHP

CakePHP はリリース告知のタイトルに "Security Relase" が 含まれていたり いなかったり してるようです。 2.0.4 のほうの告知では、 脆弱性に対する修正以外の変更を含む にもかかわらず、脆弱性単体の修正パッチが示されていないようなので、あまり好ましい状態ではないように思います (が、 2.1.5 のリリースではパッチも明確に示されていますし、 2011/11 の話なので改善されている可能性があります)。セキュリティリリースの一覧等もありません。

ただ、ドキュメントには セキュリティ上の問題の報告手段や窓口 については明記されています。このあたり、 Symfony の改善前の状況と類似しているように見えます。

CakePHP といえば、以前 CakePHP の PHP コード実行の脆弱性を使って CakePHP を焦がす とかいうエントリを 2010 年に公開したことがありますが、そのなかで、

※通常リリースの告知のなかにこんな致命的な脆弱性に関する情報を思いっきりわかりにくく書いちゃうのはひどいなあと思うので、ユーザの方は CakePHP に文句を言うといいと思います。僕は CakePHP ユーザじゃないのでやめておきます。

CakePHP の PHP コード実行の脆弱性を使って CakePHP を焦がす

とか書いてたりします。このエントリは僕の書き方とかに諸々問題があって [6] 、不本意な燃え上がり方や受け取られ方をしてしまったようで今でも若干の心残りがあります。伝えたかったこととしては「割と危険度の高い脆弱性だから影響を受ける人は対策してね!」ということの他に、

  • 当時の日本の CakePHP ユーザが、 Twitter を確認した限りでは 、このリリースの重大性について認識していなかったように見えたことに対する批判
  • 脆弱性の危険度が高いにもかかわらず、非常にわかりにくい告知エントリを公開した CakePHP のコアチームに対する批判

がありましたが、特に後者を充分に伝えることができていなかったように思います。

日本では CakePHP が非常によくに使われており、国内のコミュニティも活発であると認識しています。ですので、もし必要があるようでしたら、今回の Symfony における改善などを参考に、セキュリティリリースやハンドリングプロセスについての明文化や改善などがおこなわれるよう、働きかけていただけると非常に素敵だなーと思っています。

FuelPHP

FuelPHP » RC2.1 Security Release | Blog が今のところ唯一のセキュリティリリースのようです。 "This issue had to do with the URI not being properly sanitized, which caused a security issue in certain situations" とありますが、どのようなセキュリティ問題を生じさせることになるのかが具体的に書かれていません (まあ 1.0 リリース前の RC 期間での告知文だしということも思わないでもないですが)。

告知内でセキュリティ上の問題を報告するためのメールアドレスが若干婉曲した感じで示されていますが、 http://fuelphp.com/contributehttps://github.com/fuel/fuel/wiki/Contributing を読んだ感じでは特にセキュリティ上の問題の報告方法などは言及されていないようでした。

まだ若いフレームワークですし、おそらく今後自然と改善されることになると思いますが、実際にセキュリティ上の問題があがってくる前にこのあたり整備されているのが理想的であるとは言えるでしょう。日本の FuelPHP のコミュニティも非常に活発に見えるので、 CakePHP と同様、このエントリきっかけで働きかけがおこなわれたりするととてもとても素敵ですね。

まとめ

このエントリでは、 Symfony のセキュリティリリースに関する ML での提案と改善結果に触れ、どのような問題点があって、どのように改善されたのか、ということについて説明しました。

「第一歩」ということで、まだまだ改善できるポイントもありそう [7] でしたが、そのあたりも少しずつよくなっていけば、あるいはよくしていければいいなと思います。

また、他のフレームワークの状況もちょろっと書いてみました。近年、 PHP-FIG などの働きかけによって非常によいエコシステムが PHP 界隈でできあがっていますし、似たような感じで今回の改善なども他のところに広がっていくことを期待してみます。

さて、次の 24 日目の担当は @okapon_pon さんです! よろしくお願いします!

脚注

[1]sfForm を使ってファイルアップロードを実現している場合に脆弱となります。まだ対応していない方はブログエントリや JVN iPedia 等の各種情報を読んだ上で早急な対応を実施してください
[2]ネタとはいえ失言をお詫びいたします! ライン諸島大好きです! トケラウも大好きです! 家の引っ越し先を、新宿区にするかライン諸島にするかトケラウにするか悩んだくらい好きです!
[3]詳細は ML の投稿内容を確認してください。
[4]普通にいいドキュメントだと思うのでみなさんも是非。
[5]ちなみにこのエントリ執筆時点で、先日リリースされた Security release: Symfony 2.0.20 and 2.1.5 released - Symfony の追加が早速漏れています…… (あとで報告)
[6]ごめんなさい!
[7]まとめきれていませんが、「対策版として何のバージョンをリリースしたか」よりも「どのようなセキュリティ上の問題が解決したか」を真っ先に伝えることが重要なのではないかなどが気になるポイントです。
comments powered by Disqus

Recently entries