2016年11月28日月曜日

Ansible 2.2.0 でホストごとに実行するタスクを切り替える

ansibleで実行対象を切り替える方法 http://tdoc.info/blog/2014/05/30/ansible_target_switching.html

このサイトを参考にしようと思ったのですが古くて現在に似わなかったのでメモ.

when: "'foo' in group_names"
inventory_host でグループ分けするところまでは同じ.
when で条件分けをするにあたって,
group_names はタスクを実行しているホストが所属するグループの配列になってるので,目的のグループに所属しているかどうかを in 演算子で確認する感じです.

2016年11月22日火曜日

フォントが埋め込まれていない PDF にフォントを埋め込む

表題通りです.

古い日本語論文を読むと,90 年代終わりから 00 年代初頭ぐらいのもので,
PostScript プリンタのフォントダウンロードを期待して Adobe 基本 35 書体と
Ryumin-Ligtht と GothicBBB-Medium を指定するが埋め込んでいない,
という PDF を見かけることがある.

ふつうは代替フォントが表示されて終わるのでなんでも良いけれども,
Mendeley の内蔵ビューワーであったり,ブラウザ内蔵ビューワーであったり,
そういう環境では埋め込まれていない和文フォントはそのまま表示できずに空白になる.

次のコマンドで GhostScript を使ってこれを解決.

$ gs -o font_embedded.pdf -sDEVICE=pdfwrite -dEmbedAllFonts=true -sFONTPATH="/usr/share/fonts/Type1:/path/to/your/font/dir" font_not_embedded.pdf
-o の後には出力ファイル名,最後の引数にしているのはフォントが埋め込まれていない,今回操作を行ないたいファイルへのパス.
言うまでもないけれども,-sFONTPATH="" には : 区切りでフォントへのパスを書く.

2016年10月31日月曜日

標準エラー出力を pipe で受け取る

たまに標準出力エラーについて加工したくなることがある.
しかし,単純に|を使っても出力は受け取られないので,加工に使うコマンドの標準入力は空のままである.
次のようにすれば良い.
$ mage? 2>&1 >/dev/null | magemge!
これは,一度標準エラー出力をリダイレクトして,標準出力に投げなおしているだけである.つまり以下でも同じことができる.
$ mage? 2> /dev/stdout 1> /dev/null | magemage! 

2016年9月14日水曜日

PS VIta をハックしよう

インロダクション

ずっとまえにこんな記事を書いた私がこのネタを逃すはずがなかった.
そもそも低レイヤに興味をもつ切っ掛けのひとつが PSP のハックシーンだったので,
そのハックシーンの人達がおおきく影響している PS Vita に興味がないわけがなかった.

その PS Vita だが,今年 2016 年の 7 月終わりになりにわかに動きを見せはじめている.

背景と経緯

以前は,PS Vita に内蔵されている PSP エミュレータについて,PSP のファームウェアのバグをつつく形で PSP の Homebrew を起動させることが主流だった.Homebrew はビールの自家醸造を指す単語だが,転じてハックシーンでは自作アプリケーションをコンソールゲーム機で動作させることをいう.PS Vita は PSP の反省からなのかゲームメディアもセーブデータなどを格納するメモリーカードも独自規格かつ暗号化されており,バッテリーを自分で取り外すことも不可能になっていた.
OS には *BSD ベースのものが採用されており(未確認.一部のソフトウェアスタックだけという話も.FreeBSD と NetBSD のふたつについてライセンスされている),ASLR も有効化されてるという.

だが,実はこの PS Vita に搭載されているブラウザのレンダリングエンジン,WebKit の改造版に exploit が存在しており,PS Vita でネイティヴに Homebrew が動作させられるらしい.

そんなこんなで去年登場したのが,Rejuvenate,若返りを意味するハックである.
Yifan Lu 氏によるハックで,PlayStation®Mobile 向けに作った Homebrew が未署名でも動作する.しかし,この PlayStation®Mobile のサービスは去年終了してしまい,Yifan Lu 氏もこの Rejuvenate の開発を停止した.なにより,導入が煩雑であった.

今回の手法

今回登場したのは,またもや Yifan Lu 氏による WebKit exploit で,その名前も
HENkaku(変革)である.
これはとても簡単で,ファームウェアバージョン 3.60 の PS Vita のブラウザで,
上記サイトにアクセスし install ボタンをタップすれば良い.
すると,PS Vita のホーム画面に,molecularShell というバブルが追加され,
VitaShell という PSPFiler を彷彿とさせるファイラーアプリが起動できる.
このファイラーアプリは FTP サーバを兼ねており,FTP を通して自作アプリを送りつければ何でもあそべる.
ちなみに,HEN (Homebrew ENabler) は PSP のハックシーンから使われている用語である.

実装

このハックの詳細は実は開発者が自らブログで詳解しており,PoC も載ってる.
JSArray というコレクションのソートをするメソッド内で toString() が使われており,
これにバグがあって任意コードを配置することが可能だったため,
任意コード実行脆弱性が発生したらしい.
しかも,どうやらカーネル exploit らしいという噂もある.

ちなみにこの穴はファームウェア 3.61 で即座に塞がれた.

バックアップゲーム

また,関連して,案の定というかゲームのバックアップとそれの起動手段が出現した.
これについてはゲームの海賊版を推進し,なおかつ PS Vita のハックシーンをあやうくし,
PSP のときのいたちごっこの再現になるので微妙なところである.
バックアップツールは Vitamin,Vitamin でバックアップしたゲームで使える,PSP のときのようなプラグインのサンプルが Amphetamine,ゲームをバックアップするときに Vitamin がアプリデータベースに注入するデータのコードネームが Morphine とまあ,
ネーミングセンスはあるけどクロい.
試してみた.
我が故郷島根を舞台にした角川ミステリーゲームのゲーム,「√Letter ルートレター」である.というかゲームこれしかまだもってない.
ちなみに,結果は起動に失敗.何かのモジュールが足りないようだ.libc.suprx など差し替えたりしてみると動くかもしれないらしいけどすくなくとも手元では失敗している.

なお,このツールは eboot.bin を復号する処理があるっぽいので少なくとも日本では限りなくクロである.試したものが動かなくてよかった.きっともう使わない気がする,使わないほうが良さそうだ.

開発ツール

Rejuvenate は PlayStation®Mobile を利用するため,Unity とか用意したりちょっと面倒だったらしい(試してない)べつに VitaShell なども動作してた模様. いまは開発停止してるが,https://github.com/psp2sdk といった SDK が当時からあったようだ.
が,今回については PSPSDK のときみたく VITASDK が出てきた.
https://github.com/vitasdk
GNU Toolchain でサクサクっと使えるようだ.
https://vitadev.github.io/
こちらの成果をつかえば,上記 SDK がビルド済みバイナリで簡単に入るみたい.
追加情報:

関連項目

PSP のハックシーンでは有名で,氏のサイトは重要な情報の集積地と議論の場になっている,wololo 氏によって PS Vita の Homebrew コンテストが今日から開催される模様.
コンテスト名,GekiHEN(激変).合計 $800 の賞金が準備されているそうです.
http://wololo.net/2016/09/13/announcing-gekihen-homebrew-contest-ps-vita/
コンテストのレギュレーションや詳細はこちら

本記事執筆時点では早速最初のエントリーがあらわれていた.名前は luaIrc で,
PS Vita が IRC クライアントになるものだ.Lua Player により実装されている.
PSP の Homebrew の初期も Lua Player でいろいろ実装がされていた.

まとめ

色々手を尽くしセキュリティを強化したコンソールゲーム機であっても,バグは無くならないので思いもよらないところから突破される.これはなかなか教訓的だなあと感じるとともに,しかしこういった盛り上がりに興奮を隠せない悪い自分がいるのも見つけてしまうのでした.いやしかし,またなんでもありな感じになってきてしまいましたね……
既に ゲームボーイアドバンスやニンテンドー DS のエミュレータ,DOOM などが移植されています.

VAIO Z(フリップモデル)に Arch Linux をいれる

自分のメインマシンである VAIO Pro 13 | mk2 が不慮の事故で一部破損したので,
実用上一切問題ない箇所だったが修理送りにした.

そこで,今研究室で貸与されている VAIO Z(フリップモデル)にVAIO Pro 13 | mk2 の環境を全部転送することにした.
ちなみに,もちろんデュアルブートにしてる.Windows 消すの勿体なく感じるんですよねぇ.びんぼーしょー.

以下,覚書


  • initramfs には nvme モジュールを含める.
  • btrfs の subvolume にしていた /home は,read-only で snapshot を作成して,btrfs-send で全部送ってやることで /home をそのまま新環境にそっくり移した.
  • その際に,mbuffer を使って転送した
  • 受け側は mbuffer の stdout を btrfs-receive が受ける
また,VAIO Z(フリップフロップモデル)は N-Trig の筆圧感知のタッチスクリーンとペンが付いている.しかし,Linux の X や Wayland はデフォルトではこれを使えない.
次のようにする.
これを /etc/X11/xorg.conf.d に配置しておくことで,ペンを認識するようになる.

最後に,自動回転についてだが,現状これに対応していない.
iio-sensor-proxy というツールを使えば自動回転に対応できるのだが,
そのためのセンサーのドライバがそもそも存在していないためである.
これは Intel Integrated Sensor Hub (Intel ISH) というデバイスのドライバが必要である.
このドライバは先頃 LKML にパッチが投稿,議論されており,ついには
https://lkml.org/lkml/2016/9/7/98
のとおりに hid/for-next のツリーにマージされた.
おそらく Linux 4.9 から使えるようになるだろう.

2016年8月18日木曜日

ビルドしたx86_64なPC向けの「lk」カーネルをQEMUで動かす

前回の記事の続き.

ビルドしたものはscripts/do-qemux86-6を付けると動かせる.
が,このスクリプトを走らせるとmakeでlkのビルドをしなおそうとする.

正直単にQEMUを起動するだけなので,次のコマンドをlkのプロジェクトディレクトリのルートで行なえば良い.
$ qemu-system-x86_64 -m 512 -smp 1 -machine q35 -kernel build-pc-x86-64-test/lk.elf -nographic
-enable-kvm -cpu hostを付けるとか-nographic外して-serial stdio付けるとか,-m-smpの後ろの数字変えてメモリ割り当てやVCPU数変えるとか,
scripts/do-qemux86で指定できるオプションでの引数の変更とかは勝手にすれば良いと思う.

Googleの新OS,Fuchsiaに使われてるらしいカーネル「lk」をx86_64なPCをターゲットにビルドしてみる.

表題の通りです.
レポジトリはここ
https://github.com/littlekernel/lk.git

まずは,
$ git clone https://github.com/littlekernel/lk.git
$ cd lk
ここで次のパッチをあてる.
このパッチは2つの変更から為る.

ひとつめ
arch/x86/toolchain.mkの25行目,FOUNDTOOLが,ifndef ARCH_x86_64_TOOLCHAIN_PREFIX の中にある.
これだとARCH_x86_64_TOOLCHAIN_PREFIXを自分で指定したら必ずビルドに失敗してしまう.
しかも,この変数はもし宣言されてない場合はx86_64-elf-をプレフィクスにしようとする.大半のPCのLinux環境ではx86_64-pc-linux-gnu-だろう.
ふたつめ
engine.mkGLOBAL_DEFINESHAVE_MREMAP=0を追加する. Linuxだとこの環境変数はデフォルトで1にされてしまい,external/lib/heap/dlmalloc/dlmalloc.cmremap(2)を使おうとするが, その実装がこのプロジェクト中に存在しないので,ビルドに失敗する.

加えて,次の修正が必要かもしれない.
binutilsの中でも,nm, c++filt, objdump, objcopy, size, ldのコマンドを使用するが,このlkのビルドシステムはARCH_x86_64_TOOLCHAIN_PREFIXで指定したツールチェインのプレフィクスがこれらコマンドについてる前提でビルドする. しかし,x86_64向けのbinutilsにプレフィクスがついたコマンド名のコマンドが入ってない場合も多い.その場合はlnコマンドとか使ってなんとかするしかない.

以上を修正したところで,次の通りに実行.
(ただしツールチェインのプレフィクスは自分の環境に合わせてください)

$ env ARCH_x86_64_TOOLCHAIN_PREFIX=x86_64-pc-linux-gnu- make pc-x86-64-test
これでビルドは完了

P.S. という指摘を貰う.ARMとかMIPSとかだけじゃなくてi386/x86_64もここのツールチェイン使うが正解っぽい. FOUNDTOOL変数の定義の場所は明かにバグっぽいけど,そもそもここのツールチェインダウンロードしてパス通してってやれば,普通にプレフィクスそのままでビルド通るだろうから気がつかなかったんだろな.