GNUCitizenによると
CSRF – It comes very handy. It seams that no matter how much you talk about it, very few pay attention on the problem. And it is not a problem that you can afford to have. And among the XSS issues, which most OpenID libraries have, CSRF (Cross-site Request Forgery) seams to be the most pervasive form of attack.
http://www.gnucitizen.org/blog/hijacking-openid-enabled-accounts
とほとんどのOpenIDのライブラリはCSRFに脆弱だそうです。
tiny problemと書いてありますがとても重要な問題です。OpenIDのようなSSO (Single Sign On)システムが脆弱だとそれを利用しているシステム全体が危険にさらされます。
これは一目見るだけでCSRFに脆弱であることが分かります。
<form method=”post”>Add identity:
<input id=”openid_url” name=”openid_url” />
<input type=”submit” value=”Add” />
<input type=”hidden” name=”action” value=”add_identity” >
</form>
Web開発者で分からない場合は直ぐにセキュリティ対策の書籍を購入された方が良いと思います。
久しぶりにAmazonの私のセキュリティ本のページを見ると「日本語が変」とコメントが付いてますね。このブログをお読みの方は私が文章を書くことがあまり得意でない事はよくお分かりだと思います(笑 日本語が変なので内容が信じられるか疑問とも書かれていますが、内容は大丈夫です。「プロアクティブなセキュリティ対策」などは先取りしすぎだったくらいかも知れません。
Webアプリセキュリティ対策入門を読んで理解されていれば、CSRFに脆弱なアプリケーションなど作らないはずなのです。
# といってもOpenIDのライブラリのほとんどは海外で作られていると思います。
# ところでこの本、あまり売れていないのでこのままでは次が無いと思います。
# AJAXセキュリティの本が書きたいのですけどね。残念。
初心者はセキュリティの事など考えずに作ればよい、といった意見も散見します。しかし、Webサイトの構築は自動車を作って売るのと同じと考えると、セキュリティが重要な事が分かると思います。
自動車は「外見がカッコよくて、そこそこ走れば良い」ものではありません。ブレーキが効かなかったり、ちょっとぶつかっただけで爆発したりすると困ります。その自動車を買って乗っている人だけでなく、周りのいる方にも多大な迷惑をかけます。
Webサイトも同じで「外見がカッコよくて、そこそこ使えれば良い」ものではありません。紹介されている脆弱なOpenIDライブラリを使えば、そのOpenIDを利用しているユーザに多大な迷惑をかける事になるかも知れません。XSSに脆弱であればマルウェア配布に利用されたり、クレデンシャルを盗まれる可能性があります。SQLインジェクションに脆弱でパスワード管理がいい加減だとユーザ名とパスワードを全部盗まれるかも知れません。SQLインジェクションに脆弱であれば恒久的なXSSやマルウェア配布用のJavaScriptを埋め込む事も簡単にできるケースが少なくありません。
Webサイトはたとえそれが小規模なサイト、個人サイトであっても「外見がカッコよくて、そこそこ使えれば良い」ものではありません。
追記:
OpenIDを採用しているサイトが危ない、ということではありません。認証情報を共有しているとサイトが危ないと言うことです。念のため。
上記のフォーム例だとCSRFでユーザの追加が可能であると思われます。不正にユーザが追加できる程度なら多くのサイトでtiny problemと言えるかも知れません。仮にこのブログの場合、不正にユーザが追加できるとファイルのアップロード(ファイル名も多分自由に変更できると思うのでApacheの脆弱性も攻撃可能)などで攻撃できそうです。管理者ならHTMLの編集もできるのでセッションIDを盗んだり、なんでも出来ます。
関連情報:
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2008-0570
The OpenID 5.x-1.0 and earlier module for Drupal does not properly verify the claimed_id returned by an OpenID provider, which allows remote OpenID providers to spoof OpenID authentication for domains associated with other providers.