Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

Satellite 5 と HTTPD における空白文字の問題

更新 -

注意: 修正方法に進みたい場合は、以下の「提案されている修正ワークフロー」セクションを参照してください。手順は順番に適用する必要があります。

はじめに

2010 年に、yum-rhn-plugin の修正が導入されましたが、その時に Red Hat Satellite または Proxy とそのクライアントとの間で、HTTP リクエストのヘッダーとヘッダーの間にある空白に関するバグが発生しました。このエラーは HTTP RFC 仕様に準拠していなかったのですが、(その時点では) httpd における空白文字の処理方法が厳しくなかったため、特に問題はありませんでした。

2016 年に、この処理に関するセキュリティの潜在的な脆弱性について、CVE-2016-8743 が公開されました。その後、httpd ルールが強化されたため、自動化テスト時に yum-rhn-plugin における潜在的な脆弱性が表面化し、2017 年の早い段階で Red Hat Enterprise Linux (RHEL) 6.9 がリリースされることになりました。

これは、Satellite 6 または Red Hat Subscription Management (RHSM) には影響を及ぼしません。

関連事項

httpd のルールを修正すると、yum-rhn-plugin バグの影響を受けるクライアントからの接続が、更新された httpd インスタンスを使用している Satellite サーバーおよび Proxy サーバーによって拒否されるようになりました。

クライアントに対応する修正を提供するだけでは不十分です。なぜなら、サーバーの httpd がアップデートされると、クライアントが問題を修正する為のエラータ自体を取得できなくなるからです。

サーバーの設定で、空白文字の使用を厳しくする機能を「無効」にするように変更する必要があります。それを行うためのオプションが httpd アップデートで提供されました。ただし、空白文字の使用強化を無効にするオプションは httpd の新しいバージョンにしか存在しないため、それをサポートする httpd バージョンでのみ有効にしておく必要があります。

兆候および回避策

クライアントシステムにおける特別な兆候は、Satellite または Proxy サーバーから HTTP Error 400 レスポンスを受け取ることで発生するトレースバックです。たとえば、トレースバックは以下のようになります。

# tail /var/log/up2date    
  File "/usr/lib/python2.7/site-packages/yum/yumRepo.py", line 1685, in _getRepoXML
    self._loadRepoXML(text=self.ui_id)
  File "/usr/lib/python2.7/site-packages/yum/yumRepo.py", line 1676, in _loadRepoXML
    return self._groupLoadRepoXML(text, self._mdpolicy2mdtypes())
  File "/usr/lib/python2.7/site-packages/yum/yumRepo.py", line 1650, in _groupLoadRepoXML
    if self._commonLoadRepoXML(text):
  File "/usr/lib/python2.7/site-packages/yum/yumRepo.py", line 1470, in _commonLoadRepoXML
    result = self._getFileRepoXML(local, text)
  File "/usr/lib/python2.7/site-packages/yum/yumRepo.py", line 1248, in _getFileRepoXML
    size=102400) # setting max size as 100K
  File "/usr/share/yum-plugins/rhnplugin.py", line 399, in _getFile
    start, end, copy_local, checkfunc, text, reget, cache, size)
  File "/usr/share/yum-plugins/rhnplugin.py", line 501, in _noExceptionWrappingGet
    raise urlException
<class 'yum.Errors.RepoError'>: failed to retrieve repodata/repomd.xml from rhel-x86_64-server-7
error was [Errno 14] HTTP Error 400 - Bad Request

また、サーバーには以下が出力されます。

# tail /var/log/httpd/error_log 
[Wed Feb 15 07:37:56 2017] [error] [client 10.10.10.10] request failed: error reading the headers

最初の回避策は、httpd を以前のバージョンにダウングレードすることです。

設定オプションを使用する場合は、以下の新しい httpd 設定ファイルを追加することで問題を回避できます。

# echo “HTTPProtocolOptions unsafe” >> /etc/httpd/conf.d/123unsafe.conf; service httpd restart

いずれかの変更を行うと、すべてのクライアントが yum-rhn-plugin への修正を使用してアップデートするまで、使用を厳しくする機能を無効にすることができます。

複雑にする要因

この修正で一番に優先されることは、クライアントを保護することです。現在のステータスが何であれ、常に問題を修正する為のエラータ自体を取得できるようにする必要があります。したがって、Satellite や Proxy で設定ファイルで上述の HTTPProtocolOptions unsafe を変更することが推奨されるオプションとなります。ただし、上述のとおり、このオプションは、httpd で影響を受けるバージョン以降でのみ選択できます。また、変更が Fedora と RHEL の両方で正しく、アップストリームとダウンストリームでコードベースの差異を最小にすることが望まれます。

httpd の特定のバージョンから httpd 設定オプションを「保護」する標準的な方法は、<IfVersion> タグを使用することです。したがって、以下のように設定すると、

<IfVersion >= 2.4.25>
  HttpProtocolOptions unsafe
</IfVersion>

ジョブを行います (ここでのバージョン 2.4.25 は、Fedora にリリースされた、空白文字の使用が厳格されたバージョンの httpd です)。

ただし、RHEL バージョンは、最初に取得しているアップストリームバージョンに留まり、リリースフィールドだけがアップデートされます (たとえば、RHEL6 の httpd のバージョンは常に httpd-2.2.15 となります)。そして、<IfVersion> は、 リリースの違いを認識しません。

これに対応するには、RHEL 6.9 のhttpd バージョンにビルドされたディレクティブ (_RH_HAS_HTTPPROTOCOLOPTIONS) を追加する必要があります。このディレクティブの利用により、<IfVersion> を使用する Fedora の古いバージョンの httpd を保護します。そして、RHEL の古いバージョンの httpd を保護できます。これは、<IfDefine> のディレクティブの存在をチェックすることで行います。この結果は、以下のような設定オプションになります。

<IfVersion >= 2.4.25>
  HttpProtocolOptions unsafe
</IfVersion>
<IfDefine _RH_HAS_HTTPPROTOCOLOPTIONS>
  HTTPProtocolOptions unsafe
</IfDefine>

現在のステータス

注意: エラータを適用する前に、以下の「提案されている修正ワークフロー」セクションを十分に確認し、順番どおりに手順を進める必要があります。

エラータは、クライアントで発生している yum-rhn-plugin の問題を修正するためにリリースされています。以下のバージョンの RHEL に適用されます。

新しい httpd 設定ファイルを提供してサーバーで発生している問題に対応するエラータがリリースされています。このエラータにより、httpd における空白文字の使用の厳格化が無効になります。これは、Red Hat Satellite と Proxy 5 を使用しているすべての RHEL6 に適用されます。

この (英語版の) 記事が作成された時点では、httpd における空白文字の使用の厳格化バージョンは RHEL 6 ではリリースされていませんでした。リリースを遅らせることで、Satellite をお使いの場合に yum-rhn-pluginspacewalk-backend のエラータを適用する猶予をもたせるためです。

クライアント向けの修正は、RHEL 6.9 リリースで利用できます。

近々リリースされる Satellite 5.8 で、サーバー向けの修正が利用できます。

Red Hat Enterprise Linux 5 では httpd の修正は提供されなかったため、RHEL 5 のインストールはこの問題の影響を受けません。

Satellite 5 のアップストリームである Spacewalk には、Fedora 24、Fedora 25、および RHEL 6 でバックエンドの設定ファイルがリリースされています。ただし、RHEL 7 の httpd バージョンでは修正がバックポートされていますが、Fedora で見つかったバージョンよりも下のバージョンになります。「RHEL7 にインストールされた Spacewalk」を適切に処理する方法については、引き続き調査が行われています。

提案されている修正ワークフロー

新たに保護された httpd を使用できるようにするために、空白文字の使用を厳格にしたまますべてのクライアントが問題を修正する為のエラータ自体を取得できるようにするには、Satellite で以下の手順を順番どおりに実行する必要があります。

  1. 現在のステータス」セクションの Satellite および Proxy のエラータを、Satellite および Proxy サーバーに適用します。これにより、クライアントはすべて引き続き接続できるようになります。
  2. Satellite で使用している RHEL ベースチャンネルの最新コンテンツと同期を取ります。これにより、yum-rhn-plugin の修正が適用されます。
  3. (上記のクライアント向けエラータで選択した) システムの SOE から修正を適用します。
  4. その修正を使用してすべてのクライアントをアップデートします。
  5. キックスタートで新しい yum-rhn-plugin を取得するように、すべてのキックスタートをアップデートします。
  6. クライアントとキックスタートをすべてアップデートしたら、/etc/httpd/conf.d/aa-spacewalk-server.conf のコンテンツをコメントアウトして、Satellite と Proxy の httpd を再起動します。

順番が重要になります - すべてのクライアントに yum-rhn-plugin の修正をインストールする前に空白の使用を厳格に戻すと、このクライアントはエラータを取得できず、アップデートすることができなくなります。

タイムライン

  • 2010-01-25 urlgrabber 問題を回避する yum-rhn-plugin への修正が実装されました。この修正には、Satellite 5 のクライアントからサーバーへの HTTP 接続において空白文字が正しくない問題について修正されました。
  • 2016-12-20 CVE-2016-8743 httpd: Apache HTTP Request Parsing Whitespace Defects が公開されました。
  • 2016-12-20 Fedora に httpd 2.4.25 がリリースされました。
  • 2017-01-13 6.9 リリースに対する修正が RHEL 6 にバックポートされました。(BZ#1412974)
  • 2017-02-15 RHEL 6.9 に関する Satellite 5 の自動化テストで、破損が見つかりました。(BZ#1422518)
  • 2017-02-17 RHEL 6 の httpd パッチにバグが見つかりました。(BZ#1423414)
  • 2017-03-01 RHEL 6 と RHEL 7 のさまざまなバージョンに対して yum-rhn-plugin を修正するために 2017-04-12 エラータがリリースされました。
  • 2017-04-11 Satellite 5 および Proxy 5 (5.4、5.5、5.6、5.7) に対して spacewalk-backend 設定ファイルの修正がリリースされました。
  • 2017-04-14 RHEL7 にインストールされた Spacewalk の問題について BZ#1442477 が作成されました。