«前の日記(2018-04-18) 最新 次の日記(2018-07-30)» 編集

meta's blog - The Power To Serve

筆者について - No Unix, No Life

日本xrdpユーザ会発起人。

とある元大学院生の UNIX 系日記。FreeBSDを通じてOSSに囁かな貢献を。 FreeBSD ports contributor やってます。

For non Japanese native people:
If you are interested in my articles, please leave comments. I will do my best to give you articles in English.


2018-05-07 [長年日記]

xrdp v0.9.5 以前と Windows 10 の組み合わせでコード 0x80004005 のエラーが発生する問題

正確な日付は記憶していないのですが、2018年のGW中にリリースされた Windows 10 Insider Preview と xrdp v0.9.5 以前の組み合わせにおいて、「認証エラーが発生しました (コード: 0x80004005)。」というエラーが発生して Windows クライアントから xrdp に接続できないという問題が発生しています。

2018年5月という日付と、リモートデスクトップという単語の組み合わせから、以下の問題を連想する方が多いかもしれませんが、0x80004005 エラーと CVE-2018-0086 CVE-2018-0886 の修正は無関係です。

2018-05-15 16:28 追記: 下記リンク先のマイクロソフトの記事において、CVE番号が間違っています。正しくは CVE-2018-0886 です。

発生条件

サーバ側

  • xrdp v0.9.5 以下
  • OpenSSL 1.1.0 未満 (OpenSSL 1.0.x)

クライアント側

  • Windows 10 Insider Preview Build 17661.rs_prerelease.180428-1349
  • 今後 Insider Preview でない通常リリースでも発生するかもしれません

その他

  • クライアント・サーバ間の通信モードがTLSであること

何が起こっているか

Microsoft Remote Desktop Protocol (以下MS-RDP) には、RC4により通信を暗号化する従来のモード(もはや安全でない)と、TLSにより通信を暗号化するTLSモードが存在しますが、TLSによる暗号化を使用する場合に本問題が発生します。

上記のバージョンの Windows 10 Insider Preview 以降、リモートデスクトップクライアント(以下mstsc)がTLSモードで使用する暗号化スイートに変更があり、Forward securecyを満たす暗号化スイートのみを使用するようになったようです。

Forward securecy については筋よく説明しているサイトが他にたくさんあるので、ここで詳しくは説明はしませんが暗号化に使用する鍵に一時的な(Ephemeral)な鍵を定期的に交換して使用し、認証用の公開鍵が漏洩しても通信内容の解読を困難にするものです。ECDHE-DHE- が頭につく暗号化スイートがそれです。

一方でxrdpにTLSが実装された最初のまともなリリースであるv0.9.1からv0.9.5以前のバージョンには、OpenSSL 1.1.0 未満との組み合わせで使用した場合、Forward securecyを満たす暗号化スイートが使用されないというバグがありました。このバグは以下のissueで修正され、v0.9.6には含まれています。

ここまで書くと察しの良い方はお気づきになるかもしれませんが xrdp v0.9.5 以前と OpenSSL 1.1.0 未満の組み合わせにおいて、クライアント側はForward securecyを満たす暗号化スイートを要求するにも関わらず、サーバとなるxrdp側はそれを使用できないという状態に陥ります。ここで暗号化スイートのミスマッチが起こりネゴシエーションに失敗、接続できないという結果になります。

対処方法

対処方法は、先に上げた発生条件をどれか1つでも崩せばいいわけですから簡単です。Windowsのバージョンを下げることや、TLSによる暗号化を使用しないのは安全でない場合が多く、おすすめしません。OpenSSLのバージョンを1.1.0以降に上げるのも、OSにかなり根深い部分を触ることになる可能性があり、非常に面倒なのでできれば行いたくないですね。

というわけで、最も簡単なのは xrdp のバージョンを v0.9.6 以降に上げることです。この記事を書いている時点では v0.9.6 が最新です。xrdpとクライアントとの間でどんな暗号化が使用されているかを知るには、/var/log/xrdp.log を見てください。接続時に以下のようなログが記録されるはずです。

[20180507-15:02:00] [INFO ] TLS connection established from ::ffff:192.168.0.60 port 51710: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384

このログの場合は、コネクションはTLSv1.2によって保護され、暗号化スイートは ECDHE-RSA-AES256-GCM-SHA384 であることがわかります。