×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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”などで検索すると、脆弱性が見つかるかも? ◦ 今回はこれが言いたかった