QualysによるLinux Kernelの脆弱性(Important: CVE-2021-33909)とSystemdの脆弱性(CVE-2021-33910)に関するアドバイザリ

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面 和毅です。

07/20/2021にQualysからLinux Kernelの脆弱性(Important: CVE-2021-33909)とSystemdの脆弱性(CVE-2021-33910)に関するアドバイザリが公開されました。PoCの情報なども公開されており、今後更に情報が公開されていくようです。Red Hatからは、この脆弱性が含まれているかの検出ツールも提供されています。今回はこれらの脆弱性の概要と、各ディストリビューションの対応について簡単にまとめてみます。

【7/21/2021 05:00 更新】 Arch Linuxを加えました。

【7/26/2021 05:00 更新】 SWベンダ情報にAmazon(AWS)を加えました。


[過去の関連リンク]

全てのWifiデバイスや(WPA3を含む)プロトコルに対してのデザイン上の問題と実装上の問題(FragAttack)

Intel(R) PROSet/Wireless WiFi 製品の脆弱性(High: INTEL-SA-00402, Critical: INTEL-SA-00403)

Intel製CPUの脆弱性(“Platypus”: INTEL-SA-00389)

資格情報(Credential)が漏洩する可能性がある脆弱性 ( “ContainerDrip” : CVE-2020-15157 )

Bluetoothの鍵を上書きされる脆弱性(BLURtooth: CVE-2020-15802)

TLS-DH(E)に関する攻撃手法(Raccoon Attack : CVE-2020-5929 (F5), CVE-2020-1968 (OpenSSL), CVE-2020-12413 (Mozilla), CVE-2020-1596 (Microsoft) )

複数のgrub2 と関連するLinux Kernel の脆弱性 (BootHole (CVE-2020-1968, etc.))

INTELのセキュリティアドバイザリ(INTEL-SA-00320: Special Register Buffer Data Sampling Advisory (CVE-2020-0543))

UPnPデバイスに関する脆弱性情報(CallStranger : CVE-2020-12695)


Priority

CVE番号影響するバージョン一次情報源PriorityCVSS Score / CVSS Vector
CVE-2021-33909 3.16 <= Linux Kernel

Qualys Security Advisory Sequoia: A deep root in Linux’s filesystem layer (CVE-2021-33909)

Red Hat: 7.0 Important

Red Hat: CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H

CVE-2021-33910 v220 <= systemd

Qualys Security Advisory CVE-2021-33910: Denial of service (stack exhaustion) in systemd (PID 1)

Red Hat: 7.0 Important

Red Hat: CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H

修正方法

各ディストリビューションの情報を確認してください。

CVE概要(詳細はCVEのサイトをご確認ください)

  • Linux Kernelの脆弱性(https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-33909)
    • DoS又は権限昇格の可能性
    • 概要:3.16以降のLinux Kernelのファイルシステムレイヤにsize_tからintへの変換の脆弱性が見つかりました。生成、マウント、削除を、トータルのパスの長さが1GBを超える深いディレクトリ階層で行うと、非特権の攻撃者が10バイトの文字列「//deleted」をカーネルバッファのvmalloc()された最初の一からちょうど-2GB-10Bの位置に書き込むことが出来ます。

      Qualysはこの制御できない境界外書き込みを利用して、Ubuntu 20.04, Ubuntu 20.10, Ubuntu 21.04, Debian 11, Fedora 34 Workstationでのroot特権を得ることに成功しました。他のLinuxディストリビューションもおそらくは攻撃が可能と思われます。Qualysのexploitでは約5GBのメモリと1Mのinodeが必要になります。この攻撃手法に関しては、近い将来に公開する予定になっています。PoCの基本的なコンセプトはこのアドバイザリの最後に書かれています。

    • 分析:一次情報源がわかりやすいため、敢えてこちらでは触れません。一次情報源を参考にして下さい。
  • systemdの脆弱性(https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-33910)
    • DoSの可能性
    • 概要:v220以降のsystemdに問題が見つかりました。systemdは/proc/self/mountinfoをパースしてモニタしており、マウントポイントのパスをmount_setup_unit()に渡し、さらにunit_name_from_path()に渡され、Unit_name_path_escape()に渡されます。

      
      ------------------------------------------------------------------------
      1720 static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
      ....
      1727         r = libmount_parse(NULL, NULL, &table, &iter);
      ....
      1731         for (;;) {
      ....
      1735                 r = mnt_table_next_fs(table, iter, &fs);
      ....
      1742                 path = mnt_fs_get_target(fs);
      ....
      1751                 (void) mount_setup_unit(m, device, path, options, fstype, set_flags);
      ------------------------------------------------------------------------
      1644 static int mount_setup_unit(
      1645                 Manager *m,
      1646                 const char *what,
      1647                 const char *where,
      1648                 const char *options,
      1649                 const char *fstype,
      1650                 bool set_flags) {
      ....
      1683         r = unit_name_from_path(where, ".mount", &e);
      ------------------------------------------------------------------------
      512 int unit_name_from_path(const char *path, const char *suffix, char **ret) {
      ...
      523         r = unit_name_path_escape(path, &p);
      ------------------------------------------------------------------------
      380 int unit_name_path_escape(const char *f, char **ret) {
      ...
      386         p = strdupa(f);
      ------------------------------------------------------------------------
      

      386行目で、unit_name_path_escape()はマウントポイントパスをstdupa()に引き渡します。このstrdupa()はstduo()に似ていますが、ヒープ内ではなくスタック上でメモリをアロケートします。

      結果として、このマウントポイントのトータルのパス長が8MB(デフォルトのRLIMIT_STACK)を超えた場合、systemdはセグメンテーションフォルトを起こしてクラッシュし、systemdがPID 1のため、結果としてOSがクラッシュします。

    • 分析:一次情報源がわかりやすいため、敢えてこちらでは触れません。一次情報源を参考にして下さい。

緩和策

  1. Linux Kernelの脆弱性(CVE-2021-33909)

    以降の緩和策はQualysのExploitの実行を止めるものであり、完全な脆弱性の修正にはLinux Kernelのパッチ/更新が必要となります。

    • /proc/sys/kernel/unprivileged_userns_cloneを0にすることで、攻撃者がユーザネーム空間に長いディレクトリをマウントすることを妨害します。しかしながら、攻撃者はFUSEを代わりに用いて長いディレクトリをマウントすることが可能です。これに関しては偶然systemdの脆弱性(CVE-2021-33910)を見つけたため、充分に確認をしている状態ではありません。
    • /proc/sys/kernel/unprivileged_bpf_disabledを1にすることで、攻撃者がkernelにeBPFプログラムをロードすることを防ぎます。しかしながら、攻撃者は変わりに他のvmalloc()されたオブジェクトを狙えます。これに関しても、Qualysでは可能性を詳しく調査していません。
  2. systemdの脆弱性(CVE-2021-33910)

    こちらは緩和策は見つかっていません。


対処方法

各ディストリビューションの案内に従い、アップデートを行ってください。全てのRed Hat製品でパッチが行き渡っているかを確認するには、Red Hat SatelliteKatello、Spacewalk等を使うと管理が便利でしょう。

また、OSの再起動が発生しますので、pacemakerなどOSSのクラスタ製品やLifeKeeperなどの商用のクラスタリング製品を使うとサービス断の時間を最小限にすることが出来ます。


セキュリティ系連載案内

CM

こちらで小学生の勉強支援サイトをオープンしました。算数のプリント(都度、自動生成)が無料でダウンロードできます。コンテンツは未だ少ないですが、徐々に増やしていきます。


タイトルとURLをコピーしました