
深刻度: クリティカル (CVSS 9.8)
コンポーネント: opencontainers/runc (libcontainer)
脆弱性タイプ: CWE-59: ファイルアクセス前のリンク解決の不備 ('Link Following')
runc の maskPaths 関数に重大な脆弱性が存在します。コンテナ内の機密パス (例: /proc/kcore) をマスクする際、runc は os.OpenFile(path, O_PATH, 0) を O_NOFOLLOW フラグなしで使用します。これにより、悪意のあるコンテナプロセスがターゲットパスを機密ホストファイル (例: /etc/shadow) へのシンボリックリンクに置き換え、runc がコンテナパスではなくホストファイルに対してマウント操作を実行する可能性があります。
同梱の exploit.go は、このバイパスを可能にするカーネル動作を示しています。
Linux 環境 (再帰をテストする場合は CAP_SYS_ADMIN を持つコンテナ) 内でコンパイルして実行します:
go run exploit.go
// Vulnerable Code Pattern in runC:
// 1. Path is typically provided as a string (e.g. from config)
// 2. runC calls os.OpenFile(path, O_PATH...)
// 3. MISSING: unix.O_NOFOLLOW flag
// Result: Kernel follows symlink if attacker swapped the path.
必要なパッチ:
マスク処理の宛先パスを開く際に unix.O_NOFOLLOW を含めるように libcontainer/rootfs_linux.go を更新してください。
- dstFh, err := os.OpenFile(path, unix.O_PATH|unix.O_CLOEXEC, 0)
+ dstFh, err := os.OpenFile(path, unix.O_PATH|unix.O_CLOEXEC|unix.O_NOFOLLOW, 0)
exploit.go: Go で書かれた機能する PoC コード。analysis.md: レースコンディションの詳細な技術分析。cve_draft.md: 提出用のレポートテンプレート。免責事項: このコードはセキュリティ研究および教育目的のみで提供されています。