Slide 1

Slide 1 text

%sの話 NV (@nvsofts)

Slide 2

Slide 2 text

自己紹介 名前:NV ◦ Twitter: @nvsofts 個人サークル「えぬえす工房」代表 ◦ https://www.ns-koubou.com/ ◦ 最近は市販機器をハックする同人誌を書いています 普段は都内にあるセキュリティ会社でIoTセキュリティなどをやっています

Slide 3

Slide 3 text

%s

Slide 4

Slide 4 text

お察しの通り 今回は、sprintf()などで使用する書式文字列である”%s”に関する話です

Slide 5

Slide 5 text

これ、IoT関係あるの??

Slide 6

Slide 6 text

これ、IoT関係あるの?? あります!

Slide 7

Slide 7 text

これ、IoT関係あるの?? あります! 実は特定の使われ方で見かけることがあるからです ◦ 何度も見かけているので、偶然ではないはずです

Slide 8

Slide 8 text

使われ方 1. どこかから入力を取ってくる 2. 入力と書式文字列を元にsprintf()系関数でコマンドを作成する 3. 作成したコマンドをsystem()関数で実行する

Slide 9

Slide 9 text

コード例 ARM Linuxで、以下のコードをコンパイルした際のアセンブリコードを見る int main(int argc, char *argv[]) { char buf[1024]; if (argc != 2) { return 1; } snprintf(buf, sizeof(buf), "cp %s data", argv[1]); system(buf); return 0; }

Slide 10

Slide 10 text

アセンブリコード

Slide 11

Slide 11 text

アセンブリコード

Slide 12

Slide 12 text

アセンブリコード

Slide 13

Slide 13 text

プログラムの動作 引数に与えられたファイル名をdataというファイル名でコピーする 例:/etc/hoge.datをdataというファイル名でコピーする $ ./test /etc/hoge.dat

Slide 14

Slide 14 text

これって・・・ 脆弱性あるのでは?って思った人

Slide 15

Slide 15 text

これって・・・ 脆弱性あるのでは?って思った人 → 正解!

Slide 16

Slide 16 text

これって・・・ 脆弱性あるのでは?って思った人 → 正解! OSコマンドインジェクションの脆弱性があります

Slide 17

Slide 17 text

脆弱性を突く 例えば、こういうコマンドにしたら? $ ./test '; echo Hello!; /bin/true '

Slide 18

Slide 18 text

脆弱性を突く 例えば、こういうコマンドにしたら? $ ./test '; echo Hello!; /bin/true ' 実際に実行されるコマンドは cp ; echo Hello!; /bin/true data となる

Slide 19

Slide 19 text

なんでこんなのがあるのか? (独断と偏見が多分に入っています)

Slide 20

Slide 20 text

なんでこんなのがあるのか? (独断と偏見が多分に入っています) → C言語を「すごいシェルスクリプト」として使っている可能性? ◦ 組み込みLinuxを「面倒なことをやってくれるやつ」的な扱いをしている? ◦ 単にコマンドを実行する用途にsystem()関数を使うあたり、そういう感じがする

Slide 21

Slide 21 text

なんでこんなのがあるのか? (独断と偏見が多分に入っています) → C言語を「すごいシェルスクリプト」として使っている可能性? ◦ 組み込みLinuxを「面倒なことをやってくれるやつ」的な扱いをしている? ◦ 単にコマンドを実行する用途にsystem()関数を使うあたり、そういう感じがする → sprintf()系関数は入門者でも知っているくらい有名 ◦ とりあえずこれ使えばやりたいことを実現できる、的な考え?

Slide 22

Slide 22 text

対策 入力をサニタイズする ◦ 一般的な対策

Slide 23

Slide 23 text

対策 入力をサニタイズする ◦ 一般的な対策 そもそもsystem()関数を使わない ◦ system()関数はシェルを通すため、’;’などのシェルで意味を持つ文字が使える ◦ fork()してexec()するならそういうことはない ◦ もちろん、/bin/sh –c ~をexec()したらダメ ◦ 加えて、想定外の文字種が入っていないかの検査もするべき

Slide 24

Slide 24 text

まとめ sprintf()系関数とsystem()関数の組み合わせは、脆弱性を生む可能性 が高い 実行ファイルの文字列を”%s”などで検索すると、脆弱性が見つかるかも? ◦ 今回はこれが言いたかった