<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel rdf:about="http://www.netagent-blog.jp/">
<title>NetAgent Official Blog</title>
<link>http://www.netagent-blog.jp/</link>
<description>現場の第一線で活躍するスペシャリストが、日々の研究や実際の仕事現場から得た最新情報やノウハウやTipsなどを、このブログを通じてご紹介していきます。
</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="http://blog.livedoor.com/?v=2.0" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<items>
 <rdf:Seq>
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51859201.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51856649.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51855130.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51797614.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51791538.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51779232.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51774253.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51769168.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51764059.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51762319.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51759591.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51756259.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51752634.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51749738.html" />
  <rdf:li rdf:resource="http://www.netagent-blog.jp/archives/51746238.html" />
 </rdf:Seq>
</items>
</channel>
<item rdf:about="http://www.netagent-blog.jp/archives/51859201.html">
<title>ファイル共有を肯定する“宗教”kopimism伝道教会とは</title>
<link>http://www.netagent-blog.jp/archives/51859201.html</link>
<description>こんにちは、松本です。ずいぶんお久しぶりになります。さすがに３回連続で杉浦に記事を書いてもらうのはまずいという事で急遽私に白羽の矢が立てられました。さて、そんな内輪の事情はさておき、今回は年明け早々にネット上で話題になったmissionary church of kopimism（以...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2012-03-05T15:00:13+09:00</dc:date>
<dc:subject>松本隆</dc:subject>
<content:encoded><![CDATA[こんにちは、松本です。ずいぶんお久しぶりになります。さすがに３回連続で杉浦に記事を書いてもらうのはまずいという事で急遽私に白羽の矢が立てられました。さて、そんな内輪の事情はさておき、今回は年明け早々にネット上で話題になったmissionary church of kopimism（以下kopimism伝道教会）という、ファイル共有を信仰する宗教について書いてみようと思います。kopimism伝道教会は私が今ヲッチしている中で一押しのカルト（※1） です。まずはこの動画（YouTube)を見てたっぷりと雰囲気を味わってから記事を読むのをお勧めします（笑）<br>
<br>
<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/2Y9gMhTyM-E&feature=youtube_gdata_player"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/2Y9gMhTyM-E&feature=youtube_gdata_player" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="350"></embed></object><br>
<br>
-----<br>
<br>
■ kopimism伝道教会の誕生<br>
　2012年1月4日ネット上にkopimism伝道教会が<a href="http://torrentfreak.com/file-sharing-recognized-as-official-religion-in-sweden-120104/">スウェーデンで正式に宗教として認められたという興味深い記事<a/>が流れました。（※2） kopimism伝道教会はスウェーデンの哲学科の学生Isak Gersonによって2010年に設立された組織です。彼はインターネット上での自由な知識共有の信奉者でした。倫理と政治哲学を専攻し、インターネットと著作権の共存について否定的であり、著作権制度自体に反対の立場をとっています。世界中で商業ソフトウェアやコンテンツの違法コピー（いわゆる海賊版）の規制が強まり、ファイル共有ユーザーが当局に迫害を受けている状況を嘆き、同志を救済しコピー行為を正当化するためにkopimism伝道教会を立ち上げました。また、彼らは国家による信仰の保護を求めてスウェーデンで法務や金融の行政サービスを司るKammarkollegietに対して、<a href="http://torrentfreak.com/file-sharers-await-official-recognition-of-new-religion-110410/">正式な宗教として認めるよう申請<a/>を行いました。その試みは<a href="http://www.upi.com/Odd_News/2011/07/07/Sweden-File-sharing-not-act-of-worship/UPI-57381310055881/?spt=hs&or=on">2度失敗に終わりました<a/>が、宗教としての体裁を整え3度目の申請でようやく実現にこぎつけました。<br>
<br>
　2012年2月27日現在、教会は（ドメイン上ですが）世界17ヶ国に存在し、信者は6000人を超えるといわれています。その中には<a href="http://kopimistsamfundet.jp/">日本教会<a/>が含まれているのも非常に興味深いところです。<br>
<br>
　<a href="http://livedoor.blogimg.jp/netagentblog/imgs/8/a/8a3edddf.png" title="svg" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/8/a/8a3edddf-s.png" width="135" height="135" border="0" alt="svg" hspace="5" class="pict" align="right"  /></a>kopimism伝道教会が目指すのは、全ての人々が知識を共有しあらゆる情報に自由にアクセスできる世界です。そのために情報の検索や知識の循環、それを促すファイルのコピーは神聖な行為として正当化されます。Windowsのコピー＆ペーストコマンドのCtrl + CとCtrl + Vをモチーフにしたシンボルが彼らの信仰を端的に表しています。<br>
　信者（Kopimist）達にとって、ファイルをコピーし、リミックスし、共有することは倫理的に正しい行為であるとされているわけです。更に詳しい信仰内容に興味のある方はkopimism伝道教会の<a href="http://kopimistsamfundet.se/var-vardegrund/">信仰のページ<a/>をご参照ください。また、<a href="http://kopimistsamfundet.se/var-konstitution/">憲法のページ<a/>にはkopimism伝道教会の組織運営についても説明されています。個人的には、教義の中でインターネットが神聖なものとして尊重されていて、当局からの監視などを想定とした通信の秘密とうまく共存できそうな仕組みになっている点は興味深い部分です。ただ、今回はそのkopimism伝道教会の教義ではなく、こうした「知識の共有と循環を善とする宗教」を立ち上げた目的の部分について少し考えてみたいと思います。<br>
<br>
■ なぜ宗教なのか<br>
　スウェーデンという国は、BitTorrentにおける世界最大のトラッカーサイトThe Pirate Bayを生み出し、またインターネットファイル共有の合法化を目指した政党Pirate Party（スウェーデン海賊党）が設立されるなど、ファイル共有の歴史の中で非常に象徴的な立ち位置を占めています。特にスウェーデン海賊党の存在は、単に情報共有だけでなくユーザーのプライバシーを守るという発想においてもkopimism伝道教会の在りかたと非常にリンクしているように見えます。<br>
　<br>
　そのスウェーデン海賊党は、知識の自由な共有と情報の自由を理念として掲げて2006年に結成されました。著作権や特許法の改正など既存の知的財産権に対抗し、市民の権利を強化するという活動によりスウェーデン国内の7.13パーセントの票を獲得し、2009年の欧州議会選挙では1議席を獲得しました。このように民主主義的な手続きに則って、既存の法律を改正し、ハッカーの理念を達成しようとしているのがスウェーデン海賊党であるとする見方もできます。この試みは、手続きとしては非常にまっとうではありますが、市場経済のルールが優先される現代では、決して多数派にはならないでしょう。<br>
<br>
　その意味でIsak Gersonによるkopimism伝道教会の設立は非常に興味深く、その是非はさておき個人的には３つの意義があると考えます。ひとつは民主主義的な手続きを踏みながらも、知的財産権と同じステージで争わないと宣言したこと。Kopimism伝道教会はスウェーデン海賊党とは異なる、法律と戦うのではなく回避する道を選択したわけです。ふたつめは国家から宗教としての認可を得たことで、国内の信者や宗教関係者が最低限の保護を受けられるような組織を生み出し、またその道筋を世界に示したこと。みっつめは知識の共有に対し「善」という、共同体の垣根を越えた普遍的な概念を定義し、その実現手段であるファイル共有を倫理的に肯定する教義をまとめ、広く布教活動を実施することを可能にしたことです。「ファイル共有を積極的に肯定する宗教」という響きはジョークのようですが、考えてみるとこれはなかなか現実的かつ興味深いアプローチであるとも思います。<br>
<br>
■ スウェーデンの思惑<br>
　ここまで、kopimism伝道教会やスウェーデン海賊党について、彼らファイル共有を是とする側の視点で書いてきました。しかし私が最も気にかかっているのは「なぜスウェーデンはkopimism伝道教会を宗教として認可したのか」という点です。<a href="http://diamond.jp/articles/-/4192/">アイスランドのような特別な思惑<a/>があるのかもしれませんし、深い意図などないのかもしれません。私はいちヲッチャーとしてこれからもスウェーデンのファイル共有事情をヲチし続けようと考えています。また何か動きがありましたら、ブログで報告できればと思っています。<br>
<br>
<br>
※1 正式に国家から宗教として認可されたことで「カルト」という表現は適切でないかもしれない。しかし動画を御覧いただければ一目瞭然だが雰囲気はまだまだ十分にカルトっぽい<br>
<br>
※2 「正式に宗教として認められた」は意味的に強すぎるかもしれない。実際には国家に宗教として認識された、もしくは登録が認可されたという意味合いか
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51859201" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51856649.html">
<title>Anonymousの攻撃は成功するのか？</title>
<link>http://www.netagent-blog.jp/archives/51856649.html</link>
<description>ネットエージェント株式会社、代表取締役社長の杉浦です。今回は、「Anonymousがインターネットのルートサーバをダウンさせると予告してきた」ことに関連する内容といたしました。

-----

Anonymousがインターネットのルートサーバをダウンさせると予告してきた。
ルートサ...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2012-02-21T20:08:49+09:00</dc:date>
<dc:subject>杉浦隆幸</dc:subject>
<content:encoded><![CDATA[ネットエージェント株式会社、代表取締役社長の杉浦です。今回は、「Anonymousがインターネットのルートサーバをダウンさせると予告してきた」ことに関連する内容といたしました。<br>
<br>
-----<br>
<br>
Anonymousがインターネットのルートサーバをダウンさせると予告してきた。<br>
ルートサーバは、インターネットの名前解決における一番の元となるサーバである。一般の人が直接利用する事はほとんどないが、もし仮にここが長時間使えなくなった場合、インターネットもメールも使えなくなると思って良い。<br>
＜参考URL＞<br>
<a href="http://www.itmedia.co.jp/news/articles/1202/21/news033.html">http://www.itmedia.co.jp/news/articles/1202/21/news033.html</a><br>
<br>
■本当にルートサーバはダウンするのか？<br>
DoSアタックは基本的に数対数の戦いになるので、圧倒的に物量で優位に立てれば勝つという単純な図式が成り立つ。<br>
攻撃側が大量のクエリー（要求）を送信しても、相手側が捌ける量を超えなければ、そもそも攻撃は成功しない。また、もし特定の相手側サーバ1台に攻撃が成功するだけの送信量だったとしても、ルートサーバによっては複数のホストのクラスタとして実装されており、攻撃対象となる到達先の機器が分散される仕組み(Anycastによる負荷分散)等もあるので、サーバクラスタそのものに対する目的（＝ダウン）は達成されない。<br>
最近の一般的なサーバ１台の応答性能は50,000～100,000クエリー/秒程度である。では、果たして攻撃側のDoSアタックではどの程度まで送出可能なのであろうか？かつて社内の製品試験で過去に数多くのDNSクエリーを発行する実験を行ったところ、社内のテスト環境でも1,000,000クエリー/秒ぐらいのリクエストが送信可能だった。<br>
実験と違い、DDoS用途として扱う場合はリアルなDNSクエリーにする必要があるので、若干手を加えることになる。しかし、ほぼ同等の速度でクエリーを送出することはそう難しくないだろう。攻撃側は想像より少ないDoSアタック用端末数でも攻撃を成功させることが可能なのかもしれない。<br>
<br>
■実際の影響は？<br>
仮にルートサーバが全部ダウンしたとしても、直後であれば大半のページは閲覧可能だろう。ルートサーバがダウンした場合に生じる現象としては、Webサイト閲覧やメールの送受信が出来なったりするわけだが、ルートサーバが攻撃されている間、クライアントとの中間に存在するDNSキャッシュサーバがキャッシュを保持し続けている間は、こうした名前解決のトラブルは発生しにくい。従って、もし本当に3月31日に攻撃が始まったなら、DNSのキャッシュ内容をフラッシュするのは止めておいたほうが良い。ルートサーバのレコードのTTL(Time To Live＝寿命)は比較的長いので、うまく行けば攻撃が終わるまで、ルートサーバのキャッシュ寿命が切れる前に攻撃が終わる。<br>
ちなみにrootサーバによってレコードの寿命は異なる。中には800秒や3600秒といった短い寿命のTLDもあり、攻撃による影響が出やすいため見られないサイトが出てくる可能性がある。ちなみに日本にあるm.root-servers.netは3600000秒、およそ41日程度だ。恐らくはその辺の事情もあって、Anonymous側は攻撃が数日続く可能性も示唆しているのだろう。<br>
<br>
■誰が守ればいいのか？<br>
まずルートサーバを管理運営している組織、関係者がこれを守るのは当然だが、時間的余裕があればそれだけ対策は立てやすくなる。Anonymousの攻撃予告は3月31日で、それまでまだ40日近くある。当日までに世界中の多くの関係者が知恵を絞ってきちんと対策するはずで、恐らく大きな問題は生じないと思われる。<br>
だがもし仮に万が一攻撃が成功してルートサーバがダウンしてしまった場合に備えて事前に何が出来るか。名前解決ができなくなるであろうと予測される期間に備え、レコードを事前にキャッシュしておくことで一定の効果は見込まれる。要は予めルートサーバのコピーを作っておいて、いざというときには使えるような備えをしておくような運用が出来ればよい。<br>
<br>
<a href="http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%83%E3%83%97%E3%83%AC%E3%83%99%E3%83%AB%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E4%B8%80%E8%A6%A7">トップレベルドメイン一覧</a>にあるデータを前もって全部引いておき、キャッシュ。<br>
<br>
以下のコマンドを叩くと全TLD(Top Level Domain)を引いてくれる。<br>
<quart><br>
perl -e '$a="arpa,aero,asia,biz,cat,com,coop,info,int,jobs,mobi,museum,name,net,org,pro,tel,travel,xxx,edu,gov,mil,ac,ad,ae,af,ag,ai,al,am,an,ao,aq,ar,as,at,au,aw,ax,az,ba,bb,bd,be,bf,bg,bh,bi,bj,bm,bn,bo,br,bs,bt,bv,bw,by,bz,ca,cc,cd,cf,cg,ch,ci,ck,cl,cm,cn,co,cr,cs,cu,cv,cx,cy,cz,dd,de,dj,dk,dm,do,dz,ec,ee,eg,eh,er,es,et,eu,fi,fj,fk,fm,fo,fr,ga,gb,gd,ge,gf,gg,gh,gi,gl,gm,gn,gp,gq,gr,gs,gt,gu,gw,gy,hk,hm,hn,hr,ht,hu,id,ie,il,im,in,io,iq,ir,is,it,je,jm,jo,jp,ke,kg,kh,ki,km,kn,kp,kr,kw,ky,kz,la,lb,lc,li,lk,lr,ls,lt,lu,lv,ly,ma,mc,md,me,mg,mh,mk,ml,mm,mn,mo,mp,mq,mr,ms,mt,mu,mv,mw,mx,my,mz,na,nc,ne,nf,ng,ni,nl,no,np,nr,nu,nz,om,pa,pe,pf,pg,ph,pk,pl,pm,pn,pr,ps,pt,pw,py,qa,re,ro,rs,ru,rw,sa,sb,sc,sd,se,sg,sh,si,sj,sk,sl,sm,sn,so,sr,ss,st,su,sv,sy,sz,tc,td,tf,tg,th,tj,tk,tl,tm,tn,to,tp,tr,tt,tv,tw,tz,ua,ug,uk,us,uy,uz,va,vc,ve,vg,vi,vn,vu,wf,ws,ye,yt,yu,za,zm,zw,xn--lgbbat1ad8j,xn--54b7fta0cc,xn--fiqs8s,xn--fiqz9s,xn--wgbh1c,xn--node,xn--j6w193g,xn--h2brj9c,xn--mgbbh1a71e,xn--fpcrj9c3d,xn--gecrj9c,xn--s9brj9c,xn--xkc2dl3a5ee0h,xn--45brj9c,xn--mgba3a4f16a,xn--mgbayh7gpa,xn--80ao21a,xn--mgbx4cd0ab,xn--mgbc0a9azcg,xn--mgb9awbf,xn--mgbai9azgqp6j,xn--ygbi2ammx,xn--wgbl6a,xn--p1ai,xn--mgberp4a5d4ar,xn--90a3ac,xn--yfro4i67o,xn--clchc0ea0b2g2a9gcd,xn--3e0b707e,xn--fzc2c9e2c,xn--xkc2al3hye2a,xn--mgbtf8fl,xn--kprw13d,xn--kpry57d,xn--o3cw4h,xn--pgbs0dh,xn--j1amh,xn--mgbaam7a8h,xn--mgb2ddes";@b=split(",",$a);for(@b){system("dig $_ ns");}'<br>
</quart><br>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51856649" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51855130.html">
<title>すれちがい通信におけるプライバシー保護</title>
<link>http://www.netagent-blog.jp/archives/51855130.html</link>
<description>ネットエージェント株式会社、代表取締役社長の杉浦です。今回は、いつものセキュリティネタとは少し離れてしまいますが、本日（2月14日）に絡めた内容としました。

-----

2月14日に絡めたセキュリティということで、普段の業務ではもっと高度な攻撃について調査しているの...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2012-02-14T17:49:04+09:00</dc:date>
<dc:subject>杉浦隆幸</dc:subject>
<content:encoded><![CDATA[ネットエージェント株式会社、代表取締役社長の杉浦です。今回は、いつものセキュリティネタとは少し離れてしまいますが、本日（2月14日）に絡めた内容としました。<br>
<br>
-----<br>
<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/b/9/b93d1061.png" title="new_loveplus" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/b/9/b93d1061-s.png" width="160" height="68" border="0" alt="new_loveplus" hspace="5" class="pict" align="left"  /></a>2月14日に絡めたセキュリティということで、普段の業務ではもっと高度な攻撃について調査しているのですが、今回は今年のバレンタインデーに発売される<a href="http://www.konami.jp/products/newloveplus/new.html" target="_blank">nintendo 3DSの某ゲーム</a>に関する重要なプライバシーの保護として、ゲームを最大限に楽しみつつもゲームをプレイしていることが職場や学校で発覚しない方法について検討しようと思います。<br>
<br>
3DSでは、これまでのDSとは異なり、すれちがい通信の設定を登録をしておくことにより、そのゲームをプレイしていない時でもすれちがい通信をすることができる機能が搭載されています。この機能のおかげで、仮に他のゲームをプレイしている最中であっても、あらかじめ登録されてあったゲームについてはすれちがい通信を行うことが出来ます。3DSが普及してきた今では、街中の至るところで様々な人と簡単に複数のゲームのすれちがい通信を楽しむことができるようになりました。<br>
<br>
また、3DSにはすれちがった人のMii（自分で設定したアバター）が自分の3DSにやってくる<a href="http://www.nintendo.co.jp/3ds/software/built-in/miiplaza/index.html" target="_blank">「すれちがいMii広場」</a>というコミュニケーションソフトがあらかじめ内蔵されています。やってきたMiiには、Miiの外見や名前とともに、住んでいる都道府県名、いつすれちがったのか、今までに何回すれ違ったのか、そして「<b>さいごにあそんだゲーム</b>」といった情報も付随しています。<br>
<br>
実はここが問題なのですが、もしもこの<b>さいごにあそんだゲーム</b>が他人には知られたくないゲームタイトルだった場合、リアルの人間関係が気まずくなる可能性があるわけです。<br>
<br>
プレイしていることを周囲の人に知られたくないかもしれないようなゲームとしてよく挙げられるタイトルには、次のようなものがありますね（笑）。<br>
<ol><br>
<li>2月14日発売     <a href="http://www.konami.jp/products/newloveplus/new.html" target="_blank">http://www.konami.jp/products/newloveplus/new.html</a><br>
<li>3月15日発売予定 <a href="http://www.d3p.co.jp/jktoxx_3ds/pc.html" target="_blank"> http://www.d3p.co.jp/jktoxx_3ds/pc.html</a><br>
<li>発売中          <a href="http://www.ss-alpha.co.jp/products/moegd_3ds/" target="_blank"> http://www.ss-alpha.co.jp/products/moegd_3ds/</a><br>
</ol><br>
それでは、現実世界の人間関係を壊さないために（笑）プライバシー対策をしましょう。<br>
<br>
対策１　無線設定スイッチを切っておく<br>
<br>
対策２　すれちがいMii広場のすれちがい機能を設定で切っておく<br>
<br>
一番確実なのは、本体右側にある無線スイッチを切っておくことです。万全を期したいという人は、職場や学校の関係者と合流しそうな地点に辿り着く前から切っておく。もしくは、事前に<b>さいごにあそんだゲーム</b>を別のタイトルに変えておくために他のソフトを実行してから終了しておくべきでしょう。ですが、油断は禁物です。例えば<b>さいごにあそんだゲーム</b>に「安全に使用するために」のような、普通あまり使わないであろうタイトルを選択してしまうと、この人はもしかして隠したいことがあるのではないか？と、かえって勘ぐられてしまうかもしれません（笑）。また、「何回すれちがった」というところも重要です。相手がもし自分に近い人であれば、その人とは何度もすれちがっているはずですね。何度もすれちがっているのに、<b>さいごにあそんだゲーム</b>がいつも「安全に使用するために」になっていたり、いつも同じ無難な（笑）タイトルが表示されていたりすると、仮に怪しまれてしまったとしても仕方ないかもしれません。また、もちろんのことですが、こうして対策のために無線を切ってしまうと、本来の楽しみであるゲーム内で通信したい人たちとの通信もできなくなってしまいます。<br>
<br>
ちなみに、何度か試してみたところ、この<b>さいごにあそんだゲーム</b>が書き換わるのは、実際にゲームを起動後しばらくしてからのようです。きちんとテストしたわけではないのですが、フタを開いたままにしておくより、フタを閉めてスリープ状態にしたほうが確実に書き換わるように感じました。<br>
<br>
一方、「すれちがいMii広場のすれちがい機能を設定で切っておく」という対策にも、ちょっとした落とし穴があります。<br>
<br>
他のゲームですれちがった人をすれちがいMii広場に招待するという機能があります。もしゲームがすれちがい通信に対応していたなら、仮にすれちがいMii広場をすれちがい通信の対象と設定していなかったとしても、すれちがい広場にはそのゲーム内ですれちがった人のMiiが現れます。<br>
そうすると、すれちがった相手には、たとえゲーム内の名前と登録されたMiiの名前が違っていたとしても、結局バレてしまうということになります。例えば<a href="http://www.konami.jp/products/newloveplus/new.html">今日発売されたゲーム</a>は本名で入力している人が圧倒的多数だと思いますので、いつもすれちがう人に自分の名前がバレてしまう、なんてことが起こるかもしれません。<br>
<br>
ところで、「自分は3DSは持っていない」あるいは「すれちがい通信なんて利用せず、家で二人だけで遊ぶ」といった方には、こうした事はまったく関係ない話なのでしょうか。実はそうとは言い切れなかったりします（笑）。もしかすると誰かがあなたになりすまし、勝手にあなたそっくりのMiiにあなたの名前をつけて職場や近所をすれちがい通信しながら歩き回ることで、まるであなたが特定のゲームにはまり込んでいるかのような噂を作ってしまう、そんな嫌がらせをする人がいるかも知れませんからね。<br>
あまりゲームにばかり夢中にならず、いつも周囲の人との人間関係を大切にしましょう。<br>
ちなみに、当社では上記の嫌がらせのようなものは調査しておりませんので悪しからず（笑）。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51855130" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51797614.html">
<title>たまにはハードウェア工作を楽しもう！</title>
<link>http://www.netagent-blog.jp/archives/51797614.html</link>
<description>　こんにちは。ネットエージェント株式会社、研究開発部の長谷川です。今日は少し低レイヤの話ということで簡単なハードウェア工作を楽しもうと思います。

-----

■ ディスプレイを回転させたい！
　デュアルディスプレイの便利さはみなさんご存じのとおりだと思いますが、...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-06-21T13:29:49+09:00</dc:date>
<dc:subject>長谷川陽介</dc:subject>
<content:encoded><![CDATA[　こんにちは。ネットエージェント株式会社、研究開発部の長谷川です。今日は少し低レイヤの話ということで簡単なハードウェア工作を楽しもうと思います。<br>
<br>
-----<br>
<br>
■ ディスプレイを回転させたい！<br>
　デュアルディスプレイの便利さはみなさんご存じのとおりだと思いますが、PDFやWordなどでA4サイズの文書を表示させているときなどに「ディスプレイを縦向きに表示させたい！」と思うことはありませんか？　私は普段からそう感じており、一時期、サブで使用しているディスプレイを縦向きに使用（表示）して使っていたのですが、日常的な作業では、やはり縦よりも横のほうが向いていることもあり、なかなか思ったほど気持ちよく作業できる環境ではありませんでした。<br>
　というわけで、もう少し気軽に縦横を変えられる仕組みを実現しようと思い、ディスプレイ回転ツールを自作しました。<br>
<br>
■ 材料<br>
　今回使用した材料は以下になります。<br>
<ol><li>液晶ディスプレイ用アーム（ARM-41C）</li><li>スイッチ（5Aマイクロスイッチ）</li><li>USB-シリアル変換ケーブル（USB-シリアル変換ケーブルUC-SGT）</li><li>シリアルケーブル</li><li>みんな大好きフリスクケース</li></ol>　まず必要なのは液晶ディスプレイ用のアームです。一般的な液晶ディスプレイ用アームは、視野に対する角度などは細かく調整できますが、ディスプレイそのものの縦横を回転できるものは少ないです。それでも、丹念に探すと液晶の縦横回転機構を備えたものもそれなりの価格で見つかります。今回調達したものは、ライブクリエータ社の<a href="http://www.livecreator.co.jp/pdf/lowprice_arm.pdf" target="_blank">ARM-41C</a>というもので、ヨドバシカメラで7000円を切る価格で手に入りました。<br>
　次にスイッチですが、これはディスプレイの縦横を検出するために使用します。どのようなものでも構いませんが、今回はおもちゃ売り場で売っていたタミヤの<a href="http://tamiyashop.jp/shop/product_info.php?products_id=75016" target="_blank">5Aマイクロスイッチ</a>を使用しました。<br>
　また、スイッチのON/OFFをPCに取り込むために、シリアル通信（いわゆるRS-232C）を利用することにし、今時のPCだとCOMポートがついていないため、USB経由でCOMポートを利用可能にするために、エレコムの<a href="http://www2.elecom.co.jp/cable/usb/uc-s/gt/index.asp" target="_blank">USB-シリアル変換ケーブルUC-SGT</a>を使いました。<br>
　あとは、クロスでもストレートでも構いませんので、スイッチに接続するために使用するシリアルケーブル。そして、スイッチを固定する台座として、みんな大好きフリスクケース。それ以外にもネジや両面テープなど適宜用意しておくと便利です。<br>
<br>
■ ハードウェア工作<br>
　<a href="http://livedoor.blogimg.jp/netagentblog/imgs/c/e/ce556d2c.jpg" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/c/e/ce556d2c-s.jpg" width="160" height="117" border="0" alt="fig1" hspace="5" class="pict" align="left"  /></a>まずは、フリスクケース2個を振り子になるようネジで固定し、回転したときにスイッチが押されるようにスイッチも固定します。振り子側は、きちんとスイッチを押さえられるように中にコインを重りとして入れています（左図）。<br>
　<a href="http://livedoor.blogimg.jp/netagentblog/imgs/4/4/44c01f39.jpg" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/4/4/44c01f39-s.jpg" width="160" height="120" border="0" alt="fig2" hspace="5" class="pict" align="right"  /></a>シリアルケーブルのDTR、DSRをスイッチにハンダ付けします。また、ケーブルの自重でスイッチやハンダ付け部分が痛まないようにケースにケーブルを固定しておきます（右図）。<br>
　<a href="http://livedoor.blogimg.jp/netagentblog/imgs/1/1/11736333.jpg" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/1/1/11736333-s.jpg" width="160" height="145" border="0" alt="fig3" hspace="5" class="pict" align="left"  /></a>スイッチ部分ができあがれば、液晶ディスプレイ背面に両面テープでスイッチ機能付きフリスクケースを取り付けます。しっかりとスイッチが押されるように少し斜めに取り付けるのがコツです。縦、横とディスプレイの向きを変えたときにきちんとスイッチがON/OFFされるか確認します（左図-横、右図-縦）。<br>
　<a href="http://livedoor.blogimg.jp/netagentblog/imgs/7/e/7ec2349f.jpg" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/7/e/7ec2349f-s.jpg" width="160" height="199" border="0" alt="fig4" hspace="5" class="pict" align="right"  /></a>これで、ハードウェアの準備は完了です。あまりお金をかけない簡単な工作で、ディスプレイの向きに応じてシリアルポートのDTR-DSRがON/OFFされる装置が出来上がりました。<br>
<br>
■ ソフトウェアの準備<br>
　ハードウェアを作成したので、次はソフトウェアを組みます。<br>
　ディスプレイの向きはシリアルポートのDSR信号を監視することで把握でき、監視するコードは、概ね以下のようになります（監視コードはサービスとして動作させています）。<br>
<br>
<pre>HANDLE hComm;<br>
OVERLAPPED ov;<br>
DWORD dwCommState;<br>
<br>
/* 略 */<br>
<br>
EscapeCommFunction( hComm, SETDTR );   // DTR信号をON<br>
SetCommMask( hComm, EV_DSR );          // DSR信号の変化を監視<br>
ResetEvent( ov.hEvent );               // 非同期I/Oのためイベントをリセット<br>
<br>
WaitCommEvent( hComm, &dwCommState, &ov );   // DSRの監視スタート<br>
WaitForSingleObject( ov.hEvent, 30000 );     // イベント発生まで待機<br>
</pre><br>
　ディスプレイ表示の向きを変えるには、以下のようなコードで実現できます（エラー処理等は省略）。<br>
<br>
<pre>int iDevNum = 1; // Display No.2<br>
DISPLAY_DEVICE d;<br>
DEVMODE dm;<br>
int w;<br>
<br>
ZeroMemory( &d, sizeof( d ) );<br>
d.cb = sizeof( d );<br>
<br>
EnumDisplayDevices( NULL, iDevNum, &d, 0 ) );<br>
EnumDisplaySettings( d.DeviceName, ENUM_CURRENT_SETTINGS, &dm ) );<br>
<br>
w = dm.dmPelsHeight;<br>
dm.dmPelsHeight = dm.dmPelsWidth;<br>
dm.dmPelsWidth = w;<br>
dm.dmDisplayOrientation = DMDO_90; // 90度回転<br>
<br>
ChangeDisplaySettingsEx( d.DeviceName, &dm, NULL, CDS_UPDATEREGISTRY, NULL );<br>
</pre><br>
　全ソースコードは<a href="https://github.com/hasegawayosuke/RotateDisplay/blob/master/display.c">GitHub上</a>に置いてあります。興味がある方は参照してください。<br>
　サービスとしてシリアルポートを監視していると、ユーザのディスプレイ（デスクトップ）とは直接対話できないため、シリアルポートからの信号を受け取った時点でログオンしているユーザのトークンを用いてCreateProcessAsUserを使ってディスプレイ表示の向きを変えるためのプログラムを起動しています。<br>
<br>
■ さいごに<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/9/5/953feed4.jpg" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/9/5/953feed4-s.jpg" width="160" height="108" border="0" alt="fig5" hspace="5" class="pict" align="left"  /></a>　このように、ディスプレイの向きを検出するスイッチと、それに応じて表示の向きを変えるプログラムを作成することによって、ディスプレイの向きを物理的に変えることで表示も連動して変わり、非常に快適になりました（左図：縦表示）。<br>
　ソフトウェアエンジニアにとって、ハードウェア工作は若干敷居が高そうに思えるかもしれませんが、ソフトウェアと同じくらい面白く、また出来ることの幅、可能性も広がると思います。興味があればぜひとも挑戦してみてください。<br>
　それにしてもフリスクケースはちょっとした工作にはとても便利ですね。Enjoy!
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51797614" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51791538.html">
<title>バイナリファイルの可視化ツール BinVis の紹介</title>
<link>http://www.netagent-blog.jp/archives/51791538.html</link>
<description>　はじめまして、ネットエージェント株式会社の村中と申します。今回はバイナリファイルの可視化ツール BinVis を紹介したいと思います。

-----

　BinVis はバイナリファイルを解析、可視化し、特徴ある部分を探したり、特定のパターンや（場合によっては）暗号データを調...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-06-01T14:14:22+09:00</dc:date>
<dc:subject>村中功一</dc:subject>
<content:encoded><![CDATA[　はじめまして、ネットエージェント株式会社の村中と申します。今回はバイナリファイルの可視化ツール <a href="http://code.google.com/p/binvis/" target="_blank">BinVis</a> を紹介したいと思います。<br>
<br>
-----<br>
<br>
　BinVis はバイナリファイルを解析、可視化し、特徴ある部分を探したり、特定のパターンや（場合によっては）暗号データを調べたり、といった用途で使用される高機能なファイル可視化ツールです。とは言っても、最終的には目視による解析は必須なのですが、それらを可能な限り支援してくれるツールとして、主にリバースエンジニアリングやフォレンジックの分野で利用できます。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/c/4/c488f37e.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/c/4/c488f37e-s.png" width="160" height="88" border="0" alt="binvis_annotated3_prob" hspace="5" class="pict" align="right"  /></a>　では、早速使ってみます。BinVis を用いて、wav ファイルを開いた時の表示を右図に示します。各ウィンドウは、それぞれ以下の形式でバイナリデータを解析、表示します。<br>
<ol><li>Text</li><li>Byte Plot</li><li>RGB Plot</li><li>Bit Plot</li><li>Dot Plot</li><li>Byte Presence</li><li>Strings</li><li>Byte Cloud</li><li>Byte Frequency</li></ol>　まず 1. の Text ですが、これは 16 進ダンプと ASCII でデータ列を表示します。ヘキサエディタによくある表示ですね。この Text ウィンドウには 336 バイトしか表示されませんが、後述の Byte Plot から表示オフセットを変更できます。<br>
　2. の Byte Plot は、1 バイトを 1 ピクセルに、つまり「値」を「色」に対応させて表示します。色づけは Color Coding ウィンドウから変更でき、Normal、ASCII、Frequency、Invert の4つから選択できます。ボタンの効果は順に、0～255 の値をそのまま緑色の明るさに、ASCII 文字だけ青色で表示、低頻度の値は青で高頻度の値は赤で表示、色の反転となっているようです。また、Byte Plot の任意の位置をクリックすると、クリックした位置に対応した部分が Text 表示に反映されます。<br>
　続いて 3. の RGB Plot ですが、これは 3 バイトを 1 ピクセルに、つまり 1 バイトごとの値にそれぞれ三原色の赤・緑・青を対応させて表示します。このウィンドウでは折り返しする幅を 1～640 の値で設定でき （地味なバグで、一度スライドバーを動かすと 631 までしか設定できないが…）、これをうまく使うとベタに保存された画像を簡単に確認できます。<br>
　4. の Bit Plot は 1 ビットを 1 ピクセルに対応させて表示、つまりは ON/OFF での表示です。<br>
　以上の 4 つが、もっとも基本的な可視化機能となります。これらに加えて、さらに解析をやりやすくするための機能が以降の 5 つになります。<br>
　5. Dot Plot は、縦軸と横軸をファイルのオフセットとして、その交差する部分の値が同じなら色をつけます。値によって明るさが変わるようです。6. Byte Presence は、ある一定の範囲に 0～255 の値がそれぞれあるかどうかを調べ、あれば色をつけます。横軸が 0～255 の値、縦軸がブロックとなっています。7. Strings は、ASCII 文字が 5 文字以上続いたデータを文字列と見なし、一覧で表示するもので、いわゆる strings コマンドと同等の機能です。8. Byte Cloud は 0～255 の値がそれぞれファイル内にどれくらいあるかによって文字の大きさを変えて表示するものです。4～5 年ほど前に登場したタグクラウドのバイナリ版と思えばよいでしょう。そして最後の 9. Byte Frequency は、ある範囲内で、それぞれの値が出現する頻度をヒストグラムで表示するもので、頻度解析などでよく利用されます。<br>
　以上、各ウィンドウを簡単に解説しましたが、より詳しい説明は、<a href="http://www.blackhat.com/presentations/bh-usa-08/Conti_Dean/BH_US_08_Conti_Dean_Visual_Forensic_Analysis.pdf" target="_blank">Visual Forensic Analysis and Reverse Engineering of Binary Data</a> がご参考になると思いますので、興味がある方はぜひ参照ください。<br>
<br>
　さて、以上で機能解説は終わりですが、個人的な感想としては、紹介した表示のほとんどは Navigator ウィンドウから表示位置を変更でき、Plot 系や Byte Presence や Byte Frequency の表示は同期するため、かなり「分かりやすい」目視が可能だと感じました。また、Navigator ウィンドウにある Play/Stop ボタンを使うと自動的にスクロールする機能もあるため、流し読みもできます。<br>
　特に気に入った機能は Dot Plot と Byte Presence で、これらの表示はファイル内に出てくるデータの特徴をかなりはっきり表示できており、特に Dot Plot は値の周期や繰り返しがあった場合の表示が特徴的で、wav ファイルを見るとかなり興味深い絵が見られます。また、Byte Presence は値に偏りがあるときの表示が特徴的で、Byte Plot の横に並べるとより効果的にデータの特徴を確認できます。<br>
　逆に、Bit Plot や Normal 色づけの Byte Plot は、BMP 形式くらいでないと違いがわかりにくく、これらは少し使いにくく、利用頻度に欠けると感じました（対象データによるとは思いますが…）。<br>
<br>
-----<br>
<br>
　BinVis は、全体的にグラフィカルに表示する機能が充実しているので、シグネチャや値を見て解析するような用途にはあまり向かないかもしれませんが、データを大雑把に見る、眺めるといった用途にはかなり適していると感じました。<br>
　今回は BinVis 自体の紹介をさせていただきましたが、<a href="http://www.rumint.org/gregconti/publications/2008_VizSEC_FileVisualization_v53_final.pdf" target="_blank">Visual Reverse Engineering of Binary and Data Files</a> では、利用する際のケーススタディが 4 つほど紹介されており、BinVis の非常に有用な使い方が載っています。また、BinVis のソースコードも公開されていますので、その気があれば自分で改良もできます。<br>
　BinVis自体は今のところ Attractor が動かなかったり、最後までスクロールした時や Byte Plot 表示でファイルの終端以降をクリックした時に例外が発生したり、Color Coding を変更しても Navigator を操作するまで変更が反映されなかったりと、まだ完璧とは言い難い品質ですが、ファイル解析のアプローチを増やしてくれる点ではかなり面白いツールです。興味があれば、ぜひとも触ってみてください。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51791538" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51779232.html">
<title>PCTF 2011 参戦記</title>
<link>http://www.netagent-blog.jp/archives/51779232.html</link>
<description>　こんにちは、愛甲です。今回は、先週末に行われた PCTF 2011 も含めた、セキュリティコンテスト全般について書かせていただこうと思います。とはいっても、最近 CTF 参戦記ばかり書いている気がしますので（汗）、今回は少し違った視点でセキュリティコンテストについて考...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-04-28T13:01:07+09:00</dc:date>
<dc:subject>愛甲健二</dc:subject>
<content:encoded><![CDATA[　こんにちは、愛甲です。今回は、先週末に行われた PCTF 2011 も含めた、セキュリティコンテスト全般について書かせていただこうと思います。とはいっても、最近 CTF 参戦記ばかり書いている気がしますので（汗）、今回は少し違った視点でセキュリティコンテストについて考えてみたいと思います。「そもそも CTF って何？」という方は、<a href="http://www.netagent-blog.jp/archives/51762319.html" target="_self">前回の記事</a>をご参照ください。<br>
<br>
-----<br>
<br>
■ PCTF 2011<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/b/1/b1d45c56.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/b/1/b1d45c56-s.png" width="160" height="74" border="0" alt="blog2" hspace="5" class="pict"  align="right" /></a>　PCTF とは、アメリカの PPP_CMU というチームが主催するセキュリティコンテストです。彼らは今年の CODEGATE 2011 CTF の優勝チームでもあり、この度、<a href="http://www.lockheedmartin.com/" target="_blank">ロッキードマーティン社</a>をスポンサーとして、CTF を開催することになりました。<br>
　PCTF はオンラインで、日本時間の 4月23日（土）6:30 ～ 4月25日（月）6:30 までの 48 時間で行われました。それで、いきなりなのですが、sutegoma2 は 5 位という結果に終わりました。実は競技終了の 3 時間ほど前に一時暫定 1 位となったのですが、その後は得点が伸びずに…、といった具合で、結局は 5 位で終了となりました。まぁ結果は結果で仕方がないので、より勉強していこう、頑張っていこう、という新たな決意で再スタートしたいと思います。<br>
　さて、<a href="http://www.netagent-blog.jp/archives/51762319.html" target="_self">前回の記事</a>で問題の傾向や雰囲気について書きましたので、今回はまた別の角度から CTF について紹介したいと思います。<br>
<br>
■競技時間<br>
　実は CTF は主催国によって若干の時間的な有利不利が存在します。例えば、前回の CODEGATE 2011 CTF は韓国のチーム主催ですので、韓国の時間で実施しやすい 48 時間が競技時間として選ばれます。韓国と日本の時差はほとんどないので、日本時間にしても 3月4日（金）21:00 ～ 3月6日（日）21:00 までの 48 時間という、日本に住んでいる人にとって（というよりも韓国に住んでいる人にとって）有利な時間となりました。<br>
　しかし、PCTF は開催国がアメリカですので、日本時間にすると 4月23日（土）6:30 ～ 4月25日（月）6:30 までの 48 時間という、月曜日の予定に大きく影響の出る時間帯となります。ほとんどの社会人は月曜日の朝から仕事がありますし、学生であっても月曜日の予定が確実に空くとは限りません。つまり、日本にとっては終盤に進むにつれて確実に不利になっていきます（逆に韓国主催の CODEGATE では、序盤がアメリカ不利となります）。<br>
　よって、CODEGATE で予選 1 位になれたのは、時間的な優位性も少なからずあったのかもしれません。また逆に、次回 6 月に行われる DEFCON CTF では、アメリカ開催であるため、時間的に不利な立場になることが予想できます。<br>
<br>
■出題される問題<br>
　CTF にはセキュリティに関する全般的な問題が出題されます。@IT にて辻伸弘氏が<a href="http://www.atmarkit.co.jp/fsecurity/rensai/dknight01/dknight01.html" target="_blank">「第1回 プレイ・ザ・ゲーム！ CTFが問いかけるハックの意味」</a>と題して、CTF の問題について紹介、解説をされていますので、興味がある方はぜひご参照ください。<br>
　さて、<a href="http://www.netagent-blog.jp/archives/51762319.html" target="_self">前回の記事</a>で、CTF には主に 6 つの分野から問題が出題されると書きました。それらは「暗号」「フォレンジック」「リバースエンジニアリング」「脆弱性」「パケット解析」「トリビア」の 6 つですが、今回は、これらとは別の角度で出題される問題を分類したいと思います。<br>
<br>
●タイプ 1 ：問題ファイルを解析するタイプ<br>
　代表的なものはフォレンジックとパケット解析系の問題です。問題として与えられるファイルの中にパスワードがあるタイプで、例えば「 pkt ファイルを解析して、サーバからダウンロードされている実行ファイルの MD5 ハッシュ値を求めよ」といったものや、「 NTFS を解析して削除されたパスワードファイルを復元せよ」といった問題になります。<br>
　サイズの大きな問題ファイルに対してのアプローチ方法、いかに巨大なファイルから欲しいデータを取りだすか、といった技術力が問われます。<br>
<br>
●タイプ 2 ：問題ファイルを復号するタイプ<br>
　代表的なものは暗号問題ですが、バイナリ系の一部もこちらに属します。問題ファイルの中や問題文自体にパスワードが隠されているという点ではタイプ 1 と同じですが、こちらは探すことではなく、それらを「復号すること」がメインとなります。EXE ファイルの実行中にメモリ内を参照するとパスワードが見つかる、といったリバースエンジニアリング系の問題や、謎のデータ列が渡され、それを解読してパスワードを得る暗号系の問題をこのタイプに分類します。<br>
　今年の CODEGATE では、予選と決勝の両方で、以下のような問題が出題されました。<br>
<br>
<pre>　解読せよ：SCMPKBOUPDPHYTIAVIVRBTMVORUDNBDFNETDOIVTXRO<br>
　　　　　　UNDKOBFWBPVOEQLTGKKARACYCGDNAECBXIZIKPTLEER<br>
　　　　　　ZTYCYKIVXCPKPTPOVCAQRHRVKJUWMTWCMSXKADYHRVN<br>
　　　　　　AHCBRVSVSSCQCZQYDJXGSNRVSWCESTTBHIFCIASXRTA<br>
　　　　　　HKRRTUMVOKWITZPFZDISXZVVLGETPPLKSELDPGKELSH<br>
　　　　　　CBJBWXBIFCPEZYNBWXCDYMGAOVWNDKAKKKWBBQKPTIO<br>
　　　　　　DKMGGHRVVNHINFCQESDYMLACVVBWBBQROPBBDFOXOSK<br>
　　　　　　DIGZWXFNTKFYIICWHRVVNHIYILTKHRVXPISB<br>
</pre><br>
　これはコンピュータ技術に関するものではなく、純粋な暗号の問題になります。答えはヴィジュネル暗号なのですが、このような問題を解くためには実用的に使われる現代暗号のみではなく、古典暗号も含む、全般的な暗号に関する知識が必要になります。<br>
<br>
●タイプ3 ：リモート環境にあるパスワードを取得するタイプ<br>
　代表的なものは Exploit と Web 系の問題です。Exploit 系の問題は、脆弱性を探し出し、権限を奪うことで Key ファイルへのアクセス権を獲得し、その Key ファイルの中に書かれてあるパスワードを取得します。Web 系の問題もほぼ同じですが、こちらは SQL インジェクションを始めとした Web に関するテクニックを用いて、例えばデータベースの中にあるパスワード等を得るタイプです。<br>
　タイプ 1 やタイプ 2 とは明確に異なり、問題ファイルや問題文の中にはパスワードはなく、実際に外部のサーバや Web サイトを攻撃してパスワードを得る必要があります。リモート環境の権限を得る、データベースにアクセスする、といった分かりやすい目的であるため、ある意味もっともシンプルなタイプと言えます。<br>
　問題文においても、サーバのIPアドレスとポートのみが書かれてあったり、問題となる Web ページの URL のみが書かれてある、といったシンプル具合です。<br>
<br>
●タイプ4 ：パスワードを推測するタイプ<br>
　代表的なものはトリビア問題で、クイズのような問題がこのタイプに当てはまります。検索しなければ分からない問題や、業界の歴史やイベントなどを知ってないと解けないものも多いです。<br>
　今回の PCTF では、トリビアとして以下の問題が出題されました。<br>
<br>
<pre>　Figure out what the corrupted value is.<br>
　1.3337 ~= XXXXXXX/3145727<br>
</pre><br>
　XXXXXXXに入る文字列が解答となるのですが、いかがでしょうか？　ちなみにこの答えは「4195835」で、解説については <a href="http://www.cs.earlham.edu/~dusko/cs63/fdiv.html" target="_blank">Pentium FDIV bug</a> を参照してください。個人的にはまさにトリビアらしく、かつ、なかなか興味深く、面白い問題だったと思います。<br>
<br>
　CTF の問題は以上の 4 タイプに分けられますが、逆に考えれば、上記の 4 タイプのいずれにも当てはめ難いならば、それは CTF には使われ難い問題と言えます。またタイプ 4 はほとんどトリビア問題でしか扱われないため、実質、上記の 1～3 のタイプが考察対象となります。<br>
　では、例えば、XSS を考えましょう。サーバ内にあるパスワードを XSS で取得するといった問題は作れませんので、タイプ 3 はありません。またタイプ 1 やタイプ 2 のような、htmlファイル内を探索、あるいは解読してパスワードを得るといったものも XSS の問題とは言えませんので無理でしょう。よって、XSS は CTF では扱いにくい問題と言えます。CSRF も同じ理由で難しいです。<br>
　逆に、SQLインジェクション、またセッション管理系の成りすまし（Cookie関連）などはタイプ 3 に分類できますし、JavaScript の暗号化や難読化といった分野はタイプ 2 に分けられます。あと、バッファオーバーランを利用した Exploit や Pack された実行ファイルのリバースエンジニアリングなどは、比較的出題しやすい問題だと思います。<br>
　出題し難い問題は、他に ARP スプーフィングのような TCP/IP 以下のレイヤーを扱うもの、また、ターゲットサーバのカーネルを対象とした問題なども出題が難しいです。そもそもカーネルを扱う問題自体、CTF ではほとんど出ません。<br>
　このように考えていくと、CTF がどのような技術を競うもので、どういった分野を学んでおくことが重要であるかが分かってきます。このような「傾向」を考えてみるのも面白いかと思います。<br>
<br>
■運用システムの問題<br>
　CTF はセキュリティに関する様々な問題を扱いますが、分野は違えど、最終的に「解答となるパスワードを探す」という点においては同じです。これは極論すると、すべての問題が「与えられたファイルや情報からパスワードを探せ」というスタンスでしかなく、そのパスワードを submit したかどうかでのみ正解、不正解が決められます。<br>
　これはシステムとして運用しやすく、オンラインでの開催が容易である反面、パスワードさえ分かってしまえば問題そのものを解く必要がないとも言えます。つまり、カンニングやチーム間での教え合いが容易に可能であり、またそれを制限できません。よって、その気になれば、1 位が確定したチームは 2 位以下のチームに解答パスワードを教えることで、そのランキングを自由に操作できますし、同じ国同士のチームで解答を共有し、ランキングを占有、なんてこともやろうと思えば可能です。<br>
　そのような不正を防ぐために、CODEGATE CTF では決勝戦へ進むチームに対して、解答レポートの提出を義務付けています。これは、「どのようにして解答パスワードを得るに至ったか？」を書くレポートであり、予選終了後、3～4 日までに提出する必要があります。<br>
　このレポート提出により、極端な不正は防止できると思いますが、ランキングの上位では数百点の差に 2～3 チームがひしめき合うなんてことは普通に起こり得ます。そして、それらのチームが予選通過の条件である 8 位以内に入るために 1～2 問程度を仲の良いチームと交換する、といったことが起こらないとは限らず、またそれを防ぐことは難しいです。これは、運営や不正を行うチームが悪いと言っているわけではなく（まぁ不正は良くないですが…）、現状の CTF のシステム的な限界だと思います。それも踏まえて、決勝戦へ進むためには、予選においてある程度「余裕勝ち」しておく必要があるのかもしれません。<br>
<br>
■その他のセキュリティコンテスト<br>
　セキュリティコンテストは CTF 以外にもたくさんあります。例えば、韓国のセキュリティカンファレンス <a href="http://www.powerofcommunity.net/">Power of Community 2010</a>（以下、POC）で、Hacker's Dream という CTF と同じオンライン型のセキュリティコンテストが開かれました。ただ、ルールは CTF とは大きく異なり、解答をレポートにまとめて submit するという、また少し違った形式のコンテストだったようです。ちなみに、2010 年は日本人が優勝しており、優勝者である<a href="http://d.hatena.ne.jp/a4lg/20101203/1291337972">大居氏のブログ</a>からコンテストの詳細が確認できます。<br>
　他にも、詳しくは知らないのですが、F-Secureリバースエンジニアリングチャレンジ、Panda Challengeといった、カンファレンスではなく企業が実施しているセキュリティコンテストも多くあります。<br>
　CTF もそうなのですが、ここ 2～3 年でセキュリティ系のコンテストは数多く実施されるようになりました。参加資格が国内在住者限定のものも多いですが、オンライン上で、誰でも参加できるものもあるため、力試しに参加してみても面白いかもしれません。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51779232" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51774253.html">
<title>第1回 Win32 API 探検隊</title>
<link>http://www.netagent-blog.jp/archives/51774253.html</link>
<description>　こんにちは。ネットエージェント株式会社、研究開発部の長谷川です。
　今回は、ちょっと軽めのネタということで、MSDN Library を眺めていて見つけた、少し変わった Windows API 関数を紹介したいと思います。

■ 使い道がありそうで見つからない PathIsExe
　Shell32.dl...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-04-13T14:12:54+09:00</dc:date>
<dc:subject>長谷川陽介</dc:subject>
<content:encoded><![CDATA[　こんにちは。ネットエージェント株式会社、研究開発部の長谷川です。<br>
　今回は、ちょっと軽めのネタということで、<a href="http://msdn.microsoft.com/en-us/library">MSDN Library</a> を眺めていて見つけた、少し変わった Windows API 関数を紹介したいと思います。<br>
<br>
■ 使い道がありそうで見つからない PathIsExe<br>
　Shell32.dll に含まれる <a href="http://msdn.microsoft.com/en-us/library/bb776474%28VS.85%29.aspx">PathIsExe</a> 関数は、引数で指定したファイルが実行可能なファイルかどうかを、ファイル名の拡張子を見て判断します。例えば、"*.exe" や "*.cmd" といった拡張子であれば TRUE が返ります。<br>
　Shell32 に含まれるということで、Explorer のようなシェルやシェル拡張などを書いている場合には（もしかすると）利用するかも知れませんが、一般のアプリケーションを開発する場合にはあまりお世話になる機会はなさそうです。<br>
　同じ Shell32.dll には、<a href="http://msdn.microsoft.com/en-us/library/bb776475%28VS.85%29.aspx">PathIsSlow</a> という面白い関数もあります。これは、指定したパスが遅延の大きなネットワークドライブなどであった場合に TRUE を返すようです。<br>
　また、Shlwapi.dll にはこれらとよく似た名前で、<a href="http://msdn.microsoft.com/en-us/library/bb773724%28v=vs.85%29.aspx">PathIsURL</a> という関数もあります。引数で指定された文字列がURLの書式に合致すれば TRUE を返すようですが、"http:" や "ftp:" だけでなく、"+-:" や "..:" などでも TRUE が返ってくるというおもしろ仕様なので、大抵の場合は自分で似たような関数を用意しなければなりません。<br>
<br>
■ ちょっと便利な StrFormatByteSize <br>
　Shlwapi.dll に含まれる StrFormatByteSize 関数一族は、数値を KB や MB といった単位付きのサイズ文字列に変換する関数です。<br>
　例えば、23506 という数値を StrFormatByteSize64 に渡すと、"22.9KB" という、人間に読みやすい形に単位を変換して書式化した文字列を得られます。ファイルやメモリのサイズを表示する場合に、自分で書いてもたいしたコード量にはなりませんが、覚えておくとちょっとだけ便利です。<br>
　さて、MSDN Library には、以下の5種類の関数の説明が掲載されています。<br>
<ol><li><a href="http://msdn.microsoft.com/en-us/library/bb759971(VS.85).aspx">StrFormatByteSize64</a><br>
<li><a href="http://msdn.microsoft.com/en-us/library/bb759974(VS.85).aspx">StrFormatByteSizeA</a><br>
<li><a href="http://msdn.microsoft.com/en-us/library/bb892884(VS.85).aspx">StrFormatByteSizeEx</a><br>
<li><a href="http://msdn.microsoft.com/en-us/library/bb759975(VS.85).aspx">StrFormatByteSizeW</a><br>
<li><a href="http://msdn.microsoft.com/en-us/library/bb759979(VS.85).aspx">StrFormatByteKBSize</a><br>
</ol>　ぱっと見て気がつくのは、ANSI バージョンである <a href="http://msdn.microsoft.com/en-us/library/bb759974(VS.85).aspx">StrFormatByteSizeA</a> と Unicodeバージョンである <a href="http://msdn.microsoft.com/en-us/library/bb759975(VS.85).aspx">StrFormatByteSizeW</a> がそれぞれ別々に定義されている点です。実は、StrFormatByteSizeA と StrFormatByteSizeW は、単純に ANSI 版と Unicode 版という関係ではなく、ANSI 版が DWORD で 32 ビットまでのサイズにしか対応していないのに対して、Unicode 版は LONGLONG で 64 ビットのサイズに対応しています。また、StrFormatByteSize64 という関数は、ANSI 版である StrFormatByteSize64A しか定義されておらず、Unicode 環境では StrFormatByteSizeW が呼び出されます。<br>
　使いそうであまり使わず、それでいて自分で作ってもたいしたコードでもないような関数が用意されていて、にも関わらずチグハグ感が満載というあたり、いかにも Windows らしいですね（編注：そんなWindowsが大好きなんです！）。<br>
<br>
■ 末尾の Ex が 2 段重ねの関数<br>
　Windows API で、あとから機能が拡張されたために名前の末尾に Ex のつく関数はたくさんありますが、<a href="http://msdn.microsoft.com/en-us/library/dd317805%28VS.85%29.aspx">EnumCalendarInfoExEx</a> や <a href="http://msdn.microsoft.com/en-us/library/dd317812%28VS.85%29.aspx">EnumDateFormatsExEx</a>、<a href="http://msdn.microsoft.com/en-us/library/bb540756%28VS.85%29.aspx">LogOnUserExExW</a> は、末尾の Ex が 2 個重ねられた名前となっています。あと 3 年くらいしたら、ExExEx などになるのでしょうか。<br>
　ちなみに、Win32 API で現存するもっとも長い関数名は、おそらく <a href="http://msdn.microsoft.com/en-us/library/aa376397%28VS.85%29.aspx">ConvertSecurityDescriptorToStringSecurityDescriptor</a> あるいは <a href="http://msdn.microsoft.com/en-us/library/aa376397%28VS.85%29.aspx">ConvertStringSecurityDescriptorToSecurityDescriptor</a> の 51 文字だそうです。IDE やエディタの入力支援がなければ、何度も打つのはうんざりしてしまいそうです。<br>
<br>
■ APIとしては高機能すぎる SendARP<br>
　Iphlpapi.dll に含まれる <a href="http://msdn.microsoft.com/en-us/library/aa366358%28VS.85%29.aspx">SendARP</a> 関数は、その名前の通りコマンドラインの arp コマンドのように、ARP リクエストを送信します。なかなかアプリケーションから ARP を送ることは少ないと思いますし、ARP 自体が小さいとはいえ単一のプログラムとして成り立つくらいのものであり、それを API関数 として用意しているというのはちょっとビックリです。<br>
<br>
■ 指定したアドレスのメモリの読み書き権限を調べる IsBadReadPtr / IsBadWritePtr<br>
　Kernel32.dllに含まれる <a href="http://msdn.microsoft.com/en-us/library/aa366713%28VS.85%29.aspx">IsBadReadPtr</a> 関数や <a href="http://msdn.microsoft.com/en-us/library/aa366716%28VS.85%29.aspx">IsBadWritePtr</a> 関数は、引数として指定されたアドレスのメモリが読み書きできるかを調べる関数です（Vista以降ではサポートされていません)。サードパーティ DLL において渡されたパラメータが適切なものかどうかを判断するといった利用が想定されていたようですが、普通に考えると SEH を利用してコード全体を保護するほうが効率が良さそうです。<br>
<br>
■ さいごに<br>
　最後にちょっとしたTIPSを。MSDN Libraryは、表示の設定を "Classic"、"Lightweight"、"ScriptFree" から<a href="http://msdn.microsoft.com/en-us/library/preferences/experience/">選択できます</a>が、URLにおいて ( ) 内に "classic"、"lightweight"、"loband" などを指定することでも表示を切り替えられます。例えば <a href="http://msdn.microsoft.com/en-us/library/aa363858%28VS.85,classic%29.aspx">http://msdn.microsoft.com/en-us/library/aa363858(VS.85,classic).aspx</a> にアクセスすると classic 表示に、<a href="http://msdn.microsoft.com/en-us/library/aa363858%28VS.85,loband%29.aspx">http://msdn.microsoft.com/en-us/library/aa363858(VS.85,loband).aspx</a> にアクセスすると ScriptFree の表示に切り替わります。覚えておくとちょっと便利ですね。<br>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51774253" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51769168.html">
<title>軽量トランスポートセキュリティ CurveCP を試す</title>
<link>http://www.netagent-blog.jp/archives/51769168.html</link>
<description>　こんにちは、ネットエージェント株式会社、大阪支社の山口です。
　地震の被害、影響により当ブログの更新が 2～3 週間ほど滞っていましたが、本日より、2 週間に 1 回というこれまでとは少し頻度を抑えた形ではありますが、更新を再開させていただこうと思います。また繰...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-03-29T14:26:51+09:00</dc:date>
<dc:subject>山口尋久</dc:subject>
<content:encoded><![CDATA[　こんにちは、ネットエージェント株式会社、大阪支社の山口です。<br>
　地震の被害、影響により当ブログの更新が 2～3 週間ほど滞っていましたが、本日より、2 週間に 1 回というこれまでとは少し頻度を抑えた形ではありますが、更新を再開させていただこうと思います。また繰り返しになりますが、被害を受けられました皆様に心よりお見舞い申し上げますと共に、東北地方を始めとした東日本全体の一日も早い復旧を心よりお祈り致します。<br>
<br>
　さて、今回は、<a href="http://www.netagent-blog.jp/archives/51749738.html" target="_blank">前回紹介した DNSCurve</a> の暗号化部分を一般化した実装 CurveCP のα版実装をのぞいてみたいと思います。<br>
<br>
-----<br>
<br>
　<a href="http://curvecp.org/" target="_blank">CurveCP</a> は <a href="http://dnscurve.org/" target="_blank">DNSCurve</a> で使われているトランスポート層のセキュリティ拡張プロトコルを DNS 以外の通信にも拡張すべく、現在開発中のプロトコルです。CurveCP を利用したアプリケーションはまだないようですが、パケット構成やメッセージフォーマットを確認できる実装が公開されています。私も少し触ってみたので、その導入手順を以下に記します。<br>
　まず<a href="http://nacl.cace-project.eu" target="_blank"> NaCl（Networking and Cryptography library）</a> ライブラリをダウンロードして展開・ビルドします。本稿執筆時点でのバージョンは 20110221 でした。<br>
<br>
<pre>$ wget http://hyperelliptic.org/nacl/nacl-20110221.tar.bz2<br>
$ bzcat nacl-20110221.tar.bz2 | tar xf -<br>
$ cd nacl-20110221<br>
$ ./do<br>
</pre><br>
　今回は動作を試すだけなので、ビルドしたディレクトリのままで使います。サーバ用（192.0.2.1）とクライアント用（192.0.2.2）に 2 台同じ設定で用意しました。<br>
<br>
<pre>$ export PATH=${PATH}:`pwd`/build/`hostname -s`/bin<br>
$ mkdir -p ~/tmp/curvecp<br>
$ cd ~/tmp/curvecp<br>
</pre><br>
　サーバ側の鍵を生成します。<br>
<br>
<pre>$ curvecpmakekey serverkey<br>
$ ls -AFR serverkey<br>
.expertsonly/ publickey<br>
<br>
serverkey/.expertsonly:<br>
lock          noncecounter  noncekey      secretkey<br>
</pre><br>
　サーバ側の公開鍵をクライアントへコピーします。<br>
<br>
<pre>$ curvecpprintkey serverkey > serverkey.hex<br>
$ scp serverkey.hex 192.0.2.2:~/tmp/curvecp<br>
</pre><br>
　用意ができたので実際に通信をしましょう。今回試したα版では、通信前の準備などを行うパケット構成と、実際に送受信するデータの整形を行うメッセージ構成にそれぞれコマンドが用意されています。コマンドフォーマットは以下になります。<br>
<br>
<table border="0"><tr><td>　□curvecpserver</td><td>サーバ側パケット構成プログラム</td></tr><tr><td>　　－sname</td><td>サーバ名</td></tr><tr><td>　　－keydir</td><td>サーバ側鍵を保持するディレクトリ</td></tr><tr><td>　　－ipaddr</td><td>IPアドレス</td></tr><tr><td>　　－port</td><td>ポート番号</td></tr><tr><td>　　－ext</td><td>この通信の識別用サーバ側拡張文字列</td></tr><tr><td>　　－prog</td><td>クライアント接続時に実行するプログラム</td></tr></table><br>
<table border="0"><tr><td>　□curvecpclient</td><td>クライアント側パケット構成プログラム</td></tr><tr><td>　　－sname</td><td>サーバ名</td></tr><tr><td>　　－pubkey</td><td>サーバ側の公開鍵（文字列）</td></tr><tr><td>　　－ipaddr</td><td>IPアドレス</td></tr><tr><td>　　－port</td><td>ポート番号</td></tr><tr><td>　　－ext</td><td>この通信の識別用サーバ側拡張文字列</td></tr><tr><td>　　－prog</td><td>接続時に実行するプログラム</td></tr></table><br>
<table border="0"><tr><td>　□curvecpmessage</td><td>クライアント側パケット構成プログラム</td></tr><tr><td>　　－prog</td><td>通信時に実行するプログラム</td></tr></table><br>
　curvecpserver を使い、サーバ側で date コマンドを実行するよう待ち受け設定します。<br>
<br>
<pre>$ curvecpserver server.example.com serverkey 192.0.2.1 10000 [折返し]<br>
12345678901234567890123456789012 curvecpmessage date<br>
</pre><br>
　次にクライアント側で、サーバから送られてきた内容を表示するコマンド（curvecpclient）を実行します。<br>
<br>
<pre>$ curvecpclient server.example.com $(cat serverkey.hex) [折返し]<br>
192.0.2.1 10000 12345678901234567890123456789012 [折返し]<br>
curvecpmessage -c sh -c 'cat <&6'<br>
</pre><br>
　実行結果をキャプチャしたものを <a href="http://www.netagent-blog.jp/files/yamaguchi/curvecp_tcplog.txt" target="_blank">curvecp_tcplog.txt</a> に置いておきますので興味があればぜひ見てみてください。<a href="http://curvecp.org/packets.html" target="_blank">パケットフォーマット</a>などが確認できます。<br>
<br>
-----<br>
<br>
　今回 CurveCP のサンプル実装を実行してみました。公開鍵文字列と、鍵と対になるサーバ側の拡張文字列が事前にクライアント側へ渡っていれば暗号化通信が可能になります。暗号化通信の特徴が分かったからといって中身を閲覧できるわけではありませんが、参考になればということで紹介いたしました。<br>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51769168" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51764059.html">
<title>東北地方太平洋沖地震　お知らせ</title>
<link>http://www.netagent-blog.jp/archives/51764059.html</link>
<description>　このたびの東北地方太平洋沖地震により被害を受けられました皆様に心よりお見舞い申し上げます。お一人でも多くの人命の救済と、一日も早い復旧を心よりお祈り致します。

　本日以降の計画停電により、弊社業務につきましても通常より縮小したかたちで行うこととなりまし...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-03-14T09:56:54+09:00</dc:date>
<dc:subject>愛甲健二</dc:subject>
<content:encoded><![CDATA[　このたびの東北地方太平洋沖地震により被害を受けられました皆様に心よりお見舞い申し上げます。お一人でも多くの人命の救済と、一日も早い復旧を心よりお祈り致します。<br>
<br>
　本日以降の計画停電により、弊社業務につきましても通常より縮小したかたちで行うこととなりました。弊社サイトおよび各種ソフトウェアのアップデート等の停止や、製品出荷、サポート業務の提供におきましても支障をきたす場合が予想されます。ご迷惑をおかけ致しますことをお詫び申し上げますとともに、ご理解をお願いいたします。 <br>
<br>
　今後の状況につきましては、明らかになり次第適宜<a href="http://www.netagent.co.jp/">当社サイト</a>に掲載して参ります。また当ブログに関しましても、誠に恐縮ですが、状況が安定するまでお休みとさせていただきたいと思います。何卒よろしくお願いいたします。<br>
<br>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51764059" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51762319.html">
<title>CODEGATE 2011 CTF 参戦記</title>
<link>http://www.netagent-blog.jp/archives/51762319.html</link>
<description>　こんにちは、愛甲です。今日は、先週末に行われたセキュリティ技術を競い合う世界大会 CODEGATE 2011 CTF（Capture the Flag） について書かせていただこうと思います。

-----

■ CODEGATE 2011 CTF とは
　CODEGATE 2011 CTF とは、韓国のセキュリティカンファレンス CO...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-03-09T14:51:50+09:00</dc:date>
<dc:subject>愛甲健二</dc:subject>
<content:encoded><![CDATA[　こんにちは、愛甲です。今日は、先週末に行われたセキュリティ技術を競い合う世界大会 <a href="http://yut.codegate.org/">CODEGATE 2011 CTF（Capture the Flag）</a> について書かせていただこうと思います。<br>
<br>
-----<br>
<br>
■ CODEGATE 2011 CTF とは<br>
　CODEGATE 2011 CTF とは、韓国のセキュリティカンファレンス <a href="http://www.codegate.org/">CODEGATE</a> が主催しているセキュリティ技術の世界大会であり、毎年 3 ～ 4 月頃に世界中のセキュリティエンジニアが優勝賞金 2000 万ウォンを賭け、その技術力を競います。毎年 300 近いチームがエントリするため、本大会は予選と決勝に分かれており、予選で勝ち残った上位 8 チームで改めて決勝戦を行います。<br>
　決勝戦は CODEGATE の会場で行われますが、予選はオンラインで実施されるため、今週末は弊社のセミナールームを借り、3月4日（金）21:00 ～ 3月6日（日）21:00 までの 48 時間、チーム名 sutegoma2 で CODEGATE 2011 CTF の予選を戦うことになりました（<a href="http://d.hatena.ne.jp/tessy/20110215">参考</a>）。<br>
　sutegoma2 というのは、<a href="http://twitter.com/tessy_jp">tessy 氏</a>、<a href="http://twitter.com/yoggy">yoggy 氏</a>が中心となって運営している Web コミュニティで、主に世界中で開催されるセキュリティコンテストに参加することを目的としています。CTF 勉強会と並行して運営されており、CTF に参加したい、勉強したいといった人たちのコミュニティとなっています。勉強会から発足したコミュニティなので、学生、社会人問わず誰でも参加でき、企業の垣根を越えて、純粋にセキュリティ技術に興味のある方々で構成されています。<br>
　また今回エフセキュアブログのメンバーである福森氏も sutegoma2 に参加しており、<a href="http://blog.f-secure.jp/archives/50574300.html">今回の参戦記を記事にされています</a>ので、ぜひご確認ください。<br>
<br>
■大会のルールは？<br>
　大会は、運営チームから出題されるセキュリティに関する問題を解いていくことで点数を獲得し、獲得点数の合計値によって最終的なランキングが決定します。<br>
　昨今のセキュリティ技術は多様化が進んでおり、一概に何がセキュリティ技術で、何がセキュリティ技術ではないのか、その切り分けが難しいところですが、一般的なセキュリティコンテストにおいては、大きく以下の 6 分野に分けられます。<br>
<ol><li>暗号技術<br>
<li>デジタル・フォレンジック<br>
<li>リバースエンジニアリング<br>
<li>脆弱性調査<br>
<li>パケット解析<br>
<li>トリビア<br>
</ol>　大会によって若干の差異はありますが、大体、上記 6 分野に分けられ、各分野に対してレベル 100 ～ 500 の難易度が設定された 5 問（× 6 分野 ＝ 合計 30 問）が出題されます。これを 48 時間以内に解答し、ランキング 1 位を目指します。そして、そのランキングの上位 8 チームが決勝進出となります。<br>
<br>
■技術力だけの勝負ではない<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/2/d/2d2aec18.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/2/d/2d2aec18-s.png" width="160" height="148" border="0" alt="crypto100" hspace="5" class="pict" align="right"  /></a>　世界大会というと、技術的難易度の高い問題ばかりが出題されるイメージがありますが、実際には、技術力以外のスキルも必要になります。今回は CODEGATE 2011 CTF 予選にて出題された問題の中から、弊社代表の杉浦が解いた Crypto 100 と、研究開発部の長谷川が<a href="http://secusoba.info/">セキュそば勉強会</a>へ行く前日に解いた Binary 100 を紹介します。<br>
　まず Crypto 100 ですが、右図がその問題です。この画像からパスワードとなるキーを探します。暗号の問題ではありますが、暗号の専門的知識は必要なく、ひらめきさえすればコンピュータを知らない方でも解けます。せっかくなので 1 分ほど考えてみてください。<br>
<br>
<blockquote><font color="#f5f5f5">　正解は「携帯電話のキー入力」です。携帯電話のキーパッドを確認すると、アルファベットは各数字に以下のように対応しています。<br>
<br>
<table border="0"><tr><td>　1:</td><td>　2: ABC　</td><td>　3: DEF　</td></tr><tr><td>　4: GHI　</td><td>　5: JKL　</td><td>　6: MNO　</td></tr><tr><td>　7: PQRS　</td><td>　8: TUV　</td><td>　9: WXYZ　</td></tr></table><br>
　最初は 444 なので I 、2番目は 66 なので N 、といった具合にアルファベットに変換していくと、解答を含む文字列（英文）に変換されます。そこに適切に空白を入れると以下になります。<br>
<br>
in cryptography asubstitution cipher is a method of encryption by which units of plain text are replaced with cipher text according to a regular system the units maybe single letters pairs of letters triplets of letters mixtures of the above this cipher text is encrypted by telephone keypad so we call this keypad cipher</font></blockquote><br>
　以上から、keypad cipher が解答となります。<br>
　この問題は、言われてみれば「ああ、なるほど」と思いますが、実際にこのデータ列を前にしてすぐにピンとくるかというと、やはり個人差があります。技術力以外の何か、そういうものも重要であると実感させられる問題でした。<br>
<br>
■だけど技術ももちろん必要<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/9/7/972d237a.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/9/7/972d237a-s.png" width="160" height="95" border="0" alt="script" hspace="5" class="pict" align="right"  /></a>　そうこう言いつつも、やはりセキュリティ技術を競う大会ですから、技術力も必要です。次はまさに技術力で解答する <a href="http://221.141.3.109/binbinbin1w/87C483A4CA85374E98FFB85FD5E867EC">Binary 100</a> を紹介します。<br>
　Binary 100 はテキストファイルですが、エディタで開くと良く分からない記号の羅列が表示されます（右図）。まずはこの記号の羅列が何なのかを探る必要がありますが、この記号の羅列を一目見て「ああ、これは Windows Script Encoder だね」と言ったのは、次の日に朝一で<a href="http://secusoba.info/">セキュそば勉強会</a>へ参加する予定があるにも関わらず、深夜の 2 時まで CTF に付き合ってもらった長谷川でした。<br>
　このエンコーダに対してはデコーダ（<a href="http://www.virtualconspiracy.com/index.php?page=scrdec/intro">Windows Script Decoder</a>）が存在し、これを使うことで、データを元に戻します。元に戻すと、次は難読化された JavaScript らしきコードが見つかります。<a href="http://www.netagent-blog.jp/archives/51742815.html">NetAgent Security Contest 2010 の Level7 を解く際に dojo で関数フックする方法</a>を紹介しましたが、それを用いて、最終的な JavaScript コードを出力させます。すると CodeGate_JavaScriptEncode_Key という文字列が入った JavaScript が得られます。この JavaScript の末尾に alert(CodeGate_JavaScriptEncode_Key) のようなコードを追加して実行すると、120a151156120a163t111163120lea163u162e! という文字列が得られます。最初はこれが解答かと思いましたが、良く見ると、3 桁で区切られる数値が見えます。<br>
<br>
　「120 a 151 156 120 a 163 t 111 163 120 lea 163 u 162 e!」　<br>
<br>
　これは 10 進数に見えますが、正解は 8 進数でした。3 桁の数値を 8 進数で変換すると、PainPastIsPleasure! という文字列が得られます。これが正解となりました。<br>
<br>
■勉強になる<br>
　Crypto 100 と Binary 100 を紹介しましたが、いかがだったでしょうか。さて、何か得意げに解説させていただきましたが、実は私は競技時、この 2 問はどちらもまったく解けていませんでした（汗）。なので、ただ二人を眺めながら「すごいなぁ…」と驚いていただけなのですが、個人的には CTF の醍醐味はまさにここにあると思っています。<br>
　自分一人では絶対に分からない問題にぶつかったとしても、その問題を他の誰かが解き、その解答方法を知ることで、いつの間にか自分も同じ問題を解けるようになっています。それはつまり、CTF という競技を通して、チーム内で技術や知識を教え合っているとも言えます。<br>
　さらに、競技が終了すれば、各チームがそれぞれ解答を Web に公開し始めます。当然、各チームとも同じ解答方法ではありませんし、自チームでは解けなかった問題の解答なども読めます。競技中はチーム内で技術を共有し、終了後はチーム間で技術を共有します。まさに、世界中のチーム同士で技術や知識を教え合っている状態と言えます。個人的には、これほど効率がよく、充実した学習方法はまずないと思っています。<br>
　とは言いつつも、やはり問題が解けないとつまらなかったり、48 時間も PC に向かい続けるのは辛いと感じることもあります。ただ、より多くの問題を解けるのは技術力の証明になると思いますが、仮に 1 問も解けなかったとしても、それが技術力の無さには繋がりません。CTF に求められるスキルセットと自身が持つ技術が異なっていることもありますし、そもそも CTF に合わない（問題として出題しにくい）技術もあります（XSS や kernel関系など）。また、48 時間ずっと起きている人も中にはいますが、基本的には仮眠を取りつつやっていく人の方が多いです（眠いとやはり集中力が持たない）。<br>
　なので、あまり気負わずに、普通の勉強会に参加する感じでトライしてみるのも良いのではないかと思います。<br>
<br>
■最後に結果を少し<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/e/5/e519caa7.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/e/5/e519caa7-s.png" width="160" height="90" border="0" alt="rank" hspace="5" class="pict" align="right"  /></a>　48 時間に及ぶ長い闘いでしたが、私たち sutegoma2 は見事<a href="http://yut.codegate.org/">予選を 1 位で通過</a>できました。トップランキングを見ると分かりますが、アメリカがもっとも強く、次いで韓国チームが多いです。やはり IT 立国の強さは伊達じゃありません。しかし、そんな中でも日本やスウェーデンがトップランキングに入っていることを考えると、アメリカや韓国以外の国もまだまだ頑張れると感じます。そして、日本の技術力もまた、十分に世界に通用することを実感できた結果でもありました。<br>
　しかし、この結果に満足せず、さらなる上を目指し、これからも一歩ずつ努力していきたいと思います。<br>
<br>
　さて、最後になりますが、予選終了から今日で 3 日目なので、他の参加チームから徐々に writeup が公開され始めています。もし今回紹介した問題以外にも興味があれば、ぜひ読んでみてください。<br>
<br>
<a href="http://isc.sans.edu/diary.html?storyid=10501">Oracle padding attacks (Codegate crypto 400 writeup)</a><br>
<a href="http://auntitled.blogspot.com/2011/03/codegate-ctf-2011-vuln300-writeup.html">Codegate CTF 2011 Vuln300 Writeup</a><br>
<a href="http://securityblackswan.blogspot.com/2011/03/codegate-yut-2011-issue-500-writeup.html">CODEGATE YUT 2011: Issue 500 writeup</a><br>
<a href="http://leetmore.ctf.su/wp/codegate-ctf-2011-mini-writeups/">Some mini writeups on Codegate 2011 Prequals: Issue100,200, Net100,200, Crypto100,200.</a><br>
<a href="http://leetmore.ctf.su/wp/codegate-yut-2011-forensic-300issue-300/">Codegate CTF 2011 Forensic 300, Issue 300</a>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51762319" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51759591.html">
<title>フォレンジックエンジニアから見たコンピュータ監視法案</title>
<link>http://www.netagent-blog.jp/archives/51759591.html</link>
<description>　こんにちは、松本です。今回は「コンピュータ監視法案」や「ウイルス作成罪法案」などと呼ばれ、何かと話題に上ることの多い「犯罪の国際化及び組織化並びに情報処理の高度化に対処するための刑法等の一部を改正する法律案要綱」（以下改正案）について、デジタル・フォレ...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-03-02T15:22:31+09:00</dc:date>
<dc:subject>松本隆</dc:subject>
<content:encoded><![CDATA[　こんにちは、松本です。今回は「コンピュータ監視法案」や「ウイルス作成罪法案」などと呼ばれ、何かと話題に上ることの多い「犯罪の国際化及び組織化並びに情報処理の高度化に対処するための刑法等の一部を改正する法律案要綱」（以下改正案）について、デジタル・フォレンジックの観点から注目しているポイントを簡単にご紹介したいと思います。ただし、私は法律の専門家ではありませんので、細かい議論の部分には踏み込まず、理解している範囲でのご紹介となりますので、その点よろしくお願いいたします。<br>
<br>
-----<br>
<br>
■はじめに<br>
　改正案に関しては、最新のものではありませんが、2月28日現在では法務省のページで第163回国会（2005年特別会）に提出されたバージョンを確認できます（<a href="http://www.moj.go.jp/houan1/houan_houan34.html">参考</a>）。<br>
　内容を見ていてピンとくる方もいるかと思いますが、改正案はデジタル・フォレンジックの証拠保全手続きに関わる内容を多く含んでいます。これは、従来の法制度ではコンピュータを利用した、いわゆるハイテク犯罪に対応できなくなってきたことと、国境をまたがって行われるサイバー犯罪に対応し、国際協力を実現するために、現行の仕組みを一度改めようという狙いがあるためです。<br>
　法案の内容について確認する前に、まずはこの改正案が提出されるにいたった背景について、少しご説明します。<br>
<br>
■改正案が提出された理由<br>
　法務省のサイトで紹介されている、<a href="http://www.moj.go.jp/houan1/houan_kyoubouzai_refer03.html">改正案が作成された理由</a>を以下に引用します。<br>
<br>
<blockquote>　近年における犯罪の国際化及び組織化並びに情報処理の高度化の状況にかんがみ、国際的な組織犯罪の防止に関する国際連合条約の締結に伴い、組織的な犯罪の共謀等の行為についての処罰規定、犯罪収益規制に関する規定等を整備するとともに、組織的に実行される悪質かつ執拗な強制執行妨害事犯等に適切に対処するため、強制執行を妨害する行為等についての処罰規定を整備し、並びに情報処理の高度化に伴う犯罪に適切に対処するため、及びサイバー犯罪に関する条約の締結に伴い、不正指令電磁的記録作成等の行為についての処罰規定、電磁的記録に係る記録媒体に関する証拠収集手続の規定その他所要の規定を整備する必要がある。これが、この法律案を提出する理由である。<br>
</blockquote><br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/d/8/d8318b1b.PNG" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/d/8/d8318b1b-s.PNG" width="160" height="120" border="0" alt="スライド1" hspace="5" class="pict" align="right"  /></a>　非常に長く分かりにくいところもあるので、要約して右図にまとめます。<br>
　まずは①の「国際的な組織犯罪の防止に関する国際条約（国際組織犯罪防止条約）の締結」ですが、これは2000年11月15日に国際連合の総会で採択された、<a href="http://www.mofa.go.jp/mofaj/gaiko/treaty/treaty156_7.html">国際組織犯罪防止条約</a>の締結に伴った改正となります。具体的には、組織的な犯罪の共謀（いわゆる共謀罪）についての処罰の明確化や、公務員による腐敗行為に対する規制、そしてマネーロンダリングに代表される犯罪収益の洗浄などに対応するための法整備です。<br>
　ちなみに「共謀罪」は、共謀の定義があいまいである点や、実体がない共謀を立証するための捜査手法などが議論となり、多くの識者の方から反対の声が上がりました。この改正案が何度も廃案となる原因となった内容ですので、興味のある方はチェックしてみてください。なお、<a href="http://www.itmedia.co.jp/news/articles/1009/14/news012_2.html">メディアの報道</a>によれば2011年度に提出される法案では、共謀罪が切り離される予定とのことです。<br>
　次に②の「組織的に実行される悪質な強制執行妨害事犯等に適切に対処」ですが、これは組織的に実行される、悪質かつ執拗な強制執行妨害事犯等に適切に対処するため、強制執行を妨害する行為等についての処罰規定となります。具体的には、封印等破棄罪に関して封印等が取り除かれた後に行われる妨害行為に関しても処罰の対象とするなど、現行刑法96条の拡充や、罰則の強化・加重処罰規定の新設などが挙げられます。<br>
　そして、最後は今回の本題ともいえる③の「サイバー犯罪条約の締結」に伴った法整備です。これはフォレンジックの観点から特に重要であるため、詳しく内容を確認していきます。<br>
<br>
■サイバー犯罪条約とは<br>
　サイバー犯罪条約は<a href="http://www.mofa.go.jp/mofaj/gaiko/treaty/treaty159_4.html">外務省のページ</a>で公開されています。この条約は2001年11月8日にストラスブールで採択され、2004年4月の国会での承認を経て同年7月1日より効力が発生しています。ただし、過去に提出された法案が共謀罪とセットであったために廃案になったのは先述したとおりです。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/1/b/1be2953e.PNG" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/1/b/1be2953e-s.PNG" width="160" height="120" border="0" alt="スライド2" hspace="5" class="pict" align="right"  /></a>　サイバー犯罪条約が成立した経緯は<a href="http://www.mofa.go.jp/mofaj/gaiko/treaty/pdfs/treaty159_4b.pdf">外務省ページの説明書</a>に記載されています。条約の成立経緯などに関してはこの資料で確認できますが、重要なのは説明書の「条約の締結により我が国が負うこととなる義務」の内容です。簡単に要約すると右図のように３つの内容に分類できます。<br>
　このうち、①の実体法的規定の中には、「不正指令電磁的記録作成等（ウイルス作成罪）」法案などが含まれていますが、活発な議論の最中ですので本記事では取り扱いません。また、③の国際協力規定に関しても詳しくここでは取りあげませんが、サイバー犯罪条約がこの３つの規定によって成立していることは頭に入れて置いていただければと思います。現在はこの３つの観点がバラバラに議論されることが多く、冒頭に紹介したように「ウイルス作成罪法案」や「コンピュータ監視法案」などと一部の法案に注目された形で取り上げられがちですが、これらの観点は本来サイバー犯罪条約という一つの土俵の上の話ですので、それぞれの規定の関係性を確認しながら、慎重に議論すべき内容でもあるということです。<br>
<br>
■サイバー犯罪条約の手続法的規定と改正案の内容<br>
　サイバー犯罪条約を締結したことにより、我が国が負うことになる義務のうち、手続法的規定の内容に関係するものについて、法務省サイトで公開されている<a href="http://www.mofa.go.jp/mofaj/gaiko/treaty/pdfs/treaty159_4b.pdf">サイバー犯罪に関する条約の説明書</a>によると、「自国の権限のある当局が、蔵置されたコンピュータ・データの迅速な保全、捜索及び押収並びに提出命令、通信記録のリアルタイム収集並びに通信内容の傍受を行うことが可能となるよう、必要な立法その他の措置をとること」と記載されています。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/e/2/e249d4ef.PNG" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/e/2/e249d4ef-s.PNG" width="160" height="120" border="0" alt="スライド3" hspace="5" class="pict" align="right"  /></a>　その具体的な手段としてとられたのが刑事訴訟法の改正です。改正の概要は、<a href="http://www.moj.go.jp/houan1/houan_kyoubouzai_refer05.html">「犯罪の国際化及び組織化並びに情報処理の高度化に対処するための刑法等の一部を改正する法律案の概要」</a>として法務省のサイトで公開されています。項目を並べると右図のようになります。<br>
　まずは①の「電磁的記録に係る記録媒体の差押えの執行方法の整備」についてです。これは、電磁的記録に係る記録媒体の差押えに代えて、電磁的記録を他の記録媒体に複写して、差し押さえることを可能とすることを指します。たとえば、これまでは原本のハードディスクを差し押さえたのちに調査のための複製を取る、というような形で、あくまで原本の物理的な記録媒体のみが差し押さえの対象だったのですが、この改正により現場に存在する原本のハードディスクを差し押さえる代わりに、原本とは別のハードディスクにデータをコピーして、それを差し押さえ対象とみなしてもよくなったということです（もちろん従来の方式も認められます）。これはつまり裁判で取り扱う証拠の中で、データそのものが非常に重要な位置づけとなったといえます。<br>
　次に②の「記録命令付差押え」についてですが、これは裁判所の許可（令状）のもと、電磁的記録の保管者等に命じて、必要な電磁的記録を他の記録媒体に記録させて差し押さえることを可能とするものです。①と連動する具体的な手続きの部分ともいえます。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/1/d/1d6b771e.PNG" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/1/d/1d6b771e-s.PNG" width="160" height="120" border="0" alt="スライド4" hspace="5" class="pict" align="right"  /></a>　記録命令付差押えで注意すべき点は、差押えの執行方法が２パターンあるということです。まず、記録命令付差押許可状を発行して捜査機関が自ら別の記憶媒体にコピーを行い、コピーされた記憶媒体を差し押さえる方法です。もう一つは、記録命令付差押状を発行して被差押者（差押えを受ける相手）に命じてコピー作業を行わせ、コピーされた記憶媒体を捜査機関が差し押さえる方法です。<br>
　次は③の「電気通信回線で接続している記録媒体からの複写」に関してですが、これも裁判所の許可を得た上での差押え対象のコンピュータとネットワークで接続しているファイルサーバーなどのデータをコピーして差し押さえることを可能とする、というものです。<br>
　法案には、「差押状又は差押許可状に、差し押さえるべき電子計算機に電気通信回線で接続している記録媒体であって、その電磁的記録を複写すべきものの範囲を記載しなければならない」と明記されていますが、例えば「接続している」という定義をどうするのか、どこまでの範囲を想定しているのかなどは、まだ議論されているところです。また、海外のオンラインストレージサービスなどを対象とした場合の法的な対応はどうするのか、といった問題も指摘されています。<br>
　最後に④の「通信履歴の電磁的記録の保全要請」に関してですが、これは捜査機関が、プロバイダ等の通信事業者に対し、業務上記録している通信履歴（通信内容は含まれない）のうち、電気通信の送信元、送信先、通信日時その他通信履歴の記録の中から特定のものに対して、最大90日間（※）消去しないよう求めることを可能とする、というものです。なお、この保全要請は捜査機関独自の判断によって行えます。また、保全の必要がなくなったと判断した場合には、捜査機関は保全要請の取り消しをする義務があります。<br>
　<br>
■最後に<br>
　いわゆる、「コンピュータ監視法案」とは、具体的にはこれらの①～④の手続き及び、新設・拡充されたサイバー犯罪関連の刑法を合わせて指すことが多いようです。ネットでは今回の法改正によって、PCそのものだけでなくPCがつながっているネットワーク上のデータも含めて広く保全対象となる点、また、保全の要請が捜査機関の判断でできるようになることなどから、捜査機関がコンピュータに対する監視を合法的に強化していくのではないかと警戒し、抵抗感や拒否感を示す方も多く見受けられます。しかし、近年増加しつつあるサイバー犯罪に対応するためにも、そして私自身フォレンジックに関わる立場から、データそのものが証拠として扱われるための重要な手続きとして、法制度が変わっていくことは必要であると考えています。ただし、同時にウイルスの定義やオンラインストレージの問題、プライバシーに関する情報の取り扱いなど、確かに不明確な点も多く、まだまだ慎重な議論が必要であるとも感じています。<br>
　また、フォレンジックとは別の議論として、日本以外に主要先進国でサイバー犯罪条約を批准した国はないではないか、という意見もあります。サイバー犯罪条約を批准した場合には、通信の秘密に抵触する事案が発生する可能性もあります。また状況によっては他の加盟国との関係の中で自国の主権が侵される状況も考えられるために、他の主要先進国は二の足を踏んでいるのだということです。<br>
　このような複雑な事情もあり、様々な意見が飛び交っている今回の改正案ですが、我々にとって非常に重要な内容でもありますので、読者の皆様が少しでも関心を持っていただけるよう、また改正案を読み解く際の助けになればと願い、専門外ではありますが今回記事を書かせていただきました。<br>
<br>
（※）指宿教授の資料では60日とありますが、法務省のページに記載されている法案は90日と記載されていましたのでそちらを採用しました。もしかするとコラムの内容は最新の内容と異なる可能性があります<br>
<br>
参考資料<br>
　警察官のための刑事訴訟法講義（補訂版）　津田 隆好 著<br>
　衆議院院内集会（2011年2月15日） 「コンピュータ監視法を考える：手続法観点から」　指宿　信 成城大学教授による基調講演資料<br>
<br>
<br>
-----　追記　（2011/07/06）<br>
　平成23年6月17日に「情報処理の高度化等に対処するための刑法等の一部を改正する法律案」が可決成立したため、以下に法務省のサイトで公開されている法案とQ&Aのリンクをご紹介します。 <br>
<br>
<a href="http://www.moj.go.jp/content/000072565.htm" target="_blank">国会提出主要法案第１７７回国会（常会）<br>
情報処理の高度化等に対処するための刑法等の一部を改正する法律案 </a><br>
<br>
<a href="http://www.moj.go.jp/content/000073750.htm" target="_blank">いわゆるサイバー刑法に関するＱ＆Ａ</a>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51759591" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51756259.html">
<title>ptraceを使ったデバッギング</title>
<link>http://www.netagent-blog.jp/archives/51756259.html</link>
<description>　こんにちは、愛甲です。今回は、リバースエンジニアリングを行う際に有用な ptrace と udis86 を用いたデバッギングについて解説させていただこうと思います。なお、本記事は Ubuntu Linux (x86) で動作確認を行っています。

$ lsb_release -a
No LSB modules are availab...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-02-22T12:48:19+09:00</dc:date>
<dc:subject>愛甲健二</dc:subject>
<content:encoded><![CDATA[　こんにちは、愛甲です。今回は、リバースエンジニアリングを行う際に有用な ptrace と udis86 を用いたデバッギングについて解説させていただこうと思います。なお、本記事は Ubuntu Linux (x86) で動作確認を行っています。<br>
<br>
<pre>$ lsb_release -a<br>
No LSB modules are available.<br>
Distributor ID: Ubuntu<br>
Description:    Ubuntu 10.04.1 LTS<br>
Release:        10.04<br>
Codename:       lucid<br>
</pre><br>
-----<br>
<br>
■ ptrace とは<br>
　ptrace は、他プロセスの制御を行う手段として提供されているシステムコールです。<a href="http://archive.linux.or.jp/JM/html/LDP_man-pages/man2/ptrace.2.html">Manpage of PTRACE</a> に詳しい解説が載っており、主にデバッガを作成する際に利用されます。しかし ptrace だけでは逆アセンブルができないため、今回は逆アセンブルライブラリである <a href="http://udis86.sourceforge.net/">udis86</a> も使います。udis86 は x86（ x86_64 含む） 用の逆アセンブルライブラリで、ファイル、もしくはメモリ上からデータ列を読み込み、逆アセンブルした結果を文字列として返します。<br>
　これらを利用することで、デバッガに似たプログラムを作成できます。今回、本記事用のサンプルプログラムとして <a href="http://www.netagent-blog.jp/files/aiko/ptracer.c">ptracer.c</a> を用意しました。以降はこのソースコードを元に解説を進めますので、適宜コードを参照しながら読み進めてください。<br>
<br>
■トレースログの出力<br>
　ptracer は、他プロセスを実行した際に「実際に処理されたアセンブラコード」を逐次出力するプログラムです。OllyDbg のような一般的なデバッガにも同じような（トレースログを出力する）機能を持つものがあり、それらとほぼ同等の機能と考えてください。<br>
　仕組みとしては、まず fork で子プロセスを作成し、その後に execve によりターゲットプログラム（プロセス）に成り替わるのですが、その前に PTRACE_TRACEME を実行し、他プロセスからの ptrace アクセスの許可をしておきます。これで、親プロセスから子プロセスへ、任意のタイミングでアタッチ可能となります。<br>
　子プロセスがターゲットプログラムに成り替わったら、親プロセスから実行を制御します。PTRACE_SINGLESTEP で 1 命令ずつ進めながら、PTRACE_GETREGS でレジストリを確認します。現在実行中のアドレスは regs.eip で取得できるため、これを元に逆アセンブルし、実行されたマシン語をアセンブラコードとして出力します。アタッチしている他プロセスのアドレス空間のデータを「読む」ためには PTRACE_PEEKDATA を使います。<br>
　以下のサンプルプログラムを作成し、そのトレースログを出力します。<br>
<br>
<pre>$ cat target1.c<br>
#include &lt;stdio.h&gt;<br>
#include &lt;string.h&gt;<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
  if(argc != 2){<br>
    printf("%s &lt;PASSWORD&gt;\n", argv[0]);<br>
    return 1;<br>
  }<br>
  if(strcmp("HELLO", argv[1]) == 0)<br>
    printf("OK!\n");<br>
  else<br>
    printf("ERR\n");<br>
  return 0;<br>
}<br>
$ gcc -Wall target1.c -o target1<br>
$ ./target<br>
./target &lt;PASSWORD&gt;<br>
$ ./target ABCD<br>
ERR<br>
</pre><br>
　target1 は、引数に HELLO を渡さなければエラーを返すプログラムです。これを ptracer を使って逆アセンブルします。なお、他のライブラリ内での処理は無視したいので、target1 のテキストセクションの領域をあらかじめ調べておき、その領域内においてのみの逆アセンブル結果を表示します。逆アセンブルの領域を指定するには -a オプションを使います。<br>
<br>
<pre>$ readelf -S target1 | grep text<br>
  [14] .text  PROGBITS <font color="red">080483a0</font> 0003a0 <font color="red">0001bc</font> 00  AX  0   0 16<br>
$ ./ptracer <font color="red">-a 080483a0 0001bc</font> target1 ABCD<br>
080483a0:           31ed  xor ebp, ebp<br>
080483a2:             5e  pop esi<br>
（省略）<br>
08048498:           85c0  test eax, eax<br>
<font color="red">0804849a:           750e  jnz 0x10</font><br>
080484aa: c7042499850408  mov dword [esp], 0x8048599<br>
080484b1:     e8befeffff  call 0xfffffffffffffec3<br>
<font color="red">ERR</font><br>
080484b6:     b800000000  mov eax, 0x0<br>
080484bb:             c9  leave<br>
080484bc:             c3  ret<br>
</pre><br>
　ERR が表示される前に、0804849a で jnz 命令が処理されています。おそらくこの部分が、ERR と OK! のどちらを表示するかを判断している箇所だと考えられます。<br>
<br>
■任意のアドレスの値を書き換え<br>
　実際に処理されたアセンブラコードを逐次出力するだけならばデバッガのトレースログでもよいのですが、解析をやっていると、実行されるマシン語をリアルタイムに改ざんし、挙動を変更させたい場合があります。アタッチしているプロセスのアドレス空間へデータを「書く」ためには PTRACE_POKEDATA を使います。<br>
　実行されるマシン語のリアルタイムの改ざんは、-w オプションを使うことで実現できます。<br>
<br>
<pre>$ ./ptracer -a 080483a0 0001bc <font color="red">-w 0804849a 75 74</font> target1 ABCD<br>
080483a0:           31ed  xor ebp, ebp<br>
080483a2:             5e  pop esi<br>
（省略）<br>
08048498:           85c0  test eax, eax<br>
<font color="red">0804849a:           750e  jnz 0x10</font><br>
0804849c: c7042495850408  mov dword [esp], 0x8048595<br>
080484a3:     e8ccfeffff  call 0xfffffffffffffed1<br>
<font color="red">OK!</font><br>
080484a8:           eb0c  jmp 0xe<br>
080484b6:     b800000000  mov eax, 0x0<br>
080484bb:             c9  leave<br>
080484bc:             c3  ret<br>
</pre><br>
　今度は処理が変わり OK! が表示されました。<br>
　リアルタイム改ざん機能は、その命令が実行される直前に書き換えられ、命令の実行が終わった直後に元の値に戻されます。よって逆アセンブル結果は 750e のままですが、実際にCPUが処理を行ったのは 740e というマシン語命令です。<br>
　このように実行の直前と直後に変更を加えることで、コードの改ざん検知（あらかじめテキストセクションのコードが変更されていないことを確認して処理を開始するアンチデバッギングテクニック）を回避できます。<br>
<br>
■forkされた子プロセスを追う<br>
　サーバ系のプログラムだと、重要な通信はすべて fork された後の子プロセスに任せられ、親プロセスは accept で待つだけの役割を担う場合が多いです（とは言っても、最近のサーバ系プログラムはほぼすべてスレッド実装なので子プロセスを追う必要もありませんが…）。このようなプログラムの場合、重要なのは親プロセスよりもむしろ子プロセスなので、fork されたら、デバッグする対象を子プロセスに切り替えなければいけません。<br>
　fork や write といった「システムコール呼び出しをフックする」には PTRACE_SYSCALL を使います。ptracer では、システムコール呼び出しである int 80h を発見するまでステップ実行を行い、発見したら PTRACE_SYSCALL を呼び出して、システムコール呼び出し前と呼び出し後に処理を行っています（環境によっては int 80h が sysenter だったり、syscall であったりします）。<br>
　では、以下のサンプルプログラムを作成します。<br>
<br>
<pre>$ cat target2.c<br>
#include &lt;stdio.h&gt;<br>
#include &lt;string.h&gt;<br>
#include &lt;unistd.h&gt;<br>
#include &lt;stdlib.h&gt;<br>
#include &lt;sys/wait.h&gt;<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
  int st;<br>
  if(argc != 2){<br>
    printf("%s &lt;PASSWORD&gt;\n", argv[0]);<br>
    return 1;<br>
  }<br>
  if(!fork()){<br>
    if(strcmp("HELLO", argv[1]) == 0)<br>
      printf("OK!\n");<br>
    else<br>
      printf("ERR\n");<br>
    exit(0);<br>
  }<br>
  wait(&amp;st);<br>
  return 0;<br>
}<br>
$ gcc -Wall target2.c -o target2<br>
$ ./target2 ABCD<br>
ERR<br>
</pre><br>
　fork している部分以外は target1 と変わりません。ただ、target2 では、子プロセスを追わなければ出力結果を変えられません。fork 後の子プロセスを追いかけるためには -f オプションを使います。-f の後に DETACH と入力すれば「親プロセスをデタッチして」子プロセスを追いかけ、KILL と入力すれば「親プロセスを強制終了して」子プロセスを追いかけます。<br>
<br>
<pre>$ ./ptracer -a 08048430 0001ec <font color="red">-f DETACH</font> target2 ABCD<br>
08048430:           31ed  xor ebp, ebp<br>
08048432:             5e  pop esi<br>
（省略）<br>
08048531:           85c0  test eax, eax<br>
<font color="red">08048533:           750e  jnz 0x10</font><br>
08048543: c7042459860408  mov dword [esp], 0x8048659<br>
0804854a:     e89dfeffff  call 0xfffffffffffffea2<br>
<font color="red">ERR</font><br>
0804854f: c7042400000000  mov dword [esp], 0x0<br>
08048556:     e8c1feffff  call 0xfffffffffffffec6<br>
</pre><br>
　子プロセスを追いかけて ERR が表示されました。では、さらに子プロセスの 08048533 の値 750e を 740e に変更します。これで OK! が表示されます。<br>
<br>
<pre>$ ./ptracer -a 08048430 0001ec <font color="red">-w 08048533 75 74 -f DETACH</font> target2 ABCD<br>
08048430:           31ed  xor ebp, ebp<br>
08048432:             5e  pop esi<br>
（省略）<br>
08048531:           85c0  test eax, eax<br>
<font color="red">08048533:           750e  jnz 0x10</font><br>
08048535: c7042455860408  mov dword [esp], 0x8048655<br>
0804853c:     e8abfeffff  call 0xfffffffffffffeb0<br>
<font color="red">OK!</font><br>
08048541:           eb0c  jmp 0xe<br>
0804854f: c7042400000000  mov dword [esp], 0x0<br>
</pre><br>
　無事、子プロセスの処理を変更できました。<br>
　このように ptrace を使うことで、かゆいところに手が届く感じで解析を進められます。もちろん、デバッガや逆アセンブラをメインで使っていくのはこれまでと変わりませんが、ptrace の使い方を知っておくだけで、思わぬところで楽ができます。<br>
　では最後に ptrace を用いて、他プログラムの関数を呼び出すサンプルを解説して終わろうと思います。<br>
<br>
■他プログラムのコードを利用する<br>
　ptrace をうまく使うと、他プロセスのコードを横取りして利用できます。以下のサンプルコードを見てください。<br>
<br>
<pre>$ cat target3.c<br>
#include &lt;stdio.h&gt;<br>
#include &lt;string.h&gt;<br>
<br>
unsigned long f(char *x, int y)<br>
{<br>
  unsigned long a;<br>
  char b;<br>
  int i;<br>
<br>
  a = 0xFFFFFFFF;<br>
  if(y == 0)<br>
    return ~a;<br>
<br>
  while(1){<br>
    b = *x;<br>
    a = a ^ b;<br>
    x++;<br>
<br>
    for(i=0; i &lt; 8; i++){<br>
      if(a &amp; 1){<br>
        a = a &gt;&gt; 1;<br>
      }else{<br>
        a = a &gt;&gt; 1;<br>
        a ^= 0xEDB88320;<br>
      }<br>
    }<br>
    y--;<br>
    if(y == 0)<br>
      break;<br>
  }<br>
<br>
  return ~a;<br>
}<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
  if(argc != 2){<br>
    printf("%s &lt;PASSWORD&gt;\n", argv[0]);<br>
    return 1;<br>
  }<br>
  if(f(argv[1], strlen(argv[1])) == 0xd59b8359)<br>
    printf("OK!\n");<br>
  else<br>
    printf("ERR\n");<br>
  return 0;<br>
}<br>
<br>
$ gcc -Wall target3.c -o target3<br>
$ ./target3 ABCD<br>
ERR<br>
</pre><br>
　target3 は argv[1] を引数として関数 f を呼び出し、その戻り値を d59b8359 と評価しています。見ての通り、関数 f は不可逆なので、出力が d59b8359 となる入力データを復号できません。よって、もし入力データを知りたい場合は総当たりによるパスワードクラック等を行う必要がありますが、そのような場合に ptrace は有効です。ちなみに入力データは同じく HELLO です。<br>
　まずは関数 f を呼び出したいので、f のアドレスを調べます。また一時的に処理を止めておきたいアドレスも決めます。これはどこでも良いので、適当に main 関数の先頭にしておきます。<br>
<br>
<pre>$ objdump -d target3 | grep \&lt;f\&gt;:<br>
<font color="red">08048454</font> &lt;f&gt;:<br>
$ objdump -d target3 | grep \&lt;main\&gt;:<br>
<font color="red">080484c0</font> &lt;main&gt;:<br>
</pre><br>
　関数 f は引数を 2 つとります。第 1 引数に入力データ、第 2 引数に入力データのサイズが入りますので、第 1 引数を <font color="red">HELLO</font>、第 2 引数を <font color="red">5</font> として、スタックにこれらを積み、f を呼び出します。<br>
　以上の条件を設定したプログラムが <a href="http://www.netagent-blog.jp/files/aiko/pcaller.c">pcaller.c</a> です。target3 を渡して実行すると、target3 プロセス内にある関数 f を実行した結果が出力されます。<br>
<br>
<pre>$ ./pcaller target3<br>
<font color="red">retn: d59b8359</font><br>
</pre><br>
　このように ptrace は使い方によっていろいろと面白いことが可能です。<a href="http://archive.linux.or.jp/JM/html/LDP_man-pages/man2/ptrace.2.html">Manpage of PTRACE</a> を眺めると、今回紹介した機能以外にも様々なオプションがあるので、興味があればぜひ試してみてください。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51756259" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51752634.html">
<title>ここまでできる！　node.js に見る記号プログラミング</title>
<link>http://www.netagent-blog.jp/archives/51752634.html</link>
<description>
　こんにちは。ネットエージェント株式会社、研究開発部の長谷川です。先日、弊社の愛甲、サイバー大学の園田道夫氏とともに「非公式セキュリティキャンプ・キャラバン」と称して北海道情報セキュリティ勉強会（セキュポロ）に講師として参加してきました。例年であれば、セ...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-02-15T13:50:03+09:00</dc:date>
<dc:subject>長谷川陽介</dc:subject>
<content:encoded><![CDATA[<br>
　こんにちは。ネットエージェント株式会社、研究開発部の長谷川です。先日、弊社の愛甲、サイバー大学の園田道夫氏とともに「非公式セキュリティキャンプ・キャラバン」と称して<a href="http://secpolo.techtalk.jp/6thworkshop">北海道情報セキュリティ勉強会（セキュポロ）</a>に講師として参加してきました。例年であれば、<a href="http://www.ipa.go.jp/jinzai/renkei/spcamp2010/index.html">セキュリティ＆プログラミングキャンプ</a>の事業の一環として公式なキャラバンが開催されるのですが、今年は様々な事情で公式なキャラバンの開催が難しく講師としても心苦しく思っていたところ、ちょうどセキュポロのみなさんから勉強会の打診を頂きましたので、機会に乗じて非公式ながら「セキュリティキャンプ・キャラバン」という形を取らせて頂いたのでした。<br>
<br>
-----<br>
<br>
　さて、今日のテーマは流行りの <a href="http://nodejs.org/">node.js</a> です。node.js は高効率な Web アプリケーションを、書き慣れた JavaScript で実現するための、サーバサイドで動く JavaScript 実装です。「最近、node.js も話題なので少しは触っておかないとな…」などと考えていたところに、愛甲から突然電話がかかってきました。<br>
　電話の内容は「今、node.js で <a href="http://www.netagent-blog.jp/archives/51739962.html">[]()+! の6種類の記号だけの JavaScript</a> を書こうとしてるんだけど、うまく動かないんだよね」というものでした。愛甲といえば、普段から「0と1しか興味ない」と公言しているほどのバイナリアンであり、そんな彼が0も1も使わない JavaScript を書いているということに少し衝撃を受けた私は、全く node.js を触ったことがないにも関わらず「いや、多分なんとかなると思うので、やってみます」と返事をしてしまい、node.js の世界に飛び込んだのでした。<br>
　とりあえず、記号だけで JavaScript を動かす基本形として、まずは以下のようなコードを考えます。<br>
<br>
<pre>Function( Function( "return\"console.log(1)\"" )() )()<br>
</pre><br>
　これは、無名関数内で console.log を使って「1」というメッセージを表示するコードですが、Number.constructor が Function であることを利用すると、以下のように書き変えられます。<br>
<br>
<pre>(0).constructor.constructor( <br>
  (0).constructor.constructor(<br>
    "return\"console.log(1)\""<br>
  )()<br>
)()<br>
</pre><br>
　さらに、メソッドの呼び出しを連想配列形式に置き換えます。<br>
<br>
<pre>(0)["constructor"]["constructor"](<br>
  (0)["constructor"]["constructor"](<br>
    "return'console.log(1)'"<br>
  )()<br>
)()<br>
</pre><br>
　数字の 0 は、+[] で生成できます。また、「constructor」「return」という文字列は以下のように各文字を生成して + で連結します。<br>
<br>
<pre>"c" : ([].filter + [])[3]         // "function filter() { <br>
                                  //   [native code] }"[3]<br>
"o" : (true + [].filter + [])[10] // "truefunction filter() { <br>
                                  //   [native code] }"[10]<br>
"n" : (undefined+[])[1]           // "undefined"[1]<br>
"s" : (false + [])[3]             // "false"[3]<br>
"t" : (true + [])[0]              // "true"[0]<br>
"r" : (true + [])[1]              // "true"[1]<br>
"u" : (undefined + [])[0]         // "undefined"[0]<br>
"c" : ([].filter + [])[3]         // "function filter() { <br>
                                  //   [native code] }"[3]<br>
"t" : (true + [])[0]              // "true"[0]<br>
"o" : (true + [].filter + [])[10] // "truefunction filter() { <br>
                                  //   [native code] }"[10]<br>
"r" : (true + [])[1]              // "true"[1]<br>
</pre><br>
<pre>"r" : (true + [])[1]              // "true"[1]<br>
"e" : (true + [])[3]              // "true"[3]<br>
"t" : (true + [])[0]              // "true"[0]<br>
"u" : (undefined + [])[0]         // "undefined"[0]<br>
"r" : (true + [])[1]              // "true"[1]<br>
"n" : (undefined+[])[1]           // "undefined"[1]<br>
</pre><br>
　「filter」という文字列やtrue、false、undefinedといった値、数値なども、同様な方法で生成します。<br>
<br>
<pre>"f" : (false + [])[0]             // "false"[0]<br>
"i" : (false + undefined)[10]     // "falseundefined"[10]<br>
"l" : (false + [])[2]             // "false"[2]<br>
"t" : (true + [])[0]              // "true"[0]<br>
"e" : (true + [])[3]              // "true"[3]<br>
"r" : (true + [])[1]              // "true"[1]<br>
</pre><br>
<pre>true      : !![]<br>
false     : ![]<br>
undefined : [][[]]<br>
0         : +[]<br>
1         : +!+[]<br>
2         : !+[]+!+[]<br>
3         : !+[]+!+[]+!+[]<br>
10        : +!+[]+[+[]]<br>
</pre><br>
　「constructor」「return」の各文字列や数値が []()!+ の記号だけで生成できましたので、あとは「'console.log(1)'」という、実行するコード部分を記号で生成すれば任意のコードを記号だけで書けそうです。<br>
　JavaScript では、文字列定数は "\101\102\103" のように ASCII コードを \ に続けて8進数で記述することで、US-ASCII の範囲内の文字であれば表現できます。これを利用すると、「'console.log(1)'」という部分は「'\143\157\156\163\157\154\145\56\154\157\147\050\061\051'」になります。任意の数字は []()!+ の6種の記号から自由に生成できますので、あとは「\」と「'」の2文字を生成すればいいことになりますが、さてどうしよう…、というところで実は行き詰ったわけですが、node.js をいろいろ触っていると、console.dir が利用できることに気が付きました。console.dir( console.dir + []) を実行してみると、次のような文字列が返ってきます。<br>
<br>
<pre>function (object) {<br>
  var util = require('util');<br>
  process.stdout.write(util.inspect(object) + '\n');<br>
}</pre><br>
　うまい具合に、(consile.dir+[])[97] と (console.dir+[])[41] に「\」と「'」が存在していました。そして、「console」「dir」は次のように記号だけで書けます。<br>
<br>
<pre>"c" : ([].filter + [])[3]         // "function filter() { <br>
                                  //   [native code] }"[3]<br>
"o" : (true + [].filter + [])[10] // "truefunction filter() { <br>
                                  //   [native code] }"[10]<br>
"n" : (undefined+[])[1]           // "undefined"[1]<br>
"s" : (false + [])[3]             // "false"[3]<br>
"o" : (true + [].filter + [])[10] // "truefunction filter() { <br>
                                  //   [native code] }"[10]<br>
"l" : (false + [])[2]             // "false"[2]<br>
"e" : (true + [])[3]              // "true"[3]<br>
</pre><br>
<pre>"d" : (undefined+[])[2]           // "undefined"[2]<br>
"i" : (false + undefined)[10]     // "falseundefined"[10]<br>
"r" : (true + [])[1]              // "true"[1]<br>
</pre><br>
　これで、任意のコードを []()!+ の6種類だけで書けることがわかりましたので、実際に「console.log(1)」を記号だけで書いてみると、<a href="http://www.netagent-blog.jp/files/hasegawa/node1.js">こんなふうに</a>なります。たった1行が4万文字を超えるスクリプトになってしまいました（笑）。<br>
　この方法で、node.js らしく<a href="http://nodejs.org/docs/v0.4.0/api/synopsis.html">httpサーバ</a>も記号だけに変換してみようと思ったのですが、require や module などが Function() 内ではうまく動かず結局断念しました。require のみグローバルなコンテキストから引数で渡してやることで、ほとんどの部分を記号だけで書いた JavaScript による http サーバは<a href="http://utf-8.jp/joke/httpd.js">こちら</a>になります（ブラウザによっては表示に時間がかかりますのでご注意ください）。require なども記号だけで実現する、何かよい方法があればこっそり教えてください。<br>
　ということで、記号だらけですっかり混乱してしまった頭をすっきりさせるために、今日も飲みに行くのでした。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51752634" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51749738.html">
<title>DNSCurveの紹介</title>
<link>http://www.netagent-blog.jp/archives/51749738.html</link>
<description>　こんにちは、ネットエージェント株式会社、大阪支社の山口です。今回は DNSCurve について軽く紹介したいと思います。

-----

　DNS のレコード改竄対策として DNSSEC が少しずつ認知されつつありますが、とはいえ、その複雑さから導入にいまひとつ踏み切れない管理者の方...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-02-08T15:07:54+09:00</dc:date>
<dc:subject>山口尋久</dc:subject>
<content:encoded><![CDATA[　こんにちは、ネットエージェント株式会社、大阪支社の山口です。今回は DNSCurve について軽く紹介したいと思います。<br>
<br>
-----<br>
<br>
　DNS のレコード改竄対策として <a href="http://www.dnssec.net/" target="_blank">DNSSEC</a> が少しずつ認知されつつありますが、とはいえ、その複雑さから導入にいまひとつ踏み切れない管理者の方も多いかと思います。このような懸念に対して DNS サーバの <a href="http://cr.yp.to/djbdns.html" target="_blank">djbdns</a> や HTTP サーバの <a href="http://cr.yp.to/publicfile.html" target="_blank">publicfile</a> などで知られるイリノイ大学の <a href="http://cr.yp.to/djb.html" target="_blank">D. J. Bernstein</a> 氏が、DNSSEC の諸問題を指摘するとともに、対案として <a href="http://dnscurve.org/" target="_blank">DNSCurve</a> を提案しています。<br>
<br>
　DNSSEC と DNSCurve の主な違いとして以下の2点が挙げられます。<br>
<ol><li> DNSSEC がキャッシュサーバに保持される DNS リソース情報が正しいものであることを確認するため、応答に電子署名を施しているのに対して、DNSCurve では別ホストのキャッシュサーバを用いずに権威サーバと直接暗号化通信を行うことで正しい値を得ようとします。<br>
<li> DNSSEC が電子署名の公開鍵や署名データに新たにリソースレコードを追加してそれぞれに対応するためにソフトウェアの大規模な変更が必要だったのに対し、DNSCurve では問合せや応答のレコード数に変化がないためプロキシの実装は比較的容易だと言われています。<br>
</ol>　DNSCurve のパケットがどのような形式になっているか、公開されているドラフト「<a href="http://tools.ietf.org/html/draft-dempsky-dnscurve-01" target="_blank">DNSCurve: Link-Level Security for the Domain Name System</a>」（2010年8月で期限切れ）を参照しながら確認してみます。<br>
　DNSCurve の暗号化には<a href="http://en.wikipedia.org/wiki/Elliptic_Curve_Cryptography" target="_blank">楕円曲線暗号</a>を用いた公開鍵暗号が使用されています。暗号化に利用される Curve25519（Diffie-Hellman 鍵共有）、Salsa20（ストリーム暗号）、Poly1305（メッセージ認証）の各アルゴリズムについては、Bernstein 氏の<a href="http://cr.yp.to/papers.html#naclcrypto" target="_blank">論文</a>で説明されています。<br>
　通信には 256bits の鍵と、192bits の nonce と、128bits の MAC が使用されます。サーバ側の鍵は、鍵を BASE32 エンコードした先頭51文字をプレフィクス &quot;uz5&quot; のうしろにつけたものをネームサーバのホスト名として登録します（<a href="http://tools.ietf.org/html/draft-dempsky-dnscurve-01#section-4" target="_blank">→4</a>）。<br>
　クライアントは、&quot;uz5&quot; で始まる 54bytes のホストパートを持つ NS レコードがある場合に DNSCurve 通信を行います。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/d/1/d1072cbc.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/d/1/d1072cbc-s.png" width="160" height="116" border="0" alt="dnscurve_1_request_pkt" hspace="5" class="pict" align="right"  /></a>　問合せパケットは以下のような構成になります（<a href="http://tools.ietf.org/html/draft-dempsky-dnscurve-01#section-6.1" target="_blank">→6.1</a>）。<br>
<ul><li>識別文字列 &quot;Q6fnvWj8&quot;<br>
<li>クライアントの公開鍵 32bytes(256bits)<br>
<li>クライアント nonce 12bytes(192bits)<br>
<li>暗号化した問合せパケット<br>
</ul><br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/8/8/889057a4.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/8/8/889057a4-s.png" width="160" height="192" border="0" alt="dnscurve_2_response_pkt" hspace="5" class="pict" align="right"  /></a>　応答パケットの場合は以下のとおりです。<br>
<ul><li>識別文字列 &quot;R6fnvWJ8&quot;<br>
<li>クライアント nonce 12bytes(192bits)<br>
<li>応答 nonce 12bytes(192bits)<br>
<li>暗号化した応答パケット<br>
</ul>　TXT レコードの問合せの場合は、問合せ名にnonce、暗号化した問合せパケット、クライアントの公開鍵を含む形式になります (<a href="http://tools.ietf.org/html/draft-dempsky-dnscurve-01#section-6.2" target="_blank">→6.2</a>)<br>
<br>
　DNSCurve を試すには、まず既存のコンテンツサーバを DNSCurve に対応させるプロキシ <a href="http://curvedns.on2it.net/" target="_blank">CurveDNS</a> を使用します（フリーのコンテンツサーバ実装 <a href="http://code.google.com/p/gdnsd/" target="_blank">gdnsd</a> も DNSCurve 対応しているようです）。<br>
　そして、キャッシュサーバにて、Bernstein 氏の暗号アルゴリズムの実装された <a href="http://nacl.cace-project.eu/" target="_blank">NaCl ライブラリ</a>をビルドし、先述のドラフトを書いた OpenDNS Inc. の Matthew Dempsky  氏が公開している djbdns 用のパッチ（<a href="http://shinobi.dempsky.org/~matthew/patches/djbdns-dnscurve-20090602.patch">http://shinobi.dempsky.org/~matthew/patches/djbdns-dnscurve-20090602.patch</a>）を適用します。その後、conf-cc と conf-ld に、それぞれビルドした NaCl ライブラリのインクルードパス、ライブラリパスを追加してビルドします。<br>
<br>
　DNSCurve は、DNSSEC に比べて従来の設定からの変更が小幅なため導入に際してのトラブルは比較的少ないというメリットが見込めます。とはいえ、標準化プロセスを経ておらず、実装もまだ数が少なく、サイトごとのキャッシュサーバではなく各クライアントごとに再帰問合せを行うことによるトラフィックの増加や、鍵の更新手順などの運用上の問題等も議論が続くものと思われます。今後の状況に注目していきたいところです。
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51749738" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://www.netagent-blog.jp/archives/51746238.html">
<title>ポルノ画像を検出する密告ツールの実力と死角</title>
<link>http://www.netagent-blog.jp/archives/51746238.html</link>
<description>　こんにちは、フォレンジック・エバンジェリストの松本です。遅れましたが、明けましておめでとうございます。今回は少し視点を変えて、アンチフォレンジックの視点で、いかにファイルシステムに痕跡を残さずに不適切な画像を見れるか、に関して実験をしてみようと思います...</description>
<dc:creator>netagentblog</dc:creator>
<dc:date>2011-01-31T14:46:24+09:00</dc:date>
<dc:subject>松本隆</dc:subject>
<content:encoded><![CDATA[　こんにちは、フォレンジック・エバンジェリストの松本です。遅れましたが、明けましておめでとうございます。今回は少し視点を変えて、アンチフォレンジックの視点で、いかにファイルシステムに痕跡を残さずに不適切な画像を見れるか、に関して実験をしてみようと思います。今回はあまり技術的な内容ではありませんので、肩の力を抜いて読んでいただければと思います。<br>
<br>
-----<br>
<br>
■はじめに<br>
　仕事柄、筆者は会社のPCで不適切なWebサイト、ありていに言えばポルノ画像や動画を検証することがある。さすがに正当な業務としてコンテンツをチェックしているので、会社で閲覧すること自体の抵抗感はそれほどないが、背中越しに時折感じる同僚（主に女性）の冷たく厳しい視線が、筆者としては非常に気になるところである。<br>
　それはさておき、今回は「ハードディスクになるべく痕跡を残さずに不適切な画像を見る」ことについて考えてみたい。これは、フォレンジック調査に携わる上で避けて通れない「アンチフォレンジック」に関するテーマでもある。筆者のPCでポルノサイトを閲覧した後に、画像スキャンツールSnitch Plusを使ってハードディスクをスキャンし、ポルノ画像が検知されるかを確認する。<br>
　<br>
■ポルノ画像スキャンツールSnitch Plus<br>
　フォレンジックのツールの中に、ハードディスクなどに溜め込んだポルノ画像をスキャンして、しかるべき相手に通報してくれるツールがある。今回試す<a href="http://www.hyperdynesoftware.com/products.html">Snitch Plus</a>も名前が示すように、そういった「密告ツール」のひとつである。この類のツールは日本ではあまりお目にかかることはないが、児童ポルノの所持や公共の場でのポルノ利用に厳しい欧米などを中心に（ドラッグや犯罪の兆候などをチェックする機能なども追加された形で）販売されており、ユーザーにも広く認知されている。もちろんオンラインショップ経由で日本からでも購入できる。<br>
　Snitchシリーズを販売しているHyperdyne Softwareの製品紹介ページによると、Snitch Plusは主に家庭のパワーユーザーを対象とした、ローカルPCのハードディスクをスキャンして上記のような疑わしいデータを検知するツールのようだ。サイトライセンスを利用し、ネットワーク越しに複数台のマシンをスキャンする場合や、監査用の詳細なレポートが必要な場合はSnitch Enterprise Auditorが必要である。今回は手持ちのノートPCをスキャンするだけなのでSnitch Plusの試供版を用いる。ちなみにこの試供版は30日限定での利用が可能だが、スキャンに関しては全機能が利用できる。<br>
　ソフトウェアの設定項目や機能に関しては、以前勉強会用に作成した動画があるので、以下をご参照いただきたい（<a href="http://www.youtube.com/watch?v=vOwozbUW6tg">YouTube</a>）。<br>
<br>
<div align="center"><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/vOwozbUW6tg&feature=youtube_gdata_player"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/vOwozbUW6tg&feature=youtube_gdata_player" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="350"></embed></object></div><br>
　ちなみに今回利用するのは、SkinScan、Internet history search、Signature Analysisの3つの機能である。簡単にそれぞれの機能を紹介すると、SkinScanは画像から人物と背景を切り出し、イメージにおける肌系ピクセルの多さでポルノ画像かどうかを検知する仕組みだ。Internet history searchはその名のとおりインターネット履歴の調査で、ここでは主にWebサイトの閲覧中にキャッシュされた画像ファイルをチェックする。Signature Analysisはファイルの拡張子と中身のデータ形式が異なっているもの、つまり偽造の疑いのあるファイルをピックアップする機能だ。前回のタイムスタンプに関する記事でも紹介したように、ファイルにはシグネチャと呼ばれる、ファイルを識別するための情報が記録されている場合がある。Signature Analysisを実装しているツールでは、シグネチャ情報に紐づけられた拡張子の組み合わせのデータベースをもっており、実際のファイルとそのテーブルを比較することによって、拡張子の偽装などを検出するのだ。<br>
<br>
■実際に試してみよう<br>
　それでは、これら3つのSnitch Plusのチェックをかいくぐって、不適切な画像を閲覧してみようと思う。ただし今回は特殊なアンチフォレンジックツールは用いず、Windows環境で一般的に利用するツールやユーザーの操作によって、ちょっとした隠蔽を試みたい。<br>
　まずはインターネット履歴とキャッシュが、ローカルのPCで保存されないように、ブラウザのプライベート・ブラウジング機能を用いて閲覧する。プライベート・ブラウジングとは、ユーザーがどのWebページを閲覧したかの記録を残さずに（閲覧履歴やcookie情報、キャッシュファイルをローカルPCに作成せずに）Webページの閲覧を可能にする機能である。今回はInternet Explorer8のInPrivateブラウズモードを用いて閲覧を行った。<br>
　それでは実際に操作をしてみよう。まずはWebブラウザを利用してインターネット上から画像を保存する。用いたブラウザはInternet Explorer8である。画像を選択して右クリックし「名前を付けて保存」を選択した。ファイルは調査員を欺くため、「まじめな内容.doc」という名前を付けて保存した。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/4/7/471f9a20.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/4/7/471f9a20-s.png" width="160" height="120" border="0" alt="fo1" hspace="5" class="pict" align="right"  /></a>　拡張子とアプリケーションの紐づけを無視して画像ファイルを閲覧するには、拡張子に関係なくデータ形式を自動判別してくれる画像ビューアが必要である。ここではWindows7に標準で搭載されているWindowsフォトビューアを使って閲覧してみよう。閲覧するファイルの上で右クリックし、メニューから「プログラムから開く」を選び、このファイルを閲覧するソフトウェアとしてWindowsフォトビューアを指定する。<br>
　Windowsフォトビューアでは自動的にファイルの形式を判断し、jpeg画像としてファイルを閲覧できる。<br>
<br>
■Snitch Plusでのスキャン<br>
　それでは次にSnitch Plusを使って、画像を閲覧したPCをスキャンする。最初に説明したとおり、SkinScan、Internet history search、Signature Analysisの３つのスキャンを有効にしてドライブ全体をスキャンした。その結果が以下である。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/c/9/c97cc1ab.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/c/9/c97cc1ab-s.png" width="160" height="120" border="0" alt="fo2" hspace="5" class="pict" align="right"  /></a>　まず、特定の拡張子を持つ画像ファイルに対して、SkinScanを実行した結果を確認してみよう。表示条件はユーザー名「KAIGAI」、疑わしさは「Low and above」である。図の通り一件も確認されていない。ローカルに保存された「真面目な内容.doc」が表示されていないことから、このSkinScanはあらかじめ設定された、特定の拡張子を持つファイルに対してのスキャンであることがわかる。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/7/f/7ff520f4.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/7/f/7ff520f4-s.png" width="160" height="120" border="0" alt="fo3" hspace="5" class="pict" align="left"  /></a>　次にInternet history searchの結果を確認してみよう。<br>
　表示条件は先ほどと同様に、ユーザー名「KAIGAI」、疑わしさは「Low and above」である。これも図の通り一件も確認されていない。InPrivate ブラウズモードを利用することによって、ローカルに問題となるWebサイトの履歴情報が保存されていないことが確認できる。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/c/2/c286abab.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/c/2/c286abab-s.png" width="160" height="120" border="0" alt="fo4" hspace="5" class="pict" align="right"  /></a>　それでは最後にSignature Analysisの結果を確認しよう。表示する条件は同じだが、これまでと違い、1件の疑わしい画像が検出されている。<br>
　検出されたのは問題の「真面目な内容.doc」である。レポートに記載されているFile Type情報や警告メッセージが示す通り、拡張子を偽造したjpeg画像として認識されている。そのうえで、25％という低い確率ではあるが、このファイルがポルノ画像である可能性を示している。単に拡張子を偽装するだけでは、Signature Analysis機能によって検知されてしまうことがわかる。<br>
　ちなみにこのSignature Analysisの技術は、削除されたデータを復元する際にも活用される。ハードディスクの未使用領域に残されたデータに対して、Signatureによるスキャンを実行することにより、過去に利用され削除されたファイルやその痕跡を発見できるかもしれない。たとえファイルを削除したとしても、ハードディスクの状況によっては、過去に閲覧したポルノ画像が復元されてしまう可能性があるということだ。<br>
　<br>
■アンチフォレンジック<br>
　それではSnitch Plusのような密告ツールで検出されないためには、どうすればいいだろう。シンプルに答えるならば、ローカルに問題のデータを保存しないことが最善の方法である。せっかくInPrivateブラウズモードで、ユーザーの履歴を残さず閲覧したとしても、画像を保存することによって、証拠を残してしまっては本末転倒である（※1）。証拠を残さない、つまり、ハードディスクに余計なデータを記録しないのがアンチフォレンジックの基本だ。もちろん、隠し領域にデータを保存したり、私物のUSBメモリにこっそり保存したり、暗号化されたzipにアーカイブしたりといった隠ぺい方法も考えられる。だが、これらのオペレーションはそれ自体が、ファイルシステムやレジストリに余計な疑わしい証拠を残してしまうことになるのだ。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/e/6/e645f9c8.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/e/6/e645f9c8-s.png" width="160" height="120" border="0" alt="fo5" hspace="5" class="pict" align="right"  /></a>　ところで今回の場合のように、うっかりローカルに画像を保存してしまった場合に、その事実を隠ぺいした形でこっそり削除したい場合はどうすればいいだろう。比較的簡単な方法として、データの上書きがある。たとえば今回の場合、「真面目な内容.doc」という名前で保存しているのだから、ファイルを実際にタイトルに即した内容のドキュメントで上書きすればいい。削除フラグを立て、管理情報と実データが確保している領域を解放するだけの通常のファイル削除とは違い、確実にデータが書き換えられる上書きを行うことにより、削除されたファイルの復元が非常に困難になる。<br>
　真面目な内容.docをwordで開き、どこからかコピーしたドキュメントを上書きして、doc形式で保存する。注意すべき点は、元のデータサイズ以上のデータで上書きすることだ。<br>
<a href="http://livedoor.blogimg.jp/netagentblog/imgs/9/f/9ff94a71.png" target="_blank"><img src="http://livedoor.blogimg.jp/netagentblog/imgs/9/f/9ff94a71-s.png" width="160" height="120" border="0" alt="fo6" hspace="5" class="pict" align="right"  /></a>　この操作によって、jpegのデータは完全に上書きされるため、対象ファイルのタイムスタンプに矛盾を生じさせることはない。また特別なツールを用いないため、疑わしい履歴を残すことなく元のデータを削除することができる。このような場合、Snitch Plusでのスキャンはもちろん、プロの調査員による検証によっても、データの改ざんの痕跡を追跡することは非常に困難になるだろう（※2）。<br>
　とはいえ、ローカルの隠ぺいではカバーできない証拠もある。たとえばネットワークに流れるパケットや、ルーターで保存される通信記録などの、適切に管理されたネットワーク上の証拠である。社内システムの管理者は、ローカルの情報はユーザーによって改ざん可能である、という前提に立って、ユーザーの手の届かない、ネットワークの情報も管理・収集しておく必要がある。<br>
　不正調査での証拠は、不正が行われたPC上に存在するものだけではない。社内では入退室管理システムや監視カメラがあなたの日々の動向をチェックしているだろうし、通りすがりの同僚がキータイプやディスプレイをショルダーハックしているかもしれない。むしろローカルPCのデータは、アナログも含めた大量の証拠のうちのごく一部であると考えてよい。くれぐれも記事の真似をして会社でポルノ画像を閲覧しないようにしていただきたい。<br>
<br>
※1　プライベーブラウジングは完全にプライバシーを秘匿するものではないというレポートもある<br>
<a href="http://arstechnica.com/security/news/2010/08/private-browsing-not-so-private.ars">Ars Technica「Private browsing: it's not so private」</a><br>
<br>
※2　Volume Shadows Copy機能によってボリュームを過去の状況まで復元し、改ざんを検証できる可能性はあるが、Volume Shadows Copyのスナップショットもローカルに存在するデータなので改ざんの可能性は残る<br>
<a href="http://computer-forensics.sans.org/blog/2008/10/10/shadow-forensics">SANS Computer Forensic Investigations and Incident Response Blog「VISTA and Windows 7 Shadow Volume Forensics」</a>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=3644619&name=netagentblog&pid=51746238" width="1" height="1" />
]]>
</content:encoded>
</item>

</rdf:RDF>

