お腹.ヘッタ。

関数型とかセキュリティとか勉強したい。進捗つらぽよ

今日から始めるXDPと取り巻く環境について

はじめに

この記事はBBSakuraNetworkアドベントカレンダーの5日目です。

自分はBBSakuraでアルバイトをしている大学生です。 さくらでバイトをしていたところ気がついたら出向していて今はコアモバイルの開発に携わっています。アルバイトに出向ってあるんですね。びっくり。 今はB3なのでそろそろ大学で研究しないといけなくて焦りを感じてます。

さて、今回話すのは自分の趣味の話をします。 eBPF と言われるパケット処理のための処理技術があるのですがそれが好きで、最近はBPFを利用した高速パケット技術の手法としてXDPを追いかけています。今回はそれを始めるにはどうすればいいかをみたいな話を紹介したいと思います。

対象読者としては高速パケット処理をやりたいけど、どうすればいいかわからない!って人をターゲットにしてます。始めるときにみると手引きみたいなknowledgeを目指します(自分向けのメモぽさがあるな) 書かない話としてはパケット高速化についての細かい手法は話しません。(むしろ良さそうなのがあれば教えて欲しい)

とは言っても界隈では有名な yunazunoさんやhigebuさん、YutaroHayakawaさん、がいい感じの記事や話をしているので(興味を持ったらこの人たちをウォッチすべきです!)そちらを見ておけば大体入門できるんですが、とはいえ自分なりに基本的な導入とはじめにつまづいた事とか最近の界隈の話をしようかなと思います。

雑にXDPを理解するための概要

XDP(eXpressDataPath)はLinuxカーネルで動く高パフォーマンスのプログラマブルデータパスです。 sk_buffというデータ構造の割り当てをする前に直接データをBPFを使ってカーネルランドで処理をすることで高速な通信を実現しています。

どれくらい早いかというとこんな感じです。

cf. https://people.netfilter.org/hawk/presentations/xdp2016/xdp_intro_and_use_cases_sep2016.pdf

XDP自体の詳細はリンク先の論文を参照してください。

以下の画像は論文より抜粋した画像です。 具体的な処理の場所はXDPと書いているところで、他に関係するところは基本的に水色の部分がXDPに関係してきます。

確かにカーネルランドにあるデバイスドライバーで真っ先にパケットを受けているというのがわかると思います。

BPFとは

BPF(BerkeleyPacketFilter)というパケットフィルタ機構です。これはカーネルランドで高速にパケットを処理することができるコアの機構です。今回のXDPのコアでも利用されている機構でもあります。

この部分は誤解を恐れずに説明するとパケット処理専用のCPUをカーネルランドでエミュレートしたようなもので、MIPSに近い命令セットを持ったVMが存在しています。これらはtcpdumpなどで現在も使われている機能です。

近年ではこれらはLinuxにおいて拡張されてe(xtend)BPFと呼ばれるようになり、パケットのみならずSeccompなどのシステム間のセキュリティ機構として使われるようになり、またトレーサーとして使われています。

今回はネットワークにおいての利用の話をメインでしていきます。実行のイメージとしてはこのような形になるはずです

eBPF Map

eBPFMapというのはBPFがユーザーランド等とやりとりしたい時に使えるテンポラリーなデータ領域のことを指します。平たく説明すると共有で使えるKeyValueなテーブルです。

イメージとしてはこのような感じです。 image alt cf. https://qiita.com/sg-matsumoto/items/8194320db32d4d8f7a16

そこにはeBPFがeBPFMapに書き込んでユーザーランド側でその情報を得たり、その逆でユーザーランドからそこに書き込んだり、またeBPFがeBPFにパケット情報などを処理を渡すこともできます。 XDPもカーネルランドで動作していることからユーザーランドとやり取りすることができません。そこでBPFの機能となってるeBPFMapを使ってユーザーランドとやり取りをします。具体的なユースケースはNFVやLBのサービスの登録などで利活用されます。

Generic XDP

パフォーマンス上の理由から、XDPの処理はsk_buff(linuxのネットワークスタックに使われるソケットバッファー)が割り当てられる前にデバイスドライバーから直接呼び出されます。このことは先程のXDPのアーキテクチャの画像から理解できるとおもいますが、ということはXDPの動作にはデバイスドライバー側でのサポート対応が必須ということが言えます。

しかしながらまだまだ未対応のNICドライバーが殆どです。そこでXDPをどの環境でも使えるGenericXDPというモノがlinux kernel4.12に導入されました。速度は出ませんが開発等では非常に有用です。

利活用例

facebook: katran

facebookが社内のデータセンターで利活用しているL4LBです。以前はIPVSを利用していたのですが、自作するようになりました。

特出してるところはL4LB部分で以下の事柄です。

lineでも L4LBを自作し同じようなことをしていますのでそちらも合わせてみると良さそうです(リンクは後述する)

cilium

これはサービスやコンテナ間の通信をセキュアかつ負荷分散を高速にするために作られたフレームワークです。k8sなどのオーケストレーション上で動かすことを想定しています。

cloudflare: L4Drop, XDP DDoS Mitigation

cloudflare が行っているもので、XDPを使ってDDoS緩和をしています。 方針としてはXDPを後述するtail_callという方法で多段におきます。そしてサンプルを抽出し、解析をして その結果をgatebot と呼ばれるルール注入装置に渡してdropするかを判断するルールをXDPに注入します。 - cf. https://netdevconf.info/2.1/papers/Gilberto_Bertin_XDP_in_practice.pdf

- https://blog.cloudflare.com/l4drop-xdp-ebpf-based-ddos-mitigations/

これは実際にプロダクションとして稼働していて、毎秒800万パケット以上をドロップを一台で達成しているそうです。

ミクシィ、Static NAT

Global <-> privateの静的NATに利用してるらしい cplaneはgRPCで動いているコントロールサーバーがある。

12Mppsぐらい処理ができる。またパケットのコレクターとしても利用している。 ハマった課題については大規模なバックボーンを持たないと起きないことが書いていて一見の価値があります。

interop tokyo, end.ac

interop tokyoの2019で展示されたSRv6のファンクションにXDPをinterfaceに使ったAF_XDPを利用したものがあります。

これはAM -> midle node(ex. LB, DPI, mirroring)→SRv6 decap(DX4)→application のmidle nodeが IPv6が使えない場合を解決できるFunctionで、AMの場合はmidle nodeがv6を理解できて、その場合だとSRHを外さなくて転送だけであれば解釈する部分が事足ります。

しかし、v4ということはSRHを外す必要が出てきます。 そこで具体的には End.ACのノードに着信したらSRHをキャッシュして、outerpacketを外し、その時にinner packetがv4の時にToSにあるキーを入れておいて戻ってきたらそれを元にlookupするという方針にします。

これによってSRHは外してしまったが、元のパケットとSRHを照合できる。という便利なファンクションです。

ちなみに RFCを見るとintarop公開時の時の End.AC からEnd.AT に変わったみたいです。なんでこういう名前になったんだろう・・・

後述するAF_XDPをやる際にはこれを参考にするといいかもしれないです。

と、このようにすでにXDPの技術は多くのところで利活用されています。

XDPを用いたのパケット読み込み例

このセクションでは前述したXDPの仕組みや周辺はどのようにプログラムを書かれて動くのかというのを紹介したいと思います。

以降で説明するマシーン構成はclient, serverという2つのマシーンが通信ができるという前提です。またclientにはBCC(BPF Compiler Collection) + pythonが入っている前提です。 雑にこの辺(INSTALL.md)を見てinstallすると試せると思います

BCC(BPF Compiler Collection)はユーザランドで動作するツール群です。XDPプログラムの読み込みやカーネルランド側の操作を補助しつつ、Pythonバインディングが用意されているので、カーネルで動作するXDPプログラムはCで書きながらもユーザランド側の高度なマネジメントをpythonで書くということが可能になります。

以下は通信パケットがPort 8080の受送信に関わってる場合にDROPする例です。

serverではpython -m SimpleHTTPServer 8080で適当な8080で動くhttpサービスを立ち上げつつ、clientではwgetなどができるかまずは確認をして、その後、以下のソースのコードをアタッチしましょう。

#define KBUILD_MODNAME "foo"
#include <uapi/linux/bpf.h>
#include <linux/in.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <linux/ip.h>

int xdp_prog(struct xdp_md *ctx) {
    
    /* 
     * xdp_mdにあるメンバーから取得するべきは以下の2つ
     * data: パケットの先頭ポインタ
     * data_end: パケットの終端ポインタ
     * dataの先頭なので大体の場合はethを初期値では読むことができます
     */
    void* data = (void*)(long)ctx->data;
    void* data_end = (void*)(long)ctx->data_end;
    struct ethhdr *eth = data;
    
    // 次のパケットを読むためのオフセット(ethを読んだ後なので次はipヘッターの先頭を参照することになる)
    uint64_t nh_off = 0;
    nh_off = sizeof(struct ethhdr);
    
    /*
     * 以下の条件はdata+nh_off + 1がdata_endの範囲を超えていないのかをチェックしてます
     * 今回の場合は次のipヘッター領域を邪魔していないのかを見ています
     * もしこれを怠った場合、eBPF verifierにエラーを吐かれてアタッチができないハマりポイントなので要注意
     * */
    if (data + nh_off + 1  > data_end){
      return XDP_PASS;
    }
    
    // ipプロトコルを取得
    uint16_t h_proto;
    h_proto = eth->h_proto;

    // プロトコルがipv4であれば
    if (h_proto == htons(ETH_P_IP)){
        
        // data + ethの領域分を飛ばしてipヘッター部分を読み込む
        // 領域が出ていないのかチェック
        struct iphdr *iph = data + nh_off;
        if (iph + 1 > data_end){
            return XDP_PASS;
        }
      // tcpかudpかのプロトコル取得
      // iphdr分読み飛ばすためにオフセットを入れる(eth + iph)
      h_proto = iph->protocol;
      nh_off += sizeof(struct iphdr);
    }else{
        // v4以外ならばパケットをドロップしないで通過させます
        return XDP_PASS;
    }

    //tcpでやりとりしているか
    if(h_proto == IPPROTO_TCP){
        struct tcphdr *tcph = data + nh_off;
        // 領域を見る
        if (data + nh_off + sizeof(struct tcphdr) > data_end){
            return XDP_PASS
        }
        // ポートの取得
        uint16_t dst_port;
        uint16_t src_port;
        src_port = tcph->source;
        dst_port = tcph->dest

    // 8080ならドロップ
      if(dst_port == 8080 || src_port == 8080){
         return XDP_DROP;
      }
    }
    
    // v4以外ならばパケットをドロップしないで通過させます
    return XDP_PASS;
}

アタッチするための共通になるコードを以下に示します。 python loader.py ens3のような感じで動かす事ができます。

from bcc import BPF
import pyroute2
import time
import sys

device = sys.argv[1]
mode = BPF.XDP

# generic xdpとの切り替えはflag=2に変更することで行うことができます。
# flags = 2 # XDP_FLAGS_SKB_MODE
flags = 0

# load BPF program
b = BPF(src_file="./function.c", cflags=["-w"])
fn = b.load_func("xdp_prog", mode)

b.attach_xdp(device, fn, flags)


print("CTRL+C to stop")

while 1:
    try:
        time.sleep(1)
    except KeyboardInterrupt:
        print("Removing filter from device")
        b.remove_xdp(device, flags)
        break

パケットの書き「換える」例

先ほどのコードでどのようにXDPでパケットを扱えば良いかが雰囲気としてわかったと思います。 簡略化のためにコアの必要な部分のみ載せます。以下のコードはポートを書き換える例です。

struct tcphdr *tcph = data + nh_off;
if (data + nh_off + sizeof(struct tcphdr) > data_end){
    return XDP_DROP;
}
tcph->dest = newdest;

実際に書き換えたあとは必要に応じてchecksumを再計算します。

また、memcpyを使っても問題ありません。

パケットを書き「加える」例

以下のコードはIPIP(IPv4)encapする例です。 このコードではipv4_csum_inlineget_macaddr*という関数はipチェックサムを計算する関数と使用したい宛先のmacaddressを読み込む関数です。これらはライブラリ中に定義されておらず適当な自作関数であることに注意してください。

以下のコードで注目すべきは bpf_xdp_adjust_headという関数です。これはXDPプログラム中でパケットの取り扱ってるxdp_md構造体の先頭領域を広げる事ができる関数です。これによってxdpで受け取ったパケットを書き加えたり、外したりできます。

今回の場合はIPv4のencapを行いたいのでipヘッターの領域分を広げる必要があります。

注意点としては先頭領域の拡張なので以下の画像のようにEthhdrを移動した上で新しくIPhdr分を書き加えてあげる必要があります。

static inline int encaption_IPIP_v4(struct xdp_md *xdp)
{
    struct ethhdr *new_eth;
    struct ethhdr *old_eth;
    struct iphdr *new_iph;
    struct iphdr *old_iph;

    uint64_t csum = 0;

    if(bpf_xdp_adjust_head(xdp, 0 - (int)sizeof(struct iphdr))){
        return 0;
    }
    void* data = (void*)(long)xdp->data;
    void* data_end = (void*)(long)xdp->data_end;
    new_eth = data;
    new_iph = data + sizeof(struct ethhdr);
    old_eth = data + sizeof(struct iphdr);
    old_iph = data + sizeof(struct iphdr) + sizeof(struct ethhdr);
    if (new_eth + 1 > data_end ||
        old_eth + 1 > data_end ||
        new_iph + 1 > data_end ||
        old_iph + 1 > data_end){
            return 0;
        }
        
    uint16_t payload_len;
    payload_len = ntohs(old_iph->tot_len);
    
    uint8_t mac_address[6] = get_macaddr();
    __builtin_memcpy(new_eth->h_source, old_eth->h_dest, sizeof(new_eth->h_source));
    __builtin_memcpy(new_eth->h_dest, mac_address, 6);
    new_eth->h_proto = htons(ETH_P_IP);
    
    //IPIPにencapしたパケットの設定をする
    new_iph->version = 4;
    new_iph->ihl = sizeof(*new_iph) >> 2;
    new_iph->frag_off =  0;
    new_iph->protocol = IPPROTO_IPIP;
    new_iph->check = 0;
    new_iph->tos = 0;
    new_iph->tot_len = htons(payload_len + sizeof(*new_iph));
    new_iph->saddr = get_macaddr_s();
    new_iph->daddr = get_macaddr_d();
    new_iph->ttl = 8;
    
    // ip checksumを計算する
    ipv4_csum_inline(new_iph, &csum);
    new_iph->check = csum;
    return 1;
}

XDP周りでの引っかかりポイントと知見

XDPを使うにあたって2段階のチェックされるタイミングがあります。 1つはコンパイル時。2つめがeBPFVerifierと呼ばれるプログラムチェック機構です。 1つ目は大体構文とライブラリのパスが通っておらず失敗するパターンなので多くのエンジニアに解決可能な問題のことが多いですので割愛します。

しかし問題2つ目に挙げたeBPF Verifierです。これは安全ではないコードを実行させないというものなのですが、どうして安全ではないかがわかりにくく、デバックするのにあたっても非常に難しいです。 具体的にはXDPのプログラムをNICにアタッチすらさせてもらえず貧弱なエラーメッセージがただ出てくるのみとなっております。正直初学者には非常に厳しいです。

非常に慣れず苦労したのでここではそれについての簡単な知見を書き残したいと思います。

まず、XDPのコードは読んでいるとわかるのですがいくつかのイディオムがあります。 例えば、以下のコードは先程示したコードからの抜粋ですが iph + 1 > data_end という比較をしています。これはiphの先頭から次の領域が存在してるかのチェックをしていて、これによって無効な領域に飛んでいないかをチェックしています。これを怠った場合、安全ではないとVerifierに怒られてしまいます。

struct iphdr *iph = data + nh_off;
if (iph + 1 > data_end){
    return XDP_PASS;
}

他にもbuiltin_memcpyを使わなくてならないという制約があります。eBPFはeBPF組み込みの関数しか呼び出すことができないという制約があるので、さもないと謎のエラーとヒントを出してアタッチができないという状態が起きてしまいます。

__builtin_memcpy(tcph->check, newcheck, sizeof(uint16_t));

このようにいくつかのイディオムが存在していて、BPF特有の書き方が存在します。同じようにmemsetなどもbuiltinで使い、関数はinline展開が基本です。そのため自作の関数はalways_inlineなどでinline展開を強制する必要があります。 なので、個人的な意見としては慣れない間は極力後述するサンプルコード群になるべく近いベーシックなコードを書くのが変な失敗を踏み抜かないコツです。

他にもどんなバイトコードを吐くのかを見るのも非常に得策です。 その時は以下のように自身でclangでコンパイルしてみて、その上でそれをobjdumpしてみるという手があります。最適化によってバイトコードが簡約されるというのとbccとは環境が異なるところが存在するのでそこには気をつけましょう。

 clang -O2 -Wall -target bpf -c xdp_drop.c -o xdp_drop.o
 llvm-objdump -S -no-show-raw-insn xdp_drop.o

また、アタッチしたあとにうまくいかない場合があると思います。そんな時は「そもそも条件分岐に来ているのだろうか?」と実際の挙動が気になるのではないでしょうか。

その時はbpf_trace_printkeBPF mapを使う方法があります。残念ながらXDPやBPFにはDebuggerのような高度なものはないのでどちらも実質的にはprintfデバッグです。

前者のbpf_trace_printkは本当に用途がただのprintfデバッグゆえ説明することがあまりないので割愛しますが、後者のeBPFmapを使うケースとしてはデバッグする時にステートがほしい時やデータを計測して整形したい時などに使いやすいと考えます。理由としてはeBPFmapはbccを通じてデータを定期的に取得することができて、一度テーブルに書き込むような状態になるのでステートを持たすことができます。

以下に簡易的な例を示します。このコードの場合行き先アドレスが8080の場合8080をindexにしている値をインクリメントすることができます。 これに他の条件によって値を変化させるなどして使います。ただ実際は本質的にはprintfデバッグであることはどちらも変わらないのでお好みで使うといいと思います。

BPF_HASH(counter_table, uint32_t, uint16_t);
int packet_counter(struct xdp_md *ctx) {
    void* data_end = (void*)(long)ctx->data_end;
    void* data = (void*)(long)ctx->data;

    struct ethhdr *eth = data;

    uint16_t *value;
    uint16_t zero = 0;
    uint16_t h_proto;

    uint16_t dest_port;
    uint32_t index;

    if (ethhdr + 1  > data_end){
        return XDP_PASS;
    }
    
    h_proto = eth->h_proto;
    if (h_proto == htons(ETH_P_IP)) {
        h_proto = get_ip_proto(data, data_end);

        if (h_proto == IPPROTO_TCP) {
            dest_port = get_dest_port(data, nh_off, data_end);
            if (dest_port == 8080) {
                index = (uint32_t)dest_port;
                value = counter_table.lookup_or_init(&index, &zero);
                (*value) += 1;
            }
        }
    }
    return XDP_PASS;
}

また bpftoolと呼ばれるツールを利用して動作中の eBPF の情報を確認するというのも有効でしょう。

実行中の見るときはjitが邪魔とかそういう時もあると思いますのでその辺に注意。 ちなみには今後は自動でjitがディフォルトで有効になります。

cf. https://lore.kernel.org/netdev/40baf8f3507cac4851a310578edfb98ce73b5605.1574541375.git.daniel@iogearbox.net/

ちなみにプロダクションでXDPを使ってるfacebook曰く JIT is your friend というようにjitは有効にした方が高速です

cf. http://vger.kernel.org/lpc_net2018_talks/LPC_XDP_Shirokov_v2.pdf

XDPを取り巻く環境

対応nic

XDPはソフトウェアレベルで基本動くのですが、ドライバーのサポートによってhardwareでオフロード(ハードウェア動作)をさせることができるというのがあります。 有名なものだとMellanoxのmlx4,5シリーズがあります。これらはdropとTXにそのままreturnするというものをサポートしています。 かなり値段としては高いのですが、intelnicドライバーixgbeというものが対応しているのでIntelnicでアクセスするという方法を使うと安く済みそうです。 また、cloud基盤等で動かす場合はvirtio-netが対応してるのでVMでも使うことができるのでサービスメッシュやSR-IOVなどでも利活用することが可能で嬉しいです

ただvirtioはクセがあり、kvmで立てる際はqueues=vcpu*2, vectors=queues*2 + 2, -mq=on (cf. https://www.linux-kvm.org/page/Multiqueue ) でなおかつ 

root@xdptest1:~# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:        1024
RX Mini:    0
RX Jumbo:    0
TX:        1024
Current hardware settings:
RX:        1024
RX Mini:    0
RX Jumbo:    0
TX:        1024

1024以上となるようにしなくてはいけません。 もしならなければ、https://github.com/qemu/qemu/blob/36609b4fa36f0ac934874371874416f7533a5408/hw/net/virtio-net.c#L52 のsizeが1026になるように書き換えてビルドしてあげる必要があります。

BPFのプログラムのアタッチについて

BPFを利用する際に netlink経由からアタッチする場合と iproute2経由 と bcc経由で実行するというのがあります。

この時実はアタッチする構成やローダーによって利用可能か機能や仕組みや意味論が変わっている場合があります。 よく知られているのは inner map の互換性は iproute2bcc にはないということです。 誤解を恐れずにいうとinner map とは KVである ebpf map でbyte型のようなアトミックなデータだけではなく、リレーショナルさせる技術のことです。これは現状netlink経由のローダーでしか利用できません。 しかし、netlinkは簡単にアタッチできるようなサンプルが少ないの玉に傷です。iproute2やbccで普通にパケット処理をする分に事足りますのでこちらで入門すると良いと思います。

AF_XDP

AF_XDPと呼ばれる、XDPの高速処理な部分を活かしながらもBPF特有の書き方の難しさを解決した仕組みで、カーネルバイパスする機能です。アプローチとしてはnetmapに非常に似ています。以下の画像はOVSからの引用ですが、雰囲気が伝わると思います

DPDKのアプローチとしてはポーリングし続ける方式なのですがそこへの利用もされています。 https://www.dpdk.org/wp-content/uploads/sites/35/2018/10/pm-06-DPDK-PMD-for-AF_XDP.pdf

最近のテクニカルな部分の話

tailcall

  • cf. https://lwn.net/Articles/645169/
  • eBPFにはtailcallという実行中のBPFプログラムからあるBPFプログラムにジャンプするということができます。
  • ユースケースとしてはプログラムの整合性を保ったまま別の独立のプログラムを連携させたり、現状のeBPFの最大命令数は4096個であるためにプログラムの巨大化に対応するということが可能になります。
    • tail callの面白いのはこれのjumpの先を決定するためにebpf mapをルックアップしてて,つまりユーザー空間側mapを書き換えるとで飛ばす場所を変更できるということが簡単にできるというのがあります。
    • ちなみにkernel v5.3において100万の命令を利用可能できるようにしたいという言及があるために、プログラムの巨大化での利用は今後はしなくても良くなる可能性があります。
    • cf. https://lwn.net/Articles/794934/
  • 最近では Chain-calling と言われる概念が提案されていて、自分でそのtailcallsのmapを制御しなくてもいいようにルールベースで実行するフローが提案されています

global 変数のサポート

今まではglobal領域で変数や定数として使いたい場合は eBPFmap を利用して扱っていたのですがそれを毎回書くのは正直オペレーションとして邪魔でしかないので、そこで内部的に長さ1のmapを利用して隠蔽して普通の変数として利用できるようになりました (おそらくBPF_PSEUDO_MAP_FDを使ってると思うんですが、さらっと読んだだけなので間違えたらすいません。)

ちなみに定数のみのアプローチであればBPFプログラム内の定数を変更する際にアタッチ前に直接BTFのバイナリを書き換える方法もあります。

bpf trampoline

retpolineと呼ばれる間接呼び出しをROPで置き換える投機的実行に関する脆弱性の対策方法がありますが、しかしそれが元でbpfをkernelでコールする時に分岐予測が効かないので速度が落ちてしまうという問題がありました。 そこでそれを回避することで従来と比べてeBPFの呼び出しを高速に利用できるというものが提案されました。(つまりXDPの高速化につながります!)

cf. https://lore.kernel.org/bpf/20191102220025.2475981-4-ast@kernel.org/

さらに最近提案されたのはそのアイディアはそのままでは使いにくいので、bpfdispatcher と呼ばれるの概念を導入して xdp_call.h でXDPでも利用しやすくされたものを出てきています。今後もパフォーマンスが上がっていくのが目に見えるようで嬉しいですね。

XDPを始めるのに見ると良いリンク群

見出し通りですが、それだけ貼っても仕方ないので個人の感想を段落にして書いてます。

まとめ

雑にいろいろ書いてきましたが、XDPは今までのパケット処理のつらさが減るという部分もあります。linuxのヘッター類、つまり我々がず〜っと利活用してきたプロトコルスタックに使われてた資産が使えるので構造体などのサブセットを自前で頑張らずとも用意されていたり。 他にもlinuxのネットワークスタックとシームレスに作られていて(skbuffはxdpbuffから作られてる)、 例えばarpパケットの場合はlinuxにpassしてあげることでarp tableの管理をlinux側に丸投げするということが可能で、取り出す場合はfiblookupを使うだけでfibがわかる手軽さです。これは他のパケット高速処理系には真似ができないと思います。

しかしトレードオフもあり、BPFのチェックや、あまりにニッチすぎることをするとドライバーによって未実装の機能があったりしてつらい場合もあり、clangのバージョンを雑に上げたらバグるとか特にkernelLandで動かすのでバグる時のデバッグがつらいなどがあります。

もちろん他の高速パケット処理手法も似たり寄ったりですが、実はちょっとした入門だけなら敷居が低いということが伝わると嬉しいです。

自分でパケットを投げれるというのは非常に楽しいのでぜひやってみてください!! (間違いがあればそっと連絡をくれると助かります!)

東京都八重洲口にある某メディア企業を退職しました

こんにちは。takemioです。東京都八重洲口にある某メディア企業でインターン行ってた頃に携わった保育士と保護者をつなぐことをするプロダクトが絵本を売ってる会社に売られてしまいちょっと悲しかったです(きっと色んな人に愛してもらえるプロダクトなので続いていくといいなー)

さて初退職エントリです。

といいましてもアルバイトの話ですが。。。。

おまえはだれ

  • 竹といいます
  • 宮城県で大学生してる
  • 新3年生
  • CSを勉強してる。セキュリティとネットワークと意味論に興味
  • 詳しくはOSINTしてほしい

そこでは何してたの?

脆弱性検査ツールを作ってました。

なんで入社したの

去年東京都八重洲口にある某メディア企業のウィンターインターンに参加したから。優秀なメンター様の力でそこではラッキーなことに歴代最年少(タイ)参加(?)で審査委員賞をもらったとかラッキーをした。

そんなこんなで懇親会でヘットハントされて現在へ。

なんで辞めるの?

去年の4月から今年の3月の一年の任期で行ってました。

お気持ち

NDA上やってたことは何も言えないんですが、、、トータルなお気持ちとしては初めてのフルリモートでのアルバイトという部分であまり慣れていなかったり、大会とかに参加したりしてちょくちょく進捗が悪くて煽られまくってた私を雇ってくれて感謝という感じでした。

ですが、そもそもの仕事の割り振りが月の中で稼働ができる時間(月何時間で!という感じだった)とうまく噛み合わなくてレビューを放置されたり忙しい時ほどタスクを投げられたりでちょっとそこが非常に辛くてお互い嫌な思いをしたと思います。

特にテキストベースなやり取りがそれに拍車を掛けていたように感じました。また正直投げられたタスクの粒度をどれくらいでやればいいのかとかそういうのがよくつかめなかったり、学部生だと可動できる時間が夜になりがちでミーティングとかがやりにくい部分が多くてはじめはかなり消耗してました。

他にもガッツリ時間が取られるイベントに参加したりするとそれの埋め合わせとかが大変なので結果的に月何時間やったのかを申告するとかのほうが良さそうな気がします。

一緒にやっていた大学院生はうまく稼働ができていたのでどうしてるのかとScheduleを聞いてみると基本的に研究室のなにかにぶつからなければ良さそうな感じだったのでフルリモートは授業を取り終わってる院生や学部四年とかならおすすめなのかも知れません。

ですが時々東京にでていって労働したりすると比較的いい感じにスイッチがはいるのでそこの辺が鍵ぽいです。東京の学生は羨ましいですねー。。。。

まぁさておき、自分主導でできない部分(仕様がわかりにくいor何が仕様なのかわかんない)とかじゃあそれならどうしてほしいとかどう改善してほしいのかみたいないろいろやり取りを振り返るといくつかの反省点が出てきて次に活かしたいなと思います。

たとえば反省としては初めの仕様のキャッチアップのときにフェイスtoフェイスでやらせてもらったり、技術的キャッチアップのときはそのための時間を数時間でもいいのでそれだけのために当てたりとかしたほうがあとからが非常に良かったと思いました。リモートでアドホックなやつは時間が立って忘れたりとか結構大変だと思いました。

ですが、仕事の体験としては初めは正直つまらないと思ってたんですが(今思うとそもそもの仕様がどこにあるのかとかあまり明文化されてなかったりどこから構築してるのかとかキャッチアップできてなかったのが理由だとは思いますが)仕事をする方々は優秀でこのようにしてコードをきれいにしていくのかとか。 どのようにすると良いアーキテクチャなのかとかが見ていて勉強になったので徐々に体験をよく感じました。また納得するまで議論できたのも体験が良くて良いと思います。

他にも特に関わってたエンジニアはほとんど一流(名前は略します)で、彼らの仕事や姿勢を間近で見れたのはかなりバリューでした。特にビジネスからも見れるエンジニアはすごい。組織を回っていうのはそういうことだと思うんですよね。ちゃんと見習います。

その過程で自分もなんでこれでこうしたほうがいいのかとかを考えてて動くようにしてたのは良かったかなと思います。

終わりに

いろいろ言いましたが総じて良い会社だと思っていて、新卒で東京都八重洲口にある某メディア企業行きたい人々の気持ちがなんとなくわかった気がします。セキュリティのことをするには大きくて面白い会社だと思います。僕も「まだ、ここにない、出会い。」を探してます

ちなみに稼いだお金はほぼ全額自分の大学の学費と教科書代とPCと食費と交通費に消えていきました。無事3年次に上がれたのですが四年次に上がれるかはわかりません。

なお次の会社もそこそこ大きくて内定はしてますが正確にはまだ契約書を交わしてないので決まってませんのでセキュリティかネットワークインフラについての労働力やR&Dを求めている人がいたらお声がけください。

ICTSC2018 の運営委員を務めました

こんにちは。takemioです。最近自分の名前の表記ブレが激しいのでどうしようかと思って悩んだ結果 https://takehaya.github.io/^(竹(たけ)|たけみお|たけはや)($|くん|ちゃん) でどうぞとかかいてしまったんですが、どうすればいいか悩んでます。いい案があればください。

さて、見出しのとおりですがICTSC2018 の運営委員を務めました。

表題の ICTSC2018 とは、正式名称を「ICTトラブルシューティングコンテスト2018」と呼びますが、学生主体の学生による学生のためのインフラ技術中心のトラブルシューティング大会です。以下トラコンと略します。決して某虎の㍁の婚活サービスではありません。

インフラ技術といっても色々ありますが、ここで指しているのは主に OSI参照モデルの L2-L7 あたりを指します。運営委員はL1もやってますが、問題としては出題されていないです。

私は今年から運営にjoinしてやってました。

なぜjoinしたのか

そもそも大会参加者になりたかったが、弊学から人を集めれそうにないって当時インターンで同期で運営だったきょんたんに相談したらリファラルされて気がついたら採用された。ありがたい・・・

一年間のフロー

5月に顔合わせ会があり、夏に一次予選がありました。そのあとはトラコン予備校と言うトラコン参加者に対して希望者がいればそちらまで出向いて講義をするという試みをしました。その後二次予選があり、3月に本戦でした。

やったこと

私がやったことは予選問題の作成と予備校の講師。また本戦問題の出題をメインにインフラの構成の手伝いとかしてました。

予選問題はパケットフィルタリングというテーマで問題を作りました。netfilter queueを使った問題や、tcpdumpの条件構文の問題。またそれらのバックエンドのBPFのバイトコードを読んでもらって挙動を理解してもらうということをしてもらいました。 詳しくは以下のリンクの解説を参照してください。

https://icttoracon.net/tech-blog/2018/08/27/ictsc2018-prep01-packet-w/

予備校では大阪と福岡を担当しました。 大阪ではパケットフィルタの解説、福岡ではdockerの解説をしました。嬉しいことに福岡で講義をした学生たちは後述する本戦で入賞したので少しでもここに役立っていたのかなとか、、、勝手にわいが育てたと思ってますw(すいません。本当におめでとうございます!)

そして本戦ではSRv6の問題を作成しました。この問題はSRv6でサービスチェインさせるもので少し難しい問題を作りました(半分趣味) 詳しくは以下のリンクの解説を参照してください。

http://icttoracon.net/tech-blog/2019/03/21/ictsc2018-f-12/

他にもバックボーンの検討段階を手伝ったりDNS立てたりいろいろしてましたが、ホットステージ後半はSRv6問題の構築に手間取っていてあまり手伝えていませんでした。つらい・・・

さいごに

まずは本大会のスポンサー様と参加者各位に御礼申し上げます。このような運びで無事大会が(本戦一日目午前中が大変だったりしたが)終わったのは各位のおかげだと思います。そして入賞者の皆さんおめでとうございます!

さて来年度もより一層面白い問題を作ったりしますのでよろしくおねがいします。

Global Cybersecurity Camp2018に参加してきた。

この記事は今回一緒に参加した仲間たちの備忘録と来年度に参加してくれる未来の仲間たちの参考になればイイなぁと思って書き残してるメモ書きです。英語書くの辛いので日本語で書いてますが彼らに捧げます。(論文書いてる風)

GCC_image

TL;DR

  • 初めての試みとして韓国でGlobalCybersecurityCampが開かれた。それに参加してGCCの一期生になった。
  • 台湾、韓国、シンガポールそして日本の四カ国が韓国で約一週間のブートキャンプをした
  • かなり密度が濃いキャンプで、日本語通訳なんてものはなくて無限に英語力がほしいなとなる。英語ペラペラ民多すぎ。
  • まさかのちゃんとグループワークもあった。

whoami

  • ^(竹(たけ)|たけみお|たけはや)($|くん|ちゃん)と名乗ってます
  • 宮城県で大学二年生でCSの勉強をしてる。フルリモートのアルバイトを探している
  • SecurityCamp2018卒業生。集中開発で意味論を定義した関数型言語LLVMで3日で作ったでっち上げた
  • 現在某社脆弱性検査ツールの手伝いしたり、ネットワークについて勉強している。
  • SecHack365において一期生をやって、そこでも海外派遣の一期生をやった。
  • Detailed career: https://takehaya.github.io/

GCCとは

コミュニケーションを促進し、多国籍のセキュリティコミュニティを構築するため」のキャンプです。主催者のOrgnaizerの一人のBlueのカナさんの言葉借りるならば「サイバーセキュリティの世界引っ張れるリーダー作るをするための機会を作る」ということを目標にした、いわばSecurityCampの国際バージョンでしょうか。そして今年は記念すべき最初の年です。

今年度は韓国、日本、台湾、およびシンガポールが参加しました。流れとしてはキャンプは1週間続き、各国のホストになる組織が一日ずつ講義を計画して主催をしました。

各国のhostは以下のとおりです。

この組織がわからないという人が多いと思うので以下に説明していくと、 韓国はのKITRIは日本で言うIPAみたいなところです。で、そこの下部組織のBoBというセキュリティのプロフェッショナルの原石を作るような、いわゆる日本で言うSecurityCampのようなところがあります。そこが韓国側のホストでした。

ここはSecurityCampのように集中講義的なものばかりではなくどちらかと言うと4ヶ月ほど長い期間で目的意識を持ってR&Dをし、その成果発表をしたりします。日本で例えるとNICTのSecHack365に近いような気がします。

かなりここは力の入れ具合がすごく、例としてそこのコンペティションの上位10人には奨学金270万円を与えたり、海外カンファレンス(RSAカンファレンスやブラックハットAsia)に連れ行ったりなど。流石国の力が働いているだけあります。それだけではなく学生の成果も素晴らしくなんとこのBoBでCVEの取得まで辿り着く人が一定数います。勿論彼らはすごく頑張っており、BoBには専用のセンターが有り(ビルのワンフロアすべて使っているオフィスがある。)そこで24時間勉学に励む人もいます。そして彼らは一度大学を休学したり卒業して就職後に参加したりなど圧倒的に意識が高い人達が何人もいました。

今回の韓国側の学生のGCC参加は今までの進捗及び成果をもとに希望者を募りInterviewをしてオファーが来るという感じだったそうです。

(・・・こう書いてると申し訳ないんですが日本はもっと見習って学生に機会と金をガンガン投資して、学生も相応に頑張らないと本当に負けるなと思いました。頑張っていこうな。。。)


台湾Advanced Information Security Summer Schoolは台湾の教育省が主体で動いている情報セキュリティに関する教育組織です。SecurityCampにかなり近いような形式で端的に言えばCTFをやって力を計ったりなど。かなり近いですね。そこの協賛とかを見るとNICTなどがいるので若干日本も協力してるようです。ただ彼らはAIS3は5カ年計画なので一度解散するようですが。。。どうなんでしょう。もちろんまた次の5カ年に向けて動いてるらしいですが。

そして今回の台湾側の学生のGCC参加はそのCTFの結果でオファーが来るかどうかみたいな感じだったそうでした。ちなみに彼らも渡航代金はすべて補助されています。

シンガポールDiv0は国ではなくてコミュニティベースの組織です。残念ながらあまり詳しく聞けなかったので詳しく書きませんが、今回の学生たちはGCCプログラムの奨学金として行ってきたようで協賛スポンサー様からお金を引っ張ってきた感じです。

実は日本もそのような感じで協賛スポンサー様からのお金で行っています。国費ではありません!!!!LCCは高身長マンの私にはマジで大腿骨があたって痛い(´;ω;`)

ぜひ来年度は日本で開かれますのでこのブログを読んで興味を持った企業様ぜひスポンサーになってください!(言ってくださればそれっぽい人にルーティングします。)

そして最後は日本のSecurityCampについてですが、これは探すと日本語でゴロゴロ出てくるので公式サイトを見てもらうと良さそうなので割愛します。

ちなみにですが日本勢の今回の参加資格はSecurityCamp全国大会修了生限定で、なおかつ応募課題を解いて提出という感じでした。

応募課題について。

残念ながらwriteupは書かないでほしいと言われたので雰囲気だけで書いておきます。

問題文

読むとわかるんですがwindowsの疑似Malwareを解析して答えよという感じです。私はこれをautorunやapimoniterなどをつかって挙動を眺めて、わからない部分はデコンパイルして難読化解除をして提出しました。なかなか大変でしたが、難読化されたコードを読んで送ったのは私だけだったぽいので動的解析がちゃんと出来ていれば合格できるのではないかなと思います。

windows wmi malwareとかそんな感じで調べたりすると幸せなんではないでしょうか・・・強いて言うならば通るだけならば何でもありだったんですが、後々の講義では使えないかもしれない手法になってしまうのでcuckoo sandboxとか考えず応募用紙に書いてるpython-cimとかが使えるようになるといいかもしれませんね。

いやぁ。windowsは非常に難しいですね・・・^^;

会期期間について

GCCの予定

会期は1/21-1/25まででした。最終日が観光という感じです。 以下に簡単に講義についての概要説明をします。

1/21

  • Training 1: Look at the Hacking (Offensive Security) Big Picture by Kyounggon (KG) Kim
  • コース難易度:★☆☆☆☆

コースの内容自体は、Crypto, network, Webに関する脆弱性や紹介をしている感じで、かなり簡単で初心者でも楽しむことが出来るような網羅的な紹介が多かったと思います。

もし不安なら任意の常設CTFをやるとかcisco networking acadmyとかの教材とか眺めていくと良さそうと思いました(ステマではない)

1/22

  • Training 2: Binary Exploitation by Angelboy
  • コース難易度:★★★★★

バイナリエクスプロイトに関する話をこの講義ではしていました。CTF形式の講義で端的に言えば一日中ROPをやっていました。 勿論buffer overflowの話だったり、出来る人へのアドバンスとしてheepに関する問題を用意していたり非常に高度で、冗談抜きでなんもわからん人は無限においていかれててつらそうという感想を持ちました。 writeupも公開されていてそれだけでも勉強になります。

Global-Cybersecurity-Camp-2018/exp at master · scwuaptx/Global-Cybersecurity-Camp-2018 · GitHub

そもそも事前にやってほしいみたいなものが講義前日に出てきたので事前課題がなにも出来ずという感じで大変でした。個人的に感動したのは攻撃の手法でstack migrationというのがあってそれの講義が面白かったです。

若干理解が怪しいんですが,簡単に説明すると,1度目のropで制御を任意コードを奪うというのは割と自明でわかると思うんですが,そのあとにその奪った制御で2度目のROPを実行してstackの拡張を(rbiをずらすことをして)試みます.そのあとにコピーされたstackは自分の完全な制御領域になるのでそこまで持ってくるとほぼ永続的に任意のシェルコードを挿入することができるようになるという手法があって...つまり2回事前にROPするとほぼ好きに自分が扱える空間を作れるということが言えるんですね.すごい...

1/23

  • Training 3: Applied Cybersecurity (Cybersecurity Product Development) by Emil Tan
  • コース難易度:★☆☆☆☆

この講義は1/21の講義に近くて技術の詳細と言うよりは職業の詳細を述べており、具体的にはサイバーセキュリティ業界のサービスと方法の概要やIDSとかのツール(P0f、Snort、Shockpot、Cowie)およびML(SVM)がどのようにサイバーセキュリティに適用されるのかという簡単な紹介をしました。

この講義は実はgroup workにつながっていて、具体的には今回のグループワークは自分たちがどのように将来を描くのかを問うものだったので僕らに対してどのような将来が開かれているのかを示したかったのかなと思っています。

(しかしながらシンガポールの英語は聞き取るのが難しいですね・・・シングリッシュ

1/24

  • Training 4: Hunt for Attackers with Incident Response by Hiroshi Suzuki & Hisao Nashiwa
  • コース難易度:★★★★★

講師があるストーリーを提示し、それに基づいたVM imageを渡して即席で組み上げたチームでCTF形式のインシデントレスポンス講義が行われました。デジタル・フォレンジックに興味がある人は楽しいと思います。機密保持契約に署名しているためツールの詳細な使用などの情報を共有することはできませんが大変おもしろかったです(ただこの講義は普通のセキュリティ・キャンプ全国大会でも行われてるぽいですが)

ワーク

グループワークと個人ワークが今回はありました。 端的に言えば「GCCにどのように貢献するのか」「GCCのもつ価値はなにか」という自分自身とGCCの未来についてを議論しました。

特にgroup workでは主催者側が用意した、セキュリティのいくつかのテーマごとに人を集めてチームをつくりました。 例えばオフェンスが好きな人、ディフェンスに興味を持つ人、フォレンジックに関心がある人、セキュリティツール開発に興味がある人など。

私のチームでは様々な人が来ることによってのシナジーについてを話し、僕らが「知らなかった」を知ることが出来るということの重要性を話しました。題材が題材なので比較的に他のチームも似たり寄ったりになってしまいましたが、しかしこれが終わった後論文を書きたいとか今後もオンラインで交流をして意見交換をし続けたいといった建設的な交流が進められたと思います。

会期中の生活

人それぞれですが僕の場合は僕主催で毎日パーティをしてました。 f:id:taketarou2:20190203004203j:plain party_1

なんでこんな事になったのかと言うと僕の部屋が誰もいないんだよね(普通は相部屋)というところが事の発端で、その日から僕の部屋がパーティー会場になってしまいました・・・

これは日本人勢どうしようねこれから〜というがんばりましょうみたいな会です。NICTの園田さんはサッカーに夢中でこなかった。

  • day 2:韓国勢とシンガポール勢がきてチキンを買って食べるチキンパーティ(orengeやangelboyも来てくれた)

これは韓国勢の仲良くなった仲間とチキンパーティーをしたいねということで始まったもので、なかなかよかった。だいたい彼らアニメの話ができてすごい日本人より日本人やってるなぁという感想がありました。涼宮ハルヒが通じるの非常に感動したし、灼眼のシャナとルイズが通じたのは笑うしか無かったw

  • day 3:台湾勢とシンガポール勢が来てバイナリかるたパーティ(講師の今岡さんにそそのかされて)

これは悪い大人にそそのかされて気がついたらバイナリかるたをしていたと思ったらアーキテクチャかるたに変わっていて非常に流石国際サイバーセキュリティオタクの会なだけあるなと感じました。

  • day 4:シンガポール勢が来てビールと焼酎を買ってきたので強制的にパーティ

彼らビールを4.5リットルに焼酎1.5リットルを買ってきたので強制的にパーティが始まってしまいました。すごいなぁと思ったのが焼酎をビールに入れて飲んでいて強いなぁと思いました。彼らはそれをbombとよんでいて非常に興味深いカルチャーショックでした。。。

最後の方は完全に野郎が多く集まったのでだいたいエッチな話が飛び交ってたのは内緒ですw

  • day 5:最終日だからやるよねという話になり、僕の部屋に台湾、韓国、シンガポール勢が来てパーティー

トランプを持ち込んだりして大富豪(しかし国ごとにルールが違うというのがあり興味深かった)などをしたり、かなりエキサイティングでした。 韓国の辛いカップ麺を食べてみたり、自分たちの専門や研究。将来を話したりなど非常にみんな変わらんもんやなぁと思いました。

ほかにも年相応な話としては恋バナをみんなでしていて、「君のいつ初恋ですか!?!?!?」みたいな。同時に他の国の教育システムなどの話になったり非常に興味深かったです。

(しかしながら、それでも全員と深く交流できたわけではなく、パーティーに来てくれなかった人もいたのでちょっとだけ残念でした。台湾勢がインフルエンザになってしまった人が何人かいてあまり話せなかったからもっと話したかったなぁ)

こんな感じで、毎日3時に寝るのはそこそこきつかったし、英語伝わらなくて"google translate bast friend"という感じですが今となってはいい思い出です。おかげで一つ取得した特技がスプーンで王冠を開けることが出来るようになりました。

というわけで細かい話はいろいろあるんですが気になる人は直接聞いてくれたら答えます。

分類がわからんチラシの裏な話(petty topic)

グループワークでは自分の将来のことを話したり、GCCにどうやったら貢献できるのだろうかという話をしていたりなど自分たちがどうしたいのかをちゃんと話すいい機会をもらえたなと思います。

で、GCCはなんだろうという話ですがまんま良くも悪くも流れがセキュリティ・キャンプぽいんですよね。(個人の感想ですので正しいものではない)

なのでつながりを大切にみんな考えていてそして自他共栄な部分が今は大きいなぁと感じてます。なので現在はもう修了生のfacebookが参加者の学生で作ったのがあったりとか。テレグラムとかつかったりとか。そのうち勉強会ができたらいいなーと言う話をしたりしてます。僕は参加まだしてないけどいわゆる作業スカイプもどきなことをもうやってたみたいです。まぁタイムゾーンが大きくなったら難しいですがw

個人的にはもっと多くの人に参加してもらえる世界観を作れたらイイなぁと思います。キャンプ卒業生だけみたいなのやめて、せめて年齢制限でキャンプもう応募できない人は普通に出して良いとかそうしたらいいのにね。

あと思ったこととは意外に日本人って技術力は高いんだなぁと思った。多くの参加者が学部4年相当だったのでそう考えるまぁ日本人英語だけもうちょいやればもっといいところ行けるんだろうなぁって。しょっぱいっすなぁ。

まぁでもそれ以上に優秀な子はいて高校生で参加している子がいたりして(それこそMOPI(@naogramer)くんとかシンガポールのPei Si(@kaskrex)さんとか)もっと我々は高いところを見ていかないと行けないなと考えさせられました。留学したいなぁ・・・

特に私が思うこれからの課題の一つにはダイバーシティさが足りないという点です。日本は女性の参加者がいなくて、ですが他国はいて、その上他国の人はダブルメジャーの人とかがいて素晴らしいと感じました。体系的に学んだもので別の視点を持つ人々、生まれ持つパーソナリティやジェンダーに基づく視点などが多いのは我々の国も見習わなくてはいけないなぁと感じました。その次に来るのはお金の部分でしょうか。。。おそらくこれを読む学生や大人は日本人なのである程度の理解をしているので割愛しますが。

今回の参加を通じてSecHack(去年国費でアメリカに派遣された)で感じたこととはまた違う気持ちになりました。具体的にはやることが通用するが、技術やカンファレンスでの知見を多く得られた世界観であれはあれという気持ちで止まっていたのが、今回はリアルに同年代の人と自分を比べてバイタリティでは負けているなぁと感じたのです。

ちなみに後日談ですが、「某アワードとりあえずなにか書いて出して」と言われたのでとりあえずパーティーについてと日本以外のサイバーセキュリティに対する意識を話しますと書いたらだいたいパーティの報告じゃねぇかとお叱り落選メールが届いたのでなにか(真面目なことを書け)ということだったのですいませんという気持ちになりました。来年は真面目なの書いておきます。。。

まとめ

GCCは総じて体験が良かったのでぜひぜひみんな参加してみては?

そして参加したみんな(特に日本勢の仲間たちと他国の学生たち)には非常に良い体験をさせてもらえたなーと感謝しています。

ちなみにですが次は日本で行われます。その次が台湾。そしてシンガポール。なので後三回先までは決定してるみたいです。英語勉強して外に出ていこうな。俺もチューターとかしたいんが雇ってくれへんやろうか。

他の参加者

  • Taiwan のjuienが書いてた記事。長々と書いてた私と比べると簡潔に書いていて読みやすく素敵。 medium.com

(他の人が書いたら追加します。)

CodeBlueTokyo2018とAVTokyo2018に参加した

CodeBlueTokyo2018とAVTokyo2018に参加してきました。 これはちょっとしたメモ代わりの記事です

CODE BLUE

情報セキュリティの国際会議であるCODE BLUEに参加してきました.

codeblue.jp

昨年度CODE BLUEには学生スタッフとして応募させていただきましたが落ちてしまい、今回は無事受かることが出来ました。 さて、今回のCODE BLUEはday1はフリーでカンファレンス観覧とCTF、day2は学生スタッフ業務に追われてドタバタとしておりました.

day1に関しては, キーノートからiosへの脆弱性に対する話を聞いたあと残りは無限にCTFに時間を溶かしてました。つらい・・・

まぁ勉強になったということが多いのでどこにどうみたいな話はおいておくとして、line CTFではラッキーなことに得点したの(?)で特典のワンちゃんが書いてるTシャツを得ました。:star:

f:id:taketarou2:20181107054126j:plain

AVTOKYO

CODE BLUEの翌日はAVTOKYOに参加しました. 昨年の会場は六本木でしたが、今年は例年通り渋谷に。細かい話は去年の僕に任せます。

takeio.hatenablog.com

僕は何してたかというと、ききエナジードリンクとCTFのリベンジをしてました。これも概要先程の記事に書いてるのですが、昨年は12位でした。

しかしこんかいはなんと3位。やったぜ!!!有名なyu yagihashiやうめちーに一足先に得点されてしまいましたが、なんとか入賞できてラッキーでした。 f:id:taketarou2:20181107054154j:plain

まとめ

とりあえずレアそうなエナドリが大量に手に入った

情報科学若手の会に参加した

これは何

情報科学若手の会に参加したと言う話です.

wakate.org

情報科学若手の会とは

情報科学若手の会は次の3つを目的とした、情報科学に携わる学生、若手研究者、社会人のディスカッションと交流の会です。
- 活発な討論の中から若手研究者ならではの斬新な発想を生み出し、情報科学・情報工学の新しい可能性を考え、将来の夢を語り合う。
- 専門分野だけでなく情報科学のさまざまな分野で活躍する若手どうしの討論を通して視野を広げる。
- 専門分野にこだわらず、情報科学の全般に渡る若手研究者の横の繋がりを広げる。

1968年7月から続く由緒正しきイベントで、2017年に50回目の開催を迎えます。 学会や研究会を基本的なスタンスとしており、情報科学に関する幅広い話題に関する議論を通して新たな発想が生まれることを目指して、次のコンセプトを掲げて運営しています。

とても良い会です!!まぁ学生の財布から参加費+旅費を出すのは辛いのですが,幾らか補助も出ます.

サイコー!来年はスポンサーを増やして学生発表者は全額無料キャンペーンとかして欲しい(違

僕がこれを知ったのは僕の高校の先輩が幹事をやっていたと言う経緯があり,高校の時から誘われてたイベントで去年初参加で今年も参加という形でした.

何をした

「Segment Routingの利用例と未来」という発表をして来ました. speakerdeck.com

なんでSRについて話したのかというと今年はネットワークについて頑張ってみるかなというロールを程よくしていて,それのアウトプットということで何かしたいなと言うのがきっかけでした.

僕はInteropTokyoのSTMを今年度やらせていただいたのですがそこで見たSRの相互接続実証にはとても未来を感じたのでこれは若手らしいのでは!?!?!?と言う安直な理由で決定したものでした.

もともと興味があってやっていたのですが最新の日本語資料が少ないものなので少しでもoutputが意味がある形になれば幸いですね.

ブログ書き忘れてたのですが...ちなみに去年は様々な型推論ということでRegion inferやHMやDatabese Recordとか言語処理系にまつわるサーベイをナイトセッションというLTぐらいのサイズのところでして来ました.まる.

感想

今年から会場が変わり,熱海の山喜旅館から軽井沢の軽井沢研修所というところになりました. 場所としては大変大変交通の便が悪いのですが,中身は山喜は布団が湿ってたり辛い時があるのでそれがないというところを見るとどっちも五分五分でした.(ほんまか?)ですが幹事の人たちの努力を新会場といい素晴らしい奮闘や良いディスカッションができて最高でした.次の機会があったら意味論の話をしたいですね.... 最後に写真で振り返る三連休をします f:id:taketarou2:20181012044027j:plain 新幹線が最高に辛い情報です. f:id:taketarou2:20181012044648p:plain 敗北を知りたい(敗北した)

f:id:taketarou2:20181012044759j:plain 軽井沢自体は自然がやはり多く花も咲いていて最高.

f:id:taketarou2:20181012044840j:plain 交流イベントコラボ情報です.

f:id:taketarou2:20181012044917j:plain 若手なので古いものが大好きです.これはモトローラとintel8086.すぎょい

f:id:taketarou2:20181012045055j:plain 優勝した.最の高ですよ.

f:id:taketarou2:20181012045144j:plain f:id:taketarou2:20181012045153j:plain 信州蕎麦を食べて来た.

f:id:taketarou2:20181012045231j:plain 噂の遠目だとしなの鉄道のロゴがpythonに見える問題の画像です

f:id:taketarou2:20181012045327j:plain 温泉で優勝した

f:id:taketarou2:20181012045346j:plain酒で優勝した (1日ぶり二度目)

まとめ

情報科学若手の会に参加し,そこでは発表をしました.なお反省点はスライドは当日の3時に作り上げないことです.みなさんぜひ参加してみてください.

追記(10/12)

あの「Segment Routingの利用例と未来」発表後かなりの反響があり,一部のところから良い資料ですね!とお褒めのお言葉をいただくようになりました. 最終的にはなんと紹介させていただいたLine株式会社様やIETFでの仕様策定をしているSRv6の中の人やp4SRv6の中の人にまで伝わってしまったというのがありめっちゃ驚いてます笑

それとただこの場を借りて訂正で,公式実装と言っていましたが確かにあのドラフトでは参照されていてリンクも存在するのですが,あくまで公式ではないようでした.訂正いたします.

こういうこともあるのでぜひ若手各位は若手の会で話してみましょう!

git challengeに参加しました

こんばんは.takemioIOです!先日 git challengeというものに参加したのでそのレポートをしますー

Git Challengeとは?

大元が消えてたのでNAVERまとめを参照します.

matome.naver.jp

平たく言えばこのコンテストは

gitリポジトリに設けた難題をチームワークで解決していく競技型技術イベント

ということです.これは抽選で選ばれた人のみが参加できるイベントでした.

参加以前

  • このイベントは前々から知っていたのですがGit力に自信がないので放置してた.
  • この夏色々あって結局インターンとか行かないでしまったので企業色があるイベントにいきたいなぁーと思って行くことにした.
  • 参加する前には,応募要項として,過去の開発経験とか聞かれたはずだが完全に忘れた.結構適当に書いてそもそも応募と言いながら抽選なんてないだろと思っていた(すんません)
  • 抽選に見事に当たり,参加が確定する.ツイッター見てたら落ちた人もいると聞いてなんかすいませんねとなった記憶がある.

当日

  • 遅刻した
    • というのも開始が11時(アイスブレイキング)からなのですがまぁ仙台から来てるのでちょっと辛いわけですよ.参加者で一番遠い場所から来たわけですよ.事実上の宇宙よりも遠い場所です

  • mixiさんに初めて行った.ビルデカイ.
  • 事前勉強などは全くしてない
  • インターネッツ有名人がいることを聞いた
  • 隣の人が知り合いの知り合いだった

競技前

  • 相方氏(@_fumihumi)とコミュニケーションが取れずどっちもpushをしただろと思い込む回(実はフラグで後述話に繋がる)

  • ごはんが美味しかった.

競技開始!

  • 難易度が★ ~ ★×5 まであり,チーム戦だったのでとりあえずウォームアップがてら星1の問題から解いていった
  • 方針としてはhackmdにメモを取りながら粘っても無理そうだったらこうやったけど無理だったみたいなアサインをしてお互いにお願いする駆動をしてた.
  • 結構協力プレイしてた気がする.
  • こんなことできるんだ!みたいな気付きが多い問題があり知見になることが多かった.
  • master に push -f をしながら

競技終了!

17つ星を集めて結果は3位.もう30分あれば・・・星4つが解ければ・・・・ だいたい@_fumihumi氏と半分づつぐらい解いてたのでまぁチームとしてはバランスがよかった.

総評中の私

これはどういうことかというと初めのチュートリアルでやってることを考えずに適当にマージしたから死んだという話があり,それを潰してれば2位でした・・・(前述した通りフラグだった)

やはり感想としては結構言われてあ〜〜〜ってなってたり,過去にやったことあるはそれ(白目)だったり. 以下過去にやったファイルを使わないでcommit したという話.

takeio.hatenablog.com

あと30分あれば・・・みたいなのがあったり.正直1位を狙える位置にいたので頑張っていきたかった....精進

懇親会

  • ごはんが美味しかった (2回目)
  • 同率三位のチームが実はあって,そのチームの人たちと仲良くなれて嬉しかった.
  • LTでGSoCの話が出て来て来年は応募するぞと思った.今年某Cookpadのko1さんと面談までして推してあげるよと言われたのに大学の方でやれなくなってしまったのでリベンジするぞ!!!

まとめ

  • 一応三位になった!
  • gitそれなりに知識あったと思い込んでいた僕が恥ずかしい.勉強します!
  • 後日アルバイト先でPRのサイズデカイんだけどってキレられた(辛い)
  • 参加者の皆さん!運営の皆さん!皆さんありがとうございました💪 git力もっと上げます✍️✍️