twiterを開くたびに寄稿者を募っているツイートが目に入って、かわいそうだったので書きます。twitter.comwhywaitaさんといえば、ISUCONで優勝したり、CTFチームTokyoWesternsにも所属していたり、多才な方ですよね。そんな多才なwhywaitaさんに、ぜひお伝えしたいことがあります。問題を解く気がないならSlackチャンネルに入らないでください。賞金を分ける計算が面倒です。来年もよろしくお願いします。7日目の記事ですTweet広告を非表示にするもっと読むコメントを書く2018-10-23運が良かったのでISUCON8で優勝しましたWebサービスのチューニングを競い合うコンテストであるISUCONの第8回本戦に出場してきました。実際に何をやったのか、詳しい内容はwhywaitaが書いてくれているのでこちらでは補足情報などを書きます。blog.whywrite.itチームについて実はISUCON自体に参加するのは今回が初めてではありません。このチームは2年前に結成してISUCON6から参加していたのですが、ずっと予選落ちで本戦には一度も出場したことがありませんでした。icchyの3人で、TokyoWesternsというCTFチームの中でもインフラ系に明るいメンバーで構成されています。ISUCONの存在自体は以前から知っており、出てみたいという3人でチームを組むことになりました。死」というチームでした。名前の通り院試に苦しんでいた学部4年生の時のチームです。言語は特に決まっていなくて、得意な言語はnomeaning→Ruby、icchy→Pythonという感じだったので、両方試してみて良い感じの方を使っていました。結果はほとんど覚えていませんが、学生枠での予選突破すら難しいレベルだったと思います。予選直後にGo言語がめっちゃ強いという話を聞いて、次からGoにするかみたいな話を冗談半分でしたのを覚えています。(fried_chicken,backslash,6sec_dec)というチームで出ました。誰が誰なのかわかりませんね。publicに気づかなかったのであまり得点が上がらず予選敗退となりました。実を言うと偶然40000点くらい出た時があって、そこで止めていれば学生枠で予選突破だったかもしれません。ベンチマーカーガチャの攻略が必要だということを学びました。ISUCON8今回のISUCONも覆面チームで出る流れになったのですが、全然案が出なかったところリーダーであるwhywaitaのアイデアで決まりました。タイムゾーン云々の話をしているかというと、僕が4月から半年間アメリカに行っていて、予選の時はUTC-7から参加していたためです。他の二人は日本にいましたが、つじつまを合わせるためにどっちか片方がサマータイムってことにすればええやろってことで、社会人に比べても朝早くから出勤しているnomeaningはJDTになりました。ちなみにアメリカは18:00~2:00で、研究室から参加していたのですが、終わった後discordやtwitterやSlackに張り付いていたので朝方帰宅しました。競技時間中はSlackでボイスチャットを繋いでコミュニケーションを取っていたのでリモートワークみたいな感じでサクサク作業できましたが、手書きで情報を共有する手段がなくて、やはり集まるのは大事ですね。学部4年から3回目ということは全員修士2年で、少なくともwhywaitaは来年就職するため今回が学生チームとして出られる最後のISUCONだったので、今回こそは絶対に本戦行くぞと意気込んでいました。学生枠で通れたら良いなくらいにしか思っていなかったですが、幸運にも一般枠で通過することができて結構盛り上がってました。本戦なので結構緊張していました。事前のマニュアルをほとんど読んでなくて、会場に入ったらまず席を確保しないといけないことを知りませんでした。我々が到着したのは9:30くらいだったのですがほとんどの机は埋まっていて、円卓はちょっと狭かったので最終的に自販機の前のカウンターテーブルのような場所に座りました。机が高いので椅子も高く硬く、長いこと座っているとお尻が痛くなるので結構立ったまま作業していたのですが、スタンディングデスク割といいですね。ISUCONなのに椅子に座らないとはこれいかになんてくだらないことを考えていましたが、意外と作業しやすかったです。競技の方ですが、whywaitaのタイムラインにもある通り最初1時間くらいはほとんど何もしていませんでした。buildが走って厄介なので何も考えずにnginxとappを剥がしました。MySQLはバージョンが8だったのでCentOSの上で動かすのがだるいなと思いましたが、そこはwhywaitaがやってくれたので助かりました。あとは概ね例のタイムライン通りで、僕はコードをあまり書かずにひたすら眺めて、怪しそうだなーと思うポイントを適当に共有していたらいつのまにか高速化されていました。今回優勝できたのは本当に運が良かったと思っていて、得点の減点ルールが割合によるものだったことが非常に大きいと思います。実際takedashiはもっと多くの要素に気づいて高速化をしており、終わった直後に交わした会話からしてもこれは5万点いってるし負けたかな、という印象を受けたのですが、実際には減点で6割くらいまで得点が落ちていました。今回のアプリケーションは決済系なので、リクエストを落としたら大きな減点に繋がるのはまあ確かに、と思いました。顧客が増えれば増えるほどわずかなミスが命取りになるわけで、点数をあげればあげるほどエラーに注意しないといけないということですね。競技終了1時間前に謎のfailが多発していたので安定化を真っ先にやるべきだったのですが、僕はしばらく別の高速化に取り組んでいました。5万点を狙うよりも0にしない方を取るべきなのは当たり前で、ここは反省点です。ISUCON8は予選の段階でリクエストが増えてくると死ぬパターンがあったので、安定させて減点を減らすことに注力するのが最善だったのかもしれません。ABテストで、確率で返すという発想が全く思いつきませんでした。確率でボタンが消えるなんて実際の利用者は困惑すると思いますが、サービス全体の体験が悪くなるよりかは確かにマシだと思います。trueにした状態でベンチを通過するのは必要だろうと思っていたので、結果的には良かったです。繰り返し書きますが今回は本当に運が良かったと思います。煽りのつもりは一切ないことを事前に断っておきますが、社会人でもあまり調子が出ない問題セットはあるということと、学生でもかなり腕の立つ人がいるということに驚きました。NaruseJunでしたし、予選では学生かつ一人チームであるtaildさんは全体4位でした。懇親会で小耳に挟んだ「社会人はもうダメでこれからは学生だ」というフレーズがあって、僕は学生が社会人に安定して勝つのはまだまだ無理だと思っていますが、特定の分野なら勝てる!というケースはなくはないのかな、と思います。今回は本当に運が良かったです。本戦で学生が優勝するのは初らしく、優勝賞金100万に加えて学生優勝30万も頂いてしまいました。LINEさんありがとうございます。使う気はないですが、アイコンにもある通りトンカツが好きなので美味しいお店を教えてもらえると喜びます。最後に、運営のみなさま本当にありがとうございました。(ガチャはありましたが)ベンチマークはサクサクで、開始時間が延期することもなく、問題も予選・本戦ともによく練られた良問でした。次回も是非参加したいと思います。16:11運が良かったのでISUCON8で優勝しましたTweet広告を非表示にするもっと読むコメントを書く2018-10-10第51回情報科学若手の会に参加してきました毎年9月頃に開かれている情報科学若手の会というイベントがあって、その名前の通り若手と呼ばれる人たちが同じ場所に集まり数日間ディスカッションを交わしたり交流をする場があります。wakate.org実際にはディスカッションという堅苦しいものよりかは雑談に近い感じで、Webサイトにもある通りインフォーマルな雰囲気が特徴となっています。僕はこの会に参加するのは3回目なのですが、実をいうと今まで一度もブログを書いてませんでした。会の詳しい内容については他の参加者や幹事の方が数人ブログを書いてくださっているようです。Blogsaho-london.hatenablog.comkuge-masa.hatenablog.comhogashi.hatenablog.comkurochan-note.hatenablog.jpt.co例年は山喜旅館という静岡県伊東にあるレトロなところで開催しているのですが、今年はいろいろな事情があって軽井沢にある軽井沢研修所というところで開催されました。www.kato-karuizawa.jp避暑地と呼ばれるだけあってやはり軽井沢は涼しくていいですね。朝に適当に付近を散歩していましたが、なかなかに快適でした。加藤山崎教育基金によって運営されているそうで、研修所の敷地内には広大な植物園があったりとなかなか「お金の力」を感じる場所でした。http://www.kato-karuizawa.jp/pdf/map05.pdf僕は実際に見ていないのですが、他の参加者によると近くで温泉を掘っていた、なんてこともあったそうです。じつはこの研修所、天皇陛下も訪れるようで、施設案内には乗っていない謎の部屋があったりしましたがどうやら本当のようですね。あるのであの謎の部屋を使ってご歓談されるのかと存じます。セッションの方は面白い発表が多く、一番印象に残ったのはやはりコンテナデータセンタの話でした。「コンテナ即売会」「おっさんレンタル」などのパワーワードに加えて、法律や税金などの問題や実際の作業風景に詳しく言及されていて大変面白い発表でした。世界でも類を見ないトピックなので海外の人の反応はどうなんだろう、と思ったら意外にも英文記事になっていませんでした。少なくとも会場の反応は、質問時に「自分もコンテナデータセンタ欲しくなったんですが」と始める人が多く現れて大人気でした。他にも面白い発表が多くて、「Lispはすごい」ということがわかりました。Lispはすごいですね。久しぶりにntddkに会いました。部分的にしか知らなかったことが綺麗に組み立てられていく感じでとても良かったです。Synthesisあたりの話は詳しい実装を読んだことがなかったのでなるほど、となりました。speakerdeck.com一応僕もショートで「CTFと現実世界」というタイトルで発表をしてきました。docs.google.comCTFはあくまでも競技だけど、現実世界のバグとの関わりや実際の研究成果が深く影響する場でもあるという主張です。この手の話はそもそも最新の情報を知っている人がかなり少ない(実際のCTFプレイヤーくらい)ので、今回発表しました。感想や意見などお待ちしております。ちなみに今回は幹事の一人であるkyontanの車に5人で乗って移動していました。蕎麦やステーキを食べられたし温泉も入れたしで最高でした。日本にいなかったこともあって少し感動しました。車の手配・運転をしてくれたkyontanにこの場を借りてお礼を。ありがとうございました。今年も楽しかったので来年も参加したいですね。幹事の皆さま本当にありがとうございました。23:05第51回情報科学若手の会に参加してきましたTweet広告を非表示にするもっと読むコメントを書く2018-09-17CTFの問題を作るときに気をつけることたまにポエムっぽい記事を書きたくなることがあるんですけど、今回はそういう回です。長いので結論だけ知りたい人はこちらへどうぞ。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はペネトレーションテストではありません。してもそういう問題を出したいのならば、参加者数を限定した状態で、相当のスペックのサーバを用意すべきでしょう。そのような環境が用意できたとしても僕は出題したいとは絶対に思いませんが。典型的なURL予測も含まれると思いますが、これは僕が過去にやってしまったので強い言及は避けます。解いたときに達成感が得られるCTFに熱中している人の多くは、「問題を解いた時に得られる達成感が忘れられない」と言います。この達成感は問題を解いたこと自体もそうですが、問題を解く過程における試行錯誤の一つ一つが積み重なって最終的な解を導き出した、という体験を多く含んでいると思います。この試行錯誤の過程が長ければ長いほど問題は難しく感じ、また解けた時の達成感も大きいです。試行錯誤の過程をどうやって長くするかというと、パズル要素部分を難しくする要素の数自体を増やすという2種類の方法があります。1は先に説明した通りで、なるべく典型ではない新規性のある要素が求められます。これは非常に難しいので、多くのCTFでは2の方法をよく見ます。2は必ずしも良い方法ではなくて、単純に問題の組み合わせになっているだけ、みたいなのは避けるべきです。見かけるパターンの一つに「Webパートを解くとPwnパートが出てくる」といったものがありますが、例えばWebがインターフェースとなって呼び出しているバイナリをexploitする問題といった、何らかの関連性やストーリー性を持たせるべきでしょう(全く独立した2つの問題ならば最初から別々に出すべきです)。各要素がそれなりの難易度を持っている場合、前述したように部分点を与えた方がよいです。まとめ少し長くなりましたが、完結にまとめると運営するなら少しでもいいからCTFに出ろどうでもいい要素を入れるな使い回しをするなエスパーをやめろ(CTFはpentestではない)単に要素をくっつけただけの問題は複合問題ではないです。いうチームの良い資料がこちらにあるので、読んだことない人はぜひ一度目を通して見てください。mainというエラーが出た場合の対処方法をこちらにまとめた。こちらの記事で言及したが、pipの挙動がちょっとおかしい。調べてみたところ原因がわかったので共有する。一応概要も載せておく。行った場合、pipが使えなくなる。mainのようにエラーがでて、pipコマンドが使えなくなる。パッケージがインストールされない。debian9またはubuntu17.10を使用しているユーザーは特にハマりやすい。原因それぞれの現象の原因を詳しく示す。(リリースされたのはつい先日のことである)。9系のpipスクリプトの内容は次のようになっている。そのまま実行していることがわかる。aptはpipのスクリプトをそのまま使うのではなく、ディストリビューション向けにカスタマイズされている。実行していることがわかる。sys.exit(main())実際にpythonのライブラリが配置されているディレクトリ構造を確認してみると、明らかに構成が変わっていることがわかる。