Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
sudo-rsのテストの話 / story of sudo-rs testing
Search
Arata
June 07, 2023
310
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
sudo-rsのテストの話 / story of sudo-rs testing
Arata
June 07, 2023
More Decks by Arata
See All by Arata
Black Hat USA 2026の面白かった発表を紹介
arata_nvm
1
19
Operating Systems: Three Easy Pieces, Chapter 49 / Sun's Network File System (NFS)
arata_nvm
0
21
デコンパイラ研究調査
arata_nvm
1
39
コンパイラ基盤を支える言語たち
arata_nvm
1
120
LLVMのDSL”TableGen”向け言語サーバーの開発
arata_nvm
0
43
5分でわかるPage-Fault Weird Machine
arata_nvm
2
450
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
28
Pythonのcopy-and-patch JITの実装を読む
arata_nvm
0
180
eBPFを使った動的解析手法
arata_nvm
1
830
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
225
10k
The agentic SEO stack - context over prompts
schlessera
0
920
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
270
For a Future-Friendly Web
brad_frost
183
10k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
320
エンジニアに許された特別な時間の終わり
watany
108
250k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
How to make the Groovebox
asonas
2
2.4k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Transcript
sudo-rsのテストの話 人工衛星の開発現場でLT大会 〜地上と宇宙で活躍するRust〜 Arata
Twitter: @arata_nvm 2023/06/07 #arkedge_lt sudo-rsプロジェクトの登場 2
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • {sudo, su}コマンドをRustで再実装するプロジェクト • なぜ? ◦
もともとC言語で書かれていた ◦ そのために多くのバグや脆弱性が存在した ◦ Rustで実装することで、メモリ起因のバグやビジネスロジックの バグを減らすことが目的 sudo-rsプロジェクトとは 3
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • 既存の/etc/sudoersと互換であること ◦ > We will
be compatible with the existing /etc/sudoers format. sudo-rsの技術目標 4
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • 既存の/etc/sudoersと互換であること ◦ > We will
be compatible with the existing /etc/sudoers format. • どうやって互換性を保証するのか? ◦ 同じテストをsudoとsudo-rsがパスすることを検証する sudo-rsの技術目標 5
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 6
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 7 1. /etc/sudoersファイルと ユーザの準備
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 8 1. /etc/sudoersファイルと ユーザの準備
2. `sudo true`が成功することを検証
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 9 1. /etc/sudoersファイルと ユーザの準備
2. `sudo true`が成功することを検証 3. 特定のユーザーで`sudo true`が 成功することを検証
Twitter: @arata_nvm 2023/06/07 #arkedge_lt オリジナルのsudoコマンドでテストするとき cargo test -p sudo-compliance-tests --
--include-ignored sudo-rsのsudoコマンドでテストするとき SUDO_UNDER_TEST=ours cargo test -p sudo-compliance-tests テストの実行 10
Twitter: @arata_nvm 2023/06/07 #arkedge_lt オリジナルのsudoコマンドでテストするとき cargo test -p sudo-compliance-tests --
--include-ignored sudo-rsのsudoコマンドでテストするとき SUDO_UNDER_TEST=ours cargo test -p sudo-compliance-tests コマンドを変えるだけでテストの対象(sudo/sudo-rs)を変更できる テストの実行 11
Twitter: @arata_nvm 2023/06/07 #arkedge_lt オリジナルのsudoコマンドでテストするとき cargo test -p sudo-compliance-tests --
--include-ignored sudo-rsのsudoコマンドでテストするとき SUDO_UNDER_TEST=ours cargo test -p sudo-compliance-tests 今日話すこと 12 これはなに?
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • SUDO_UNDER_TEST=ours ◦ テストをDockerのコンテナ上で走らせている ◦ 環境変数に応じて使用するDockerfileを変更する
▪ ours.Dockerfile / theirs.Dockerfile • --include-ignored ◦ sudoでしか実行できないテストが存在する ◦ ignoreアトリビュートでsudo-rsのテストから除外している TL; DR 13
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • SUDO_UNDER_TEST=ours ◦ テストをDockerのコンテナ上で走らせている ◦ 環境変数に応じて使用するDockerfileを変更する
▪ ours.Dockerfile / theirs.Dockerfile • --include-ignored ◦ sudoでしか実行できないテストが存在する ◦ ignoreアトリビュートでsudo-rsのテストから除外している TL; DR 14
Twitter: @arata_nvm 2023/06/07 #arkedge_lt [再掲] テストの例: user_list::all 15
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 16 sudoersファイルの内容を 引数に渡してEnv()を呼び出す
Twitter: @arata_nvm 2023/06/07 #arkedge_lt Env 17
Twitter: @arata_nvm 2023/06/07 #arkedge_lt Env 18 EnvBuilderをインスタンス化
Twitter: @arata_nvm 2023/06/07 #arkedge_lt Env 19 引数を`/etc/sudoers`の内容とし て保持する
Twitter: @arata_nvm 2023/06/07 #arkedge_lt テストの例: user_list::all 20 EnvBuilder::build()を呼び出す
Twitter: @arata_nvm 2023/06/07 #arkedge_lt EnvBuilder::build 21
Twitter: @arata_nvm 2023/06/07 #arkedge_lt EnvBuilder::build 22 docker::build_base_image()を呼び出す
Twitter: @arata_nvm 2023/06/07 #arkedge_lt docker::build_base_image 23
Twitter: @arata_nvm 2023/06/07 #arkedge_lt docker::build_base_image 24 dockerコマンドを構築する
Twitter: @arata_nvm 2023/06/07 #arkedge_lt docker::build_base_image 25 SudoUnderTest::from()の結果に応じて 引数に渡すDockerfileを変更する
Twitter: @arata_nvm 2023/06/07 #arkedge_lt SudoUnderTest::from_env 26
Twitter: @arata_nvm 2023/06/07 #arkedge_lt SudoUnderTest::from_env 27 環境変数SUDO_UNDER_TESTの値を SudoUnderTestに変換する
Twitter: @arata_nvm 2023/06/07 #arkedge_lt 1. 環境変数SUDO_UNDER_TESTの値を見る 2. “ours”ならours.Dockerfile、”theirs”ならtheirs.Dockerfile を使用する 3.
Dockerfileをもとにイメージを構築する 4. コンテナ内でsudoコマンドを実行し、結果を観測する これらをEnv構造体などで抽象化している →同じテストをsudoとsudo-rsで再利用できる まとめ 28
Twitter: @arata_nvm 2023/06/07 #arkedge_lt • /sudo-rs/test-framework ◦ /sudo-compliance-tests ▪ /src/child_process.rs
▪ /src/user_list.rs ▪ … ◦ /sudo-test ▪ /src/ours.Dockerfile ▪ /src/theirs.Dockerfile ▪ … モジュールの構成 29 テストケース テストのためのフレームワーク