
CVE-2026-92162 の教育的な解説記事とテストモード PoC。Flatpak の DeployAppstream の arch パラメータにおけるパストラバーサルにより、root ディレクトリの作成が可能になる。
Flatpak システムヘルパー(flatpak-system-helper)におけるパストラバーサルの教育用解説およびテストモードの概念実証。DeployAppstream D-Bus メソッドは arch 文字列を受け取り、それをファイルシステムパスに埋め込み、検証なしで root として作成します。アクティブなローカルユーザーは ../ コンポーネントを指定することで、root 権限のサービスに意図された appstream ツリー外のディレクトリを作成させることができます。
このリポジトリは、完全な技術分析とリサーチのポストモーテムに付随するものです。教育目的、仕組みを理解したい防御者、および自身が所有するか書面による許可を得て評価するシステムでの認可されたテストのために存在します。
この資料は、協調的開示および修正済み Flatpak リリースの提供後に公開されています。概念実証は、自身が所有するか、明示的にテストを許可されたラボマシンに対してのみ実行してください。管理下にないシステムに対して実行しないでください。法律および保有する認可の範囲内に留まる責任はあなたにあります。
システムヘルパーの handle_deploy_appstream() は origin 引数を検証しますが、arch 引数は検証しません。OCI リモートの場合、arch は flatpak_build_file に渡され、次に g_mkdir_with_parents に渡されます。これは root として実行され、../ を字句的に解決します。このメソッドの polkit アクションは org.freedesktop.Flatpak.appstream-update であり、allow_active=yes であるため、アクティブなローカルセッションはパスワードプロンプトなしでこのコードに到達します。fedora リモートを持つデフォルトの Fedora Workstation など、すでに OCI リモートが存在するシステムでは、低権限ユーザーが任意のパスに root 所有のディレクトリを作成できます。このリポジトリのペイロードは /root/.ssh 自体を標的にしています。
この脆弱性(ファインディング A)は、制御された認可されたラボにおいて、未認証のローカルユーザーからマシン上の root へ昇格するために使用された2つの脆弱性チェーンの一部として実証されました。チェーンは次のように機能します。ファインディング A が root として /root/.ssh を作成します。ファインディング B(二次的な書き込みプリミティブ)は、そのディレクトリに攻撃者が制御するコンテンツを書き込むことができます。両者を組み合わせることで、攻撃者は攻撃者が選択したパスに root 所有のファイルを配置できます。各バグ単独では限定的です。ファインディング A はディレクトリを作成するだけで、ファインディング B は親ディレクトリがすでに存在する場所にしか書き込めません。ファインディング A がファインディング B に必要な親ディレクトリを提供し、このペアが root ファイル書き込みとなります。
ファインディング B はこのリサーチによって独自に特定されましたが、新しい発見ではありません。これはリサーチのポストモーテムに記載されている、Deploy の extra data 書き込みパスにおける既知の、まだ未修正の弱点です。したがって、この解説はファインディング A を対象とし、その功績を認めるものであり、ファインディング B はチェーンが依存する既知の未修正コンポーネントとしてのみ使用しています。
このリポジトリはファインディング A のみを実証します。チェーン化の手法と防御上の教訓はリサーチのポストモーテムに記載されています。
プロジェクトはすでに flatpak_is_valid_arch を提供しており、これはアーキテクチャ名を [A-Za-z0-9_] に制限します。修正は、ハンドラ境界およびパス構築ヘルパー内で arch 引数に対してこれを呼び出すことです。../ の値はこの述語を通過できません。修正済みの Flatpak リリースに更新してください。
.
├── README.md このファイル。
├── requirements.txt PoC のシステムパッケージ前提条件。
└── poc_arch_traversal.sh 未検証の arch パラメータに対する PoC。
デフォルトではサンドボックス化されたテストモード、
本番モードは /root/.ssh を標的にする。教育用途のみ。
requirements.txt のパッケージが存在する Linux マシン。allow_active=yes に依存するためです。次で確認してください:
loginctl list-sessions を実行し、セッションに seat が表示されることを確認します。/usr/libexec/flatpak-system-helper です。スクリプトはまず Flatpak ソースツリーの builddir/ または _build/ にある新しくビルドされたヘルパーを探し、FLATPAK_SYSTEM_HELPER がすべてを上書きします。
必要なシステムパッケージについては requirements.txt を参照してください。本番モードは、システムインストール上の既存の OCI リモートを自動検出して使用します。mkdir はレジストリに接触する前に実行されるため、偽の、あるいは到達不能なものでも、任意の OCI リモートが機能します。OCI リモートが存在しない場合、スクリプトは「No OCI remote found」というメッセージでキャンセルし、何も送信しません。
Fedora Workstation にはすでに OCI の fedora リモートが同梱されているため、そこでは何もする必要がありません。flatpak remotes --system で存在するものを確認してください(OCI リモートは options 列に oci と表示されます)。
これはフロー全体で sudo を必要とする唯一のコマンドであり、スクリプトが代わりに実行することはありません。次で追加します:
sudo flatpak remote-add --system --no-gpg-verify oci-poc oci+http://127.0.0.1:19876
(flatpak には --oci フラグがありません。少なくともこの作業の基盤となったバージョンである 1.19.0 までは。oci+ URL プレフィックスがリモートを OCI レジストリにするものです。)レジストリが実行されていない場合、「Warning: Could not update extra metadata」というメッセージが予想されますが、リモートは追加されます。
bash poc_arch_traversal.sh
スクリプトはプライベートな D-Bus バスと --session モードのヘルパーを、すべて一時ディレクトリの下で起動します。ペイロード ../../../../../root/.ssh を指定して DeployAppstream を呼び出し、エスケープされたディレクトリが実際のターゲットを模した <workdir>/root/.ssh に作成されたことを検証します。出力の途中で D-Bus エラーが発生することが予想されます。これはディレクトリがすでに作成された後に OCI インデックスのフェッチが失敗したものであり、予想される動作です。
bash poc_arch_traversal.sh prod
スクリプトはパスワードを要求しません。OCI リモートを自動検出し、トラバーサルペイロードを指定して DeployAppstream を未認証でトリガーし、ヘルパーの応答を出力します。root ヘルパーは /root/.ssh を作成し、その後到達不能なレジストリで失敗し、予想される D-Bus エラーを出力します。応答が代わりに認証エラーである場合、あなたはアクティブなローカルセッションにいません。マシンのコンソールから実行してください。特定のリモートは bash poc_arch_traversal.sh prod <remote> で強制できます。
トリガー自体は非特権で実行されますが、結果の確認には root が必要なため、スクリプトはそれをあなたに委ねます。実行後、同じマシンで:
sudo ls -laR /root/.ssh
sudo stat -c '%U:%G' /root/.ssh
ディレクトリが存在し、root:root によって所有されている必要があります。スクリプト出力の D-Bus エラーは失敗ではありません。メソッド呼び出しが失敗してもエスケープされたディレクトリが存在するため、mkdir がフェッチの前に実行されたことを証明しています。
実行前に /root/.ssh がすでに存在していた場合(例えば sshd が実行中のホスト)、そのパスに対する実行は何も行わず、何も残しません。ヘルパーの lock ファイルは一時的であり、メソッドが戻ると削除され、icons はインデックスのフェッチが成功した後にのみ書き込まれます。クリーンな検証には、まだ存在しないパスに対して実行してください。
sudo rm -rf /root/.ssh # 実行前に存在しなかった場合のみ
sudo flatpak remote-delete --system oci-poc
リサーチと解説: Yehia Ali Mohamed Ezzat。
このリポジトリのドキュメントとコードは教育目的で提供されています。 自己責任で、認可された場所でのみ使用してください。