OAuth 1.0 を使用した Play WS のサービス拒否
日付
2017 年 1 月 20 日
説明
Play の WS HTTP クライアントにサービス拒否 (DoS) の脆弱性が発見されました。これは Play のすべてのバージョン 2.0.0 ~ 2.5.10 に影響します。
Play WS には Signpost OAuth による OAuth 1.0 とのインテグレーションが含まれており、HTTP リクエストに署名された OAuth ヘッダーを含めてリモート サービスと通信できます。Signpost OAuth は、内部で OAuth プロバイダーとして commons-httpclient4 を使用します。
WS リクエストが OAuth を使用していて HTTPS 接続である場合、サーバーが TLS ハンドシェイクに応答しないと、HTTP リクエスト接続は http.socket.timeout を無視するため、ハングします。
影響
Signpost OAuth 自体はマルチスレッドではないため、呼び出し自体がブロッキング操作になります。適切なパラメーターが与えられた場合、リモート サービスに対するサービス拒否攻撃につながる可能性があります。すべての WS リクエスト処理スレッドが枯渇するからです。
この脆弱性は CVE-2015-5262 として登録されています。
影響を受けるバージョン
Play 2.0.0 - 2.5.10
回避策
この脆弱性の回避策は、HTTPClient ライブラリをバージョン 4.5.2 にアップグレードすることです。このバージョンにはこれらの問題がありません。
libraryDependencies += "org.apache.httpcomponents" % "httpclient" % "4.5.2"
修正
Play 2.5.12 または 2.4.10 にアップグレードするか、以前のバージョンの Play を使用している場合はライブラリをアップグレードしてください。
謝辞
この問題の報告に協力してくれた Denny Ma 氏に感謝します。