エクスプロイト&脆弱性
Sambaのリモートコード実行脆弱性「CVE-2021-44142」の詳細を解説
Unix系OSのコンピュータをWindowsのドメインコントローラやファイルサーバなどとして利用するために導入されるオープンソースソフトウェア「Samba」の開発元は、同ソフトウェア4.13.17以前のバージョンで見つかった、ヒープ領域内において境界外読み取り/書き込みが可能となる脆弱性に対応する修正パッチをリリースしました。
Unix系OSのコンピュータをWindowsのドメインコントローラやファイルサーバなどとして利用するために導入されるオープンソースソフトウェア「Samba」の開発元は、同ソフトウェア4.13.17以前のバージョンで見つかった、ヒープ領域内において境界外読み取り/書き込みが可能となる脆弱性に対応する修正パッチをリリースしました。この脆弱性は、脆弱性リサーチャーグループ「STAR Labs」のNguyễn Hoàng Thạch氏およびBilly Jheng Bing-John氏によって、トレンドマイクロの脆弱性発見コミュニティ「Zero Day Initiative」(ZDI)が運営するハッキングの世界大会「Pwn2Own Austin 2021」において初めて存在が示され、開発元へ情報が提供されました。次いでZDIのLucas Leong氏がこの脆弱性の追加亜種を発見し、同様にSambaの開発元へ提供されました。今回の一連の脆弱性は、脆弱性リサーチャーグループ「DEVCORE」のOrange Tsai氏からもSambaの開発元へ報告されました。
今回の脆弱性が悪用されると、攻撃者は、Samba がインストールされたシステム上で任意のコードをリモートで実行することが可能となります。この脆弱性を悪用する際、認証の必要はありません。脆弱性自体は、Samba サーバデーモン(smbd)において、ファイルを開く際のEA(Extended Attributes、拡張属性)メタデータの構文解析処理内に存在しているからです。攻撃者は、この脆弱性を悪用することで、root権限でコードを実行することができます。
本稿では、関連する一連の脆弱性およびそれを修正するために公開されたパッチについて解説します。
■ 背景
Sambaでは、ファイル共有サービスを提供するサーバデーモンはsmbdと呼ばれています。今回の解析では、ここからダウンロードされるsmbdのバージョン4.9.5上で実施されました。これは、Sambaの最新バージョンではないものの、このバージョンもしくはそれ以前のバージョンを製品に組み込んでいるベンダはまだかなり多く存在しています。Pwn2Own Austin 2021でもそうした状況を想定していました。Sambaはデバイス間のファイル共有を提供するため、デフォルトで有効になっていることが多く、smbdの設定は「/etc/samba/smb.conf」に記載されています。以下は、AppleデバイスのTime Machine共有をサポートする際、Sambaがどのように設定されるかを示すsmb.confファイルの一部となります。
図1:「CVE-2021-44142」のこのソースコードはGitHubから取得できます。
ここでは「guest ok = yes」と記述されており、ゲストユーザの認証が可能であることがわかります。vfs objectsのリストには、catia、fruit、streams_xattrの3つのモジュールが含まれています。問題の脆弱性は、Apple SMB クライアントとの互換性を強化するfruitモジュールに存在しています。今回の脆弱性に関するベンダ側の説明によると、「vfs_fruit の問題は、fruit VFS モジュールのデフォルト設定でfruit:metadata=netatalkもしくはfruit:resource=fileを使用した場合に影響します。両オプションをデフォルト値とは異なる設定にすれば、<中略>システムは影響を受けません」と記載しています。
■ どのような脆弱性か
Sambaに同梱されているfruitモジュールは、SambaとNetatalkの間の相互運用性を提供するために設計されています。NetatalkはオープンソースソフトウェアとしてApple Filing Protocol(AFP)により、Unix系システムをAppleデバイスのファイルサーバとして機能させることができます。セッションが確立されると、smbdでは、認証されていないユーザにより、SMB2_SET_INFOを介して拡張ファイル属性を設定することが可能になります。これは「source3/smbd/trans2.c」に存在するset_ea関数によって実行されます。設定時の属性名は「user.SAMBA_PAI」、「user.DOSATTRIB」、「user.SAMBA_STREAMS」、「security.NACL」を含め、プライベートのSamba属性名リストに含まれてはならないようになっていますが、これらの属性を除いて、攻撃者は、任意の拡張属性を設定することができるようになります。
fruit モジュールは「AFP_AfpInfo」もしくは「AFP_Resource」のストリーム名を持つファイルへのアクセス要求を処理します。例えば、「AFP_AfpInfo」を使用すると、攻撃者は、同ファイルのNetatalkメタデータを開いたり、読み取り、書き込みすることができます。Netatalkのメタデータは、adouble(AppleDouble)構造体に格納されており、ad_get/ad_fget関数によって初期化されます。
そしてファイル内のNetatalkメタデータは「org.netatalk.Metadata」という名称で識別される拡張属性の値として格納されます。このメタデータはadouble(AppleDouble)構造体を埋めるために解析されます。この「org.netatalk.Metadata」は、上述のプライベートSamba属性名リストには含まれていないため、攻撃者は、この属性に任意の値を設定することができます。こうして、攻撃者は不正なメタデータ値を注入することが可能となります。そして、adouble 構造体が後で使用される際、複数の境界外メモリアクセスにつながる危険性があります。
以下、Pwn2Ownイベントにおいて示された脆弱性について詳細を解説します。
■ ZDI-22-245: ヒープ領域における境界外読み取り
fruit_pread関数は、ファイルのメタデータを読み取る関数です。ファイルストリームの名称は「AFP_AfpInfo」であり、ファイルタイプは「ADOUBLE_META」であるため、「fruit_pread_meta -> fruit_pread_meta_adouble」という関数の流れとして実行されることになります。この脆弱性利用はZDIでは「ZDI-22-245」と識別しています。
以下のソースコードに沿って説明をします。
図2:「CVE-2021-44142」のこのソースコードはGitHubから取得できます。
この場合、4279行目で、ad_fget関数は、攻撃者が制御するデータを含むadouble構造体を作成します。
4285行目で「ad_get_entry」のコールがADEID_FINDERIエントリへのポインタを返しています。これは攻撃者によって制御可能であるため、攻撃者は「ad->data」バッファの最後のバイトを「p」ポイントにすることができます。これにより、4300行目の「memcpy」コールが割り当てられたバッファの終端を越えて読み込まれ、ヒープから最大31バイトのメモリがダンプされることになります。
■ ZDI-22-246: ヒープ領域における境界外書き込み
fruit_pwrite関数は、ファイルにメタデータを書き込むために使用されます。すでにADEID_FINDERIエントリを制御できるので、それを利用して「memcpy」コールを制御し、ヒープに最大31バイトのデータを書き込むことができます。この脆弱性利用はZDIでは「ZDI-22-246」と識別しています。
以下のソースコードに沿って説明をします。
図3:「CVE-2021-44142」のこのソースコードはGitHubから取得できます。
この場合、4657行目において、ad_fget関数はメタデータからad adouble構造体を生成しています。前述のとおり、攻撃者はここに不正なメタデータを注入し、その中の値を制御することができます。
その後、4664行目において「ad_get_entry」はADEID_FINDERIエントリへのポインタを返しています。この部分は、攻撃者によって制御可能であるため、攻撃者は、pを「ad->data」バッファの最後のバイトを指すように設定することができます。これにより、4671行目の「memcpy」コールが「ad->ad_data」バッファの終端を越えて書き込むことができるようになります。「ad->ad_data」は、ヒープメモリから割り当てられるため、攻撃者は、この脆弱性を利用して、ヒープバッファの終端を越えて最大31バイトのデータを書き込むことが可能となります。
■ ZDI-22-244: ヒープベースのバッファオーバーフロー
Pwn2Ownで示された脆弱性を解析した際、ZDIの脆弱性リサーチャーであるLucas Leong氏は、さらなる脆弱性の亜種に気づきました。
Pwn2Ownで示された脆弱性の場合、SambaはADEID_FINDERI関数の検証に失敗するため、ヒープ領域における境界外読み取りおよび境界外書き込みにつながります。Lucas氏によるさらなる解析では、SambaがADEID_FILEDATESIエントリを検証しないことも確認しました。つまりこれにより、「ad_getdate」での境界外読み取り、および「ad_setdate」での境界外書き込みにつながってしまいます。こうして、以下のコードに見られるように、3バイトのオーバーフローとなります。この脆弱性利用はZDIでは「ZDI-22-244」と識別しています。
図4:「CVE-2021-44142」のこのソースコードはGitHubから取得できます。
攻撃者は、この脆弱性を利用して、smbdデーモンのコンテキストでコードを実行することができるようになる可能性があります。
■ 修正パッチ詳細
今回の脆弱性「CVE-2021-44142」への修正パッチのソースコードは、こちらからご覧いただけます。ベンダからの主な変更点は、この脆弱性を緩和するため、以下の2つの領域への更新となっています。
第一には、Samba において、関数「ad_entry_check_size()」を追加し、AppleDouble 形式を解析する際に各エントリのサイズを検証するように更新されました。
第二に、Sambaにおいて、Netatalkの拡張属性「AFPINFO_EA_NETATALK」をプライベート属性名リストに追加しました。攻撃者は、この悪用の最初の段階で、ファイルに不正な拡張属性を設定する必要があるため、この変更により、任意のNetatalk拡張属性を設定しようとするすべてのユーザを効果的にブロックします。これは、この攻撃手口に対する一般的な緩和策といえます。
■ 結論
Sambaでは、2022年1月31日に今回の脆弱性およびその他の脆弱性も含めて修正パッチを公開しました。本稿では、CVE-2021-44142への修正パッチの詳細を説明しました。また、バージョン4.13.17に加え、バージョン4.14.12および4.15.5が、今回の脆弱性に対応するために新たにリリースされています。開発元は、今回の回避策として「smb.conf」の設定済み VFS のリストからfruit VFSモジュールを削除することも挙げています。しかし、これはSambaサーバにアクセスしようとする macOSシステムの機能に重大な影響を及ぼします。このため、今回の脆弱性では、修正パッチのテストおよび導入に専念することを推奨します。また、企業内で該当デバイスを使用しているサードパーティベンダに連絡を取り、修正パッチの適用およびデバイスのアップデートを確認することをお勧めします。多くのベンダが、自社のデバイスに同梱しているSambaのバージョンを更新する必要があるため、今後、これらの脆弱性に対処するための追加の修正パッチが多数提供されることが予想されます。
参考記事:
- 「CVE-2021-44142: DETAILS ON A SAMBA CODE EXECUTION BUG DEMONSTRATED AT PWN2OWN AUSTIN」
by The ZDI Research Team
翻訳:与那城 務(Core Technology Marketing, Trend Micro™ Research)