SlideShare une entreprise Scribd logo
1  sur  15
Télécharger pour lire hors ligne
BitVisorに移植する (2)
東京農工大学 市川 遼
2019/12/12 BitVisor Summit 9
自己紹介
● 東京農工大学 工学府情報工学専攻 2年
○ 留学していたので卒業が一年伸びた
● 興味
○ Web security, Forensics, etc.
● 研究
○ VMM
前回お話したこと
● BitVisorにLuaやLibVMIを移植する方法
● 依存ライブラリ (libc, GLib) はどうする?
○ 通常のMakeでビルド
○ *.o を探し出してobjs-1に追加
○ BitVisorに対応するためにmuslは部分的に修正する
● BitVisorのどこに追加する?
○ 保護ドメイン (process) で動かす
● Lua用のパッチが必要
○ lua.cをBitVisorのprocess向けに編集した
○ SSEを使うためにCR0, CR4を設定
今回お話すること
● 文字通りLuaのソースコードに一切手を加えず移植する方法を考案した
○ main関数を直接呼び出せる
● musl から newlib への変更とその理由
● 実際に Lua を今回の方法で移植する手順を紹介
ディレクトリ構成
● 新しく追加するアプリケーションを app に配置すると仮定
● app/third_party
○ 依存ライブラリのビルド用 (BitVisorのビルドには使わない )
○ Luaはlibc以外に依存しないので今回は不要
● app/lua
○ Lua本体のプログラム
● app/process/lua.c
○ アプリケーションのエントリポイント
○ ここから目的のプログラムの mainを呼び出す
app/process/lua.c
● 本来のmain関数をライブラリのように扱う
○ argc, argv を設定しておく
● exitprocessを忘れない
○ return 0では終了しない
○ 無限にプロセスが増える
● app/process/Makefile でリンク対象を指定
○ lua-objs = lua.o ../../third_party/lua/lua-5.3.5/src/lua.o
○ lua-libs = third_party/lua/$(outa)
● これでLua本体には変更を加えず起動可能
int
_start (int a1, int a2)
{
// app/lib/lua/lua/src/lua.c:main
int main(int, char *[]);
const int stacksize = 16*1024;
if (setlimit (stacksize, 8*stacksize)) {
printf("lua restrict failedn");
exitprocess(1);
}
int argc = 1;
char *argv[] = {"lua", 0};
main(argc, argv);
exitprocess(0);
return 0;
}
移植の際に発生する問題点を整理する
● システムコールが全く違う
○ process用に用意されたもののみ (core/process.c)
■ msg*, {new,exit}process, setlimit
○ 多くのプログラムはlibc経由でLinuxのシステムコールを呼び出す
● リンク時の名前衝突
○ libcをそのままコンパイルすると BitVisorで独自実装されているものとぶつかる
● ライブラリの静的リンク
○ BitVisorのビルドシステムはちょっと特殊である
解決策
● システムコールが全く違う、リンク時の名前衝突
○ バイナリをビルドした時点で BitVisor用の命令セットであれば良い
→ BitVisor用のコンパイラを作れば良いのでは?
● ライブラリの静的リンク
○ いままではBitVisorのobjs-1に追加する方法を取っていた
■ 追加するライブラリが多くなってくると面倒
○ GCCのstatic linkだけで片付けたい
● → BitVisor用のコンパイル環境があればよいのでは?
x86_64-bitvisor-gccのビルド
● toolchain (Binutils, GCC, newlib) のBitVisor対応
○ https://wiki.osdev.org/OS_Specific_Toolchain
○ https://wiki.osdev.org/GCC_Cross-Compiler
○ https://wiki.osdev.org/Porting_Newlib
○ https://sourceware.org/newlib/libc.html#Syscalls
○ OSDev Wikiがnewlibにしか対応していなかったので muslから変更
■ newlibは変更すべきファイルがまとまっていて扱いやすい
○
● ホストの名前空間を汚したくないのでDocker上で構築する
○ x86_64-bitvisor-gcc という保護ドメイン用コンパイルが出来上がる
○ 当然このコンパイラでコンパイルされたバイナリは Linuxで実行できない
BitVisorサブシステム
● newlib/libc/sys/bitvisor にシステムコール部分を実装
○ いくつかの関数をBitVisorの機能へリンクする
● syscall:sbrk -> bitvisor:lib_mm:alloc
● syscall:_exit -> bitvisor:lib_syscall:exitprocess
● stdio:fgets -> bitvisor:lib_lineinput:lineinput
○ readを msgsendint(0,0) にしてもうまく動かない
● syscall:write -> msgsendint(1, c)
● あとはstubでとりあえず十分
newlibベースtoolchainのビルド
● binutils
○ 8 files
● gcc
○ 6 files
● newlib
○ 19 files
■ 4 files: newlib本体
■ 15 files: bitvisorサブシステム (syscall実装含む)
● diff: 2033行
● dockerでビルドする
ビルドシステム側の修正
● process-binを吐き出すときにx86_64-bitvisor-gccに差し替える
○ Makefile.buildの $(bins) セクション
● コンパイラフラグ
○ -static
○ -l$(lib)
● 後は普通にビルドするだけ
○ 必要なライブラリをあらかじめ docker内でビルド、インストールしておく
○ *-objs, *-libs でやってた依存関係解決を GCCで代わりにやってしまう
processに追加する
● process に追加するとlibがせっかく実装したbitvisorサブシステムと衝突
→ 新しくprocessディレクトリを作る (app/process)
○ psubdirs に追加
○ process-depends を忘れない (並列ビルドすると依存関係で落ちる )
■ Makefile:
● $(dir)app/process/$(outp_p) : $(app-depends-1)
● process/lib を用いずにビルド可能に
● 依存ライブラリはコンテナ内からリンクされる
○ *-libs に追加する必要がない
欠点
● ビルドシステムがsanity checkを持っていると走らない
○ コンパイルされたバイナリが実行可能かどうか
○ syscallが違うのでそれはそう
● GLibのビルドシステムが meson + ninja に変わった
○ LibVMIで必要
○ x86_64-bitvisor-gcc でビルドすると途中で落ちる
○ 現在はGLibだけ x86_64-linux-gcc でビルドしている
まとめ
● DockerでBitVisor用のビルド環境を作った
○ 依存ライブラリなどの問題が解決された
● 真の意味であらゆるプログラムを移植可能になった
○ newlibは最低限しか実装していない (read, write gettimeofday
○ 必要なsyscallは実装する必要がある
● newlibを用いて容易に拡張できる
○ 必要なsyscallは newlib/libc/sys/bitvisor で追加
○ mprotectなどを実装すればJITも動くかも? (今後の展望)

Contenu connexe

Tendances

pkgsrcに関する何か 2009 - 何と何で何とやら
pkgsrcに関する何か 2009 - 何と何で何とやらpkgsrcに関する何か 2009 - 何と何で何とやら
pkgsrcに関する何か 2009 - 何と何で何とやらAkio OBATA
 
Deconstruction of Serverless and blockchain
Deconstruction of Serverless and blockchainDeconstruction of Serverless and blockchain
Deconstruction of Serverless and blockchainTakahiro Hayashida
 
5分でわかるブロックチェーンの基本的な仕組み
5分でわかるブロックチェーンの基本的な仕組み5分でわかるブロックチェーンの基本的な仕組み
5分でわかるブロックチェーンの基本的な仕組みRyo Shimamura
 
pkgsrcに関する何か 2008 - 何かは何かであって、何かでなし
pkgsrcに関する何か 2008 - 何かは何かであって、何かでなしpkgsrcに関する何か 2008 - 何かは何かであって、何かでなし
pkgsrcに関する何か 2008 - 何かは何かであって、何かでなしAkio OBATA
 
ビットコイン~原理からソースまで~
ビットコイン~原理からソースまで~ビットコイン~原理からソースまで~
ビットコイン~原理からソースまで~bitbank, Inc. Tokyo, Japan
 
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸kunst1080
 
pkgsrc とは何か? - よもやま話
pkgsrc とは何か? - よもやま話pkgsrc とは何か? - よもやま話
pkgsrc とは何か? - よもやま話Akio OBATA
 
多摩美メディア芸術基礎I 第1回: WWW基礎
多摩美メディア芸術基礎I 第1回: WWW基礎多摩美メディア芸術基礎I 第1回: WWW基礎
多摩美メディア芸術基礎I 第1回: WWW基礎Atsushi Tadokoro
 
Minecraft modding 06
Minecraft modding 06Minecraft modding 06
Minecraft modding 06Takunology
 
Minecraft modding 09
Minecraft modding 09Minecraft modding 09
Minecraft modding 09Takunology
 
Vagrantで即席クラウドストレージ
Vagrantで即席クラウドストレージVagrantで即席クラウドストレージ
Vagrantで即席クラウドストレージYoshimi Tominaga
 
virtio勉強会 #1 「virtioの基本的なところ(DRAFT版)」
virtio勉強会 #1 「virtioの基本的なところ(DRAFT版)」virtio勉強会 #1 「virtioの基本的なところ(DRAFT版)」
virtio勉強会 #1 「virtioの基本的なところ(DRAFT版)」Naoya Kaneko
 
KOF2016東海道らぐLT
KOF2016東海道らぐLTKOF2016東海道らぐLT
KOF2016東海道らぐLTShu Kobuchi
 
MinChain – Bitcoin ライクな最小限のブロックチェーン実装
MinChain – Bitcoin ライクな最小限のブロックチェーン実装MinChain – Bitcoin ライクな最小限のブロックチェーン実装
MinChain – Bitcoin ライクな最小限のブロックチェーン実装Yuto Takei
 
Mashup Hackathon 名古屋 MA11
Mashup Hackathon 名古屋 MA11Mashup Hackathon 名古屋 MA11
Mashup Hackathon 名古屋 MA11Wataru Sato
 

Tendances (20)

pkgsrcに関する何か 2009 - 何と何で何とやら
pkgsrcに関する何か 2009 - 何と何で何とやらpkgsrcに関する何か 2009 - 何と何で何とやら
pkgsrcに関する何か 2009 - 何と何で何とやら
 
Deconstruction of Serverless and blockchain
Deconstruction of Serverless and blockchainDeconstruction of Serverless and blockchain
Deconstruction of Serverless and blockchain
 
5分でわかるブロックチェーンの基本的な仕組み
5分でわかるブロックチェーンの基本的な仕組み5分でわかるブロックチェーンの基本的な仕組み
5分でわかるブロックチェーンの基本的な仕組み
 
pkgsrcに関する何か 2008 - 何かは何かであって、何かでなし
pkgsrcに関する何か 2008 - 何かは何かであって、何かでなしpkgsrcに関する何か 2008 - 何かは何かであって、何かでなし
pkgsrcに関する何か 2008 - 何かは何かであって、何かでなし
 
Bsdtw repo
Bsdtw repoBsdtw repo
Bsdtw repo
 
ビットコイン~原理からソースまで~
ビットコイン~原理からソースまで~ビットコイン~原理からソースまで~
ビットコイン~原理からソースまで~
 
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
 
pkgsrc とは何か? - よもやま話
pkgsrc とは何か? - よもやま話pkgsrc とは何か? - よもやま話
pkgsrc とは何か? - よもやま話
 
多摩美メディア芸術基礎I 第1回: WWW基礎
多摩美メディア芸術基礎I 第1回: WWW基礎多摩美メディア芸術基礎I 第1回: WWW基礎
多摩美メディア芸術基礎I 第1回: WWW基礎
 
Minecraft modding 06
Minecraft modding 06Minecraft modding 06
Minecraft modding 06
 
Minecraft modding 09
Minecraft modding 09Minecraft modding 09
Minecraft modding 09
 
情報編集(Web) 130409
情報編集(Web) 130409情報編集(Web) 130409
情報編集(Web) 130409
 
Vagrantで即席クラウドストレージ
Vagrantで即席クラウドストレージVagrantで即席クラウドストレージ
Vagrantで即席クラウドストレージ
 
virtio勉強会 #1 「virtioの基本的なところ(DRAFT版)」
virtio勉強会 #1 「virtioの基本的なところ(DRAFT版)」virtio勉強会 #1 「virtioの基本的なところ(DRAFT版)」
virtio勉強会 #1 「virtioの基本的なところ(DRAFT版)」
 
KOF2016東海道らぐLT
KOF2016東海道らぐLTKOF2016東海道らぐLT
KOF2016東海道らぐLT
 
Securing Supply Chains
Securing Supply ChainsSecuring Supply Chains
Securing Supply Chains
 
Sfstudy #2
Sfstudy #2Sfstudy #2
Sfstudy #2
 
MinChain – Bitcoin ライクな最小限のブロックチェーン実装
MinChain – Bitcoin ライクな最小限のブロックチェーン実装MinChain – Bitcoin ライクな最小限のブロックチェーン実装
MinChain – Bitcoin ライクな最小限のブロックチェーン実装
 
Beijing Report 2022
Beijing Report 2022Beijing Report 2022
Beijing Report 2022
 
Mashup Hackathon 名古屋 MA11
Mashup Hackathon 名古屋 MA11Mashup Hackathon 名古屋 MA11
Mashup Hackathon 名古屋 MA11
 

Similaire à how to port * to BitVisor (2)

how to port * to BitVisor
how to port * to BitVisorhow to port * to BitVisor
how to port * to BitVisoricchy
 
ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略bitbank, Inc. Tokyo, Japan
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能Kohei Tokunaga
 
話題のNode-REDでIoTアプリを作ってみよう
話題のNode-REDでIoTアプリを作ってみよう話題のNode-REDでIoTアプリを作ってみよう
話題のNode-REDでIoTアプリを作ってみようKimihiko Kitase
 
[Intermediate 01] イントロダクション / Bitcoin を動作させる
[Intermediate 01] イントロダクション / Bitcoin を動作させる[Intermediate 01] イントロダクション / Bitcoin を動作させる
[Intermediate 01] イントロダクション / Bitcoin を動作させるYuto Takei
 
Code igniter + ci phpunit-test
Code igniter + ci phpunit-testCode igniter + ci phpunit-test
Code igniter + ci phpunit-testME iBotch
 
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用Ryo Sasaki
 
BitVisor Summit 3 「BitVisorの現状と今後」
BitVisor Summit 3 「BitVisorの現状と今後」BitVisor Summit 3 「BitVisorの現状と今後」
BitVisor Summit 3 「BitVisorの現状と今後」Takahiro Shinagawa
 
「Gitが、おもしろいほどわかる基本の使い方33」 出版記念セミナー
「Gitが、おもしろいほどわかる基本の使い方33」 出版記念セミナー「Gitが、おもしろいほどわかる基本の使い方33」 出版記念セミナー
「Gitが、おもしろいほどわかる基本の使い方33」 出版記念セミナーHajime Ogushi
 
Pythonとgit hubとベンチャー企業の上手な付き合い方
Pythonとgit hubとベンチャー企業の上手な付き合い方Pythonとgit hubとベンチャー企業の上手な付き合い方
Pythonとgit hubとベンチャー企業の上手な付き合い方Takahiro Fujiwara
 
GitHubにおける開発フローについてのお話
GitHubにおける開発フローについてのお話GitHubにおける開発フローについてのお話
GitHubにおける開発フローについてのお話Sota Sugiura
 
マイクロサービスとは.pptx
マイクロサービスとは.pptxマイクロサービスとは.pptx
マイクロサービスとは.pptxssuserdd7ea9
 
クラウドセキュリティ基礎
クラウドセキュリティ基礎クラウドセキュリティ基礎
クラウドセキュリティ基礎Masahiro NAKAYAMA
 
[cb22] ブロックチェーンにC&Cサーバー情報を隠ぺいした攻撃者との直接対峙により得られたもの by 谷口 剛
[cb22]  ブロックチェーンにC&Cサーバー情報を隠ぺいした攻撃者との直接対峙により得られたもの by 谷口 剛[cb22]  ブロックチェーンにC&Cサーバー情報を隠ぺいした攻撃者との直接対峙により得られたもの by 谷口 剛
[cb22] ブロックチェーンにC&Cサーバー情報を隠ぺいした攻撃者との直接対峙により得られたもの by 谷口 剛CODE BLUE
 
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイNobuyuki Matsui
 
Kubernetes 初心者の僕からの JKD 参加報告
Kubernetes 初心者の僕からの JKD 参加報告Kubernetes 初心者の僕からの JKD 参加報告
Kubernetes 初心者の僕からの JKD 参加報告Kentaro NOMURA
 
bitbankフロントエンド開発について
bitbankフロントエンド開発についてbitbankフロントエンド開発について
bitbankフロントエンド開発についてKou Matsumoto
 
Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Atsushi Nakamura
 

Similaire à how to port * to BitVisor (2) (20)

how to port * to BitVisor
how to port * to BitVisorhow to port * to BitVisor
how to port * to BitVisor
 
ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
話題のNode-REDでIoTアプリを作ってみよう
話題のNode-REDでIoTアプリを作ってみよう話題のNode-REDでIoTアプリを作ってみよう
話題のNode-REDでIoTアプリを作ってみよう
 
[Intermediate 01] イントロダクション / Bitcoin を動作させる
[Intermediate 01] イントロダクション / Bitcoin を動作させる[Intermediate 01] イントロダクション / Bitcoin を動作させる
[Intermediate 01] イントロダクション / Bitcoin を動作させる
 
Netmf-180224
Netmf-180224Netmf-180224
Netmf-180224
 
Code igniter + ci phpunit-test
Code igniter + ci phpunit-testCode igniter + ci phpunit-test
Code igniter + ci phpunit-test
 
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
 
BitVisor Summit 3 「BitVisorの現状と今後」
BitVisor Summit 3 「BitVisorの現状と今後」BitVisor Summit 3 「BitVisorの現状と今後」
BitVisor Summit 3 「BitVisorの現状と今後」
 
「Gitが、おもしろいほどわかる基本の使い方33」 出版記念セミナー
「Gitが、おもしろいほどわかる基本の使い方33」 出版記念セミナー「Gitが、おもしろいほどわかる基本の使い方33」 出版記念セミナー
「Gitが、おもしろいほどわかる基本の使い方33」 出版記念セミナー
 
Pythonとgit hubとベンチャー企業の上手な付き合い方
Pythonとgit hubとベンチャー企業の上手な付き合い方Pythonとgit hubとベンチャー企業の上手な付き合い方
Pythonとgit hubとベンチャー企業の上手な付き合い方
 
GitHubにおける開発フローについてのお話
GitHubにおける開発フローについてのお話GitHubにおける開発フローについてのお話
GitHubにおける開発フローについてのお話
 
マイクロサービスとは.pptx
マイクロサービスとは.pptxマイクロサービスとは.pptx
マイクロサービスとは.pptx
 
Deploy TypeScript Application by CodePipeline
Deploy TypeScript Application by CodePipelineDeploy TypeScript Application by CodePipeline
Deploy TypeScript Application by CodePipeline
 
クラウドセキュリティ基礎
クラウドセキュリティ基礎クラウドセキュリティ基礎
クラウドセキュリティ基礎
 
[cb22] ブロックチェーンにC&Cサーバー情報を隠ぺいした攻撃者との直接対峙により得られたもの by 谷口 剛
[cb22]  ブロックチェーンにC&Cサーバー情報を隠ぺいした攻撃者との直接対峙により得られたもの by 谷口 剛[cb22]  ブロックチェーンにC&Cサーバー情報を隠ぺいした攻撃者との直接対峙により得られたもの by 谷口 剛
[cb22] ブロックチェーンにC&Cサーバー情報を隠ぺいした攻撃者との直接対峙により得られたもの by 谷口 剛
 
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
 
Kubernetes 初心者の僕からの JKD 参加報告
Kubernetes 初心者の僕からの JKD 参加報告Kubernetes 初心者の僕からの JKD 参加報告
Kubernetes 初心者の僕からの JKD 参加報告
 
bitbankフロントエンド開発について
bitbankフロントエンド開発についてbitbankフロントエンド開発について
bitbankフロントエンド開発について
 
Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0
 

how to port * to BitVisor (2)