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変数の定義の場所は明かにバグっぽいけど,そもそもここのツールチェインダウンロードしてパス通してってやれば,普通にプレフィクスそのままでビルド通るだろうから気がつかなかったんだろな.

2016年7月12日火曜日

フレッツ回線の収容ビルとか障害情報とか

https://flets.com/customer/const2/

ここで自分の住所や電話番号から障害情報やどこのNTTビルに収容されてるか確認できる。
今知りました。

2016年6月25日土曜日

近年のTeXLiveでAdobe14書体を使う+日本語フォント埋め込み

Adobe書体の埋め込み

ちょっと前の情報だと,dvipdfmx -f dlbase14.map foo.dvi などとすれば良いとある.
しかし,最近は dlbase14.map はない.

また,usr/share/texmf-dist/dvipdfmx/dvipdfmx.cfgには
f pdftex.map
という項目があり,pdftex.mapupdmap-sys の結果の pdftex_dl14.map のコピーだった.
だが,デフォルトで,
\renewcommand{\rmdefault}{ptm}
\renewcommand{\sfdefault}{phv}
\renewcommand{\ttdefault}{pcr}
としても,実際に PDF に埋め込まれるのは URW のクローンフォントである.
本当に Times とかを埋め込むには,
# updmap-sys --setoption LW35 ADOBEkb
などとすると,/var/lib/texmf/fonts/map/pdftex/pdftex_dl14.map が書き換えられた.
べつに /usr/share/texmf-dist 以下とか見てなくて,/var/lib/texmf-dist のほうを見てる事にしばらく気がつかず.


日本語フォント埋め込み

デフォルトだと日本語フォントが埋め込まれなくて悲しくなる.というか読み辛い.
次のコマンドでプリセットのフォントマップをつかってくれる.
# kanji-config-updmap-sys auto
大抵の環境で ipa.map を使われると思う.指定できるのは次
hiragino, hiragino-pron, hiragino-elcapitan, hiragino-elcapitan-pron, morisawa, morisawa-pr6n, kozuka, kozuka-pr6n, ipaex, ipa, ms, yu-osx, yu-win, yu-win10
例えば Windows 10 で游書体を使いたいとかなら
C:\Windows\System32> kanji-config-updmap-sys yu-win10
とかすればいい感じにやってくれるはず.試してないけど.

とか書いておきながら,次の TeXLive 2016 ではデフォルトで IPA フォント埋め込みにしてくれるっぽいので知らなくてもいいかもしれない.

P.S.
https://gist.github.com/orumin/235888076da7932cd21e9b1f525d0ff9
 Adobe 14書体をごにょるやつ,ライセンス的にダメっぽいけど.

2016年6月21日火曜日

ちょっとスクレイピングの練習と,narou.rb

ちょっと最近Kindle PaperWhiteを書い直しまして,それと
小説家になろうをちらちらと読むようになった.
私はもともとしたらば掲示板にあるやる夫スレなどを読んでおり,それからすると小説家になろうの小説もまあまあ馴染みやすかったのでつい読んでしまう.

そこで,Kindleで素敵な組版で読めるといいなとおもったところ,
narou.rbの存在を知った.

しかしながら,(当然だが)既に商業化などに付き削除されてしまったものはnarou.rbじゃダウンロードも電子書籍化も不可能である.
だが,Web Archiveに生きている事は多々あり,これをEPUB3にして手元に保持しておきたいなあとか考え,次のスクリプトでnarou.rbで管理できる形に目次と小説本文をyaml形式で保存するスクレイピングスクリプトをつくった.

ぶっちゃけていうとこの素晴らしい世界に祝福を!のWeb版のEPUBをコレクションしておきたかったというわけです.

以下,成果.
RubyもNokogiriもあまりよくわかってないのでイテレーションが非効率な気がするが,まあそんなに問題ないとおもう.