本文の内容は、2023年10月5日にDANIELE LINGUAGLOSSA が投稿したブログ(https://sysdig.com/blog/cve-2023-4911/)を元に日本語に翻訳・再構成した内容となっております。
最近、Qualys は、ほとんどの Linux ベースのオペレーティングシステムにデフォルトでインストールされている、一般的な GLIBC エコシステムに影響する重大な脆弱性を発見し、報告しました。具体的には、プロセスの起動中に特殊な環境変数を処理するためのコードにバッファオーバーフローが発見され、ローカル権限の昇格につながる可能性があります。幸いなことに、この脆弱性の悪用は Falco によって検知することができます。この記事では、’Looney Tunables’と呼ばれるこの脆弱性を深く掘り下げ、なぜこの脆弱性が発生したのか、Falcoのルールを使ってどのようにリスクを検知し軽減するのかを見ていきます。
CVE-2023-4911(スコア 7.8)に割り当てられたこの欠陥は、深刻度が高い脆弱性と見なされています。悪用された場合、攻撃者は、GLIBC バージョン 2.34(Status に関する正確な情報については、Linux ディストリビューションを参照) がインストールされた Linux 上で root 権限を取得することができます。この記事を書いている時点では、このエクスプロイトの概念実証バージョンがいくつかリリースされています。エクスプロイト自体は簡単で、メモリアドレスのブルートフォースを行っても、5分以内にエクスプロイトを成功させることができます。
攻撃者はまず、指定されたsuidバイナリのLD_LIBRARY_PATHを変更するかコピーを作成し、プロセスが攻撃者が制御するディレクトリから信頼できない共有オブジェクトをロードできるようにします。この結果、root 権限で悪意のあるコードが実行されます。
この脆弱性に対する修正プログラムは、現在、各 Linux ディストリビューションからリリースされています。この脆弱性は多くの異なるバージョンに影響を及ぼしているため、各ディストリビューションのサイトで修正情報を確認することをお勧めします。
予備知識
GLIBCは、Ubuntu、Fedora、Red Hat、Debianなど、多くの一般的なLinuxディストリビューションにデフォルトでインストールされています。これには、Linuxダイナミックローダー(ld.so)が含まれており、プログラムの実行に必要なすべての共有オブジェクトのロードを担当するソフトウェアの一部です。そのタスクを簡単に説明すると
- 共有ライブラリのロード
- シンボル解決
- 再配置の実行
LD_PRELOAD
とLD_LIBRARY_PATH
環境変数の処理- メモリ内のバイナリのマッピング
- メモリ管理
- バイナリの実行
Qualysが発見した脆弱性は、ダイナミック・リンカーの初期化、特にGLIBC_TUNABLES環境変数の処理中に発生します。この変数は、その後のイベント中に GLIBC の動作を微調整することを可能にします。
利用可能なチューナブルのリストは、以下のコマンドを実行することで取得できます:
/lib64/ld-linux-x86-64.so.2 --list-tunables
チューナブルは、プログラム実行中にコロンで区切られたキーと値のペアのリストとしてターゲット・バイナリに提供されなければなりません。リンカーは、環境変数からセキュリティーに敏感なチューナブルを解析し、最終的にストリッピングする責任を負います。以下は、チューナブルの解析と悪用の間に何が起こるかについての詳細な分析です。
CVE-2023-4991 の詳細
この欠陥はコミット 2ed18c (“Fix SXID_ERASE
behavior in setuid programs (BZ #27471)”) で __tunables_init
関数内に導入されました。この関数が呼び出されると、環境変数をループしてGLIBC_TUNABLESを探します。見つかったら、 tunables_strdup
を呼び出して変数のコピーを作成し、処理を開始します。GLIBCはまだ初期化されていないので、strdup関数はカーネルにメモリを要求するためにmmapを呼び出す __minimal_malloc
を使用します。これにより、メモリはヒープではなく仮想メモリから割り当てられます。
バッファオーバーフローが発生するのは、引数の解析方法が原因です。チューナブル文字列が tunable1=tunable2=value の形式である場合、最初に文字列をtunable1=”tunable2=value “として解析し、後で tunable2=value として処理を続けます。このため、割り当てられたバッファの中に、許可されているよりも多くのデータがコピーされることになります。この脆弱性はソースコードの監査によって発見されましたが、Qualys社は、AFL++またはLibfuzzerでロジックをファジングすると、数秒でクラッシュを再現できたと述べています。
Qualys が説明する悪用手法は単純で、 link_map
構造体の l_info
メンバーにオーバーフローするまで環境を NULL バイトで埋めることから構成されます。 この構造体 (Elf64_Dyn
) はバイナリの動的セクションを指し、タグと値で構成されます。 この場合、DT_RPATH
タグに注目します。これは、ライブラリ ルックアップが実行される場所を含むバイナリの動的セクションです。
このポインタを変更するペイロードを注意深く作成すると、バイナリが信頼できないディレクトリから共有オブジェクトをロードする可能性があります。
現在の悪用テクニックはASLRをバイパスできず、ブルートフォースによる推測に基づいています。スタックには16GBのメモリが割り当てられ、プロセス環境は最大6MBを占有し、選択されたポインタがスタックのちょうど真ん中を指すことを考えると、2,730回の試行後にポインタが有効である可能性は十分にあります。ホスト上のループでは、これはほんの数分しかかかりません。
CVE-2023-4911の検出
システムコールに基づくクラウド・ネイティブのセキュリティ・ツールである Falco は、Looney Tunables 脆弱性の実行時の悪用を検出するために使うことができます。
脆弱なコードに到達するために、エクスプロイトは特定の環境変数GLIBC_TUNABLESを通してデータを渡す必要があり、Falcoはこれを観測することができます。誤検知のリスクを減らすため、Falco はプロセスがクラッシュしたときにセグメンテーションフォルトシグナルを探すこともできます。前述したように、エクスプロイトはブルートフォースで適切なメモリアドレスに到達するため、失敗するとセグメンテーションフォルト(別名クラッシュ)になります。
- rule: GLIBC "Looney Tunables" Local Privilege Escalation (CVE-2023-4911)
desc: detect the exploitation of the CVE-2023-4911. Attackers can inject payloads in the GLIBC_TUNABLES environment variable when running executables with the SUID permission to execute code with elevated privileges.
condition: evt.type=procexit and evt.dir=> and evt.arg.sig=SIGSEGV and proc.env contains "GLIBC_TUNABLES=glibc."
output: Glibc exploited for privilege escalation [CVE-2023-4911] (evt.type=%evt.type core=%evt.arg.core status=%evt.arg.status ret=%evt.arg.ret proc.name=%proc.name cmdline=%proc.cmdline pname=%proc.pname parent_cmdline=%proc.pcmdline proc.exepath=%proc.exepath gparent=%proc.aname[2]container.name=%container.name image=%container.image.repository container.name=%container.name container.id=%container.id user.uid=%user.uid user.loginuid=%user.loginuid user.loginname=%user.loginname)
tags: [host, container]
priority: WARNING
Code language: JavaScript (javascript)
CVE-2023-4911 の緩和
この脆弱性を緩和する最善の方法は、パッチを当てることです。しかし、いくつかの追加的な解決策は存在しますが、ベンダーによって異なります。この CVE-2023-4911 の影響を受ける場合は、影響を受けるディストリビューションに基づいてシステムにパッチを適用してください。
RedHat は、SystemTap ツールを使って、どのバイナリが環境内で GLIBC_TUNABLES を起動しているかを検出し、それらを直ちに終了させる手順を公開しています。この解決策を実行するには、追加のソフトウェアをインストールし、システムの再起動時にこのプロセスを繰り返す必要があるかもしれません。
まとめ
Looney Tunables脆弱性は、多くのLinuxディストリビューションが関与しており、悪用が比較的容易であるため、非常に深刻です。攻撃者が通常のユーザーとしてログインするか、あるいは他のリモートからの悪用によって、システムに非特権アクセスを得た場合、この脆弱性を利用してroot権限を取得することができます。ほとんどのLinuxディストリビューションには何らかの形でGLIBCが搭載されているので、脆弱性があるかどうかをチェックすることは非常に重要です。
検出は、Falco のようなランタイムツールを使って、上述で提供されたものと同様のルールで行うことができます。現在のところ、脆弱性を緩和する方法はあまりないため、脆弱性にパッチを適用することを最優先すべきです。この脆弱性は、標準的なLinuxサーバーだけでなく、コンテナ、アプライアンス、IoTデバイスにも影響します。Linuxが存在するあらゆる場所に、この脆弱性が存在する可能性があります。