swampの忘備録

エンジニアが、情報系のイベント行ったときとかプログラミングなどの情報工学について忘備録として書くつもりです。

LINE DEVELOPER DAY 2019に参加してきた

2019年11月20日と21日にかけて、LINE DEVELOPER DAY 2019に参加してきました。

様々な魅力的なセッション、展示、ハンズオンがありとても楽しかったです。
このブログでは、私が聞いたセッションの内容や感想を中心にまとめてみました。

f:id:swamptk:20191216131042j:plain

行くことになった経緯

イベントがあることは知っていたけど、遠方でお金が足りない...と思っていた矢先、
なんとLINEさんが学生向けに交通費を出していただけるという企画があることを知り応募しました。

LINE DEVELOPER DAY 2019 学生向け参加支援制度のお知らせ - LINE ENGINEERING

少し作文をして、晴れて交通費支援の対象になりました。
LINEさん本当にありがとうございました。地方の学生には大助かりです。

会場の雰囲気

電車の都合上12時頃に到着しました。
会場もホテルのワンホールを貸し切っており、とても広い、そして人が多い。
オブジェ?看板?もスマホを使ってデザインしてあり、すごいと感じました。
しかも各セッションには、翻訳もついています。
英語のセッションも分かりやすくなりますし、外国の方にとっても助かります。
外国の方も多い印象でした。
さすが、天下のLINE様だと感じました。

深層学習と脳科学

超有名なあの甘利先生が講演されていました。
超満員で僕が行ったころには座る席はありませんでした。
深層学習の基礎的なお話からされていて非常に興味深かったです。
私が特に興味深いと感じたのは、「Libetの実験」のお話でした。
ベンジャミン・リベット - Wikipedia
詳しくはWikipediaを見てほしいのですが、簡単に言えば、
回っている時計の針を好きな場所で止めてくださいと言ったとき、7で止めたとき
自分自身では、4ぐらいのときに「7で止めよう」と意識したと言うが、
実際に脳波を調べてみるともう2ぐらいには7で止めると決めていたという実験です。
(うろ覚えなので正確ではないと思います。ごめんなさい)
すなわち、脳内では無意識に先に答えを出し、その後意識するということです。
では、別に意識しないでいいじゃないかとも思います。
しかし、この「意識」の良いところは、
「ほんとに7で止めていいの?いややっぱり止めよう」と再度よく考えることができる点です。
無意識のうちに脳でした決定を意識し、その決定を再度吟味することができるのです。
このように人間は、いわば考えることが2重構造のような作りになっているのです。
しかし、現在、深層学習では人間のような高尚な2重構造は持っていないということでした。
やっぱり人間に追いつくのにはまだ時間がかかるのかなあと感じました。
また、色々な人がtweetしていらっしゃいましたが、
極小解と大域解が一般的にあると言われているが、パラメータを超増やせばそう変わらないよねという話も非常に興味深かったです。

セキュアなLINE バックアップを活用したシームレスな端末移行

speakerdeck.com

LINEを端末間移行する場合にどうセキュアにバックアップを活用して移行するかというお話でした。
その1つとしてLINE Letter Sealingも挙げられていました。
どのように端末移行やメッセージ保護をしているのかを詳しく知ることができました。
印象に残ったこととして、
UXとセキュリティのバランスをとるのは難しいのでどこを妥協点にするか見極めることが重要であるとおっしゃっていた点です。
これまで、セキュリティを勉強していく中で、あまりUXを意識したことはありませんでした。
しかし、いくらセキュリティを強固にしたところで使いにくいUXになっていれば使ってくれません。
そのあたりのことも考慮にいれつつ今後セキュリティを学んでいきたいと感じました。

The Art of Smart Channel

speakerdeck.com

Smart Channelと呼ばれるLINEのトーク画面上部に記載されるおすすめニュースや商品を紹介されるレコメンドシステムについての仕組みについてのお話でした。
Smart Channelが導入される前、個々のサービスのレコメンデーションシステムはあったそうですが、複数のサービスを横断するレコメンデーションシステムはなかったそうです。
アーキテクチャも複雑で難しく私にはよく理解できませんでしたが、機械学習などを駆使し工夫されていることが分かりました。
どの広告を表示するか選ぶのに、Banditアルゴリズムを使用しているというのは驚きました。
Banditアルゴリズムは、もともとスロットマシンの最適解を探すアルゴリズムです。
名前は知っていたけど仕組みは全然知らなかったのでこれを機にしっかり学習したいなと思いました。
A/Bテストよりすごい?バンディットアルゴリズムとは一体何者か - Qiita

Custody / KYC / AML regulations on crypto world

speakerdeck.com

超簡単にまとめれば、新しく「LINE Blockchain Platform」を作るよ!というお話でした。

まず、規制とテクノロジーの関係についてUberAirbnbを例に説明してくださいました。
それぞれ技術が法律に追いついていないことで、便利に使えていない面があります。
ブロックチェーンなどの新しい技術が生まれ、そこで新しいビジネスがうまれます。
そして、ビジネスの中で何らかの規制がうまれてくる。
New Tech → New Business → New Regulationという流れができているのです。
近年の仮想通貨業界を見ていて、まさにこの流れだなあと感じました。
テクノロジーは規制を生むという側面もあるが、
規制とエンジニアリングを上手く組み合わせることでイノベーションも生まれてきます。
LINEさんはそれを仮想通貨の世界で行おうとしています。
仮想通貨は、ハッキングやマネーロンダリングなどで規制が強化されてきました。
規制が強化されたことで、仮想通貨を使いたくても対応できないところも増えてきました。
だから、LINEがそのプラットフォームを作って多くの人に簡単に仮想通貨を使ってもらいたい。
仮想通貨でイノベーションを起こしてほしいとのことでした。

私自身LINE Blockchain Platformにはとても未来を感じました。
もっと多くの人が気軽に仮想通貨に触れることができ、色々なプロダクトに仮想通貨を導入することができるのではないかと思いました。
規制とエンジニアリングを上手く掛け合わせて、新たなイノベーションを生んだいい例だと感じました。

しかし、講演者もおっしゃっていましたが、
確かに規制は絶対悪ではなく、むしろ必要だとは思いますが、
あまりにも厳しい規制はブロックチェーンや仮想通貨の可能性を閉ざしてしまうのではないかと感じました。

XXE、SSRF、安全でないデシリアライゼーション入門

www.slideshare.net

徳丸本で有名な徳丸さんがご講演されました。生でお話を聞けるなんて興奮しました。
最初のほうが聞けなかったことが悔やまれます。
XXEやSSRF、デシアライゼーションについてのお話を実演も交えながら、丁寧にお話してくださいました。
初めて聞いた攻撃でしたが、何となくは理解できたと思います。
SSRF攻撃は、攻撃者からは直接アクセスすることはできないけど、公開サーバを介すことで攻撃を可能とする攻撃です。
blog.tokumaru.org
安全でないデシアライゼーションとは、
クッキー等からシリアライズデータを送り込み、任意のオブジェクトをメモリ内に生成し、オブジェクトが破棄されるタイミングでですとクラスタが実行され、オブジェクトを巧妙に組み合わせることにより攻撃を実行できるというものです。
blog.tokumaru.org
それぞれの対策や実例等も理解でき、満足度がとても高かったです。
不明な点は、徳丸先生のブログ等を見ながら復習していきたいです。
徳丸本もいい加減読み進めなければと思う今日この頃です。
余談ですが、案内された席に座ったら、偶然隣が知り合いで世間は狭いなと感じました。

Backend Architecture Design for Analyzing and Processing Massive Blockchain Traffic

speakerdeck.com

ブロックチェーンの基本的なデータ構造から解説していただきました。
ハッシュチェーン、ブロックチェーントランザクションの話を図を交えながら分かりやすく解説していました。
最近あまりブロックチェーンに触れておらず、忘れかけていたので良い復習になりました。
そして、LINEのブロックチェーンであるLINK Chainやその動きを可視化する?LINK Scanの構造について説明を受けました。
私にとっては少し難解であまり理解できませんでしたが、様々な技術的工夫がされていることがよく分かりました。

Opening DAY2

speakerdeck.com
ここから2日目です。
オープニングでは、LINEの紹介や今後注力していくプロダクト、Developerの開発環境などなどについて紹介されました。
ここでは、LIFFについて紹介します。
LIFF(LINE Front-end Framework)とは、LINEが提供するウェブアプリのプラットフォームです。
LINE Front-end Framework
今まで、LIFFがLINE Messaging APIに導入されたことによってLINEの機能を使ったWebアプリが簡単に作れるようになるという利点を持っています。
できることの幅も広がるように感じます。
実際に、LIFFで開発されたプロダクトは世に公開されているようです。
私も機会があれば、是非開発してみたいと考えています。
また、Developerの開発環境についても紹介されていました。
LINEの開発環境は洗練されているものですばらしいと感じました。
特に驚いたことは、世界中どのオフィスに行ってもインテリアや内装などのデザインが似ていて、どのオフィスに出張に行っても同じように仕事ができるといった配慮がされている点です。
インテリアや内装などを専門にするデザイナーさんまでいるとか。
また、オフィスについてすぐ仕事ができるようにWi-Fiなどの設定も世界中どのオフィスでも同じということを聞き驚きました。
(どうやってネットワーク構築してんだろうと思ったり思わなかったり)
そして、LINE Styleと呼ばれる価値基準を設けて、目的を持ち楽しく仕事をしているという様子が伝わりました。
LINE Styleからは学ぶことも多いので私も実践していきたいです。
linecorp.com

つながろういつでも、何とでも。LINE Thingsからはじまるモノと人との新しいコミュニケーション

speakerdeck.com
LINEが進めているLINE Thingsと呼ばれるIoTプラットフォームのお話でした。

LINEのプラットフォームを使用することで、
NO install:LINEアプリをインストールするだけで他のアプリはいらない
NO Signup:LINEに登録しておけばそれでいい
NO credit card:LINE Pay使えばクレジットカードいらない
NO unrechable User いつでも届けたいときに届ける
NO useless Development:ログイン機能など無駄に時間がかかる機能を開発しなくてよい
という5つのNOを実現することができます。
(これはIoTだけでなく他のプロジェクトでも同じ)
他のプラットフォームでIoTを実現しようと思うとYesになってしまうものばかりです。
LINEというプラットフォーム上で簡単で便利にIoTを実現しようというのです。

実際の例として、服の乾き具合が分かるハンガーIoTの構成について解説されました。
実際のコード例なども紹介され、本当に簡単にできるのだなあと関心しました。
先程紹介したLIFFもここで大きな役割を担っています。
他にも実用例がたくさん紹介されました。
特に印象に残ったのは、Neosmart PenとLIFFを使ったプロダクトです。
簡単に言えば、Neosmart Penで書いた文字をLINEで認識して、そのままトークで送信しようというIoTでした。
わざわざ写真で撮影したものをトークに送るという面倒なことをしなくてもいいとなると非常に楽になるなと感じました。
その他にも、可能性を感じるプロダクトがたくさんありました。
私も何かアイデアを探して、LINEでIoTを実現するといったこともしてみたいです。

Flutter for LIVE Commerce

speakerdeck.com
最近またFlutterにはまっているので、今回一番楽しみにしていた講演の1つでした。
実案件でFlutterを使っているお話をお聞きすることができ、非常に興味深かったです。

まず、Flutterとは、Dart言語を書くだけでAndroidiphone両方のアプリができるというクロスプラットフォームツールです。Googleが開発しているオープンソースです。
LINEでFlutterを使ったプロジェクトは、LIVE Commerceと呼ばれるLive streaming ECサービスです。(今後ローンチ予定)
なぜFlutterを使っているのかという理由は3つあります。
① 開発人数が不足している中で開発効率を上げられるから
② UIのライブラリがRichであるから
③ カスタムレンダリングを採用しているから
まとめると、コンパクトなチームでスピードが求められUIをきれいにしたいといったときにFlutterは有効的だということです。

Flutterを使ったことによるBenefitとして大きく3つ挙げられます。
① Single code base
 98%をDartのコードで書くことができるため、Androidiphone用それぞれのコードを記述する必要はありません。1つのコードでアプリを作ることができるのです。
② Fast Development
 FlutterにはHot Reloadと呼ばれる、とてもとても便利な機能があります。Hot Reloadとは、コードの変更内容をファイルを保存するだけで読み込みデバックしてくれる機能のことです。従来20秒程度かかっていた読み込みが1秒程度で終わり開発を効率化させています。
 また、Declarative(宣言的な)コードでUIを組むことができるので非常に分かりやすく早くアプリを作ることができます。
③ Single Client Team
 従来Androidiphone双方のアプリを作るのにそれぞれコードを書かなければなりませんから、2つのチームが存在するということになります。
 例えばAndroidチームが少しここのUIを変えたいということならば、デザイナーだけでなくiphoneチームにも「ここ変えて大丈夫かい?」と聞かなければなりません。
 そんなことを繰り返しているとそれぞれのチームですり合わせを行いそれがどんどん複雑になっていきます。
 しかし、Flutterではアプリ開発チームは1つなのでそのような心配は減ります。

Flutterを導入して運用するまでにもポイントがあります。
まず、開発メンバーだけでなくデザイナーさんやQAさんなどとの意識のすり合わせです。
例えば、デザインはAndroid ,ios は同じデザインにするといったことです。(Shareボタンなどは例外)
Flutterを使うことによって今までと違う部分も出ると考えられるので協力していける環境を作っていくことが大事です。
テクノロジー面についてでも、BLoC(ブロックパターン)を使うとかProvider packageを使うとか様々な工夫をしています。
Flutterではネイティブの動作を全て完全に作ることができるわけではありません。
LIVE Commerceでは、Playerの部分は動画が主要なのでチューニングしたいということからネイティブで作成しています。
Flutterで作れない部分も少しありますが、最悪ネイティブで作るという解決策をとっています。
また、Flutterアプリに簡単にアニメーションを追加できるFlareも使用してUIを作っているとのことでした。

自分自身もFlutterを使って開発していますが、なぜFlutterなのか、Flutterの利点、欠点は?
といったことを実務ベースで理解することができ、非常に有意義な講演でした。

​LINEのデザインシステム:一貫性を損なうことなくLINEのサービスの速度を上げる

speakerdeck.com
LINEのデザインシステムをコンポーネント化を進めていくまでの道のりに関し講演していただきました。

今でこそデザインのコンポーネントがしっかりしていますが、昔は、アイコンが開発者によって統一されていないとか、1つのアプリに500以上の色が出てくるなど問題が非常に多いデザインでした。
デザインが統一化、コンポーネント化されていないことで、繰り返しの多い作業が多いなどの問題もありました。
そのような無駄のあるデザイン開発プロセスの工程を70%削減できるということで改革が進められました。

改革ではでLINEは「LINE Design Principles」と呼ばれるLINEにおけるデザインの原則を定めました。
・We ≠ Users
・Clear Primary Task
・Chat First
・Reliable Design
・Continuous Experience
・Respect for Legacy
の6つです。
この原則を決めることによって、30までカラーバリエーションを抑えることができたり、シンプルでクリアなアイコンを使えるようになりました。
このような改革によって二度手間を大きく削減することができました。
このデザインに関する事項は社内で閲覧できるサイトである「LINE DESIGN SYSTEM」にまとめられて、様々な開発で活用されています。

最近LINEのデザインがよくなっているなと感じていたところだったので、このような努力があったのかと感動しました。
デザインもプロダクトを作っていくうえで非常に重要だと感じます。自分でも勉強してみたいです。

LINE Loginで始めるAuth0の使い方 - 認証基盤をかんたんに構築する方法

speakerdeck.com

顔認証受付の仕組み

speakerdeck.com

感想

2日間で様々な技術についてのお話をお聞きすることができて非常に有意義な時間でした。
LINEの技術カルチャーも分かり非常に楽しそうだなと感じました。
今後LINEの技術も自分のプロダクトに積極的に導入したいと感じました。
今回は貴重な機会をありがとうございました。

f:id:swamptk:20191216131112j:plain

Windows10でFlutterをインストールして使えるようになるまで

 Windows10でFlutterをインストールして使えるようになるまでの手順をまとめてみました。久々に技術系の記事を書きます。

環境構築

Windows install - Flutterに従って、Flutterの環境構築を行います。

前提として、Windows PowerShell 5.0以降、Git for Windows 2.xが導入されているものとします。

FlutterSDKのダウンロード

まず、上記サイトにアクセスして、FlutterSDKをダウンロードします。以下の青いボタンを押してSDKをダウンロードします。

f:id:swamptk:20191109123459p:plain

その後、ダウンロードしたzipファイルを任意の場所で解凍(C:\Program Files\以下などはダメだそうです)

解凍したflutterフォルダの「flutter_console.bat」を実行して以下のような状態になればOKです。

Windows によって PC が保護されました」という青い画面が出てくる場合もありますが、無視して詳細情報を押し実行して問題ありません。

f:id:swamptk:20191109125027p:plain
flutter_console.batを実行した結果

Pathを通す

コマンドプロンプトPowerShellなどでflutterコマンドを使うために、Pathを通します。

「コントロールパネル」→「システムとセキュリティ」→「システム」→「システムの詳細設定」→「環境変数」で環境変数の設定画面を開きます。

環境変数「Path」に「解凍したflutterフォルダのPath¥bin」を入力してOKを押してください。

 

f:id:swamptk:20191109130746p:plain
環境変数設定画面

flutter doctorを起動する

コマンドプロンプトなどのコンソールで「flutter doctor」を実行します。

f:id:swamptk:20191109133149p:plain
flutter doctorの実行結果(1回目)

たくさんエラーが出ているので1つ1つ解消していきます。

Android Studioをインストールする

Download Android Studio and SDK tools  |  Android Developersから最新のAndroid Studioをインストールします。

ダウンロードしたexeファイルを実行すればAndroid Studioが導入できます。

そして、Android Studioを起動します。

もし、Proxy環境で起動する場合は、以下のサイトを参考にして設定してください。

qiita.com

「File」→「Settings」→「Plugins」を選択し、検索窓に「Flutter」と入れてください。

f:id:swamptk:20191109142441p:plain
flutter Pluginの追加

先頭に出てきている「Flutter」のinstallボタンを押します。

指示に従えば、Flutterのプラグインをインストールすることができます。

そして、「flutter doctor --android-licenses」をコマンドプロンプトで実行してください。

Proxyの設定

Proxy環境で動かす場合は、Proxy設定を行う必要があります。

コマンドプロンプトで以下のように設定します。

$ set http_proxy=username:password@hostname:port
$ set https_proxy=username:password@hostname:port

つまったところ

基本的に各環境で出てくるエラーは違います。

例として私の環境でflutter doctorして出たエラーを紹介します。

[!] Android toolchain - develop for Android devices (Android SDK version 27.0.3)
    X Flutter requires Android SDK 28 and the Android BuildTools 28.0.3
      To update using sdkmanager, run:
        "C:\Users\ultra0\AppData\Local\Android\sdk\tools\bin\sdkmanager" "platforms;android-28" "build-tools;28.0.3"
      or visit https://flutter.dev/setup/#android-setup for detailed instructions.

このエラーは、今、Android SDK version 27.0.3だからAndroid SDK version 28.0.3にインストールしなさいということです。

「File」→「Settings」→「System Settings」→「Android SDK」→「SDK Tools」を選択します。

f:id:swamptk:20191114104144p:plain
Android SDKno

「Show Package Details」に☑を入れ、Android SDKの28.0.3に☑を入れます。そして、OKを押しインストールを開始します。

f:id:swamptk:20191114104526p:plain
Android SDK28.0.3を選択する

また、「File」→「Settings」→「System Settings」→「Android SDK」→「SDK Platforms」を選択します。

上記と同じように「Android 9.0」をインストールします。容量に余裕がなければAndroid 9.0の上2つの項目だけでも構いません。

f:id:swamptk:20191114112012p:plain
Android9.0のインストール

詳しくはこちらのページもご覧ください。
SDK Managerを使ってSDKおよびSDK Toolsを追加でインストールする | Androidプログラミング入門 | JavaDrive

動作確認

Android Studioを開き、File→New→New Flutter projectでflutterのプロジェクトを開くことができれば完了です。

途中以下のような画面が出てきます。Flutter SDKの欄には先ほどインストールしたPathを入力してください。

f:id:swamptk:20191114141817p:plain

以下のような画面が出てくればOKです。
f:id:swamptk:20191114142007p:plain

詳しくはこちらのページもご覧ください。
Android StudioでFlutterを使うための設定手順 - KOKENSHAの技術ブログ

Androidエミュレータの構築

動作確認を行うための、Androidエミュレータを作成します。

「Tools→ADBManeger」をクリックすると以下のような画面になります。

f:id:swamptk:20191210134422p:plain
ADBManeger

まず、Nexus 5Xを選択し、「Next」を押します。
f:id:swamptk:20191210141807p:plain

その後、ダウンロードされているAndrtoidのバージョンを選択して「Next」を押します。
f:id:swamptk:20191210142059p:plain

そして、次の画面でFinishを押しエミュレータを作成します。

その後、ADBManegerで作成したエミュレータをダブルクリックすることでエミュレータを起動することができます。
f:id:swamptk:20191210142900p:plain

CODE BLUE2019の学生スタッフをしてきた

2019年10月28日~2019年10月30日にかけて情報セキュリティ国際会議である「CODE BLUE2019」に学生スタッフとして参加させていただきました。非常に有意義でとても楽しかった3日間でした。

f:id:swamptk:20191102172141j:plain

学生スタッフとは

学生スタッフは、情報セキュリティ国際会議であるCODEBLUEの運営お手伝いをするスタッフです。
スピーカーのアテンドとかドアキーパーとか受付とかいろいろなお仕事があります。
そのお仕事から1つ割り振られDay1かDay2のどちらかにスタッフとして働きます。
もう1日は自由にCODEBLUEを楽しんでよいのです。

CODEBLUEのtwitterをチェックしていると7月ぐらいに告知されます。

CODEBLUEに普通に参加すれば安くても約5万円かかります。当日券だと約13万するそうです。
学生スタッフとして参加すればそれが会場までの交通費だけで済みます。遠方の人には宿泊もつきます。
どの講演も興味深いものでそれを無料で聞けるのはとてもお得です。
とても楽しいし、ためになるので学生の皆さんは是非応募しましょう!

Day0

CODEBLUE自体は10月29日でしたが、10月28日にスタッフは交流と業務説明のため集まりました。
まず、学生スタッフと協賛企業の方々との懇親会があり、同じ学生スタッフや企業の方と交流を深めることができました。
どこかで見たことがあるなあという方が多くいらっしゃって界隈は狭いなあと実感したところです。
その後、明日以降の業務の説明を受けました。
また、CBNOCのヘルプで久しぶりにLANケーブルの作成もしました。

f:id:swamptk:20191102172154j:plain

Day1

1日目、僕はシフトが入っている日でした。
僕の仕事は、MainトラックでタイムキーパーをしたりQAのマイク回しなどを1日していました。
仕事自体は難しいものではありませんでしたが、タイムキーパーを担当したときは、責任重大なので少し緊張しました。

運よくMainトラックで仕事ができたので、講演をほぼすべて聞くことができました。
英語のものが多いかつ難しい内容なので、同時通訳を聞けたけれども8割以上は意味わかりませんでした。
もっと勉強しなければと感じました。
この日のMainトラックは、サプライチェーン攻撃とかIoTの話が多かったかなと印象がありました。
具体的な攻撃について取り上げているものも多く聞いていて興味深いものが多かったです。

Day2

2日目は、自由に講演を聞いたり企業ブースを回ったりしました。
疲れていたので、初っ端の講演はあきらめてゆったり9時ぐらいにホテルを出発しました。

この日は仮想通貨系の講演が多いなと印象でした。こちらも興味深かったです。

また、はんだづけもしました。楽しかったです。

あとは、ネットワーキングパーティーに参加して、色々な人とお話させていただきました。
その後、スタッフで打ち上げを行って解散となりました。

まとめ

初めてCODEBLUEに参加しましたが、レベルの高い講演を聞くことができる、そしてたくさんの人に出会うことができて非常に楽しかったです。

講演の内容は、レベルが高すぎるかつ英語の内容が多くて日本語通訳はありましたが、3割ぐらいしか理解できませんでした。
しかし、おもしろい内容も非常に多かったので復習をしっかりしていきたいです
今度来るときは理解できるようにいろいろな観点のセキュリティをしっかりと学んでいきたいと思いました。
あと、英語全然分からなかったので英語も勉強したいです。

最初で最後の学生スタッフとしての参加でしたが、また何かの機会に是非参加してみたいと思いました。
関係者の皆さん、今回はこのような機会を与えてくださりありがとうございました!

f:id:swamptk:20191102172124j:plain

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

 2019年8月13日~2019年8月17日にかけてセキュリティ・キャンプ 全国大会2019に参加してきました。 
 自分の備忘録も兼ねているので、かなり長い記事になりますが許してください。

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

セキュリティ・キャンプとは、日本における将来の高度IT人材となり得る優れた人材の発掘と育成を目的とした独立行政法人情報処理推進機構(IPA)の事業の一つです。

現代においては、情報セキュリティの脅威は高まる一方です。
本事業では、セキュリティ分野に興味を持ち、将来同分野で活躍したいという意志をもった若者に対して、高度な情報セキュリティ技術の習得機会を提供しています。また、モラルや法律遵守の意識、セキュリティ意識、職業意識、自立的な学習意識についても向上のための機会を提供しています。

本事業は、2004年度のスタート以来、2018年度のセキュリティ・キャンプまでで計748名の将来が有望なIT・情報セキュリティ人材を輩出しています。セキュリティ業界はもとより各方面から、高度な情報人材育成に有益なイベントとして高く評価されています。

https://www.ipa.go.jp/jinzai/camp/2019/zenkoku2019_about.html

 つまり、セキュリティに関するとってもとっても濃い講義を税金で無料で受けられるとても楽しいキャンプということです。
 周りにすごい講師、チューター、受講者がたくさんいて、とても刺激を受けることができました。

会場入り

 遠方なので、なんと前泊が許可されました。とてもありがたい限りです。
 ということで、一足早く会場入りをさせていただきました。


1日目

開会式

 えらい大人の方がたくさんお話をしてくださいました。

特別講演(倫理)「転ばぬ先の法律入門(サイバー空間編)」

 自らが犯罪を犯さないためにも倫理って大切だよね。というお話でした。
 様々な事例の具体例が示されていたため非常に分かりやすくためになりました。
 倫理観を鍛えて善い人生を送れるように気を付けていきたいです。

セキュリティ基礎

 良いパスワードとは?という問いから始まり、パスワードに関するあれこれを講義してくださいました。
 GPUでパスワード全解析していったら、1秒間に327,000,000,000個というパスワードを解析できるというデータには非常に驚きました。
 参考ページ No password is safe from this new 25-GPU computer cluster - CNET
 GPUすげーーという感じです。破られないパスワードはもう作れないのか?と思ったりもしました。
 また、生体認証ならある程度は安全が担保されるだろうと思っていましたが、
 いろいろと代替された事例を見て、一概に安全とは言えないとはいう印象がとても強くなりました。
 初めの問いの現実解としては、経路が異なる認証を複数個ということでした。
 今まで、「パスワード」を主眼に考えてみたことはなかったので、非常に興味深かったです。
 また、「パスワード」を信頼するという行為は非常に危険であると感じました。
 パスワードについて考える良い機会になったので、自分自身のパスワードに対する考えも変えていきたいと思いました。

特別講演(一般)「ITの話ができる仲間を作ろう~IT業界とコミュニティ活動~」

 コミュニティ活動について講師の法林さんの経験をもとに講義をしてくださいました。

www.slideshare.net
 僕もCoderDojoのメンターなどいくつかのコミュニティに参加していますが、非常に共感できるところも多かったです。
 ある人も言っていましたが、コミュニティの運営というのは本当に貢献でなりたっていると思います。(僕の実体験からも)
 自分もコミュニティに貢献できるように、様々な活動をしていきたいなと思いました。
 また、会社に入っても「外の物差し」を知れると聞いたので、積極的にこれからもコミュニティ活動はしたいと思いました。

LT大会

 LT大会では、僭越ながら秘密計算の簡単な概要についてお話させていただきました。

www.slideshare.net
 周りが強い方ばかりでこんな内容で戦々恐々としましたが、興味を持ってくださる方もいたようなので発表してよかったなあと思いました。
 LTは頑張って挑戦してみましょう!

2日目

C1~3 制御システムのセキュリティとShinoBOTによる攻防演習

 この講義では、工場にあるような制御システムを模した環境を用いて、制御システムに対する攻撃と防御を学びました。
 以下のような実際にありそうなロボットアームのセキュリティについて考えていきました。

 午前は、制御システムと概要と防御について学びました。
 Wiresharkで、実際の通信をキャプチャして解析し、どんなプロトコルのどんなデータが来ているのか見てみました。
 また、snortを使って、そのデータを検出したりしました。
 午後は、制御システムに対する攻撃について学びました。
 最初に遠隔操作マルウェアシミュレータであるShinoBotについて学び、簡単なCTF形式で使い方を学びました。
 実際にCTF形式でやってみるととても楽しかったです。また遠隔操作の怖さを知ることもできました。
 その後は、実際の制御システムに対する攻撃スクリプトを書いていきます。
 なんと言語はPowerShell! C言語とかを使うのかと思っていたので意外でした。
 使ってみると確かに便利な関数たくさんあるし、使いやすいなあと感じました。
 夜は、攻防戦です。チームで攻撃と防御に分かれて習ったことを駆使しながら対決しました。
 攻撃の仕方、防御の仕方にもいろいろな視点があることを感じました。
 どの試合も、とても盛り上がって楽しかったです。
 この講義では、なかなか触れることのない制御システムのセキュリティにふれ、貴重な経験になりました。
 これからもっと制御システムに対するセキュリティは必要になってくると思います。
 そのセキュリティには、「情報システム」とは違う視点も必要です。
 今回学んだことをもとに、制御システムのセキュリティにも興味をもっていきたいです。

3日目

B4 認証の課題とID連携の実装


 認証やID連携についての基礎的な知識を学びました。
 前半は、実際の事例から問題点を考察し、その後パスワード、ID、認証と認可とは何かを教わりました。
 某社の事例を見て、情報公開や報道のリテラシーというのも大切だと学びました。
 また、IDといってもいろいろな意味があり、それぞれ使い分けが必要なのは初めて知りました。(Identify、Identification、Identifierとか)
 Discussionなども通して、改めて認証やIDを扱う際に私たちはどんなことを意識しなければならないのか考える良い機会になりました。
 後半は、まず、FIDOやOpenID Connectの仕組みについて、非常に分かりやすく説明してくださいました。
 なぜトークン置換攻撃やCSRFリプレイ攻撃などが起きるのかとその対策についてもフロー図で分かりやすく理解できました。
 また、ID tokenなどを書き換えて他人の情報を盗めることもハンズオンを通して体感しました。
 今まであやふやだった認証やID連携について、詳細に理解することができ非常に勉強になりました。
 また、定められた規約通りに実装することは、攻撃を防ぐという意味でも重要だと感じました。
 もう少し勉強して、OpenID connectを実際に使用したアプリケーションも作ってみたいと感じました。
 

B5 体系的に学ぶモダン Web セキュリティ


 Webセキュリティについて様々な要素を学びました。講義資料は以下です。

speakerdeck.com

 事前学習から、知らないことが多くWebセキュリティの基礎的な知識を文字通り体系的に身に着けることができました。
 難しいところもありましたが、分かりやすく構成されていたと思います。
 CSP、XSSCSS Injectionあたりを中心に学びました。
 当日は、ハンズオンが多くあり、実際に攻撃をしてみて理解を深めることができました。
 1つ1つの攻撃に対してハンズオンがあり、それぞれで理解を深めることができました。
 Webセキュリティを考えるうえで大事なことばかりだったので、この知識を忘れないようにしたいです。
 「攻撃と防御は裏表」という言葉は印象に残りました。そのために歴史を学んで、実践し、いかに防御していくかを考えていく癖をつけていきたいなと感じました。

4日目

B6 つくって学ぶ、インターネットのアーキテクチャと運用


 ネットワークのアーキテクチャについて実際に構築しながら学んでいきました。
 IPアドレスDNS、BGPあたりを中心にその動向やセキュリティ、運用方法が詳しく理解できました。
 特にBGPあたりの話では実際にどう運用されているのかが解説され、非常に興味深かったです。
 このあたりの知識は知っていると思っていても、まだまだ知らない知識が多かったので勉強になりました。
 ハンズオンでは、IPアドレスの設定やルーティングの設定などを行いました。
 普段、仮想環境を3つも立ててネットワークを構築してみるといった経験は中々できないので、実際にIPアドレスをふったり、ルーティング設定を通してネットワークの仕組みをより理解できたと思います。
 ハンズオンの時間が十分にとれず、少ししか進められなかったことは少し残念でした。
 自分でも資料を見ながらトライしてみたいなと思いました。

C7 車載LANの仕組みとメッセージの取得・解析

 自動車のセキュリティや車載LANについての講義を受けた後、演習用CANネットワークに対して解析や攻撃を行いました。
 自動車セキュリティに関しては以前から興味を持っていたので、その概要や最新の状況について知れて、非常に有意義な時間でした。
 演習では、CANメッセージを解析して、パケットの情報を読んだり、CANネットワークにメッセージを送ったり、スピードなどの任意のデータを出力させるスクリプトを書いたりと盛りだくさんな内容でした。
 途中には、実車(ポルシェ)を見にいったりもしました。実際にOBD-II端子にツールをつないでモータ回転数などが見えることが体感できました。
 家の車にもOBD-II端子はあるはずなので試してみたいなと感じました。
 いとも簡単に情報をとることや情報を書き換えることができていたので、セキュリティについて強く考えさせられました。
 車だけでなくIoT機器のセキュリティは、何でもインターネットにつながりつつある現代の社会では非常に重要な事項であると感じました。
 そのためにも、ハードウェア、OS、通信など幅広い知識を身につけていきたいと思います。

5日目

 グループワーク、講義の成果報告、閉会式と進みました。
 集中トラックや他のトラックに関する詳細について聞くことができて、どのトラックのお話も興味深かったです。
 リバースエンジニアリングゼミは特に面白く興味深かったです。
 無事に修了書もいただき、名残惜しいながらも無事に全過程を終えることができました。


グループワーク

 グループワークでは、「セキュリティ・キャンプ修了後にあなたが取り組むこと」というテーマでグループを作り、取り組みました。
 僕は、プログラミング初心者のためのコミュニティを作ろうということでグループで話し合いをしました。
 自分自身地方にいて、IT関係の勉強会は非常に少ないというのが現状です。
 そんな状態を少しでも変えたいなというのが、僕の大きな願いです。自分の地元でも勉強会を増やしていきたいという気持ちがあります。
 1人では、できることは少ないですが、今回の縁を大切にして色々と考えていきたいです。

戦利品

 初日にノベルティをたくさんいただきました。
 ラノベもあってビックリしました。
 協賛企業の方々ありがとうございます。


 また、4日目のラストナイトイベントでは本を頂きました。
 協賛企業の方々ありがとうございます!

食事

 全部は撮ってないですが、食事はこんな感じでした。どれもおいしかったです。

f:id:swamptk:20190821001200j:plainf:id:swamptk:20190821001203j:plainf:id:swamptk:20190821001212j:plainf:id:swamptk:20190821001227j:plain

その他

 宿泊部屋も1人部屋で非常に過ごしやすかったです。
 朝は油断すると寝坊するので、キャンプ前から規則正しい生活を送ることは大切です(僕は大丈夫でしたが、寝坊した人をn人見ました)
 名刺は、今回60~70枚ぐらいは配ることができました。
 初対面の人に話しかけるのは苦手ですが、頑張ったほうだと思います。個人的にはもっと交換したかったです。
 名刺交換の機会はいつあるか分からないので、常に持っておきましょう。帰りの電車の中でも交換することはあります。
 あと、パケットを読む機会が案外多かったので、Wiresharkの使い方とかパケットの読み方とか覚えておくといいかもしれません。

まとめ

 セキュリティに関して、素晴らしい講師から良質な講義を無料で受けられるセキュリティキャンプは最高でした。
 受講者の方とも色々なお話をさせていただき楽しかったです。
 同時に全く分からないことも多く、自分の勉強不足も痛感しました。
 今回受けた刺激を大切にして、これからも精進していきたいと強く思いました。
 色々な方とお話させていただき、たくさんアウトプットすることは大切だと感じたので、積極的に様々なことに挑戦していきたいです。
 このような機会は中々ないので、是非皆さんも挑戦してみてください。
 そして、今回のセキュリティキャンプに関わってくださった皆さん、本当にありがとうございました!

Raspberry Piで踏切を動かしてみよう (執筆中)

このページでは、2019年8月10日に実施されるクリエイティブキッズキャンプ ワークショップ
Raspberry Piで踏切を動かしてみよう」の詳細を解説します。(現在執筆中)

セキュリティキャンプ2019の応募用紙を晒してみる

こんにちは。テスト週間にも関わらず、久々にブログを書いているswampです。

この度、セキュリティキャンプ2019 バラエティトラックに参加させていただけるになりました!

www.ipa.go.jp


去年と同じくとても応募課題に取り掛かるのがギリギリになってしまい、推敲などしていないので、無理だろうなと思っていました。
そんな中、自分の番号を見たときは、嬉しくて体が震えました。

応募課題自体には、5日前ぐらいから取り掛かり始めましたが、中々上手く進めることができませんでした。
結局、締め切り当日の授業中に3つぐらいの課題をやってしまうという暴挙に出てしまいました。
間に合わないかと思いましたが、なんとか間に合わせることができました。

さて、他の方の応募課題の回答内容を見ていると、僕なんかがなぜ通ったのか分からないですが、自責の念を込めて回答内容を公開しようと思います。

来年以降に応募する方の参考になれば幸いです。

問1

本問題はシナリオベースの問題です。※登場する組織、プロトコルはすべて架空です。

とあるビルの空調メーカーは自社の制御プロトコルは以下の点から安全であると主張しています。

a.空調のプロトコルは独自であり、公開されていないため、攻撃されることはない。
b.万が一、空調がハッキングされても一時的に寒くなったり、熱くなったりするだけで命にかかわるものではない。
c.仮にエアコンが暴走しても、コンセントを抜けば停止することが可能である。

あなたはプロトコルを調査することにしました。
その結果、たしかに独自ではあったが、暗号化も認証も利用していないことがわかりました。

システム構成
[操作用PC] <--- NW(LAN) ---> [空調制御装置] <--- 独自物理線 ---> [エアコン/室外機]
 ↑ここからの送信されたパケットを取得
※NW=ネットワーク

問1(a)

以下のバイト列は2019年4月5日に「操作用PC」でキャプチャした通信内容(L7データ)です。
操作した内容とパケットを見比べて、解析を行い、わかったことを述べてください。
ヒント:IEEE 754、リトルエンディアン、CRCUNIX時間
例)いずれのパケットにも共通する箇所である最初の3バイトはASCIIに直すと「BEG」となっており、「BEGIN」の最初の文字と思われる。
恐らく、パケットの先頭であるということを示していると思われる。

【通信データ】
(1)エアコンの設定温度を28.0度に設定した際のリクエストパケット
42 45 47 08 0A A7 5C 08 00 00 04 00 01 00 00 E0 41 45 4E 44 20 50 A8 F3
(2)エアコンの設定温度を19.5度に設定した際のリクエストパケット
42 45 47 3A 0A A7 5C 08 00 00 04 00 01 00 00 9C 41 45 4E 44 DA 66 22 70
(3)風の強さを5段階の一番強くした際のリクエストパケット
42 45 47 C2 0C A7 5C 05 00 00 04 00 03 05 45 4E 44 06 C7 07 12

回答

1.各パケットの最初の3バイト
例にもある通り、いずれのパケットにも共通する箇所である最初の3バイト「42 45 47」を、ASCIIから文字列に変換すると「BEG」となった。これは「BEGIN」の最初3文字であると考えられる。よって、この「42 45 47」は、パケットの先頭を意味していると考えられる。

2.各パケットの4バイト目から7バイト目
各パケットの4バイト目から7バイトのデータ、すなわちデータ(1)では「08 0A A7 5C」、(2)では「3A 0A A7 5C」、(3)では「C2 0C A7 5C」については、UNIX時間を示していると考えられる。
2.1 UNIX時間と使用目的
UNIX時間とは、コンピュータシステム上で表現される時刻表現の1種である。すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数を示している。[1] このUNIX時間は、何年何月何日何時何分などの単位ごとに時間を表現せずに、32bitの2進数(全て正の整数)で時刻を表現している。もし、単位ごとに区切って表現していたならば、今よりパケットの数が増えるため通信量が多くなるという欠点が考えられる。また、世界中どこでもUNIX時間は、UTCを基準とした1つの正の整数である。日本が19時でロンドンが11時でもUNIX時間で表現すれば1つの数字である。この空調が日本だけでなく海外でも使用するならば、プロトコルの変更を伴わずに利用できると考えられる。もし、単位ごとに区切って表現していたならば、それぞれの時刻は異なるので、日本の時刻にあったプロトコル、イギリスの時刻にあったプロトコルを別途書かなければならず、非効率的である。また、想定していない攻撃が起こってもプログラムの保守範囲も広くなるのでセキュリティ対策が追い付ないと考えられる。よって単位ごとに時刻を表現して送信するよりも適しているため使用されていると考えられる。
2.2 パケット内でのUNIX時間
このパケットは、設問より2019年4月5日に通信されたことが分かっている。それを日本時間と仮定するならば、2019年4月5日0時0分0秒をUNIX時間(16進数)で表すと、「5CA61BF0」である。2019年4月5日23時59分59秒をUNIX時間(16進数)で表すと、「5CA76D6F」である。よって2019年4月5日のUNIX時間は、「5CA61BF0」から「5CA76D6F」の範囲であると考えられる。データ(1)では、「08 0A A7 5C」では、そのまま文頭から読むとUNIX時間は、1974年04月11日21時38分52秒であり、この部分はUNIX時間を示していないように見えるが、これを反対から読むと「5C A7 0A 08」である。これは上述した4月5日のUNIX時間の範囲である。実際にUNIX時間に変換すると、2019年04月05日16時55分52秒となった。データ(2)については、「3A 0A A7 5C」を反対から読んで「5C A7 0A 3A」をUNIX時間に直すと2019年04月05日16時56分42秒となった。データ(3)については、「C2 0C A7 5C」を反対から読んで「5C A7 0C C2」をUNIX時間に直すと、2019年04月05日17時07分30秒となった。
2.3 リトルエンディアン
 2.2節では、パケットを「反対から読む」と表現したが、この表現は正確ではない。データ(1)、(2)、(3)のパケットはリトルエンディアンで書かれているという表現が正しい。リトルエンディアンとは、最下位ビットが属するバイトを低位のアドレスへ格納していくバイト順序(バイトオーダ)の方式である。キャプチャすると、「順序が逆になって出てくる」という特徴がある。[2] 例えば「12345678」(16進数)をリトルエンディアンで表現すると考える。リトルエンディアンで表現するときは、1バイト(8ビット)単位で考えるため、最下位バイトは78となる。よって「78563412」と表現するのが正しい。データ(1)について、本来のUNIX時間を16進数で示すと「5C A7 0A 08」であった。これを今説明したリトルエンディアンで表現すると、「08 0A A7 5C」となり通信データパケットに一致している。よってリトルエンディアンで表現されていたことが確認できる。データ(2)、(3)についても同様である。通常のプログラム作成においては、このようなバイトオーダを気にする必要はないが、今回のようにバイト順序が異なるコンピュータ(プロセッサ)間でデータをやり取りするネットワークプログラムでは非常に重要な考え方である。[3] 具体的には、操作用PCはLANを通してネットワーク通信を行い空調制御装置に接続している。操作用PCと空調制御装置は別のコンピュータでありアーキテクチャも異なる。それらの通信においてはバイト順序を意識しなければならない。

3.各パケットの8バイト目から11バイト目
 この部分の詳細はこのパケットからは断定できない。しかし、何らかの制御情報であると推定される。「08 00 00 04」の場合はエアコンの設定温度の変更を行うことを示し、「05 00 00 04」の場合は風の強さの制御を行うことを示していると考える

4.各パケットの12、13バイト目
 各パケットの12、13バイト目は、どのような操作を行うかを指定していると考えられる。エアコンの設定温度を変更であれば、「00 01」、風の強さの制御であれば「00 03」を示している。

5.設定温度の表現
 データ(1)、データ(2)では28.0℃や19.5℃といった設定温度の表現を行っている。 データ(1)、データ(2)では14バイト目から17バイト目の4バイトがそれにあたる。まずデータ(1)では「00 00 E0 41」である。このパケットもリトルエンディアンで書かれていると予想されるので、実際のデータとしては「41 E0 00 00」であると考えられる。これは、IEEE754という、多くのプロセッサなどのハードウェア、またソフトウェアに実装されている浮動小数点数の計算で最も広く採用されている標準規格で記述されている。[4] 10進数の28.0をIEEE754の単精度浮動小数点形式というコンピュータ内部での小数点の表現形式で表した結果を16進で示すと、「41 E0 00 00」になりパット内のデータと一致していることが分かる。データ(2)でも同様に19.5をIEEE754の単精度浮動小数点形式で表した結果は、「41 9C 00 00」であり、これは、「41 9C 00 00」をリトルエンディアンで表現した、データ(2)のパケット「00 00 9C 41」と一致している。よって、設定温度は、パケットの14バイト目から17バイト目にIEEE754の単精度浮動小数点形式のリトルエンディアンで記述されていることが分かる。

6. 風の強さの表現
 データ(3)の14バイト目では、風の強さが5段階で一番強い、すなわち「5」という状態を「05」で示していると考えられる。

7.END命令
 いずれのパケットにも共通する箇所である「45 4E 44」(データ(1)、(2)では、18バイト目から20バイト目、データ(3)では15バイト目から17バイト目)を、ASCIIから文字列に変換すると「END」となった。よって、この「45 4E 44」は、パケットの命令の終了を意味していると考えられる。

8.各パケットの最後の4バイト
 最後の4バイトは、ヒントにある通りであれば、CRC符号なのだろうが、どのような使い方をされているのか特定できなかった。

参考文献
[1] 「UNIX時間」『フリー百科事典 ウィキペディア日本語版』(最終閲覧日:2019年5月22日) https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93
[2] 「バイトオーダ - ビッグエンディアン/リトルエディアン」『ERTL組込みリアルタイムシステム研究室』2003年11月20日更新(最終閲覧日:2019年5月23日)http://www.ertl.jp/~takayuki/readings/info/no05.html
[3] 大滝みや子、岡島裕史『平成28年度[春期][秋季]応用情報技術者合格教本』株式会社技術評論社,2016年,p.134
[4] 「IEEE 754」『フリー百科事典 ウィキペディア日本語版』(最終閲覧日:2019年5月27日)https://ja.wikipedia.org/wiki/IEEE_754

問1(b)

問a.の回答をもとにエアコンの設定温度を30.0度に設定するためのパケットを生成してください。
答えが導き出せなかった場合はわからなかったことを記入してください。

回答

2019年5月27日の11時40分0秒に「操作用PC」でキャプチャした通信内容(L7データ)のパケットであると仮定する。パケットは問aの解析結果から、以下のように生成できると考えられる。

42 45 47 00 4E EB 5C 08 00 00 04 00 01 00 00 F0 41 45 4E 44 ?? ?? ?? ??

BEGIN UNIX時間 制御コード 温度(IEEE754単精度表示) END CRC符号 の順で記載している。
??の部分は、CRC符号の部分であると考えられるが、与えられたパケットからどのようにCRC符号を生成しているのか分からなかったため、書くことができなかった。

問1(c)

とある空調メーカーの主張で誤りと感じた部分を指摘してください。

回答

1. 独自の空調プロトコル
「a.空調のプロトコルは独自であり、公開されていないため、攻撃されることはない」と主張しているが、根本的に間違っている。まず空調のプロトコルが独自であることは必ずしも安全ではない。確かにプロトコルが独自であれば、外部から見れば、それがどのように動いているか分からない。それはどこを攻撃すればよいのかを不明にしているという見方もできるかもしれない。しかし、一つ脆弱性が見つかれば、その脆弱性からシステムを攻撃できる。プロトコルが独自であるということは、それを作った人、会社しか修正するのはできないということだ。ということはその脆弱性を修正できる人数は少ないので、脆弱性により大きな攻撃が起こったときは修正に時間がかかり、脆弱性の影響が大きな範囲に広がる可能性があるまた、動きがブラックボックス化しているということは、修正も非常に困難になる。もしも、その独自プロトコルを作った人が会社を辞めていたり、仕様書を紛失していたりすれば、そのプロトコルアーキテクチャが不明になり、ソースコードのみから脆弱性を探すことになり、時間がかかるし、どこが原因か分からなくなるということになるかもしれない。よって独自プロトコルを使用することは危険であると考えられる。次に、公開されていないから攻撃されることはないというのも間違いである。公開されていなくても暗号化されていないので設問1で解析を行えたように、パケットの中身からアーキテクチャを予想することもできる。よってそれを利用して攻撃することは容易に可能であるといえる。また、公開されていなければ、それを修正できる人も少ないということであり、脆弱性の影響範囲を広げることになる。「独自のプロトコルで公開しない」のではなく、「ある程度安全が保障され標準化されているプロトコルで公開されているもの」を使うべきだと考える。

2. 空調がハッキングされた場合
「b.万が一空調がハッキングされても一時的に寒くなったり暑くなったりするだけで、命に係わるものではない」とあるが、これも間違っている。例えば、夏に高温で暖房をつけるようなハッキングをした場合、熱中症で室内の人が倒れるかもしれない。特に高齢者であれば温度変化に気づかないこともある。また、あまりにも高温の温度を指定した場合、火事になる危険性もある。また、ヒートショック死の危険もあると考えられる。意図的に温度を急激に上げたり、さげたりをすれば、温度変化が大きくなり、体に負担を与え、死に至ることがある。

問1(d)

同システムがハッキング可能であった場合、考えうる最悪のシナリオを書いてください。
例)ビル全体の冷房をガンガン入れて、電気代を高額にする。

回答

 想定している最悪のシナリオは、問cでも述べた通り、人が死亡することではあるが、既に述べたので、ここでは他のシナリオ(2番目に最悪なシナリオ)について解説する。
 ハッキングが可能になれば、エアコンを自由自在に操作することができる。もしも、この空調に人の動きを感知して空調を変えるといったようなシステムがついていたならば、このシステムをハッキングすることによって様々なシナリオを想定できる。
まず電気会社が悪用できる。人の気配を感知することができるので、部屋に人がいない時に、空調を意図的に動かし、莫大な電気代に儲けることができる。部屋に人がいないときを狙うので、誰にも気づかれない。空調がついていたならば、部屋に入ってきたら気づくだろうと思うかもしれない。しかし例えば夜間なら人がいなくなる時間、そして早朝人が来る時間は分かっているのでその間に外気温などを考慮して温度を調節すれば気づかれることはないはずだ。また、毎日ではなく数か月に1回などにしておけば、誰かが空調を切り忘れたとしか思わないだろう。
また空調メーカーも悪用できる。意図的に空調を動かし続ければ、それだけ空調の寿命が短くなるということになる。例えば通常の使い方をすれば、10年以上壊れることがないのに、5年で壊れるように、気づかれずに空調を動かすことも可能であると考える。そうすれば空調メーカーに対して新たな注文、修理依頼が発生し、儲けることができる。本当は、10年以上壊れることはないのに、そのような攻撃をすることを前提にして発売し、カタログにも5年程度で壊れると記載すれば、誰も気づくことはない。そして、それは、空調を意図的に壊す攻撃が見つかった時にも悪用し、稼ぐことができるだろう。

問2

いままで作ったもの(ソフトウェア、装置、システム、組織、など何でも)で自慢したいものがあれば教えてください.その中で、何かあなたのプログラミングのスキルを推し量るエピソードがあれば書いてください.

回答

① ポモドーロタイマーの作成
JavaFXでのGUIプログラミングを授業で学び、自由製作課題でポモドーロタイマーを作成した。今までCUIでしかプログラムを作った経験がなかったが、実際に自分がコンピュータで使われているボタンなどの機能を作成することはとても興奮することであった。コードなどは、GitHubに公開している。(https://github.com/KeisukeSawa/PomodoroTimer) 他の人は、ゲームなどを作っている人が多かったが、私は、実用的に役立つものを作りたいという強い思いで、PCで動作するポモドーロタイマーを作成した。タイマー動作中に画面を真っ黒にして、PCの動作を困難にするといった機能を盛り込んでいる。これは、私自身が勉強中にPCが目の前にあるとついPCを触ってしまうことがあったからだ。自分の不便だということを解決できたソフトウェアの一例だと思う。今後は、自分の利便性だけでなく他の人の利便性も考えて改良を重ねていきたい。自分でコードを組んでソフトウェアを作ることはとても楽しくも難しいことだった。この経験を苦労したことや、やっておけばよかったこと(Githubの活用、分からないことの調べ方など)は現在も生かすことができている。また、これからもこの知識を生かして社会の役に立つものをこれからも作っていきたいと思っている。

② Wiiリモコンを利用したシューティングゲーム
 弊学校の学園祭において、来場した人に楽しんで帰ってもらえるように企画している「メイン企画」において、Wiiリモコンを用いたシューティングゲームの開発を行った。内容は、トロッコに乗り込み、進んでいくような画面を作成し、その中で、Wiiリモコンを操作し、AボタンやBボタンを押すことによって、向かってくる敵を攻撃し、最後にボスであるドラゴンと対決するという内容だ。
 3人で開発を行い、私は、ゲームプレイ中に風を起こす扇風機とUnityとの連携や、WiiリモコンとUnityの連携、得点計算など広範囲のプログラムを1人で担当した。大規模なゲームの開発は初めてだったが、ゲームのコア部分を担当させていただき、ゲームの完成に大きく貢献でき、とてもうれしかった。
 技術的には、Unity、BlenderArduinoなどを用いました。お客さんから見えるUI部分には、Unityを使用し、キャラクターなどには、Blenderを利用した。Unityでは、C#を使用してプログラムを記述した。扇風機との連携には、Arduinoを利用した。UnityとArduinoを連携させ、ゲームがスタートしたら、扇風機を作動させ、敵に当たってしまったら扇風機を止めるというプログラムを書き、扇風機の制御を行った。複数台のWiiリモコンとUnityを連携させることが非常に難しかったが、UnityWiimoteというライブラリを利用し、解決した。
UnityWiimoteは、もともとWiiリモコン1台を想定したライブラリだったが、プログラムを参考に、Wiiリモコン制御部分を解析し、該当部分の変数名を変えて複製することで、複数台制御にも対応できるようにした。詳しくは、次のページに記載している。URL:http://swamptk.hatenablog.com/entry/2018/01/21/192414 
 また、学園祭で、子供を含む不特定多数の人がプレーすることをふまえ、プログラムからも安全対策を行った。プレイヤー全員が準備をして、全員同時にAボタンを押したら、スタートするという仕組みを採用したが、それでは、まだ安全にゲームがスタートできる状態でないのにプレイヤーが誤ってAボタンを押してしまい結果的に思わぬ事故につながってしまう可能性があった。対策として、管理者用リモコンを用意した。係員がプレーをスタートできる状態かどうかを確認したうえで、プレイヤーと係員双方がAボタンを同時に押すことでゲームがスタートするというプログラムを書いた。私は、このような安全対策もアトラクションゲームに必要不可欠と考えており、一種の「セキュリティ」だと考える。細かなところだとは思うが、これからも「安全」や「セキュリティ」に気を付けてソフトウェアを作成したいと考えている。

③ FullerとFirebaseを利用した定期テスト範囲共有アプリ
 某社のインターンシップで、FlutterというiosとAndoroidアプリが1つのコードで開発できるクロスプラットフォーム開発ツールと、リアルタイムデータベースやユーザ認証などが簡単に行えるモバイル開発のためのプラットフォームであるFirebaseを用いて定期テストの範囲を簡単に共有できるアプリの作成を行った。コードなどは以下のGithubに公開している。https://github.com/KeisukeSawa/test-write このインターンシップでは、会社からやることを指定されるのではなく自分が好きなアプリを作ってもよいということだったので今まで作りたかったアプリを作成することにした。このアプリを作ろうと思ったきっかけは、私がクラスの後ろの黒板に3時間ぐらいかけて、テストの範囲を書いていたからだ。それは、手間がかかりどうにかしたいと考えていた。そこで、Webページでのテストの範囲の共有をしたが、これでは作成者である私しか編集ができず、間違いがあったときなどに不便だった。そこで、皆で共有してテストに関する情報の書き込みや編集ができるアプリを作成しようと考えた。機能としては、チャット形式で試験範囲や科目の情報を共有できるようする機能を付けた。誰でもチャットに投稿、編集が可能にしている。そして、全ての科目、試験に対応可能とした。FlutterやFirebaseは、まだ発展途上の技術で日本語情報が少ないため、英語で情報収集することや今まで書いたことがないDartという言語に苦労したが、今までの経験を活かし、インターンシップの4日間という非常に短い期間でアプリの大方の機能を完成させることができた。

④ ARアプリの作成
 弊学校の学園祭において、来場した人に楽しんで帰ってもらえるように企画している「メイン企画」において、用意されている画像にタブレット端末をかざすとコンテンツが浮き出るようなARアプリを作成した。技術的にはUnityとVuforiaというライブラリを使用して作成した。マーカーによって出てくるキャラクターやその動作が変わるというような動作をするようにプログラムを行った。制作期間は1週間という短い期間でかつ、ARアプリの作成経験は一切なかったが、これまでの経験を活かし実現することができた。

問4

今後、人工知能はセキュリティ分野でどのような役割を担うか?あなたの予想と共に、そのメリットとデメリットを記述してください。

回答

今日、PC、スマートフォンタブレットなどの情報端末以外にも、身近な家電などもインターネットに接続されるようになってきた。いわゆるIoTが様々なところで活用されつつある。すなわち、これはありとあらゆる場所でサーバー犯罪が起こる可能性があるということを意味している。これからも「守らなければいけない対象」は増え続ける。よって、人間には限界があると考えられる。今後、人工知能がセキュリティ分野で大きな役割を果たしていくことになると考えられる。

1.人工知能とは
 人工知能とは、様々な定義の仕方があるが、ここでは、「言語の理解や推論、問題解決などの知的行動を人間に代わってコンピュータに行わせる技術である。[1]」という定義を用いることにする。この定義に基づけば、人間の知的な行動を人間に代わって行うことが人工知能の役割になっている。では、人工知能が得意な不得意なことはどのようなことなのだろうか。この定義にある「推論」とは、「知識をもとに,新しい結論を得ること」である。[2] 人工知能は、多くのデータを収集し、それを学習させ、推論することで結論を導いている。この多くのデータを「学習」させること、すなわち人工知能をよりよく使えるものにするためには、多くのデータが必要であるということである。大量のデータから答えを導き出せるものであれば、人工知能が大いに活躍できるはずであり、人工知能の得意な部分である。物事を解析すること、すでにあったことを検知することなどは得意であろう。しかし、逆を言えば人工知能に十分なデータを与えられないことや人工知能が新たな創造をすることは苦手であるといえる。人工知能にはまだ「0から1を生み出す」ことができていないのである。

2.人工知能のセキュリティ分野での役割
 人工知能は1章で述べた通り、大量のデータから答えを導きだせるものであれば、非常に有用な働きをすると考えられる。メールなどによる標的型攻撃、ランサムウェアによる攻撃など現在行われている多くのサイバー攻撃は既知のものが多いため、そのデータを人工知能に学習させることで、人工知能が、「攻撃されている」といったことを自ら「認識」することができる。攻撃を認識した後も、その攻撃に対する適切な対策も学習させておくことで、その攻撃に対し、人工知能が適切な「防御」を行うことができると考える。例えば、標的型攻撃に対して、添付ファイルを検査しウイルスと断定できたなら人工知能がそのメールを破棄し、それが送られたメールアドレスをブロック、IPAなど適切な機関に報告するという一連の対策を自動的に行うことができる。万一、標的型メールを開いてしまった場合でも、人工知能がいち早くそれを認識し、そのコンピュータをネットワークから遮断することもできると考える。このように幅広い範囲でサイバー攻撃に対する「認識」と「防御」を行うことが今後のセキュリティ分野での人工知能の役割の1つになるのではないかと考える。

3.人工知能がセキュリティ分野に及ぼすメリット
 人工知能がセキュリティ分野に及ぼすメリットの1つは、人工知能同士がつながりリアルタイムで連携できるようになるところである。1節で人工知能は、データが与えられていないようなもの、すなわち未知の攻撃には対処しきれないということを記述した。しかし、コンピュータに対して異常をきたす未知の現象を人工知能が検知すれば、それはサイバー攻撃として認知される。現在新たに認知された攻撃をアンチウイルスソフトなどに適用させようとするとセキュリティパッチが必要であり、ある程度の時間がかかる。しかし、人工知能が新たな攻撃を認知すれば、その情報を瞬時にインターネットを通して他の人工知能にも学習させることができる。すなわち常に最新のセキュリティ情報を人工知能は得ることができるのだ。このように人工知能がインターネット上でつながることで、リアルタイムで連携することができるので、でサイバー攻撃に対する被害を最小限にすることができる社会になると考えられる。
 また、そのコンピュータやネットワークがどのような目的(例えば個人での利用目的なのか、会社など組織でのビジネス目的なのか)によって起こり得る脅威も別のものになる。人工知能が利用目的を認識すれば、その利用目的に応じた適切な「対策」を自動的に行えるというメリットがある。現状、セキュリティ人材を確保しておらず、攻撃にも適切に対処しきていない個人所有のコンピュータやネットワーク、ITを専門としない企業(特に人が少なく情報を司る部門がない中小企業など)などで人工知能を導入すれば「認識」「防御」「対策」を全て自動で行えるため、サイバー攻撃に対するセキュリティ対策として有用なものになると考えられる。セキュリティ人材の不足にも人工知能が対応できるというメリットがあるのだ。だだし、次章で述べる通り、100%人工知能を信頼しすぎてはならない。

3.人工知能がセキュリティ分野に及ぼすデメリットと対策
 人工知能をセキュリティ分野で活用するデメリットの1つとして、サイバー攻撃から守るはずの人工知能に対して攻撃が行われる可能性があるという点があげられる。人工知能を現在発覚している手法で攻撃しようとしても、解析が得意である人工知能システムは、「攻撃されている」ことを自ら解析し自ら防御できると考えられる。しかし、人工知能に対する「入力と出力」から人工知能脆弱性を発見される可能性もある。具体的な例を挙げると、まず、人工知能が意図しないであろうデータを「入力」する。意図しないであろうデータとは、例えば、音声データの数箇所の周波数を意図的に高くしたり低くしたりしたデータ、乱雑な文字列にしたデータなどがあげられる。そして、そのデータに対して、人工知能が解析を行った情報を「出力」させることで、その人工知能システムの脆弱性を知ることができる可能性がある。もし、乱雑な文字列の入力でエラーが出たのなら、乱雑なデータを与え続けることでシステムを攻撃することができるということが容易に想像できる。つまり、「入力と出力」によって人工知能の弱点を探し、見つかった弱点を中心に攻撃していくことで人工知能システムへの攻撃ができるのである。
 このデメリットを克服するためには、「人間」の役割が重要なものになると考える。具体的には、具体的には、人工知能の「入力と出力」を定期的に調べるという新たな仕事を作ればよいと考える。その人工知能にどのような「入力」がされてどのように「出力」したのかをログでチェックしたり、テストデータを使って分析することで、未然に人工知能の弱点を発見することができ修正をすることができる。そしてそのデータを蓄積し、新たに人工知能に対し学習させることで新たな攻撃の形の発見にもつながると考えられる。

4.まとめ
 今後、セキュリティ分野で、人工知能は、幅広い範囲でサイバー攻撃に対する「認識」と「防御」そして、その「対策」を行っていくという役割を果たすと考えられる。そして、その人工知能はますます発展を続けていくと思われます。しかし、人工知能を信頼しきって人間が何もしなくなってしまったら人工知能がいざ攻撃されたときに適切な対応ができません。定期的に「人間」がチェックすることがセキュリティを維持することの最も大切なことだと考える。

参考文献
[1] 「人工知能」『ASCII.jpデジタル用語辞典』(最終閲覧日:2019年5月26日)
http://yougo.ascii.jp/caltar/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD
[2] 人工知能学会「人工知能って何?」『What’s AI』(最終閲覧日:2019年5月26日)https://www.ai-gakkai.or.jp/whatsai/

問7

ある個人が自分だけで使用しているPC(OSは適当に決めてください)に保存されている情報、例えば特定の文書ファイルやデータなどにしか記録されていないはずの情報が、インターネット上の掲示板に1ヶ月前から掲載されていることを知りました。この情報がどうやって漏洩したか、PCの状態、さまざまなログやファイル、ルータの通信記録などから推察する手順をできるだけ多くの条件を想定して示してください。

回答

ある個人が自分だけで使用しているPCのOSをWindows10として話を進める。
① Windows10では、MicrosoftアカウントでOne driveというクラウドサービスを自動的に導入している場合がある。すると、自分のエクスプローラーの中の「ドキュメント」や「ピクチャ」といったフォルダに漏洩した特定のファイルやデータがあった場合、自分が意識していないうちにOne driveに共有されていてそのOne driveにアクセスするためのMicrosoftアカウントが盗まれて漏洩した可能性が高い。
② netstatなどを用いてsshTCP/IPのポートが空いていないかを調べる。もし、どこかのポートが開放されていたら、そのポートからコンピュータに侵入された可能性がある。
③ アンチウイルスソフトなどでスキャンし、ウィルスが無いかを調べる。ウィルスがあった場合はそのウィルスが原因である可能性が高いので、それがどんなウィルスなのかを調べる。そして、ウィルスの入手経路を調べる。インターネットの通信履歴で、いつ、どんな経路で入手したのか調べる。また、標的型メール攻撃である可能性もあるので、不審なメールがなかったかを調べる。
④ そのコンピュータが接続しているルータのログを調査する。そのログの中で1か月前からのログを見て、漏洩したファイル名やそのパス、そのファイルの内容などでフィルタリングを行い、いつ漏洩したかやどこのIPアドレスに対して漏洩したのかを特定できる。
⑤ そのコンピュータを公衆Wi-Fiに接続していた経験がある場合はそこで漏洩した可能性が高い。一般的に公衆Wi-Fiは暗号化されておらず、コンピュータの設定によっては公衆Wi-Fiに接続されているコンピュータに表示されることもある。その情報をもとに攻撃された可能性がある

問8

CTFでこういう問題を作ってみたい、というのをなるべく具体的に挙げてください。

回答

仮想記憶に応用できる手法である「Copy on Write」を使った問題を作ってみたい。「Copy on Write」とは、簡単に言えば、アドレス空間のコピーを必要になるまで遅らせる技術である。あるプロセスを実行する際は、物理アドレス空間にマッピングされるが、それが同じプログラムであれば、同じ領域はコピーしても意味がない。しかし、プログラムの内容は同じでも、スタックやヒープの値は異なる場合がある。その際、プログラムのデータは二次記憶装置に1つしかマッピングしてなくてもよいが、スタックやヒープは異なる場合があるので、物理アドレス空間に複数マッピングしなければならない。しかし、今ある2つの同じ内容のプロセスが2つとも動くことは保証できないし、実行のためにforkシステムコールなどで子プロセスを作ってもexeveシステムコールで新しいプログラムを実行してしまいコピーしたアドレス空間の意味がなくなる。よって、それを防止するために同じプログラムのスタックやヒープ領域に書き込みが起こったらはじめて物理アドレス空間をコピーする仕組みを作る。よって、不必要なCopy on Writeを繰り返すことで、物理メモリを参照していき、その中からフラグを回収していくという問題を作ってみたいと考える。



総文字数としては、13000字ぐらいでした。
個人的には、問7や問8はもう少し推敲して詳しく書きたかったと思っています。
今回は、プログラムを一切書かずにパケットの解析もWebに転がっているツールを使ってやってしまいました。
他の方が行っているようにもう少しプログラム書いて解析したかったなと思います。

僕のように、そんなにプログラム書いていなくても、選考を通過することができました。
技術力よりも、筋道がたった論述がされているかであったり、技術に対する熱意などが見られているのかなあと感じました。
(ただし、僕にそれがあるのかは分かりませんが)

何はともかく、参加させていただけると決まったので、この機会を十分生かせるように精進していきたいです。

flutter doctorして X Flutter plugin version 12.1 - the recommended minimum version is 16.0.0 が出るときの対処法

 インターンでFlutterに触れて、Flutterを使っていこうと思っているswampです。

 そもそもFlutterって何という記事はいつになるかは分かりませんが、今度書こうと思います。

 自分のPCでもFlutter使いたくて入れようとしましたが、中々上手くいかなかったので、やり方を共有しようと思います。
 普通の方は、以下の公式ドキュメント通りやれば上手くいくと思います。
 詳細は解説しないので、初めての人は以下をご覧ください。
flutter.io

 1.環境
 ・Windows10
 ・AnfroidStudio
 を用いて行います。

 2.僕が陥った過ち
 公式のドキュメント通りFlutterをgit cloneして、環境変数を追加して、
 AndroidStudioにFlutterのプラグイン入れればすぐ終わるだろうと思っていました。
 しかし、見通しは甘かった。
 AndroidStudioのTOP画面に出るはずの「Start a new Flutter Project」が出てこないのです。

 3.原因
 flutter doctorコマンドで原因を探ると以下のように出てきました。

>flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel beta, v0.7.3, on Microsoft Windows [Version 10.0.17134.285], locale ja-JP)
[!] Android toolchain - develop for Android devices (Android SDK 25.0.3)
    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses
[√] Android Studio (version 2.3)
    X Flutter plugin version 12.1 - the recommended minimum version is 16.0.0
[!] VS Code, 64-bit edition (version 1.25.1)
[!] Connected devices
    ! No devices available

! Doctor found issues in 3 categories.

 なんなんだこれは?と1日ぐらい考えて、
 AndroidStudioを最新バージョンではなかったことが原因だとわかりました。

 4.AndroidStudioのアップデート
 [Help] -> [Check for Update] 
 もしくはAndroidStudioのTOPページの [Cofigure] -> [Check for Update] で指示に従うとアップデートできます。

 5.アップデートした後
 FlutterのプラグインをUninstallして、もう1度インストールし直しましょう。
 その後、AndroidStudioのTOPページの下部にある[Event]というところをクリックするといろいろ出てくるので、すべての指示に従います。
f:id:swamptk:20180917005840p:plain
 
 そしてAndroidStudioの再起動を行えば、「Start a new Flutter Project」が出てくると思います。
 f:id:swamptk:20180917010118p:plain
 
 5.まとめ
 FlutterとAndroidStudioを使う時は、ちゃんと最新版にアップデートしてから使いましょう。