進路

2020年3月に東京農工大学博士前期課程を修了します。1 学部時代を含めると計6年間 (1年間の休学期間を除く) 通い続けた大学でした。

今回は今までやってきたことの振り返りと、今後どうするのか、についてです。ポエムです。なるべく短くしたつもりですが、ちょっと長いかもしれません。

今まで何をやってきたのか

競技プログラミング

大学に入った当初は特に目的もなく、なんとなく将来も仕事がありそうだなくらいの感覚で選んだ情報工学科だったため、とりあえずMCCというコンピュータ系のサークルに入って競技プログラミングを始めました。 チームでACMが主催するICPC (国際大学対抗プログラミングコンテスト) にも出場したりしたのですが、競技プログラミングはあまり肌に合わなかったようで、特にレートを上げることもありませんでした。
もともと考察が好きだったので、ICPCに出場した時は閃き系問題の解法を考えたり、環境構築やデバッグを担当していました。他の二人はバンバンコードを書くタイプだったので、チーム的にはうまくマッチしていました。 最後の年は国内オンライン予選で5位 (大学別2位) に食い込んだりもしたので、それなりにうまくやれていたのかなと思います。

CTF

競技プログラミングを初めて一年後くらいに、同サークルに所属していた @Shift_Crops から声をかけられて初めたのがCTFでした。 「CTFって何?」と聞いたら「パズルみたいなもん」と言われて、なんとなく面白そうだなと思って初めたのがきっかけです。 当初はCTFブームが始まりかけくらいのころで、オンラインに転がってる問題はksnctf, akictfくらいしかなかったのを覚えています。
コンピュータのことはほとんどわからず、base64も知らずにヒントをもらいながらようやく解いたonionが初めて解いたCTFの問題だった気がします。 しばらくの間は誘ってもらった @Shift_Crops と、MCCの同期何人かでtuat_mccという名前でたまにオンラインCTFに出てたりしてました。

少しして、当時交流のあったMMAとCureSecureとお試しで合同チームを組んで、RuCTFEに出ることになりました。 結果は100位、ほとんど何もできませんでした。 f:id:icchyr:20200219215236p:plain

そしてその時のチームが今のTokyoWesternsに至ります。当初に比べるとメンバーも増え、世界ランキングにも食い込める成績を残せるレベルまでなりました。

研究

大学では、学部4年生になるまでは競プロやCTF以外は特に何もしませんでした。 学部4年生で研究室に配属されて、なんとなくマルウェア検知をやりたいという漠然とした考えだけがあり、最初のうちはDECAFDRAKVUFを弄って、なんとなくWindows APIフックができてすごいなあくらいのことをやっていました。
@ntddk の一生あとで読んでろには大変お世話になったのを覚えています。 彼が同年代だったこともあり、僕自身にとっても大きな刺激になっていたと思います。

しばらくいろんなサンドボックスを触った後、指導教官から急に「BitVisorってのがあるんだけど、触ってみない?」と言われ、とりあえずどんなものかと動かしてみました。 当時はVMMどころかシステムプログラミングに関する知識もほとんどなく、ソースコードを読んでも正直何をしているのかさっぱりわかりませんでした。
ネットに転がっているQiitaの記事や、BitVisor Summitでのスライドを漁りながら試行錯誤していたら、なんとなくBitVisorの改造方法がわかってきて、BitVisorを使ってマルウェア検知機構を作ろうということになりました。 マルウェア検知機構のロジックをVMM内で記述できたら面白いなと思い、LuaとLibVMIを組み込んでいい感じのシグネチャマッチングを書けるシステムを目指しました。 いろんなライブラリの移植を試みる課程でリンカの仕組みを調べたり、JSONパーサを書いたり、時にはファイルシステムやメモリアロケータの実装をしたりしました。
実装の際にはいろいろ壁がありましたが挫折することはなく、競技プログラミングをやっていた経験が生きたのかな?と思っています。

そんなこんなでシステムプログラミングやVMMの作り方などの知識が身につき、すっかり低レイヤーに染まってしまいました。 主にBitVisorをベースとした研究をいくつか発表し、他の研究者の方たちから筋が良い(?)と評価して頂いたものもあります。

www.slideshare.net

CBCTF 2

TokyoWesternsを立ち上げて2年くらい経ったころ、交流のあったpotetisenseiから「新しいCTFを立ち上げたいんだが、一緒に手伝ってくれないか」と持ちかけられ、彼の持っていたアイデアに感銘を受けて協力することにしました。 当時お互いに交流のあったkanaさんに協力を仰ぎ、5年目を迎えたCODE BLUEというカンファレンスでCBCTFをやらせてもらえることになりました。
CBCTF 2017 (初回) はbinjaが温めてきた問題でJeopardyのみをやり、2回目の予選はオンラインでJeopardy, 決勝戦はpotetisenseiの考案した新しいCTF形式 Bull's Eye で行いました。 最初のBull's Eyeのバックエンドは全てRailsで実装されており、Rubyに明るくなかった僕はあまり開発に関われませんでした。 また本番はdocker-composeの謎挙動や、sidekiqの カスみたいな 仕様により円滑にコンテストを進行することができず、運営も炎上したし海外チームにも大きな迷惑をかけました。
なによりも、バックエンドをメインで開発していた @tyage が大半のバグ修正を行い、僕はアドホックな解決策を示すことしかできませんでした。tyageごめんね。

次年度 (2019) のCBCTFはバックエンドを完全に一新し、新たにGolangで実装することに決めました。 スコアサーバ側は既にある程度Railsで完成されていたので、ワーカーやスケジューラなど根幹部分のみを再実装することに決め、全部フルスクラッチで書きました。
実装はGitHubに上がってます。ちょくちょくひどいcommitとかがあるのは許して下さい。

github.com

Golangを選んだ理由の一つは、非同期処理がやりやすそうだなと思ったからです。実際にスケジューラを書き始めるまで知らなかったのですが、gRPCがちゃんとキャンセルできてエラーハンドリングも問題ないの便利ですね。context考えた人すごくないですか?あれめちゃくちゃ便利だと思います。
もう一つの理由は、依存関係のないシングルバイナリで出力されることです。PythonRubyなどのスクリプト言語でアプリケーションをデプロイした経験のある人はわかると思うんですが、パッケージ管理とか処理系のバージョンとかで躓くとかなり面倒なんです。 Golangだとアプリケーション単位でバイナリが一つ出てくるだけなので、デプロイがめちゃくちゃ楽です。新しくパッケージ追加してもバイナリの中に含まれているので、デプロイ先でpip installやbundlerを走らせけなければならない、ということがないわけです。 あと学習コストがそんなに高くないです。Rustとかに比べれば、の話ですが。

留学

CTFをやっていた関係で海外の人たちと交流が生まれ、UCSBのPhDを卒業後ASUで研究室を立ち上げた、元ShellphishのリーダであるYan Shoshitaishvili氏から「こっちで研究インターンをしてみないか」と言われ、修士1年を終えたタイミングで半年間ASUに研究留学をすることになりました。
ASUでは主にfuzzingのプラットフォームに関する研究を行い、現実世界のアプリケーションをなるべく低コストかつスケールする方法でfuzzingする手法を提案し、プロトタイプの実装を行いました。 半年間という短い期間だったので、テーマ決めや実装方針などを含めるととても足らず、論文を完成させる前にインターンは終わってしまいましたが、今でも引き継がれて続いているそうです。 詳しいことは書けませんが、別の研究チームも加わってより良いアーキテクチャになっています。そのうち論文が出るんじゃないでしょうか。

ASUで留学している間に様々な縁が生まれ、2019年のNDSSというトップカンファレンスのWorkshop on Binary Analysis Research (BAR) では招待講演をさせてもらったりしました。 同講演では、先ほどのBull's Eyeのコンセプトについての発表をしてきました。 聴衆の食いつきは良く、終わった後にアメリカの国防関連の人から話を聞かれたりもしました。 世界でも類を見ない新しいアイデアであり、評価はかなり高かったです。この辺はさすがpotetisenseiといったところでしょう。3

その他

TokyoWesternsとしてCTFをやっている上で、いろんなところで講義したり発表したりしました。 中でも一番有名なのはCODE BLUE 2019で発表したAVOracleだと思います。

これはWCTF 2019に持っていくために考えていた問題が原案となっており、Windows Defenderを使ってなんか面白いことやろうっていう状態からひねり出したアイデアです。我ながらよく思いついたなと思っています。一生に一度あるかないかくらいだと思っています。

他にもいろいろありますが、記事が長くなるので省略します。

これからどうするのか

外資系企業に行こうとしたりもしましたが、最終的には日本に残ることにしました。 理由は以下の通りです:

  1. 面接の準備がヘタクソすぎて受けた企業ほとんど落ちた
  2. 最終的に行きたい企業があったが、タイミングの問題ですぐに入れない状況だった
  3. 仮に外資系に行っても、最終的には↑の企業に行くつもりだった
  4. その企業から今年入社の誘いを受けたので無理に他を探す必要がなくなった

誘いを受けた企業はベンチャーなのですが、とにかく仕事内容が面白くて、まさに自分が求めていたものでした。 仕事内容もさることながらメンバーもトップクラスと呼べる人材ばかりが揃っており、このメンバーならなんでもできそうだな、と思ったのが決め手です。 どこの会社かは、多分そのうち明らかになると思うのでここでは言いません。 ちなみに口頭だけでまだ正式なオファーを受けているわけではないので、札束で殴るなら今がチャンスです。4


  1. 卒業が確定したわけではありません。修了要件を満たせなければ学部卒として生きていきます。

  2. この記事を書いてる途中に、この辺で酒を飲み始めています。以降おかしなことを書いていた場合、それが原因です。

  3. 本当の原案はint03さん (eggpodさん) だったそうです。そこからpotetisenseiがスコアリング方法などを考えた状態で僕のところに持ちかけてきたという形になります。

  4. 気持ち的にはほとんど決めているので、相当な条件じゃないと動かないです。多分

逮捕された場合にできることできないこと

いや~あなたが素直に認めてくれてこっちも助かったよ! プログラミングとかに詳しかったらどうしようかと思っていたけどね

nlab.itmedia.co.jp


最近日本だけでなく世界(?)をも騒がせている兵庫県警の無茶な逮捕劇ですが、ことセキュリティ業界に大きな打撃を与えていることをご存知でしょうか。
セキュリティに関する知見を共有する有名な勉強会であるすみだセキュリティの活動休止 (http://ozuma.sakura.ne.jp/sumida/2019/03/15/77/) をはじめ、詳細な手順を含んだ技術ブログの公開停止など業界全体の萎縮ムードがここ数日で加速しています。僕も自衛のために、公開していた技術系の記事のうち、日本語で書かれておりかつセキュリティに関するものを非公開にしました。
「なにをそんなに神経質になっているんだ」と思う方もいらっしゃるかもしれませんが、逮捕・起訴されてしまってからでは取り返しがつきません。一般的に前科と呼ばれるものは起訴されて有罪判決が下された場合に初めてつくものですが、逮捕された時点で前歴という扱いになります。そのため逮捕されても落ち着いて不起訴になるように動けば良いのですが、前歴というのは印象が悪いです。もし採用に際して「前科・前歴がある場合はあらかじめ申告してください」と言われた場合に、下手に隠すと経歴詐称になります。かといって前歴があることを正直に述べても、何もない人に比べると印象が悪くなるのは避けられないでしょう。いずれにせよ逮捕されないに越したことはありません。

では万が一逮捕されてしまった場合に一体どれほどのリスクがつきまとうのでしょうか?周りからの心証が悪くなるのは言うまでもありませんが、前科がついた場合に制限されるものの代表例としては、資格の取得と渡航があるようです。それぞれについてまとめてみました。

僕は法律に関して一切の素人なので内容については責任を持ちません。あしからず。

資格の制限

起訴および有罪が確定した時に特定の資格を保持している場合、その資格の剥奪・再取得制限がかかる場合があります。

参考: 前科と資格制限 - 【刑事事件専門】渋谷青山刑事法律事務所(東京都渋谷区)

対象資格 資格を制限する刑(とその期間) 効果 資格制限法条
医師 罰金以上の刑 1.免許を与えないことがある
2.免許の取消し又は3年以内の医業の停止の処分をすることができる
医師法
4条3号
7条2項
保健師助産師,看護師,準看護師 罰金以上の刑 1.免許を与えないことがある
2.免許の取消し又は3年以内の業務の停止の処分をすることができる
保健師助産師看護師法
9条1号
14条1項・2項
歯科医師 罰金以上の刑 1.免許を与えないことがある
2.免許の取消し又は3年以内の歯科医業の停止の処分をすることができる
歯科医師
4条3号
7条2項
歯科衛生士 罰金以上の刑 1.免許を与えないことがある
2.免許を取り消し,又は期間を定めて業務の停止を命じることができる
歯科衛生士法
4条1号,8条1項
獣医師 罰金以上の刑 1.免許を与えないことがある
2.免許を取り消し,又は期間を定めて業務の停止を命じることができる
医師法
5条1項3号
8条2項3号
薬剤師 罰金以上の刑 1.免許を与えないことがある
2.免許を取り消し,又は3年以内の業務の停止の処分をすることができる
薬剤師法
5条3号
8条2項2号・3号
学校の校長,教員 禁錮以上の刑 なることができない 学校教育法
9条2号
一般職の国家公務員 禁錮以上の刑(刑執行終了まで) 1.官職に就く能力を有しない
2.受験することができない
3.失職する
国家公務員法
5条3項2号
8条1項1号
38条2号
43条
76条
地方公務員 禁錮以上の刑(刑執行終了まで) 1.職員となり,又は競争試験若しくは選考を受けることができない
2.職を失う
地方公務員法
9条の2,3項,8項
16条2号
28条4項
取締役 会社法331条1項3号
に定める条件
(刑の執行終了後2年)、
それ以外の禁錮以上の刑
(刑執行終了まで)
なることができない 会社法
331条1項3号,4号
公認会計士 公認会計士法4条2号
に定める条件
(刑の執行終了後5年)、
禁錮以上の刑
(刑執行終了後3年)
1.なることができない
2.登録を抹消しなければならない
公認会計士法
4条2号・3号
21条1項3号
16条の2,1項・5項1号
税理士 禁錮以上の刑
(刑執行終了後5年)
国税地方税に関する法令
(3年)
税理士法の罪による罰金の刑
(刑執行終了後3年)
1.資格を有しない
2.登録を抹消しなければならない。
税理士法
4条4号・5号・6号
26条4号
一級建築士 禁錮以上の刑,
建築士法に違反し
又は建築物の建築に関する罪を
犯し罰金の刑
(刑執行終了後5年)
1.免許を与えない
2.免許の必要的取消
建築士法
7条3号・4号
8条の2第3号
9条1項2号・3号
8条1号・2号

定められる罪を犯した場合に、再度資格を得ることができるのかできないのかを一覧にすると以下のようになります。(△は必ずしも取得できるわけではないということを意味します)

資格 再取得の可否
医師
保健師助産師,看護師,準看護師
歯科医師
歯科衛生士
獣医師
薬剤師
学校の校長,教員 ×
一般職の国家公務員 ×
地方公務員 ×
取締役 ×
公認会計士 ×
税理士 ×
一級建築士 ×

意外なことに、医療系の資格は必ず取得を拒否されるわけではありません。一方で教員や公務員、取締役などの資格は禁錮以上の刑を課せられた場合は決められた期間をすぎるまで再取得を拒否されるようです。
なお、他に取得を制限される資格の例としては以下のものがあります。

詳しい条件はそれぞれの資格に関する法に定められていると思いますが、調べるのが面倒なのでここでは割愛します。

渡航に関する制限

エンジニアの皆さんは資格制限よりもこちらの方が困ると思います。前科があるとどのような制限があるのでしょうか。

旅券(パスポート)の発行制限

パスポートの発行に関しては旅券法13条に定められています。このうち、2号および3号には以下のように定められています。

  • 死刑、無期若しくは長期二年以上の刑に当たる罪につき訴追されている者又はこれらの罪を犯した疑いにより逮捕状、勾引状、勾留状若しくは鑑定留置状が発せられている旨が関係機関から外務大臣に通報されている者 (2号)
  • 禁錮以上の刑に処せられ、その執行を終わるまで又は執行を受けることがなくなるまでの者 (3号)

不正指令電磁的記録に関する罪は3年以下の懲役または50万円以下の罰金のため、もし2年以上の刑が課された場合はパスポートが発行できなくなりますし、禁錮以上の刑(禁錮・懲役・死刑)に該当する(刑法9条・10条)ため、最大3年パスポートが発行できないことになります。1

渡航制限

日本は世界中の国と比べると比較的渡航に関する制限が緩く、短期滞在であればほとんどの国にビザ無しで入れるようになっています。しかし、アメリカ・カナダ・オーストラリアにおいてはいかなる場合でも渡航に際して電子渡航認証を事前に取得する必要があり、それぞれESTA, eTA, ETA (ETAs)と呼ばれています。これはそれぞれの国独自の入国許可証みたいなもので、Webから簡単に申請することができます。場合によりますが実際に承認されるのもせいぜい72時間とされており、それほど手間ではありません。

アメリ

アメリカでは逮捕歴があるとビザなし渡航ESTAによる渡航)が許可されておらず、必ず事前にビザの申請を行わなければなりません。ESTAは申請から3日が目安と言われており、申請自体は料金の支払いを含めてWebのみで完結します。しかしビザを取得する場合、種別にもよりますが、必要な書類を用意した上でアメリカ大使館で面接を受け、さらにそこからビザつきパスポートが発送されるまで一週間程度待つ必要があります。例えば「来週アメリカ出張が入った」というケースにおいて、有効なビザを持っていない場合は逮捕歴がある時点で出張をキャンセルしなくてはならないということです。

カナダ

カナダの場合は犯罪歴があってもeTAを申請することができるようですが、実際に承認されるかどうかはカナダ大使館側の判断次第のようです。しかし申請フォームには犯罪歴に関する記入欄があり、正直に申告する必要があります。

オーストラリア

オーストラリアのETA (ETAs) の申請要件には「刑期の合計が12ヶ月を越える有罪判決(実刑・執行猶予に関わらず)を受けていないこと」とあり、一定の犯罪歴があるとビザの申請が必須のようです。しかしオーストラリアの場合、ビザの申請はオンラインで可能で、必要な書類なども電子データによる送付が認められています。ビザの発給までの期間の目安としては一週間とされており、アメリカに比べると比較的手軽にビザを取得することができるようです。

電子渡航認証の申請可否をまとめると以下のようになります。

渡航 逮捕歴有り 犯罪歴有り
アメリ × ×
カナダ △ (拒否される場合もある) △ (拒否される場合もある)
オーストラリア △ (12ヶ月を越える有罪判決を受けていない場合は申請可能) ×

その他のビザ無し入国が可能な国については、特に制限は無いようです(全ての国を詳しく調べたわけではありません)。とはいえ、入国カードに犯罪歴を記入する欄があった場合は正直に書いた方がよいです。後になって詐称が発覚すると、入国審査官に軽く詰め寄られる比ではないトラブルに発展するかもしれません。

その他

nlab.itmedia.co.jp

まぁ懲役3年罰金50万以下なんだけど、あなたは初犯だから略式起訴で罰金30万になるだろうな

とありますが、略式起訴は被疑者の同意無しには成り立たず、同意した場合は罪を認めることになります。略式命令の告知を受けた日から14日以内は正式裁判の請求を行うことができますが、取り下げないで略式手続が成立した場合は有罪が確定するので前科がつきます。早く社会に復帰できる一方で前科がついてしまうので、先にあげたようなデメリットなどをよく考えて、普通の裁判で戦うかどうか決めた方が良いと思います。

まとめ

  • 禁錮以上の刑が課せられると大半の資格が取り消し、再取得可能になるまで時間がかかる
  • 逮捕歴が発生した時点でアメリカへESTA渡航できなくなる
  • 12ヶ月を越える有罪判決を受けるとオーストラリアへETA (ETAs) で渡航できなくなる

世知辛い世の中になってしまいました。TokyoWesternsとしての活動を制限するつもりは全くないですが、しょうもない理由で逮捕されないように気をつけたいですね。

参考文献


  1. 執行猶予がついた場合も刑の執行を保留されているだけで有罪判決を言い渡されたことに変わりはないので、同様に制限されます。

2018年を振り返る

今年もいろいろあったので振り返る。2017年の振り返りはこちら

icchy.hatenablog.jp

昨年に劣らずいろいろなことがあったと思う。昨年同様、メインはCTFでの活動に関する話である。

1月

幸いにも一年前のように病院のベッドの上で年を越してはいなかった。失ってから初めてその重大さに気づくものっていろいろあると思うが、健康なんかはその良い例だと思う。
2017年の12月にYan先生 (a.k.a zardus) がHITCONの帰りがてら日本に遊びに来ていて、そこで留学の誘いを受けていたがまだ決心がついていなかった。1月半ばあたりにメールを出して、親や研究室のボスに相談した後に行く決心を固めたのはここから1週間くらいだったと思う。4月から行く予定だったので時間的にはかなり余裕に見えたが、実際にはApplicationを書いたり、ビザの取得のためのDS2019を用意してもらったりで最終的にすべての用意が整ったときは出発まで1週間を切っていて、かなりギリギリだった。

2月

一応Research Specialistという肩書で大学に雇われるという扱いなので、大学の求人に応募する形でApplicationを書く。どうやら専用の求人を掲載したらしいが、Web上に掲載されるまでかなり時間がかかった。また、Applicationを提出してからAcceptされるまでさらに時間がかかった。実はRejectされるんじゃないか?と内心ヒヤヒヤしていた。
とにかくこの応募手続きでかなり時間がかかって、多分2月の半分くらいこれで溶けた気がする。

3月

正式にOffer letterを受け取ったのでビザを取得するためのDS2019という書類の発行手続きに入る。この書類の発行が結構時間がかかって、向こうから発送したよというメールをもらったのが3/16で受け取ったのが3/19だった。これを待ってからビザを取りに行く準備を始めると明らかに間に合わないので、あらかじめ予約だけ取っておいてDS2019待ち、という状況にしておいた。確かDS2019を受け取った2日後にビザの面接を受けて、その翌日くらいに発送されていたと思うが、受け取るまで少し時間がかかった。
めでたくビザを手に入れてあとは出国だけという状態になったのが確か3/25だったと思う。
留学とはいえ持ち運べる荷物はせいぜいスーツケースとリュックサックが一つずつなので、とにかく必要最低限の物しか入れなかった。

4月

出発直前に0CTF Qualsに出た。オンサイトで集まったこともあって途中までかなり良い感じだったが、予選突破にはあとちょっと足りないという状態で残り30分を迎えて頭を捻っていたところ、奇跡的に解法を思いついて残り5分のところでsubmitした。これが決め手となって決勝の出場権を獲得した。

初めてアメリカを訪れた。インターネットがないと確実に詰むのであらかじめSIMを買っておいたのが良かった。現地の空港について、Airbnbのホストに連絡を入れたところで日付を一日間違えて予約していたことが発覚して危うく初日を野宿で過ごすところだったが、幸いにも前日が空いていたので免れた。
時差ボケが本当にひどくて、一週間くらい夜中の3時に目が覚めて昼間クソ眠いみたいな状態を繰り返していた。 到着後に必要な書類手続き (主に税金関係) が結構面倒で、4月末くらいまでは広い大学構内を練り歩いたりPhoenix社会保障事務所に行ったりしてた。

5月

研究テーマが無事に決まって進め始める。詳しいことは書かないが、先行研究に対してどう改善したかとかではなくて、新しい手法の提案なのでとにかくアイデアと実装が重要だった。

XCTFで良い成績をおさめたチームが招待されるらしい中国の謎CTFに参加した。確かCyber Mimic Defense Contestとかそんな感じの名前だったと思う。 CTFは微妙だったが運よく2位で200万くらいゲットした。(まだ賞金は振り込まれていない)
中国から戻る途中で日本に立ち寄ってDEF CON CTF Qualsに参加した。19位で終わったので今回も無理か…と思ってたらクソ多い枠のおかげで予選通過して微妙な気持ちになったのを今でも覚えている。
月末には0CTF/TCTFに参加するために再度中国へ。会場が深圳だったので香港から陸路入国しようとしてTokyoWesterns全員で彷徨っていた。

6月

気胸じみた痛みが発生して急遽大学の病院にかかる。結果的には気胸ではなかったが、レントゲンを撮って診断を受けただけなのに$166かかった。
Midnight Sun CTF finalsに参加するためにスウェーデンストックホルムへ行く。途中でニューヨークに立ち寄って観光したりした。当たり前なのだがストックホルムはめちゃくちゃ寒くて、アリゾナの気候で感覚が狂っていたのもあってなかなかつらかった。
ちなみに帰りの便が遅延して、経由地であるロンドンに一日とどまる羽目になった。

月末にはGoogle CTF Qualsに参加してなんとか予選を通過した。

7月

WCTFに参加するためまたまた中国へ。途中で日本に数日滞在できる便を運営に取ってもらって、一時帰国中に寿司を食べに行ったりカラオケに行ったりした。WCTFではめちゃくちゃ運が良くて、なんと優勝することができた。 優勝賞金は$50000だったのだが、WCTFの運営はめちゃくちゃ優秀で、税金の分を払ってくれた上に一か月くらいで送金されてきた。どこかのいまだに払ってくれないCTF運営とは大違いである。
余談だが、帰りの飛行機が欠航になってまたしても一日中国に滞在する羽目になった。

月末にCBCTF Qualを開催した。問題は主にbinjaの人が作ったが、CBOJのジャッジシステム部分をスクラッチで書いたり他の問題をレビューしたりした。

8月

初のDEF CON CTF Finalsに参加。ラスベガスでカジノや射撃場に行ったりした。

SCTF finalsに初参加してギリギリ入賞した。ちなみに初めて韓国に行った。
TWCTF 4thを開催する。過去最高のレート97となってPlaidやHITCONとかと並んだ。

9月

CTFの合間を縫って進めていた研究のプロトタイプ実装が完成する。その後議論を経てアーキテクチャの改善などを進めていく。 大体まとまってきたところで一旦プロジェクトから抜けて、続きを日本で進めながら論文化を進めていくことにした。

ISUCON8の予選に参加する。時差が結構つらかったがなんとか予選を突破する。

帰国直前でDragon CTFに参加する。TokyoWesternsのメンバーが全然参加する気がなかったっぽいのでShellphishとして参加したところ、かなり調子が良くてなんと予選1位で通過してポーランドに行くことになった。

10月

情報科学若手の会に参加する。
この辺りの時期からPCをMacから買い替えようと思い始めてXPS15とX1 extremeを無限に比較検討していた。

運が良かったのでISUCON8本戦で優勝する。

icchy.hatenablog.jp

Google CTF Finalsに参加するためロンドンへ行く。終了30分前くらいで思いついた解法が間に合わなくて、1/2くらいflagが出たところで時間切れになった。これが解けていたら多分3位だったっぽくてつらい。

11月

CBCTF finalsを開催する。システムを作るのがとにかくしんどくて、本番も結構燃えた。Ruby書いたこと全然ないのにRailsを使うのはやめたほうが良い。tyageごめん。 打ち上げの後、CBCTFに来てたDragonSectorと0daysoberと一緒にカラオケに行った。 ようやくX1 extremeを購入してDragon CTFに持っていったところ、タイミングよくMBPがCTF前日にディスプレイが映らなくなって、ほとんどセットアップしてないX1 extremeで戦うことになった。これもあと5分くらいのところでsubmitが間に合わなくて入賞を逃した。ShellphishとしてFinalsに行ったのはなかなか貴重な体験だった。

12月

RealWorld CTFに参加するため今年4回目の中国へ。普通に楽しかったし来年もあれば参加したいなあと思うくらいには良いCTFだった。イベントの規模感がとにかくすごくて、会場にはそこら中に武装した警備員がたくさんいた。

年末に35C3 CTFに参加した。filemanagerという問題はXSS Auditorの挙動を逆手に取った情報リークの手法なのだが、あと少しのところで気づかなくて解けなかった。多分これが解けていたらCTF Timeは3位のまま終わってたんじゃないかと思う。p4強いなあ

まとめ

とにかくCTFで旅をしまくった年だった。飛びすぎてJALのステータスがついたが、ほとんど運営の金である。

TokyoWesternsとしてDEFCONに参加できたので去年の目標は達成できたと思う。来年はもっと多くのオンサイトCTFで入賞したい。

来年何するかはちょっといろいろ考えがあるので、2019年のトンカツにご期待下さい。それではよいお年を。

whywaita Advent Calendar 7日目の記事です

この記事は whywaita Advent Calendar 2018 - Adventar 7日目の記事です。

twiterを開くたびに寄稿者を募っているツイートが目に入って、かわいそうだったので書きます。

twitter.com

whywaitaさんといえば、ISUCONで優勝したり、CTFチームTokyoWesternsにも所属していたり、多才な方ですよね。

そんな多才なwhywaitaさんに、ぜひお伝えしたいことがあります。



































問題を解く気がないならSlackチャンネルに入らないでください。賞金を分ける計算が面倒です。 f:id:icchyr:20181207160005p:plain

以上です。来年もよろしくお願いします。

運が良かったのでISUCON8で優勝しました

Webサービスのチューニングを競い合うコンテストであるISUCONの第8回本戦に出場してきました。
実際に何をやったのか、詳しい内容はwhywaitaが書いてくれているのでこちらでは補足情報などを書きます。

blog.whywrite.it

チームについて

実はISUCON自体に参加するのは今回が初めてではありません。 このチームは2年前に結成してISUCON6から参加していたのですが、ずっと予選落ちで本戦には一度も出場したことがありませんでした。 メンバーはwhywaita, nomeaning, icchyの3人で、TokyoWesternsというCTFチームの中でもインフラ系に明るいメンバーで構成されています。 ISUCONの存在自体は以前から知っており、出てみたいという3人でチームを組むことになりました。

ISUCON6

最初にこのチームで出たときは「院試 in 死」というチームでした。名前の通り院試に苦しんでいた学部4年生の時のチームです。 言語は特に決まっていなくて、得意な言語はnomeaning→Ruby、icchy→Pythonという感じだったので、両方試してみて良い感じの方を使っていました。
結果はほとんど覚えていませんが、学生枠での予選突破すら難しいレベルだったと思います。 予選直後にGo言語がめっちゃ強いという話を聞いて、次からGoにするかみたいな話を冗談半分でしたのを覚えています。

ISUCON7

詳しい経緯は覚えてないのですが、覆面チーム(普段使っている名前を隠したチーム)にするかという動きになり、latin_cross 入院中 latin_cross (fried_chicken,backslash,6sec_dec)というチームで出ました。誰が誰なのかわかりませんね。
この時はGo言語で実装をしていましたが、Cache-Control: publicに気づかなかったのであまり得点が上がらず予選敗退となりました。

f:id:icchyr:20181023115835p:plain

実を言うと偶然40000点くらい出た時があって、そこで止めていれば学生枠で予選突破だったかもしれません。(画像にあるtmpというチームが学生枠最後のチームです) ベンチマーカーガチャの攻略が必要だということを学びました。

ISUCON8

今回のISUCONも覆面チームで出る流れになったのですが、全然案が出なかったところリーダーであるwhywaitaのアイデアで決まりました。

f:id:icchyr:20181023120925p:plain

なぜタイムゾーン云々の話をしているかというと、僕が4月から半年間アメリカに行っていて、予選の時はUTC-7から参加していたためです。 他の二人は日本にいましたが、つじつまを合わせるためにどっちか片方がサマータイムってことにすればええやろってことで、社会人に比べても朝早くから出勤しているnomeaningはJDTになりました。
ちなみにアメリカは18:00~2:00で、研究室から参加していたのですが、終わった後discordやtwitterやSlackに張り付いていたので朝方帰宅しました。 競技時間中はSlackでボイスチャットを繋いでコミュニケーションを取っていたのでリモートワークみたいな感じでサクサク作業できましたが、手書きで情報を共有する手段がなくて、やはり集まるのは大事ですね。

学部4年から3回目ということは全員修士2年で、少なくともwhywaitaは来年就職するため今回が学生チームとして出られる最後のISUCONだったので、今回こそは絶対に本戦行くぞと意気込んでいました。
学生枠で通れたら良いなくらいにしか思っていなかったですが、幸運にも一般枠で通過することができて結構盛り上がってました。

ISUCON本戦

初めての本戦なので結構緊張していました。 事前のマニュアルをほとんど読んでなくて、会場に入ったらまず席を確保しないといけないことを知りませんでした。 我々が到着したのは9:30くらいだったのですがほとんどの机は埋まっていて、円卓はちょっと狭かったので最終的に自販機の前のカウンターテーブルのような場所に座りました。 机が高いので椅子も高く硬く、長いこと座っているとお尻が痛くなるので結構立ったまま作業していたのですが、スタンディングデスク割といいですね。 ISUCONなのに椅子に座らないとはこれいかになんてくだらないことを考えていましたが、意外と作業しやすかったです。

競技の方ですが、whywaitaのタイムラインにもある通り最初1時間くらいはほとんど何もしていませんでした。docker-composeは手元の環境構築を楽にするための優しさなのかなと思いましたが、restartするたびにdocker-compose buildが走って厄介なので何も考えずにnginxとappを剥がしました。 MySQLはバージョンが8だったのでCentOSの上で動かすのがだるいなと思いましたが、そこはwhywaitaがやってくれたので助かりました。

あとは概ね例のタイムライン通りで、僕はコードをあまり書かずにひたすら眺めて、怪しそうだなーと思うポイントを適当に共有していたらいつのまにか高速化されていました。特に何もしてないですね。

今回優勝できたのは本当に運が良かったと思っていて、得点の減点ルールが割合によるものだったことが非常に大きいと思います。 実際takedashiはもっと多くの要素に気づいて高速化をしており、終わった直後に交わした会話からしてもこれは5万点いってるし負けたかな、という印象を受けたのですが、実際には減点で6割くらいまで得点が落ちていました。 今回のアプリケーションは決済系なので、リクエストを落としたら大きな減点に繋がるのはまあ確かに、と思いました。 顧客が増えれば増えるほどわずかなミスが命取りになるわけで、点数をあげればあげるほどエラーに注意しないといけないということですね。
競技終了1時間前に謎のfailが多発していたので安定化を真っ先にやるべきだったのですが、僕はしばらく別の高速化に取り組んでいました。 戦略としては4, 5万点を狙うよりも0にしない方を取るべきなのは当たり前で、ここは反省点です。 特にISUCON8は予選の段階でリクエストが増えてくると死ぬパターンがあったので、安定させて減点を減らすことに注力するのが最善だったのかもしれません。( enable_share を見つけたときにこうなるだろうという予感はしていました)

他の参加者と話して一番なるほどとなったポイントはやはり enable_share のABテストで、確率で返すという発想が全く思いつきませんでした。 確率でボタンが消えるなんて実際の利用者は困惑すると思いますが、サービス全体の体験が悪くなるよりかは確かにマシだと思います。 とはいえ enable_share をtrueにした状態でベンチを通過するのは必要だろうと思っていたので、結果的には良かったです。


繰り返し書きますが今回は本当に運が良かったと思います。 煽りのつもりは一切ないことを事前に断っておきますが、社会人でもあまり調子が出ない問題セットはあるということと、学生でもかなり腕の立つ人がいるということに驚きました。今回特別賞 (もっとも早く15000点を突破したチーム) はNaruseJunでしたし、予選では学生かつ一人チームであるtaildさんは全体4位でした。 懇親会で小耳に挟んだ「社会人はもうダメでこれからは学生だ」というフレーズがあって、僕は学生が社会人に安定して勝つのはまだまだ無理だと思っていますが、特定の分野なら勝てる!というケースはなくはないのかな、と思います。ただ今回は本当に運が良かったです。

本戦で学生が優勝するのは初らしく、優勝賞金100万に加えて学生優勝30万も頂いてしまいました。LINEさんありがとうございます。 パーっと使う気はないですが、アイコンにもある通りトンカツが好きなので美味しいお店を教えてもらえると喜びます。お待ちしております。

最後に、運営のみなさま本当にありがとうございました。(ガチャはありましたが)ベンチマークはサクサクで、開始時間が延期することもなく、問題も予選・本戦ともによく練られた良問でした。 次回も是非参加したいと思います。

第51回情報科学若手の会に参加してきました

毎年9月頃に開かれている情報科学若手の会というイベントがあって、その名前の通り若手と呼ばれる人たちが同じ場所に集まり数日間ディスカッションを交わしたり交流をする場があります。

wakate.org

実際にはディスカッションという堅苦しいものよりかは雑談に近い感じで、Webサイトにもある通りインフォーマルな雰囲気が特徴となっています。
僕はこの会に参加するのは3回目なのですが、実をいうと今まで一度もブログを書いてませんでした。すみません。

会の詳しい内容については他の参加者や幹事の方が数人ブログを書いてくださっているようです。

blog.unasuke.com

情報科学若手の会 #51 に参加してきた | κeenのHappy Hacκing Blog

saho-london.hatenablog.com

kuge-masa.hatenablog.com

hogashi.hatenablog.com

kurochan-note.hatenablog.jp

t.co

例年は山喜旅館という静岡県伊東にあるレトロなところで開催しているのですが、今年はいろいろな事情があって軽井沢にある軽井沢研修所というところで開催されました。

www.kato-karuizawa.jp

避暑地と呼ばれるだけあってやはり軽井沢は涼しくていいですね。朝に適当に付近を散歩していましたが、なかなかに快適でした。
この軽井沢研修所、公益財団法人 加藤山崎教育基金によって運営されているそうで、研修所の敷地内には広大な植物園があったりとなかなか「お金の力」を感じる場所でした。

http://www.kato-karuizawa.jp/pdf/map05.pdf

僕は実際に見ていないのですが、他の参加者によると近くで温泉を掘っていた、なんてこともあったそうです。すごいですね。
じつはこの研修所、天皇陛下も訪れるようで、施設案内には乗っていない謎の部屋があったりしましたがどうやら本当のようですね。

天皇皇后両陛下のご日程:平成30年(7月~9月) - 宮内庁

ご挨拶,少時ご歓談(長野県知事,県議会議長,県警察本部長) とあるのであの謎の部屋を使ってご歓談されるのかと存じます。

セッションの方は面白い発表が多く、一番印象に残ったのはやはりコンテナデータセンタの話でした。「コンテナ即売会」「おっさんレンタル」などのパワーワードに加えて、法律や税金などの問題や実際の作業風景に詳しく言及されていて大変面白い発表でした。世界でも類を見ないトピックなので海外の人の反応はどうなんだろう、と思ったら意外にも英文記事になっていませんでした。少なくとも会場の反応は、質問時に「自分もコンテナデータセンタ欲しくなったんですが」と始める人が多く現れて大人気でした。
他にも面白い発表が多くて、「Lispはすごい」ということがわかりました。Lispはすごいですね。
久しぶりにntddkに会いました。彼の発表 The Art of De-obfuscation は部分的にしか知らなかったことが綺麗に組み立てられていく感じでとても良かったです。Program Synthesisあたりの話は詳しい実装を読んだことがなかったのでなるほど、となりました。

speakerdeck.com

一応僕もショートで「CTFと現実世界」というタイトルで発表をしてきました。

docs.google.com

CTFはあくまでも競技だけど、現実世界のバグとの関わりや実際の研究成果が深く影響する場でもあるという主張です。
この手の話はそもそも最新の情報を知っている人がかなり少ない(実際のCTFプレイヤーくらい)ので、今回発表しました。感想や意見などお待ちしております。

ちなみに今回は幹事の一人であるkyontanの車に5人で乗って移動していました。蕎麦やステーキを食べられたし温泉も入れたしで最高でした。しばらく日本にいなかったこともあって少し感動しました。車の手配・運転をしてくれたkyontanにこの場を借りてお礼を。ありがとうございました。

今年も楽しかったので来年も参加したいですね。幹事の皆さま本当にありがとうございました。

CTFの問題を作るときに気をつけること

たまにポエムっぽい記事を書きたくなることがあるんですけど、今回はそういう回です。長いので結論だけ知りたい人はこちらへどうぞ。

CTFブームもここ数年の話ではなくなり、日本でもCTF開催側にチャレンジするチームや会社などが増えてきました。TokyoWesternsを結成して本格的にCTFを始めた2014年終わり頃に比べると、世界的にも日本的にもその数はだいぶ増えたんじゃないかなと思います。日本に限った話で言えば、やはりSECCONをベースとした団体の貢献が多いのは言うまでもないでしょう。Twitterのbioに「CTF」というワードを追加している人の数もかなり増えてきたように思います。
さて、こうした中で多くのCTFを経験すると「問題の質」というのがなんとなくわかるようになってきます。日本のCTFだけだと正直なところまだまだ数が少ないので難しいですが、海外で開かれている多くのCTFに参加するとなんとなく良い問題とそうでない問題がわかるようになってくると思います。そして、CTFを開催する時は「そうでない問題」側に取られてしまう問題の数をなるべく減らしたい、できれば0になるように努力します。

では一体どのような問題が「良い問題」とされるのでしょうか?(ここでは「CTFは現実世界で役に立つ・立たない問題」を議論する気はなくて、そういうのを期待している人は別のところでやってください。)
これについては正直なところ個人の価値観に大きく依存すると思いますが、なるべく一般論として言える(と僕は思っている)ポイントについて言及します。(これは自戒の念も込めて、多くのブーメランを含んでいます)

パズル要素がある

まず一番重要かつ難しいポイントです。我々は基本的には「ハッカー」という、創意工夫によって面白いなにかを達成することが好きな生き物ですから、解法が自明でないことが求められます。この解法が自明足るか否かは参加者によるところが大きくて、多くにとって非自明であればあるほどその問題は難しいと言えます。もし他のCTFで同様のものが出題されている場合はいわゆる「既出」と言われ、そのCTFに参加した人にとっては自明・簡単になります。逆に言えば、より多くのCTFに参加し解法パターンの引き出しを増やすことで、より多くの問題を解けるようになるということです。大学入試とかと同じ原理です。
このパズル要素を適度に含めるのは非常に難しくて、自明でない要素を考えつくには自明な要素をなるべく多く知っている必要があるからです。「CTFに参加したことがない運営が良い問題を作るのは難しい」と言われる所以だと僕は思っています。

本質から外れた妨害要素を入れない

問題を作る上でよく勘違いする人が多いのですが、難しいから良い問題、多くのチームに解かれなかったから良い問題というわけではありません。
たとえばpwnableやreversingの問題があったとして、PowerPCアーキテクチャとか出てきたらうんざりします。なぜうんざりするかというと、「PowerPCは今では一般的ではない」からです。その問題がもしPowerPCの特徴に関連した、あるいは実際にPowerPCで動いていた何かを模して作られたというのならばまだ良いのですが、単純に解析やエクスプロイトを面倒にする目的でそのようなアーキテクチャを選択するのは避けるべきです。もちろんこれはPowerPCに限ったことではなくて、思考停止してVMProtectを噛ませるとかそういうのも含みます。本質的でないところで時間を溶かすのはプレイヤーにとって非常に悪い体験ですし、なにより作問者がその問題の本質部分に自信がないことの現れです。もし作問者が、プレイヤーがこの妨害を突破することにも意味があると考えているならば、突破した時点で部分点を与えるべきでしょう。部分点がない場合は、途中のチェックポイントを通過していようがいまいが解けてなければ0点です。

問題の使い回しをしない

一番やってはいけないことです。CTFの問題を作るというのは非常に大変な作業ですが、埋め合わせのために過去問を適当に変えて出すというのは禁じ手です。少し手を加えるだけで解法が異なってくるような場合はハッカー心をくすぐられて大いに歓迎されますが、例えばプログラミング系の問題でパラメータを適当に変更しただけとか、そういうのは非常に嫌がられます。
なぜかというと、過去問は既にある程度問題を理解しているチームが存在するためです。そのようなチームは過去のコードを再利用しないはずがなくて、これは大きなハンデになってしまいます。有利になったチームは「ラッキー」くらいにしか思いませんが、不利になったチームからすると相手がチートしたときくらい悔しい思いをするでしょう。もちろんこの場合は運営に責任がありますが。

「面白くない」要素が可能な限り排除されている

できれば問題はなるべく楽しく解きたいものです。もちろん何が楽しい・楽しくないかは個人にもよると思いますが、少なくとも無意味な作業は誰だってやりたくないでしょう。 例えばパスワード辞書を使ってブルートフォースをするとログインできて、そこから問題が始まりますみたいなのは最悪です。adminは適当なパスワードを使っているらしいみたいな文言があればまだマシですが、そう言った文脈を一切抜きに辞書攻撃を求めるのはもってのほかです。パスワード辞書なんて正直無限にありますし、片っ端から試せばサーバに負荷もかかります。CTFはペネトレーションテストではありません。どうしてもそういう問題を出したいのならば、参加者数を限定した状態で、相当のスペックのサーバを用意すべきでしょう。もっともそのような環境が用意できたとしても僕は出題したいとは絶対に思いませんが。
他には .index.php.swp などの典型的なURL予測も含まれると思いますが、これは僕が過去にやってしまったので強い言及は避けます。

解いたときに達成感が得られる

CTFに熱中している人の多くは、「問題を解いた時に得られる達成感が忘れられない」と言います。この達成感は問題を解いたこと自体もそうですが、問題を解く過程における試行錯誤の一つ一つが積み重なって最終的な解を導き出した、という体験を多く含んでいると思います。この試行錯誤の過程が長ければ長いほど問題は難しく感じ、また解けた時の達成感も大きいです。
では試行錯誤の過程をどうやって長くするかというと、

  1. パズル要素部分を難しくする
  2. 要素の数自体を増やす

という2種類の方法があります。
1は先に説明した通りで、なるべく典型ではない新規性のある要素が求められます。これは非常に難しいので、多くのCTFでは2の方法をよく見ます。
2は必ずしも良い方法ではなくて、単純に問題の組み合わせになっているだけ、みたいなのは避けるべきです。よく見かけるパターンの一つに「Webパートを解くとPwnパートが出てくる」といったものがありますが、例えばWebがインターフェースとなって呼び出しているバイナリをexploitする問題といった、何らかの関連性やストーリー性を持たせるべきでしょう(全く独立した2つの問題ならば最初から別々に出すべきです)。ただし各要素がそれなりの難易度を持っている場合、前述したように部分点を与えた方がよいです。

まとめ

少し長くなりましたが、完結にまとめると

  • 運営するなら少しでもいいからCTFに出ろ
  • どうでもいい要素を入れるな
  • 使い回しをするな
  • エスパーをやめろ(CTFはpentestではない)
  • 単に要素をくっつけただけの問題は複合問題ではない

です。よろしくお願いします。

また、CTFを開催するときに気をつけるべきポイントについては、アメリカのPlaid Parliament of Pwning (PPP) というチームの良い資料がこちらにあるので、読んだことない人はぜひ一度目を通して見てください。