
これは、libappimage と appimaged に対する PoC エクスプロイトです。
2 つの CVE を組み合わせることで、一見 AppImage に見えないファイルを作成できます。 このファイルは appimaged によって暗黙的に検出・インストールされ、同一アプリケーションのシステムインストール版を上書きします。
今回のケースでは、ペイロードとして MP3 ファイルが使用され、上書き対象のアプリケーションは Nautilus です。
この脆弱性は、全バージョンの appimaged と、1.0.3 より古いすべての libappimage バージョンに影響します。
MP3 コーデックにはファイルヘッダが存在しないため、メディアソフトウェアはファイル全体をスキャンしてフレームヘッダを探す必要があります。 そのため、ELF ヘッダと AppImage タイプ 2 ヘッダをファイルの先頭に配置しても、MP3 は再生可能なままです。この特性により、MP3 は本 PoC に最適なターゲットとなります。
MP3 ファイルは、再生メディアの後にペイロードバイナリが含まれるように変更されます。Dart スクリプトを使用して、MP3 データをペイロード実行可能ファイルと ELF ヘッダの間に配置します(シンボルテーブル内のシンボルの位置は調整していません。これは追加の労力が必要であり、本 PoC では不要だったためです)。ペイロードバイナリは 1MB 未満であるため、ファイルサイズの顕著な増加は引き起こしません。ファイルの末尾には squashfs ファイルシステムが追加され、偽の Nautilus デスクトップファイルとアイコンが含まれています。
なお、MP3 を squashfs の末尾に追加することも技術的には可能ですが、ファイル内で非常に遅い位置に現れるため、メディアプレイヤーを混乱させる可能性が高くなります。一方、ELF ヘッダの直後はファイルの先頭から数十バイトの位置にすぎません。
appimaged は、監視対象ディレクトリ内のすべてのファイルを、ファイル拡張子に関係なくスキャンします。MP3 を検出すると、ELF ヘッダと AppImage ヘッダを認識し、内部のデスクトップファイルを抽出します。
不正なデスクトップファイルが書き込まれ、悪意のある MP3 を指すようになります。ユーザーが次に「Files」を起動すると、システムインストール版ではなく、MP3 に埋め込まれた ELF 実行可能ファイルが実行されます。
通常、デスクトップファイルは "appimagekit_...desktop" という名前になるため、システムアプリケーションを完全に上書きすることはできません。しかし、libappimage の Integrator.cpp は Name フィールドを検証やエスケープなしで取得するため、不正なデスクトップファイルに次のように追加できます:
Name=/../org.gnome.Nautilus
Name[en]=Files
これにより、ファイルは ~/.local/share/applications/org.gnome.Nautilus.desktop として書き込まれ、システムにインストールされた Nautilus を隠蔽します。
インストールされている libappimage のバージョンが 1.0.3 以上であることを確認してください。これにより、Name フィールドの検証が修正されます。
現時点では、Debian の libappimage はこれに 含まれておらず、かなり古いバージョンであることに注意してください。
すべてのバージョンの appimaged は脆弱であり、プロジェクトは非推奨となりました。
go-appimage は、*.AppImage という名前の AppImage のみを取得することでファイル名の問題を回避しています。AppImageLauncher は、インストール前にユーザーに許可を求めることでファイル名の問題を回避しています。
任意の音声ファイルを audio.mp3 に配置し、dart bin/write_mp3.dart を実行してペイロードをビルドし、変更された MP3 ファイルを書き込みます。これには Dart SDK と FreePascal がインストールされている必要があります。
バイナリには Pascal が使用されました。これは、サブプロセス機能を使用した場合に、テストした他の言語(musl を使用した静的リンク C、Go)の中で最も小さい静的リンクバイナリを生成したためです。
テストでは、world.execute(me) が音声ファイルとして使用されました。これは適切であると考えられたためです。