BitVisor内蔵のlwIPでAlkanetログの送信を試みる
⽴命館⼤学 システムソフトウェア研究室
⼭下雄也，明⽥修平，瀧本栄⼆，⽑利公⼀

1はじめに (1/4)• 近年，マルウェアが増加しており，マルウェアの脅威が問題となっている– マルウェアの脅威に対抗するためには，多数のマルウェアを迅速に解析する必要がある• システムコールトレーサAlkanet†– Windows上で動作するマルウェアを対象とし，マルウェアが発⾏したシステムコールのログ(Alkanetログ) を作成– VMMであるBitVisorベース– アンチデバッグ機能を持つマルウェアでもスレッド単位で短時間にトレース可能†⼤⽉勇⼈, 瀧本栄⼆, 齋藤彰⼀, ⽑利公⼀: マルウェア観測のための仮想計算機モニタを⽤いたシステムコールトレース⼿法, 情報処理学会論⽂誌, Vol.55, No.9, pp.2034–2046 (2014).

2

はじめに (2/4)• Alkanetによるトレースでは，IEEE 1394ケーブルを⽤いる• IEEE 1394の問題点– 柔軟な端末の構成が難しい
(2)"

Alkanet(3)Alkanet&'($(4)SIGINT

Linux)

IEEE 1394 (5)#*!

Windows%&'(1)

($!

(6)Alkanet3はじめに (3/4)• 前スライドで述べた問題を解決するため，Ethernet版Alkanetを提案(1) (2)




!


 

Windows#$%(3)Alkanet!

Alkanet (Ethernet)

Ethernet$%&"Linux&"(5)

IEEE 1394

(4)SIGINT



'

!

(6)Alkanet4

はじめに (4/4)• 本発表では，Ethernet版Alkanetの開発を進める中で得られた知⾒について発表する– NICの隠蔽設定や送信に特化したlwIPのチューニングによる性能差– lwIPを⽤いて複数のパケットを送信する場合，ARPを考慮する必要がある

5

使⽤するTCP/IPプロトコルスタック• Ethernet経由でのAlkanetログ送信を実現するためには，TCP/IPプロトコルスタックが必要– 現⾏のBitVisorには，TCP/IPプロトコルスタックlwIPが移植されている– lwIPを⽤いて，Ethernet経由でのAlkanetログ送信機能を実装• lwIP (lightweight IP)– 組込みシステムを対象とした
TCP/IPプロトコルスタック– 設計⽬標: メモリ等のリソース使⽤量を可能な限り削減する
6各種設定による送信性能の差

7送信スループットの計測• lwIPが，どれほどの送信性能を持っているか調べるため，送信スループットの計測を⾏った• 以下の6つを対象に，計測を⾏った
プロトコル

NICの隠蔽設定

データサイズ/pkt

送信バッファサイズ(TCP, ip)

TCP

net=ip

536B

1072B

(tuned TCP, ip)TCP

net=ip1460B

65535B(TCP, ippass)TCP

net=ippass

536B

1072B

(tuned TCP, ippass)TCP

net=ippass

1460B

65535B(UDP, ip)

UDP

net=ip

1472B(UDP, ippass)UDP

net=ippass

1472B

8

送信スループットの計測• lwIPが，どれほどの送信性能を持っているか調べるため，送信スループットの計測を⾏った• 以下の6つを対象に，計測を⾏った
プロトコル

NICの隠蔽設定

データサイズ/pkt

送信バッファサイズ(TCP, ip)

TCP

net=ip

536B

1072B

(tuned TCP, ip)TCP

net=ip1460B

65535B(TCP, ippass)TCP

net=ippass

536B

1072B

(tuned TCP, ippass)TCP

net=ippass

1460B

65535B(UDP, ip)

UDP

net=ip

1472B(UDP, ippass)UDP

net=ippass

1472B

9

NICの隠蔽設定• BitVisorは，NICをゲストOSに対して隠蔽する機能を持っている– net=ip: NICを隠蔽する– net=ippass: NICを隠蔽しない• NICを隠蔽するか否かが，送信性能にどの程度影響を与えるのか知りたい– NICの隠蔽設定を計測対象に加えた10

送信スループットの計測• lwIPが，どれほどの送信性能を持っているか調べるため，送信スループットの計測を⾏った• 以下の6つを対象に，計測を⾏った
プロトコル

NICの隠蔽設定

データサイズ/pkt

送信バッファサイズ(TCP, ip)

TCP

net=ip

536B

1072B

(tuned TCP, ip)TCP

net=ip1460B

65535B(TCP, ippass)TCP

net=ippass

536B

1072B

(tuned TCP, ippass)TCP

net=ippass1460B

65535B(UDP, ip)

UDP

net=ip

1472B(UDP, ippass)UDP

net=ippass

1472B

11

TCPのチューニング
• lwIPは，チューニング⽤の#define定数マクロを多数⽤意している– チューニングを⾏うことで，どの程度⾼速になるのか知りたい• 以下の2つのチューニングを⾏ったtuned TCPを計測対象に加えた– MSSを536Bから1460Bに変更 (TCP_MSS)– TCPが持つ送信バッファのサイズを1072Bから65535Bに変更(TCP_SND_BUF, TCP_SND_QUEUELEN,
MEMP_NUM_TCP_SEG)
12

送信スループットの計測• lwIPが，どれほどの送信性能を持っているか調べるため，送信スループットの計測を⾏った• 以下の6つを対象に，計測を⾏った
プロトコル

NICの隠蔽設定

データサイズ/pkt

送信バッファサイズ(TCP, ip)

TCP

net=ip536B

1072B(tuned TCP, ip)TCP

net=ip1460B

65535B(TCP, ippass)TCP

net=ippass

536B

1072B

(tuned TCP, ippass)TCP

net=ippass

1460B

65535B(UDP, ip)

UDP

net=ip

1472B(UDP, ippass)UDP

net=ippass

1472B

13

計測環境
項⽬

値

VMM
ゲストOS

BitVisor 1.4

CPU
メモリ

Intel (R) Core(TM) i5-2320 CPU @ 3.00GHz

NIC

Intel Corporation PRO/1000
PT Dual Port Server Adapter (1Gbps)
1460B (TCP)，1472B (UDP)

1パケットあたりのデータサイズ

Debian 8.6 (Linux 3.16.0-4.amd64)
4GB

1実験あたりの合計送信データサイズ 100MB
実験回数5回

14

計測⽅法(1)dbgshを⽤いて，送信⽤関数を呼び出すDebian

BitVisor(2)パケット100MB送信

Ethernetケーブル

Ubuntu(3)sys_now()を⽤いて，全パケットの送信に要した時間を計測• 送信した合計バイト数と送信に要した時間から送信スループットを算出• 5回計測し，その平均値を結果とする
15

計測結果と考察(TCP, ip)

138.3Kbps(tuned TCP, ip)

21.2Mbps(TCP, ippass)

33.8Mbps(tuned TCP, ippass) 874Mbps(UDP, ip)

953Mbps(UDP, ippass)

981Mbps

0.0041倍
0.024倍
0.97倍• 特に，TCPの送信スループットが極端に低下する– TCPは，ウィンドウサイズ以上のデータを送信する場合，ACKを待つ必要がある– NICを隠蔽することで，VMに割込みが⼊らない– ACKの受信処理を円滑に⾏えないことが原因
16

計測結果と考察(TCP, ip)

138.3Kbps(tuned TCP, ip)

21.2Mbps(TCP, ippass)

33.8Mbps(tuned TCP, ippass) 874Mbps(UDP, ip)

953Mbps(UDP, ippass)

981Mbps

153倍
26倍• チューニングに関する参考サイト– Tuning TCP | lwIP Wiki | Fandom powered by Wikia(http://lwip.wikia.com/wiki/Tuning_TCP)– Maximizing throughput | lwIP Wiki | Fandom powered byWikia (http://lwip.wikia.com/wiki/Maximizing_throughput)
17計測結果と考察(TCP, ip)

138.3Kbps(tuned TCP, ip)

21.2Mbps(TCP, ippass)

33.8Mbps(tuned TCP, ippass) 874Mbps(UDP, ip)

953Mbps(UDP, ippass)981Mbps• Ethernet版Alkanetでは，(UDP, ip)を採⽤– ロギング⽤端末への攻撃の対策– 膨⼤なログを素早く送信する必要がある– 有線なので，パケットロスは滅多に発⽣しない

18

ARPに関する問題

19

ARPに関する問題• ARPによるアドレス解決が完了する前に，複数のパケットを送信しようとするとパケットの破棄が発⽣する– 複数のパケットを送信する場合，ARPを考慮する必要がある• 問題の原因と対策について述べる

20

lwIPの送信処理の流れ• lwIPは，以下の⼿順で送信処理を⾏う
1. TCP or UDPヘッダを作成
2. IPヘッダを作成
3. ARPテーブルを検索– 該当するエントリあり
4.

Ethernetヘッダを作成してパケットを送信– 該当するエントリなし
4.

ARP Reply待ちキュー (ARPエントリ毎に存在) にパケットを⼀時的に格納

5.

ARP Requestを送信

6.

ARP Reply受信後，4で格納したパケットを送信
21

ARPに関する問題の原因
キューサイズは1パケット分
enqueue
パケット2

パケット1

パケット1は上書きされる

ARP Reply待ちキュー• nパケット送信した場合，1番⽬からn-1番⽬までのパケットは破棄される• Ethernet版Alkanetでは問題にならない– 起動パケットを受信した段階で，アドレス解決が完了しているため
22

複数のTCPパケット送信⽅法• tcp_connect()を⽤いることで，ARPアドレス解決や3ウェイハンドシェイクと同期が取れる• err_t tcp_connect(struct tcp_pcb *pcb, ip_addr_t *ipaddr,u16_t port,tcp_connected_fn connected)– SYNパケットを送信する (ARP Requestも送信)– connectedには，コネクション確⽴後に呼び出されるコールバック関数を指定可能• connectedにデータ送信⽤関数を指定することで，複数のTCPパケットを送信できる– コネクション確⽴後には，ARPアドレス解決が完了しているため
23

複数のUDPパケット送信⽅法• TCPのように，コールバック関数で同期を取ることができない• ARPに関して何かしらの対応は必要– 1パケット⽬と2パケット⽬の間に待機処理を⼊れる– lwIPを拡張し，ARP Reply受信時にコールバック関数が呼ばれるようにする– ARP Reply待ちキューのサイズを増やす• ARP Reply待ちキューのサイズの増やし⽅– ARP_QUEUEINGを1に設定– MEMP_NUM_ARP_QUEUEにサイズを設定 (パケット単位)
24Ethernet版Alkanetの現状• 基本的な機能については実装完了– Alkanetログ送信機能– 起動/終了パケット受信機能– Ethernet版ログ取得ツール• 今後は，Ethernet版Alkanet上でマルウェアを動作させ，IEEE 1394版Alkanetと同様のログを取得できるか確認

25

おわりに
• Ethernet版Alkanetの開発を進める中で得られた知⾒について発表– NICの隠蔽設定やlwIPのチューニングによる送信性能の差• NICを隠蔽すると，特にTCPの送信スループットが極端に低下する• lwIPが提供するチューニング⽤定数を使⽤することで，送信スループットの向上が可能– lwIPを⽤いて複数のパケットを送信する場合，ARPを考慮する必要がある• TCPでは，コールバック関数を⽤いて解決可能• UDPでは，これといった解決策が存在しない
26