FlawOpen

flawopen.com/Teardowns/cve-2023-2640-ubuntu-overlayfs-privilege-escalation

● CVE-2023-2640 · CVSS 7.8 · 高
セキュリティ研究 · FlawOpen

CVE-2023-2640:Ubuntu OverlayFS権限昇格

CVE-2023-2640は一部のUbuntuカーネルでOverlayFSの権限確認を回避します。カーネル種別を確認し、ベンダー修正を適用してください。

💡 わかりやすい解説 (ELI5)

訪問者が書類に公式印を押せるか職員が確認する建物を想像してください。ローカルの近道は、建物内の保守ラベルだけ確認を省く目的でした。その後の変更により、制限付きのセキュリティ印を含むすべての印の要求が近道を通るようになりました。修正は、マウントしたファイルシステムのuser namespaceで通常の権限確認を復元します。

主要な概念と専門用語

OverlayFS
OverlayFSは下位層のファイルを表示し、変更を上位層へ書き込むLinuxのunion filesystemです。
Extended attribute (xattr)
拡張属性(xattr)はfilesystemオブジェクトに付与されるメタデータです。Linuxのセキュリティモジュールやfile capabilityは特定のxattr namespaceを使用します。
ovl_do_setxattr()
上位層オブジェクトにxattrを書き込むOverlayFS helperです。影響を受けたラッパーは権限確認を行わないVFS helperを広く使用していました。
Copy-up
書き込みに変更可能なコピーが必要なとき、下位層オブジェクトを上位層へ複製するOverlayFS操作です。

フレームワーク対応

  • このガイドで説明する弱点の CWE 参照: CWE-863

根本原因の分析 (Root Cause)

UbuntuのCVE記録によると、脆弱な構成にはupstreamコミット c914c0e27eb0 とUbuntu SAUCEパッチ「Skip permission checking for trusted.overlayfs.* xattrs」の両方が必要です。このパッチはOverlayFSのxattrラッパーを変更し、内部の trusted.overlayfs.* メタデータだけを対象に権限確認を省く目的でVFS _noperm helperを使っていました。upstreamでラッパーが変更された後、このhelperは他のxattrにも使われるようになりました。そのため、ローカルの非特権ユーザーがマウント済みファイルに特権拡張属性を設定し、適切な確認なしでupper層のファイルへコピーさせる可能性がありました。Canonicalの修正は広範な権限確認なしの経路を戻し、upper mountのuser namespaceを指定して vfs_setxattr() を呼びます。これはUbuntuカーネル固有のローカル権限昇格で、リリース、カーネル種別、namespaceおよびmountポリシーによって影響が異なります。

ステップ・バイ・ステップの攻撃フロー

ステップ 1

対象となるUbuntuカーネル構成

カーネルには c914c0e27eb0 と trusted.overlayfs.* xattrの確認を省くUbuntu SAUCEパッチの両方が必要です。upstreamのバージョン番号だけでは影響を判断できません。

ステップ 2

ローカルユーザーがxattr経路へ到達

ホストのnamespaceとmountポリシーの範囲で、ローカルの非特権ユーザーが対象OverlayFS経路を利用できる必要があります。Ubuntuはローカル攻撃として説明しています。

ステップ 3

権限回避が他のxattrにも及ぶ

変更されたラッパーはOverlayFS内部メタデータ向けの _noperm helperへxattr更新を渡していました。upstream変更後、他のxattrも必要な確認を受けない可能性が生じました。

ステップ 4

特権属性がupper層に到達

Ubuntuによると、マウント済みファイルに特権拡張属性を設定し、必要な確認なしでupper層へコピーできる場合があり、ローカル権限昇格につながる可能性があります。すべての構成が同一ではありません。

ソースコード比較:脆弱 vs 堅牢化

影響を受けたSAUCE経路はupstream変更で適用範囲が広がった後、すべてのxattrに __vfs_setxattr_noperm() を呼んでいました。修正はupper mountのuser namespaceを指定して vfs_setxattr() を使い、通常のVFS確認を復元します。これはCanonicalパッチの要点を示す抜粋で、周辺のdebug出力は省略しています。

ソース抜粋: fs/overlayfs/overlayfs.h

脆弱な実装
/* SAUCE 変更を取り消す前の Ubuntu 標準パッチの該当箇所。 */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
                                  const char *name, const void *value,
                                  size_t size, int flags)
{
    struct inode *inode = dentry->d_inode;
    int err;

    inode_lock(inode);
    err = __vfs_setxattr_noperm(&init_user_ns, dentry, name,
                                value, size, flags);
    inode_unlock(inode);
    return err;
}
堅牢化されたセキュアパッチ
/* Ubuntu の標準修正: 権限を確認する VFS ラッパーを復元する。 */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
                                  const char *name, const void *value,
                                  size_t size, int flags)
{
    int err = vfs_setxattr(ovl_upper_mnt_userns(ofs), dentry, name,
                           value, size, flags);
    return err;
}

エンジニアリング&システム堅牢化チェックリスト

参考資料