Successfully reported this slideshow.

DLL読み込みの問題を読み解く

7

Share

1 of 48
1 of 48

DLL読み込みの問題を読み解く

7

Share

Download to read offline

OSC2017Kyoto 講演資料です.
(20170806: 講演で使ったバージョンに更新しました. 事前にアップロードしたものとほぼ同じです.)

OSC2017Kyoto 講演資料です.
(20170806: 講演で使ったバージョンに更新しました. 事前にアップロードしたものとほぼ同じです.)

More Related Content

Viewers also liked

More from JPCERT Coordination Center

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

DLL読み込みの問題を読み解く

  1. 1. セキュアなソフトウェアをつくるために…… DLL読み込みの問題を読み解く JPCERT コーディネーションセンター 情報流通対策グループ リードアナリスト ⼾⽥ 洋三 2017年8⽉5⽇(⼟)
  2. 2. Copyright ©2017 JPCERT/CC All rights reserved. 本⽇の話題 ü ⾃⼰紹介 ü 「DLL読み込みの脆弱性」って? ü 過去を振り返る -- 2010年ころ ü 最近の届け出 ü ユーザが⾏うべき対策、開発者が⾏うべき対策 ü まとめ ü 参考情報など 2
  3. 3. Copyright ©2017 JPCERT/CC All rights reserved. http://www.tomo.gr.jp/root/e9706.html JPCERT/CC 情報流通対策グループ リードアナリスト ⼾⽥ 洋三 脆弱性情報分析, セキュアコーディ ング普及啓発活動…… に努めています 3 ⾃⼰紹介
  4. 4. Copyright ©2017 JPCERT/CC All rights reserved. JPCERT Coordination Center 日本における情報セキュリティ対策 活動の向上に取り組んでいる組織 4
  5. 5. Copyright ©2017 JPCERT/CC All rights reserved. 過去のOSC参加履歴 (セミナーを⾏ったもの) 5 •OSC2017@Osaka •SEI CERT コーディングスタンダードのご紹介 •OSC2016@Hokkaido •OWASP ASVS と Cheat Sheet(日本語版)のご紹介 •OSC2015@Hokkaido •CSRF 脆弱性とその対策について •OSC2014@Fukuoka •Lessons (to be) Learned from Handling OpenSSL Vulnerabilities •OSC2013@Kyoto •~ヒトの振り見て我が振り直せ~脆弱性事例に学ぶJavaセキュアコーディング •OSC2012@Fukuoka •Androidセキュアコーディング~安全なAndroidアプリ開発のための心得~ •OSC2011@Nagoya: セキュアコーディングノススメ(JAVA編) •OSC2010@Hokkaido: あなたのコードにセキュアコーディングスタンダード •OSC2009@Fukuoka: セキュアコーディングノススメ •OSC2008@Tokyo/Spring: セキュアコーディングノススメ •OSC2007@Fukuoka: セキュアコーディングノススメ •OSC2007@Niigata: ソフトウェア脆弱性を取り巻く状況と対策 •OSC2007@Kansai: ソフトウェア脆弱性情報流通のこれまでとこれから •OSC2005@Tokyo/Fall: ソフトウェア脆弱性情報流通への取り組み
  6. 6. Copyright ©2017 JPCERT/CC All rights reserved. JPCERT/CC の活動 重要インフラ、重要情報インフラ事業者等の特定組織向け情報発信早期警戒情報 海外のNational-CSIRTや企業内のセキュリティ対応組織の構築・運⽤⽀援CSIRT構築⽀援 脆弱性情報ハンドリング Ø 未公開の脆弱性関連情報を製品開発者へ提供し、 対応依頼 Ø 関係機関と連携し、国際的に情報公開⽇を調整 Ø セキュアなコーディング⼿法の普及 Ø 制御システムに関する脆弱性関連情報の適切な 流通 マルウエア(不正プログラム)等の攻撃⼿法の分析、解析アーティファクト分析 各種業務を円滑に⾏うための海外関係機関との連携国際連携 インシデントの予測と捕捉インシデント予防 発⽣したインシデントへの対応 制御システムに関するインシデントハンドリング、情報収集・分析発信制御システムセキュリティ ⽇本シーサート協議会、フィッシング対策協議会の事務局運営等国内外関係者との連携 Ø マルウエアの接続先等の攻撃関連サイト等の閉 鎖等による被害最⼩化 Ø 攻撃⼿法の分析⽀援による被害可能性の確認、 拡散抑⽌ Ø 再発防⽌に向けた関係各関の情報交換及び情報 共有 インシデントハンドリング (インシデント対応調整⽀援) 情報収集・分析・発信 定点観測(TSUBAME) Ø ネットワークトラフィック情報の収集分析 Ø セキュリティ上の脅威情報の収集、分析、必要 とする組織への提供 6
  7. 7. Copyright ©2017 JPCERT/CC All rights reserved. JPCERT/CC セキュアコーディングのコンテンツ 7 www.jpcert.or.jp/securecoding/
  8. 8. Copyright ©2017 JPCERT/CC All rights reserved. slideshare にも講演資料やセミナコンテンツ置いてます 8 www.slideshare.net/jpcert_securecoding/presentations
  9. 9. Copyright ©2017 JPCERT/CC All rights reserved. 「DLL読み込みの脆弱性」って? 9
  10. 10. Copyright ©2017 JPCERT/CC All rights reserved. JVNに掲載されているDLL読み込み案件 10
  11. 11. Copyright ©2017 JPCERT/CC All rights reserved. JVNに掲載されているDLL読み込み案件 11
  12. 12. Copyright ©2017 JPCERT/CC All rights reserved. そもそも DLL ってなんだっけ? 12 ダイナミック リンク ライブラリ (DLL) は、関数とリソースの共有ラ イブラリとして機能する実行可能ファイルです。 …… オペレーティング システムは、実行可能ファイルの読み込み時、 または実行時に必要に応じて、DLL を実行可能ファイルのメモリ 領域に読み込むことができます。 また、DLL は、実行可能ファイ ル間で関数とリソースを共有しやすくします。 メモリ内の DLL の 内容には、同時に複数のアプリケーションがアクセスできます。 https://msdn.microsoft.com/ja-jp/library/1ez7dh12.aspx •Windows 標準の DLL(Kernel32.dll, User32.dll, GDI32.dll, …) •アプリ固有の DLL
  13. 13. Copyright ©2017 JPCERT/CC All rights reserved. DLL の読み込み 13 • (C などの)スタートアップルーチンの初期化の一環として 必要な DLL を読み込み • アプリの中で LoadLibrary() などを使って読み込み 1. 実⾏ファイルがあるディレクトリ (アプリケーションディレクトリ) 2. Windows システムディレクトリ 3. Windows ディレクトリ 4. カレントディレクトリ 5. 環境変数 PATH 0. “KnownDLLs” に登録されているかどうか Windows デスクトップアプリが使用する DLL 検索パス (cf. https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx)
  14. 14. Copyright ©2017 JPCERT/CC All rights reserved. DLL 読み込みの様⼦を⾒る 14 •Sysinternals に含まれている Process Monitor (procmon) • DLL 読み込みをはじめ、Win32 API 呼び出しの様⼦などの調査に 役⽴つ •Dependency Walker • DLL の読み込み順序、依存関係を調べる 定番のツール2つ
  15. 15. Copyright ©2017 JPCERT/CC All rights reserved. Sysinternals Process Monitor (procmon) ファイル関連の操作やレジス トリ操作などのイベントを記 録できる ⼤量のイベントログのなかか ら、プロセス名、パス名、操 作内容などによるフィルタを かけて必要な部分のみを抽出 できる 15 https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
  16. 16. Copyright ©2017 JPCERT/CC All rights reserved. procmon を使った挙動確認 üprocmon.exe を実⾏ (イベント記録開始) üプログラム起動, ひととおり操作 üprocmon.exe でフィルタ設定 üフィルタ後のログ内容を精査 ü必要に応じてログ保存 16
  17. 17. Copyright ©2017 JPCERT/CC All rights reserved. procmon の実⾏には管理者権限が必要 起動すると, UAC(ユーザ アカウント制御)で実⾏許 可を求められます. 17 こんなやつ
  18. 18. Copyright ©2017 JPCERT/CC All rights reserved. procmon が起動したところ(1) 18
  19. 19. Copyright ©2017 JPCERT/CC All rights reserved. procmon が起動したところ(2) 19 プロセス名 操作するファイルのパス名 操作結果
  20. 20. Copyright ©2017 JPCERT/CC All rights reserved.20 Procmon のフィルタ設定(0)
  21. 21. Copyright ©2017 JPCERT/CC All rights reserved.21 プロセス名, パス名など “begins with”, “contains” など “include”, “exclude” 「プロセス名」が「firefox」で「始まる」ものを選択 Procmon のフィルタ設定(1) “Add” ボタンを押す
  22. 22. Copyright ©2017 JPCERT/CC All rights reserved.22 フィルタで使うルールが⼀つ登録された Procmon のフィルタ設定(2)
  23. 23. Copyright ©2017 JPCERT/CC All rights reserved.23 “Apply” ボタンを 押す フィルタ内容の更新完了. 以下同様にして、必要なだけルールを追加していく. Procmon のフィルタ設定(3)
  24. 24. Copyright ©2017 JPCERT/CC All rights reserved. Teraterm 0.94 インストーラ実⾏時 24 “process name” と “Path” でフィルタを かけたところ.
  25. 25. Copyright ©2017 JPCERT/CC All rights reserved. Teraterm 0.94 インストーラ実⾏時 25
  26. 26. Copyright ©2017 JPCERT/CC All rights reserved. Teraterm 0.95 インストーラ実⾏時 26
  27. 27. Copyright ©2017 JPCERT/CC All rights reserved. 過去を振り返る -- 2010年ころ 27
  28. 28. Copyright ©2017 JPCERT/CC All rights reserved. 2010年ころの状況(1) 28 • セキュリティベンダから, DLL 読み込みの脆弱性に対する攻撃 ⼿法が公開され, 注⽬を集める • CERT/CC VU#707943 や US-CERT Technical Alert TA10-238A 公開 • Microsoft からアドバイザリや開発者向けガイダンス⽂書公開 • セキュリティアドバイザリ 2269637 • 「DLLプリロード問題の対策ガイダンス」 [参考] WindowsのDLLだけが危ないのか?DLL hijacking vulnerability概説(前編) https://codezine.jp/article/detail/5441 https://www.jpcert.or.jp/sc-magazine/codezine02-8.html WindowsのDLLだけが危ないのか?DLL hijacking vulnerability概説(後編) https://codezine.jp/article/detail/5442 https://www.jpcert.or.jp/sc-magazine/codezine02-9.html
  29. 29. Copyright ©2017 JPCERT/CC All rights reserved. 2010年ころの状況(2) 29 https://www.jpcert.or.jp/sc-magazine/codezine02-8.html
  30. 30. Copyright ©2017 JPCERT/CC All rights reserved. 不正な DLL を読み込ませる攻撃とは… 30 - (攻撃者が)ドキュメントファイルと一緒に細工した DLL を置く - 細工した DLL をドキュメントファイルと一緒にダウンロードさ せそのまま実行させる 1. ドキュメントファイルと一緒に細工 した DLL を置く 2. ドキュメントファイルに関連づけら れたアプリを起動 3. カレントディレクトリにある DLL を 使ってしまう https://www.jpcert.or.jp/sc-magazine/codezine02-8.html
  31. 31. Copyright ©2017 JPCERT/CC All rights reserved. 「カレントディレクトリ」からの DLL 読み込み 31 1. 実⾏ファイルがあるディレクトリ (アプリケーションディレクトリ) 2. Windows システムディレクトリ 3. Windows ディレクトリ 4. カレントディレクトリ 5. 環境変数 PATH 0. “KnownDLLs” に登録されているかどうか Windows デスクトップアプリが使用する DLL 検索パス (cf. https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx) これ 対策として検索順位が下がった
  32. 32. Copyright ©2017 JPCERT/CC All rights reserved. 最近の変化 32
  33. 33. Copyright ©2017 JPCERT/CC All rights reserved. DLL読み込みの届け出の増加 33 • 2016年ころから DLL 読 み込みの脆弱性の届け出 が増加 • 対象のほとんどは 「インストーラ」 「⾃⼰解凍書庫」 2016Q4 2017Q1 2017Q2 「JPCERT/CC 活動概要」から (https://www.jpcert.or.jp/pr/)
  34. 34. Copyright ©2017 JPCERT/CC All rights reserved. 2010年ころの届出との違い 34 テキストファイルを開く際に… インストーラと同⼀のディレクト リに存在するDLLを…
  35. 35. Copyright ©2017 JPCERT/CC All rights reserved. 不正な DLL を読み込ませる攻撃とは (旧) 35 - (攻撃者が)ドキュメントファイルと一緒に細工した DLL を置く - 細工した DLL をドキュメントファイルと一緒にダウンロードさ せそのまま実行させる 1. ドキュメントファイルと一緒に細工 した DLL を置く 2. ドキュメントファイルに関連づけら れたアプリを起動 3. カレントディレクトリにある DLL を 使ってしまう https://www.jpcert.or.jp/sc-magazine/codezine02-8.html
  36. 36. Copyright ©2017 JPCERT/CC All rights reserved. 不正な DLL を読み込ませる攻撃とは (新) 36 - (攻撃者が)インストーラと一緒に細工した DLL を置く - 細工した DLL をインストーラと一緒にダウンロードさせその まま実行させる 1. インストーラと一緒に細工した DLL を置く 2. インストーラを起動 3. 同一ディレクトリにある DLL を 使ってしまう 脆弱性のある インストーラ
  37. 37. Copyright ©2017 JPCERT/CC All rights reserved. DLL 読み込み: 通常の動作 プログラム起動! プログラムと同じディレクトリから DLL を探し出そうとする 通常は DLL が⾒つからず(NOT FOUND)、次の場所に探しに ⾏く システムディレクトリにある DLL を発⾒して使⽤ 37
  38. 38. Copyright ©2017 JPCERT/CC All rights reserved. プログラム起動! プログラムと同じディレクトリから DLL を探し出そうとする 通常は DLL が⾒つからず(NOT FOUND)、次の場所に探しに ⾏く システムディレクトリにある DLL を発⾒して使⽤ 38 DLL を⾒つけ、ロードする 細⼯した DLL をプログラムと同じディレクトリに置く DLL 読み込み: 問題が発⽣するケース
  39. 39. Copyright ©2017 JPCERT/CC All rights reserved. 「アプリケーションディレクトリ」からの DLL 読み込み 39 1. 実⾏ファイルがあるディレクトリ (アプリケーションディレクトリ) 2. Windows システムディレクトリ 3. Windows ディレクトリ 4. カレントディレクトリ 5. 環境変数 PATH 0. “KnownDLLs” に登録されているかどうか Windows デスクトップアプリが使用する DLL 検索パス (cf. https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx)
  40. 40. Copyright ©2017 JPCERT/CC All rights reserved. システムの保護、アプリのセキュリティ 40 • “Windows” や ”Program Files” といったシステム領域 • アプリ側ではなくシステム側が保護 • 細工された DLL が置かれるといった状況はシステム側の責任 • (もちろんユーザが適切な形で使用している前提) • ユーザディレクトリ • 管理はユーザ側の責任 • フィッシングや水飲み場攻撃など, 世の中はユーザを騙す攻撃がいっぱい • どこまでユーザの責任にする? システム領域外で動作するアプリには, よりセキュアな実装を求めたい インストーラ, 自己解凍書庫, ポータブルアプリなど
  41. 41. Copyright ©2017 JPCERT/CC All rights reserved. ユーザが⾏うべき対策 開発者が⾏うべき対策 41
  42. 42. Copyright ©2017 JPCERT/CC All rights reserved. ユーザが⾏うべき対策 42 • あやしいファイルを放置しない • インストーラや自己解凍書庫を安全な形で実行する 安全な形で実行 1. (インストーラをダウンロード) 2. 新規にディレクトリを作成 3. 作成したディレクトリにインストーラを移動 4. インストーラを起動
  43. 43. Copyright ©2017 JPCERT/CC All rights reserved. 開発者が⾏うべき対策 43 ØDLL の読み込み方法に注意する Øアプリ/インストーラの挙動についてユーザに説明し, 注意を促す DLLの読み込み • SetDefaultDllDirectories() や SetDllDirectory() でアプリ ケーションディレクトリを排除 • DLL 読み込みは可能な限り絶対パスで • インストーラ作成ツールによるインストーラ作成やアーカイ バによる自己解凍書庫作成時にはツールの対応状況を 確認
  44. 44. Copyright ©2017 JPCERT/CC All rights reserved. 開発者が対処しきれないケース 44 vアプリのスタートアップ部分で勝手にロード vWindows 標準 DLL が独自に他 DLL をロード vWindows 標準機能 (DLL forwarding, OS 互換機能 の発動など) v動作監視ソフトの影響 vなど DLL の読み込み⽅法 ガンバりたいヒトには, 遅延読み込み指定とフック関数を活⽤して⾃前の読み込みという⼿段もある (それでも100%解決できるわけではないけど) [参考] (https://docs.microsoft.com/en-us/cpp/build/reference/linker-support-for-delay-loaded-dlls) (http://www.ponsoftware.com/archiver/bug.htm) (http://micco.mars.jp/vul/2017/mhsvi20170515_01.htm) (https://ipmsg.org/dllpreload/dllpreload_attack.html) など…
  45. 45. Copyright ©2017 JPCERT/CC All rights reserved. まとめ 45 DLL 読み込み案件の扱いに苦労しています ユーザがとるべき対策: 安全な形で実⾏ 開発者がとるべき対策: —どのくらいアプリ側でがんばるか決める —使⽤上の注意をきちんとユーザに説明する DLL読み込みと合わせてコマンド呼び 出しについても注意!!
  46. 46. Copyright ©2017 JPCERT/CC All rights reserved. 関連情報(1) 46 JVNTA#91240916: Windows アプリケーションによる DLL 読み込みやコマンド実 行に関する問題 (https://jvn.jp/ta/JVNTA91240916/) JVNVU#707943: Windows プログラムの DLL 読み込みに脆弱性 (https://jvn.jp/vu/JVNVU707943/) 任意のDLL/実行ファイル読み込みに関する脆弱性の注意喚起 (https://www.ipa.go.jp/about/press/20101111.html) Dynamic-Link Library Security (https://msdn.microsoft.com/en-us/library/windows/desktop/ff919712(v=vs.85).aspx)
  47. 47. Copyright ©2017 JPCERT/CC All rights reserved.47 Windows DLLプリロード攻撃の新しいパターンと防御法 (https://ipmsg.org/dllpreload/dllpreload_attack.html) UNLHA32.DLL で作成された自己解凍書庫における任意の DLL 読み込 みに関する脆弱性 (http://micco.mars.jp/vul/2017/mhsvi20170515_01.htm) UNLHA32.DLL における任意の DLL 読み込みに関する脆弱性 (http://micco.mars.jp/vul/2017/mhsvi20170515_02.htm) Microsoft Windows における DLL 読み込みに関する脆弱性 (http://www.ponsoftware.com/archiver/bug.htm#load_lib) 関連情報(2)
  48. 48. Copyright ©2017 JPCERT/CC All rights reserved. セキュアコーディングに関するお問合せ、インシデント対応のご依頼は 48 JPCERTコーディネーションセンター ̶Tel:03-3518-4600 ̶https://www.jpcert.or.jp/ セキュアコーディングに関するお問い合わせ ̶Email:secure-coding@jpcert.or.jp ̶https://www.jpcert.or.jp/securecoding/ インシデントの報告 ̶Email:info@jpcert.or.jp ̶https://www.jpcert.or.jp/form/

×