まず真っ先に自分のサイトを確認しろよ、と今になって思ったが、こちらは改竄 されていない模様。危ないところだったのかもしれず。
あらすじ:Web を巡回していたら、突然 Firefox のタブに見慣れないページが 現れたので調査することにした。 現れたページは完全に空白ページなので何だか分からないが、有害なソフトウェ アを実行させようとするサイト(の名残り?)らしい。 まずは、いつどこで開かれたのか分からないので page info を見る。危険かも知れないので、上記のサイトは開かないこと Referring URL で記されているサイト(URL の一部はモザイク加工した)のソー スを見ると、最下部に JS が仕込まれているようだ。 strange_js.txt (view-source) (一部の古いブラウザは、テキストファイルに書かれたスクリプトを実行してし まうようなので、実行部分はこちらでコメントアウトし、一応 view-source: も 経由するようにしておいた) 何重にも暗号化(と言っていいか分からんが)が施されており手動で復号するの は面倒くさいが、document.write を alert に書き換えて仮想 PC のブラウザ上 で実行すれば、とりあえず最終的なスクリプトは得られる。が、復号していく段 階の途中でも少しだけ工夫されていた。 「rf5f6ds」という名前のクッキーが無ければ新たに作成し、jsの復号を続行。 復号が完了すると、今度は「advmaker_komap」という名前のクッキーを同様に調 べ、クッキーの作成から 720 秒経過後にマウス操作が発生したら、可能な限り 最小なウインドウサイズで件のページをポップアップする、という処理が行われ ているようだ。 要するに、720 秒後に爆発する爆弾が、サイトを初訪問したときだけ仕込まれる らしい。 -- とりあえずサイト管理者には連絡した。 が、ただの改竄でなくアカウント乗っ取りだった場合、メールが本来の管理者に 届かない可能性がある。さくらインターネットに連絡するべきだろうか。 -- 追記: どうやら、さくらは過去にも改竄を許してしまったケースがあったようだ。
2008年6月1日から2日にかけて,ホスティング事業者のさくらインターネットが 預かる複数のサーバーの送信データが改ざんされる事件があった。 [ARPスプーフィング]他のマシンあての通信を乗っ取り,監視強化が先決:ITproひょっとしたらそのときの名残りなのかと思ったが、該当ページの最終更新時間 が 2009年3月17日 15:42:36 なので、最近改竄されたものと判断した方が良さそ うだ。上記記事と同様の手口だった場合、サイト管理者にはどうしようもないだ ろうから、やはり、さくらにも連絡するか。 -- 追記2: サイト管理者に連絡がつき、改竄が確認されて現在は、悪意のあるスクリプトは 除去された模様。良かった良かった。 しかしそうなると、さくらに連絡したのは勇み足だったかもしれないな。
あらすじ:オレオレ実装の coroutine は、実は semi-coroutine だったという ことが判明。 http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20070622#p01 http://www.jucs.org/jucs_10_7/coroutines_in_lua/de_Moura_A_L.html Win32API の Fiber なんかは symmetric coroutine ってことになるのかな。 -- libpcl では呼び出し側が call し、呼ばれる側が resume なり exit なりで制御 を返しているのに対して、Lua とかは呼び出し側が resume で、呼ばれる側は yield なのだな。 一発目の呼び出しも resume なのは個人的に奇妙に感じられるけど、create した 時点で一度中断されているものと考えれば受け入れられるか。 -- yield というキーワードがよく分からない。制御権を'譲る'他に、値を'産出'す る意味合いもあるような気がする。 python のジェネレータの例はモロにそれっ ぽい。 そんなこんなで、yield キーワードを選択する場合、戻り値を返せるようにしな ければならない気がするけど……。呼ばれる関数が無限ループでないとき、関数 を抜けると、どうなるのか。どういう挙動を示すべきなのか。 yield が戻り値を返せるとなると、coroutine が終了したことを知るためには、 それ以外の手段を用いる必要がある。 Lua では coroutine が終了する場合 yield と同じ挙動を示すらしい。終了した にも関わらず resume を掛けるとエラーになるとか。 via http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/30969 -- オレオレ実装に yield を盛り込むとしたら、とりあえず coroutine_t にフラグ 変数を仕込んで、終了時に立てる方向かなぁ。 オレオレカーネルももうちょっと弄って形にしたいが、そちらに回す時間がなか なか取れない。
SiOPM の限界に挑戦。というほどでも無いけど。 例によって、この↓ MML を http://www.liarsoft.org/data/7thDragon_Battle1.txt こちら↓に貼り付けて play を押せば(多分)再生されます。 http://mesudak.googlepages.com/siopm_js_poc.html と言いたいところですが、かなり重いデータなのであらかじめ mp3 にしました。 7thDragon_Battle1.mp3 -- SiOPM は既存の非シンセ系 FM 音源と比べて、アルゴリズムと波形の大幅拡充が 図られているので色々やりがいがありますな。まぁしかし、不安定なのがあまり よろしくない。なんども編集しているとブラウザごと巻き込んで処理を返さなく なることが多々あるので、ダメージがでかい。ネイティブアプリ版が欲しくなり ますな。ついでに VSTi も欲しい。むしろ VSTi が欲しい。 -- せっかくだから自分のパーティでも貼っておこう。
自覚がどうのと言った舌の根も乾かぬうちからコルーチンライブラリを更新しま した。今までは入れ子できませんでしたが、8段まで入れ子出来るように改良。 段数は簡単な変更で増やせます。それと、co_resume_to() を co_goto() に変更。 http://www.liarsoft.org/soft/coroutine_gba_1_0_2.zip -- 最初は libpcl の関数名をパクってたはずが、名前も挙動も大分俺々実装になっ てきた……。
今回の件は対岸の火事だと思っているので特に書く事も無いかと思うんだけど、 なんだか一部の人に期待されてるようなのでなんか書こうと思ったけど、やっぱ 特に書くこと無いなぁ。 というのは GBA も同じ道を一度歩んでいるからなんだよな。(そのときの事由は 意匠権の侵害による輸入・販売の差し止めなので、事情が違うという話はあるん だけど) まあ、本来踏むべき手順をすっ飛ばして手を出しているという自覚はどこかで持っ ていた方がよいと思うなあ。自分もたまに忘れるんだけど。ちなみに、その点で homebrew という言葉は語感が良すぎてどうかと思ったりもする。自分でもたま に使うけど。 -- それはそうと、折角なので枯れたハードの非公式開発環境を適当に列挙し、雑感 でも述べてみようかと。 ファミコン : nesasm / cc65 古くはトンカチエディタや、FAMILY BASIC の RAM 増設・ディスク化といった所 までさかのぼれる。現在は nesasm ほぼ一択。C コンパイラもあるにはあるけど。 拡張チップの力でなんでも出来そーな気がするけど、気がしただけ。知らんよ。 PCエンジン : PCEAS / HuC なんと C で開発出来る。HuC は #incbin などの拡張がされてて(恐らくアセン ブラにそのまま渡されるだけだと思うが)素晴らしい、けど知らん。 メガドライブ : SGCC m68k 好きで Z80 好きで、あと FM 音源も好きな人、つまりはオッサン御用達。 C もあればアセンブラもあるし全部ある。 Z80 アセンブラは各自ご自由にといったところだが、最近 GNU binutils が対応 したので、それを使うのが今は一番いいんじゃないかと思う。当サイトで Windows 用にコンパイルしたものを配布している。 PCG が BG とスプライトで共有とか、パレットが16色4本分しか無い(しかも、 これも同様に共有)とか、大胆な制約はあるけど、逆に挑戦のし甲斐もあるかも しれない。 crt0.S が LGPL(実質 GPL)なので、自前で用意したい。 スーパーファミコン : Tricks Assembler / A816 / kasm PPU は強力になったけど CPU が貧弱なので、やっぱりフルアセンブリ。 SPC700 までやるなら WLA DX もあったほうがいいかも。 ぶっちゃけ解像度以外は劣化 GBA なので、GBA から入った身としては触る気が しない。 ゲームボーイ : GBDK 自分で作ったゲームが携帯できるとはすごい時代になったもんだ。でも知らん。 ゲームボーイアドバンス : DevkitAdvance / devkitARM 開発資料が流出してしまい、本体発売前から非公式開発が盛んだったらしい曰く つきのマシン。 DevkitAdvance がメンテナンスされなくなったので、一部を引き継ぎかつ最新の GNU toolchain を使えるようにしたものが devkitARM。1から作るならどちらを 利用しても大差は無い。(でも gcc が 4.3 から目に見えて良質なコードを吐く ようになったみたいなので、最新を選んだ方がお得かも) 非常に素直な構造をしているので、お勉強にはいいんじゃないかと思う。 BG と フレームバッファを選択出来、二昔前のマイコン感覚でも使える。 libgba とか使わんほうが面白いと思うよ。 WonderSwan : LSI-C86 or TurboC or DigitalMarsC + exe2wsx どーしても Witch が手に入らんけど、どーしても Swan でやってみたいという 人向け。そんな奴はおらんと思うが。 キャラジェネやらなんやらが RAM 領域にマップされており、操作は割りと楽。 逆に言うとその分ユーザメモリが圧迫されてる。SRAM 領域でカバー出来るらし いが、8086 のセグメント周りの作法が分からず自分にはどうにも出来なかった。 PS1 : gcc mips ports もうネットやろうぜは入手できないけど、でもプレステって凄かったよな、とい う(以下略) DMA が賢い。ゲーム機のあるべき進化形だと思った。 Caetla とか揃えたけど、揃えただけで放置したよ。 SS : gcc sh ports 知らんけど、SH-2 を二つも積んでるのに片方のコードが NOP だらけとは何事だ ろうとは思った。マゾい。逆に考えると設計者はサドい。 PS2 : ps2toolchain + ps2sdk 基本的にフレームバッファ。GS が触りたい人は gsKit をお好みで。 EE/VU/IOP と三つの環境を押さえる必要があるのでめんどくさい。 VU は 1clk 削るごとにポリゴンが 2000 個増やせるとかゆー世界なので素晴ら しくマゾい。仕事でやる人は大変だな。 DC : gcc sh ports + KOS SDL に OpenGL ラッパーまである。もはや PC と変わらん気も。 -- ○○'を'作りたいって目的と、△△'で'作りたいって手段があると思うんだけど、 非公式開発はどちらかというと手段の方に入ると思う。最初は手探りなのが、全 体像を徐々に把握しあれもこれも出来るようになって、コンピュータを自分の手 で征服していく感覚が得られるのが面白いと思うんだ。(ハッカーが整備した道 を後から歩いているだけだとしてもね) この感覚は組み込みをやっても得られるんだろうとは思うけど、ミーハーでワナ ビーな僕ちゃんは、ゲーム機'で'やってるわけだ。
以前公開した GBA 用コルーチンライブラリは終了処理をちゃんとしていなかった ため、呼ばれる関数は無限ループしている必要があったんですが、真面目に終了 するように改良しました。 改めて GBA ソフトのページ で公開します。 多分 NDS や、その他の ARMv5 プロジェクトでもそのまま使えると思います。 ライセンスは NYSL で。 -- 今回どう改良したかというと、新たに co_exit を設け、あらかじめ lr (リンク レジスタ)に登録するようにしました。関数を抜けると co_exit が呼ばれる(と いうよりは戻っていく)ので、そこで coroutine_t の中身を変更しています。 co_exit はコルーチンから普通に呼んでも安全なので、いきなり死にたいときに 使ってもいいかも。
少し勉強して、sreg で mixi のニックネームが取れるようになった。Yahoo! も 同様にメールアドレスが取れないかなと思ったが、今のところ対応して無い模様。 そんなこんなで、あしあとアプリを作ってみた。 http://www.liarsoft.org/footprint/footprint.cgi -- 得られた Identity そのものを ID として公開しようかと思ったが、その一方で こんな記事を読んでしまい、どうしたら良いのか分からなくなった。これじゃあ OpenID が認証にしか使えない。なるほど、Yahoo! が Sreg に対応しないのも、 ヤフオクが ID を隠すようになった(これは OpenID は関係ないけど)のも同様 の理由があるんだろう。 たとえば、はてなアカウントだったら(タイトル要素で識別表示) こんな感じにすればいいのかなあ。はてなの ID はクロールするまでもなくあち こちで公開されているし、まあそんなに問題には……と思わなくも無い。 google は xrds っぽい url が返ってくるので、識別したければ email を要求 するんだろうけど、例えば hoge@gmail.com を
(同じく、タイトル要素で識別表示) にしたところで、gmail アカウントはバレバレだし、どんな形であれ表示される のは抵抗があるだろうな。俺だって、たった今アカウント隠したし。
入力する ID を &openid.foo=bar のような形にすることで色々悪用出来そうな ので、ID はちゃんとチェックしないと駄目ですね。大文字あるいは小文字のアルファベット・0-9の数字・「-」・「_」(いずれも半角) のいずれかを3-32文字並べたもの(ただし最初の文字はアルファベットであること) から成る。アルファベットの大文字と小文字は互いに区別されるので要注意。 はてなID前エントリの、投げる側の例は修正しておきました。 -- そういうことも起こりうるから OpenID 2.0 が必要だったのか、と一人納得。 となると、むしろ OP Identifier だけを使うべきで、OpenID::Consumer::Lite を無理矢理はてなに対応させるのは悪ということになるなぁ。
Net::OpenID::Consumer::Lite そのものの改造が必要です。 まずは投げる方。#!/usr/local/bin/perl use strict; use warnings; use Net::OpenID::Consumer::Lite; use CGI; my $q = new CGI; my $HATENA_ID = $q->param('hatena_id') || die('hatena id required'); my $check_url = Net::OpenID::Consumer::Lite->check_url( 'https://www.hatena.ne.jp/openid/server', # OpenID Server URL 'http://localhost/openid_verify.cgi', # 帰って来る URL ); if ($check_url =~ m|www\.hatena\.|) { if ($HATENA_ID !~ m|^[a-zA-Z][0-9a-zA-Z_-]{2,31}$|) { die('not hatena id'); } $check_url .= "&openid.identity=http://www.hatena.ne.jp/$HATENA_ID/"; } print $q->redirect($check_url);openid.identity を末尾に追加してます。openid.claimed_id も足した方が良い のかも。(追記) その直前に ID チェックを挟みました。 投げた後はてなから最終的に返ってくるクエリには openid.op_endpoint が入っ ていないので、check_authentication に失敗します。これは欠かせないので、 Net::OpenID::Consumer::Lite に手を加えます。AdHoc な場合分けで対処。sub _check_authentication { ... my $end_point; if (defined $request->{'openid.op_endpoint'}) { $end_point = $request->{'openid.op_endpoint'}; } else { if ($request->{'openid.identity'} =~ m|^http://www\.hatena\.ne\.jp/|) { $end_point = 'https://www.hatena.ne.jp/openid/server'; } else { $end_point = ... } } my $url = do { $request->{'openid.mode'} = 'check_authentication'; my $request_url = URI->new($endpoint); ...こんな感じかなぁ。 利便性を考えると、モジュールの外から endpoint を指定できるようにした方が いいかも。まぁとりあえずはこれで is_valid:true が返ってくれば OK なんだ と思います。 -- google 対応は check_url 時に extensions で email 要求をし、 $check_url の末尾に openid.ns=http://specs.openid.net/auth/2.0 openid.identity=http://specs.openid.net/auth/2.0/identifier_select openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select openid.realm=RETURN_URL を追加、あと mode を checkid_setup にすれば出来そう。 yahoo は assoc_handle と oic.time を見てそうなので無理かな……。対応して もパッと見で分かる識別 ID は得られないので、あまり嬉しくないし、いいか。 -- OpenID に対して、こんな AdHoc なやり方しちゃっていいのかな、と思わなくも 無いんですが、どうなんだろう。
むふー。(;´ω`ω‘)