Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Survey and Analysis of ICS Vulnerabilities (Japanese)

Masaki Kubo of JPCERT provides some statistical analysis of the ICS vulnerabilities. He also looks at the coding errors that caused the vulnerabilities and takes an indepth look at recent Yokogawa vulnerabilities.

  • Inicia sesión para ver los comentarios

Survey and Analysis of ICS Vulnerabilities (Japanese)

  1. 1. ICS脆弱性の調査および その対策としてのCERT Cコーディングルール 2014年10月15日 JPCERT コーディネーションセンター 脆弱性解析チーム 久保正樹
  2. 2. アジェンダ ICS-CERT アドバイザリに見る脆弱性の傾向 最近の事例 対策に有効なCERT-C コーディングルール Copyright©2014JPCERT/CC All rights reserved. 1
  3. 3. ICS-CERT アドバイザリにみる 脆弱性の傾向 Copyright©2014JPCERT/CC All rights reserved. 2
  4. 4. ICS-CERT アドバイザリ 米国土安全保障省の産業制御システムセキュリティ担当機関が提供 する制御製品の脆弱性情報 — http://ics-cert.us-cert.gov/advisories Copyright©2014JPCERT/CC All rights reserved. 3 2010年〜2013年末までに公開さ れたアドバイザリを対象にデータ を収集し、調査を行った
  5. 5. データ収集対象のICS-CERTアドバイザリ Copyright©2014JPCERT/CC All rights reserved. 4 件数 アドバイザリの件数242 脆弱性の件数445 1アドバイザリ当たりの脆弱性件数1.8 期間: 2010年〜2013年末
  6. 6. 月別・種別の脆弱性公表件数 ICS-CERT アドバイザリの「BACKGROUND」などから製品種別をHMI、コントローラー、ネット ワーク機器、その他の4分類とし、製品種別ごとの脆弱性の公開傾向を下図に示す 製品種別ごとの脆弱性の内訳月別・製品種別ごとの脆弱性公開件数 Copyright©2014JPCERT/CC All rights reserved. 5 HMIの脆弱性が全体の約60%弱を占め、年月に関わらず 万遍なく公表されている 242件
  7. 7. CVSS 脆弱性の深刻度評価のための統一的指標 Copyright©2014JPCERT/CC All rights reserved. 6 基本値(base metrics) の評価軸説明 A V 攻撃元区分(Access Vector) 脆弱性はどこから攻撃可能であるか A C 攻撃条件の複雑さ(Access Complexity) 脆弱性を攻撃する際に必要な条件の複雑さ A u 攻撃前の認証要否(Authentication) 脆弱性を攻撃するためにシステムの認証は必要か C 機密性(Confidentiality) への影響機密情報漏えいの度合い I 完全性(Integrity) への影響システム内の情報改ざんの程度 A 可用性Availability) への影響システムの遅延・停止の度合い 深刻度Base Score レベルⅢ(危険) レベルⅡ (警告) レベルⅠ (注意) 7.0~10.0 4.0~6.9 0.0~3.9
  8. 8. 脆弱性の深刻度(ICS-CERT vs. 脆弱性全般) 脆弱性全般(CVE 19,012件)とICS-CERTアドバイザリ(422件) のCVSS Base Score Copyright©2014JPCERT/CC All rights reserved. ■ 脆弱性全般■ ICS-CERT 7 全般ICS-CERT 平均値6.3 7.5 中央値5.0 6.2 最頻値4.3 10.0 縦軸は度数の合計が100にな るように全体とICS-CERTを 各々変換した値
  9. 9. 脆弱性の深刻度(ICS-CERT vs. 脆弱性全般) 脆弱全般(CVE 19,012件)とICS-CERTアドバイザリ(422件) のCVSS Vector String Copyright©2014JPCERT/CC All rights reserved. 8 ※ 左が脆弱性全般、右がICS-CERTアドバイザリの脆弱性
  10. 10. PoC/攻撃コードが存在する脆弱性の割合 Copyright©2014JPCERT/CC All rights reserved. 9 445件 ■ Web上にPoC/攻撃コードが公開されていることを確認 ■ アドバイザリに※2)の記載あり ■ アドバイザリに記載なし、もしくは※1)の記載あり ※1) 36% に攻撃コードが存在 No known public exploits specifically target this vulnerability. ※2) Public exploits are known to target this vulnerability. Publicly released PoC code exists for this vulnerability. Exploit code is publicly available. Public exploits may exist that could target this vulnerability.
  11. 11. 脆弱性ランキング(全体) Copyright©2014JPCERT/CC All rights reserved. 10 422件 1位CWE-119 バッファエラー 2位CWE-20 不適切な入力確認 3位CWE-79 クロスサイトスクリプティング 4位CWE-22 パストラバーサル 5位CWE-121 スタックバッファオーバーフロー その他
  12. 12. 脆弱性ランキング(製品種別) Copyright©2014JPCERT/CC All rights reserved. 順 位 11 全体HMI コントローラ ネットワーク機 器 その他 1 バッファエラーバッファエラー不適切な入力確認 認可・認証・アクセ ス制御 不適切な入力確 認 2 不適切な入力確認XSS 不明 不十分なエントロ ピー バッファエラー 3 XSS 不適切な入力確認バッファエラーバッファエラー パストラバーサ ル 4 パストラバーサルパストラバーサル 不適切なアクセス 制御 不適切な認証 スタックバッ ファオーバーフ ロー 5 スタックバッファ オーバーフロー スタックバッファ オーバーフロー 隠れた機能暗号に関する問題 認可・権限・ア クセス制御
  13. 13. CWE CWE (共通脆弱性タイプ一覧) ソフトウェアのセキュリティ上の弱点(脆弱性)の分類学 Copyright©2014JPCERT/CC All rights reserved. 12 CWE-74 インジェクション CWE-79 XSS CWE-94 コードインジェクション CWE-78 OSコマンドインジェクション CWE-89 SQLインジェクション CWE-134 コマンドインジェクション
  14. 14. 脆弱性の分類 CWEを上位の階層で集約した場合の脆弱性の割合 Copyright©2014JPCERT/CC All rights reserved. 13 1位CWE-20 不適切な入力確認 2位CWE-118 範囲エラー 3位CWE-264 認可・権限・アクセス制御 4位CWE-399 リソース管理の問題 5位CWE-255 証明書・パスワードの管理 422件
  15. 15. 脆弱性ランキング Copyright©2014JPCERT/CC All rights reserved. 14 順位CWE 脆弱性のタイトル件数 1 CWE-119 バッファエラー82 2 CWE-20 不適切な入力確認55 3 CWE-79 クロスサイトスクリプティング22 4 CWE-22 パストラバーサル21 5 CWE-121 スタックバッファオーバーフロー19 6 CWE-287 不適切な認証14 7 CWE-264 CWE-89 認可・権限・アクセス制御 SQL インジェクション 13 9 CWE-122 CWE-284 ヒープバッファオーバーフロー 不適切なアクセス制御 12 11 CWE-259 パスワードのハードコーディング8 12 CWE-200 CWE-427 情報漏洩 ファイル検索パスの制御不備 7 14 CWE-399 CWE-190 CWE-255 CWE-331 CWE-400 CWE-476 リソース管理エラー 整数オーバーフローとラップアラウンド 証明書やパスワードの管理 不十分なエントロピー リソース枯渇 NULL ポインタ参照 5 20 CWE-23 CWE-798 CWE-311 CWE-352 CWE-592 CWE-912 相対パストラバーサル 認証情報のハードコーディング センシティブなデータを暗号化しない クロスサイトリクエストフォージェリー(CSRF) 認証バイパス 隠れた機能 4 26 CWE-94 CWE-125 CWE-134 CWE-189 CWE-306 CWE-416 CWE-425 コードインジェクション 境界外読取り 書式文字の制御に不備 数値処理の問題 重要な機能に対する認証の欠如 解放済みメモリ使用 リクエストの直接送信('Forced Browsing’) 3 33 CWE-78 CWE-120 CWE-91 CWE-261 CWE-269 CWE-285 CWE-310 CWE-330 CWE-388 CWE-538 CWE-618 CWE-471 CWE-321 OS コマンドインジェクション 古典的バッファオーバーフロー XML インジェクション パスワードの暗号化の強度不足 不適切な権限管理 不適切な認証 暗号に関する問題 強度の不十分な乱数の使用 エラー処理 ファイルやディレクトリ情報の漏洩 危険なActiveX メソッドの公開 不変であるべきデータの改変(MAID) 暗号化鍵のハードコーディング 2 46 CWE-114 CWE-601 CWE-123 CWE-28 CWE-319 CWE-21 CWE-40 CWE-73 CWE-113 CWE-118 CWE-219 CWE-248 CWE-250 CWE-262 CWE-294 CWE-307 CWE-315 CWE-320 CWE-326 CWE-338 CWE-362 CWE-389 CWE-404 CWE-410 CWE-415 CWE-521 CWE-522 CWE-611 CWE-680 CWE-703 CWE-732 CWE-749 CWE-755 CWE-763 CWE-788 CWE-835 プロセスコントロール オープンリダイレクト Write-what-where 条件 パストラバーサル: '..filedir’ センシティブな情報の平文送信 パストラバーサルと同値エラー パストラバーサル: ‘UNCsharename’ (Windows UNC Share) ファイル名やパス名の外部制御 HTTP レスポンス分割 範囲エラー Web ルートにセンシティブなデータ キャッチされない例外 必要の無い権限による実行 パスワードに有効期限を設定しない 認証バイパス(Capture-replay) 認証処理に対する回数制限や時間制限の未設定 センシティブな情報をクッキーに平文で保存する 鍵管理エラー 不適切な暗号強度 暗号学的に強度の足りないPRNG の使用 競合状態 エラー条件、戻り値、ステータスコード 不適切なリソースのシャットダウンやリリース 不十分なリソースプール 二重解放 弱いパスワードを設定できる 認証情報の不十分な保護 XML 外部要素参照(‘XXE’) の不適切な制限 整数オーバーフローからバッファオーバーフローにつながる 例外条件の不適切なチェックや処理 重要なリソースに不適切なパーミッションを付与する 危険なメソッドや機能の公開 例外条件の不適切な処理 無効なポインタや参照の解放 バッファの終端外のメモリへのアクセス 無限ループ 1 ICS-CERTアドバイザリで特定された 脆弱性とその件数
  16. 16. ICS-CERT アドバイザリの脆弱性 • 全体の30%がバッファオーバーフロー関連 → 大部分はC/C++で書かれたプログラム → 古典的な脆弱性が繰り返されている • 12% がCWE-20 “Improper Input Validation” → 脆弱性の根本原因は不明 • PoC/攻撃コードが公開されている脆弱性は36%と高い割合 • IT 全般の脆弱性よりも脅威度が高い傾向 Copyright©2014JPCERT/CC All rights reserved. 15
  17. 17. 最近の事例 Copyright©2014JPCERT/CC All rights reserved. 16
  18. 18. 最近の研究事例 Copyright©2014JPCERT/CC All rights reserved. 17
  19. 19. 攻撃のシナリオ– 任意のコード実行– 〜拡張テスト機能起動中〜 BKFSim_vhfd 1. 攻撃者は細工した攻撃パケットを CENTUMがインストールされたPCの 20010番ポートに送信する .exe Port 20010/UDP 任意のコード実行 2. CENTUM を実行するユーザの権限 で任意のコードが実行される Copyright©2014JPCERT/CC All rights reserved. 18 攻撃者 00100100010 01010100010 101000111…. http://www.yokogawa.co.jp/dcs/products/cs/system-overview/dcs-cs-0201ja.htm
  20. 20. BOOL sub_403E10(BOOL a1, const char *Format, ...) { …….. char Buffer[260]; // [sp+18h] [bp-208h]@7 // Overflow 2 char Dest[260]; // [sp+11Ch] [bp-104h]@4 // Overflow 1 va_list va; // [sp+22Ch] [bp+Ch]@1 va_start(va, Format); …….. if ( v2 >= a1 && Format && hObject != (HANDLE)-1 ) { memset(Dest, 0, 0x100u); Dest[256] = 0; if ( strlen(Format) < 0x100 ) vsprintf(Dest, Format, va); //Buffer Overflow 1: Dangerous use of vsprintf to copy data to the stack else sprintf(Dest, "data size too big (>= %i)", 256); …….. Copyright©2 19 014JPCERT/CC All rights reserved.
  21. 21. BOOL sub_403E10(BOOL a1, const char *Format, ...) { …….. char Buffer[260]; // [sp+18h] [bp-208h]@7 // Overflow 2 char Dest[260]; // [sp+11Ch] [bp-104h]@4 // Overflow 1 va_list va; // [sp+22Ch] [bp+Ch]@1 va_start(va, Format); …….. if ( v2 >= a1 && Format && hObject != (HANDLE)-1 ) { memset(Dest, 0, 0x100u); Dest[256] = 0; if ( strlen(Format) < 0x100 ) vsprintf(Dest, Format, va); //Buffer Overflow 1: Dangerous use of vsprintf to copy data to the stack else sprintf(Dest, "data size too big (>= %i)", 256); …….. Copyright©2 20 014JPCERT/CC All rights reserved. ログメッセージを書き出す関数 • Format:書式指定文字列 • 残りの引数:外部から入力され た値を使用
  22. 22. BOOL sub_403E10(BOOL a1, const char *Format, ...) { …….. char Buffer[260]; // [sp+18h] [bp-208h]@7 // Overflow 2 char Dest[260]; // [sp+11Ch] [bp-104h]@4 // Overflow 1 va_list va; // [sp+22Ch] [bp+Ch]@1 va_start(va, Format); …….. if ( v2 >= a1 && Format && hObject != (HANDLE)-1 ) { memset(Dest, 0, 0x100u); Dest[256] = 0; if ( strlen(Format) < 0x100 ) vsprintf(Dest, Format, va); //Buffer Overflow 1: Dangerous use of vsprintf to copy data to the stack else sprintf(Dest, "data size too big (>= %i)", 256); …….. Copyright©2 21 014JPCERT/CC All rights reserved. Dest は260バイトの配列 vsprintf() でログメッセージ を組み立ててDest に格納する
  23. 23. BOOL sub_403E10(BOOL a1, const char *Format, ...) { …….. char Buffer[260]; // [sp+18h] [bp-208h]@7 // Overflow 2 char Dest[260]; // [sp+11Ch] [bp-104h]@4 // Overflow 1 va_list va; // [sp+22Ch] [bp+Ch]@1 va_start(va, Format); …….. if ( v2 >= a1 && Format && hObject != (HANDLE)-1 ) { memset(Dest, 0, 0x100u); Dest[256] = 0; if ( strlen(Format) < 0x100 ) vsprintf(Dest, Format, va); //Buffer Overflow 1: Dangerous use of vsprintf to copy data to the stack else sprintf(Dest, "data size too big (>= %i)", 256); …….. Copyright©2 22 014JPCERT/CC All rights reserved. 可変引数を扱うための ローカル変数
  24. 24. BOOL sub_403E10(BOOL a1, const char *Format, ...) { …….. char Buffer[260]; // [sp+18h] [bp-208h]@7 // Overflow 2 char Dest[260]; // [sp+11Ch] [bp-104h]@4 // Overflow 1 va_list va; // [sp+22Ch] [bp+Ch]@1 va_start(va, Format); …….. if ( v2 >= a1 && Format && hObject != (HANDLE)-1 ) { memset(Dest, 0, 0x100u); Dest[256] = 0; if ( strlen(Format) < 0x100 ) vsprintf(Dest, Format, va); //Buffer Overflow 1: Dangerous use of vsprintf to copy data to the stack else sprintf(Dest, "data size too big (>= %i)", 256); …….. Copyright©2 23 014JPCERT/CC All rights reserved. Format の次の引数をva で 指し示すためのおまじない
  25. 25. BOOL sub_403E10(BOOL a1, const char *Format, ...) { …….. char Buffer[260]; // [sp+18h] [bp-208h]@7 // Overflow 2 char Dest[260]; // [sp+11Ch] [bp-104h]@4 // Overflow 1 va_list va; // [sp+22Ch] [bp+Ch]@1 va_start(va, Format); …….. if ( v2 >= a1 && Format && hObject != (HANDLE)-1 ) { memset(Dest, 0, 0x100u); Dest[256] = 0; if ( strlen(Format) < 0x100 ) vsprintf(Dest, Format, va); //Buffer Overflow 1: Dangerous use of vsprintf to copy data to the stack else sprintf(Dest, "data size too big (>= %i)", 256); …….. Copyright©2 24 014JPCERT/CC All rights reserved. あらかじめnull 終端文字を入 れているようだ
  26. 26. BOOL sub_403E10(BOOL a1, const char *Format, ...) { …….. char Buffer[260]; // [sp+18h] [bp-208h]@7 // Overflow 2 char Dest[260]; // [sp+11Ch] [bp-104h]@4 // Overflow 1 va_list va; // [sp+22Ch] [bp+Ch]@1 va_start(va, Format); …….. if ( v2 >= a1 && Format && hObject != (HANDLE)-1 ) { memset(Dest, 0, 0x100u); Dest[256] = 0; if ( strlen(Format) < 0x100 ) vsprintf(Dest, Format, va); //Buffer Overflow 1: Dangerous use of vsprintf to copy data to the stack else sprintf(Dest, "data size too big (>= %i)", 256); …….. Copyright©2 25 014JPCERT/CC All rights reserved. 書式指定文字列の大きさを 調べている? ※正しくは、組み立てた後 の文字列の長さを調べるべ きでは?
  27. 27. BOOL sub_403E10(BOOL a1, const char *Format, ...) { …….. char Buffer[260]; // [sp+18h] [bp-208h]@7 // Overflow 2 char Dest[260]; // [sp+11Ch] [bp-104h]@4 // Overflow 1 va_list va; // [sp+22Ch] [bp+Ch]@1 va_start(va, Format); …….. if ( v2 >= a1 && Format && hObject != (HANDLE)-1 ) { memset(Dest, 0, 0x100u); Dest[256] = 0; if ( strlen(Format) < 0x100 ) vsprintf(Dest, Format, va); //Buffer Overflow 1: Dangerous use of vsprintf to copy data to the stack else sprintf(Dest, "data size too big (>= %i)", 256); …….. Copyright©2 26 014JPCERT/CC All rights reserved. Dest への文字列書き込み. 書き込む文字列の長さは Dest に収まるのか?
  28. 28. Format として使われる書式指定文字列 ERROR:HealthFromUDP():GetHostTblPosByName(hostname=%s) rtnno=%d ERROR:HealthFromUDP():GetHostTblPosByName(hostname=ホスト名) rtnno=整数 Copyright©2 27 014JPCERT/CC All rights reserved. 書式指定子(文字列) 書式指定子(整数) *sprintf() で文字列を組み立てると… 組み立てた文字列は当然Format 自身よりも長くなる ホスト名はどこからやってくる?
  29. 29. 死活監視のため、HISステーションと FCSの間ではハートビートパケット をやりとりしている Copyright©2 28 014JPCERT/CC All rights reserved.
  30. 30. ハートビートパケットのフォーマット 最初の16バイト:ヘッダ 第16バイト目:パケットの残りのサイズ(0〜255) ホスト名文字列(null 終端文字列らしい) 最後の4バイト:末端のしるし ということはホスト名の最大長は 255 – 4 == 251バイト!? Copyright©2 29 014JPCERT/CC All rights reserved.
  31. 31. ERROR:HealthFromUDP():GetHostTblPosByName(hostname=ホスト名) rtnno=整数 書式指定文字列部分: 59バイト ホスト名: <=251バイト 整数: ??? 組み立てられる文字列は310 + α バイト。 一方、その文字列を格納する変数Dest は260バイト。 細工したハートビートパ ケットでバッファオーバフ ローの可能性!! Copyright©2 30 014JPCERT/CC All rights reserved.
  32. 32. Copyright©2 31 014JPCERT/CC All rights reserved. STR31-C: 文字データとnull終端文字を格納するために 十分な領域を確保する データをバッファにコピーする際、データを保 持する十分な大きさがバッファにないと、バッ ファオーバフローが発生する。
  33. 33. 違反コード Copyright©2014JPCERT/CC All rights reserved. 32 #include <stdio.h> void func(const char *name) { char filename[128]; sprintf(filename, “%s.txt”, name); } null終端文字(1バイト) + “.txt” (4バイト) == 5バイト name 引数の長さが123 バイトを超えると バッファオーバフローが発生する
  34. 34. 適合コード #include <stdio.h> void func(const char *name) { Copyright©2014JPCERT/CC All rights reserved. 33 char filename[128]; sprintf(filename, “%.123s.txt”, name); } 書式指定子のフィールド長で文字列長を制限 snprintf(filename, sizeof(filename), “%s.txt”, name); snprintf()を使い、書き出す文字列長を制限
  35. 35. 対策に有効な CERT C コーディングルール Copyright©2014JPCERT/CC All rights reserved. 34
  36. 36. CERT C コーディングスタンダード CERT-C のルール Copyright©2014JPCERT/CC All rights reserved. 35 CERT-C ルールには、違反コードや適合 コードのサンプルやリスク評価など様々な脆 弱性を作り込まないために遵守すべき内容が 記載されている。 ① 対応する脆弱性(CWE) ② ルールをサポートする静的解析ツール といった補足情報も
  37. 37. CERT-C の特徴 誕生のきっかけは2006年春のC言語規格の標準化会議 — 言語規格書:コンパイラ屋向け —Secure Coding Standard:プログラマ向け C言語のエキスパートを含む開発コミュニティによって作られ、 日々メンテナンスされている —1500人以上のcontributor Copyright©2014JPCERT/CC All rights reserved. 36
  38. 38. 脆弱性とコーディングルールの対応 各ルールの「関連するガイドライン」から 関連するCWE (脆弱性) を抽出できる Copyright©2014JPCERT/CC All rights reserved. 37
  39. 39. 脆弱性とコーディングルールのマッピング CWEとCERT-Cの対応表を作成 Copyright©2014JPCERT/CC All rights reserved. 38 ICS-CERTアドバイザリ で特定された脆弱性 1.CWE-xx 2.CWE-xx 3.CWE-xx 4.CWE-xx 5.… 対応する CERT-Cのルール •INTxx-C •ARRxx-C •STRxx-C •MSCxx-C •…
  40. 40. マッピング上の留意点 制御システム製品すべてがC言語で開発されているわけ ではない —Ex. XSSの脆弱性を作り込んだ製品 開発言語は多くの場合不明。一方で、脆弱性の3割が C/C++の代表的コーディングエラー(CWE-119) → 残りの7割やいかに? マッピングはあくまでCで開発されていた場合を仮定し て行った Copyright©2014JPCERT/CC All rights reserved. 39
  41. 41. 22の推奨ルール Copyright©2014JPCERT/CC All rights reserved. 40
  42. 42. 44個のルールが445件の脆弱性に関連 そのうち22個のルールが必須項目 Copyright©2014JPCERT/CC All rights reserved. 41
  43. 43. INT30-C 符号無し整数の演算結果がラップアラウンドしないようにする INT32-C 符号付き整数演算がオーバーフローを引き起こさないことを保証する INT35-C 整数式をより大きなサイズの整数に対して比較や代入をする際には、事前に演算後のサイズで評価する Copyright©2 42 014JPCERT/CC All rights reserved. 整数関連 MEM30-C 解放済みメモリにアクセスしない MEM35-C オブジェクトに対して十分なメモリを割り当てる メモリ管理 ARR30-C 境界外を指すポインタや配列添字を生成したり使用したりしない ARR38-C ライブラリ関数が無効なポインタを生成しないことを保証する 配列操作 EXP33-C 未初期化のメモリを参照しない EXP34-C NULL ポインタを参照しない EXP39-C 適合しない型のポインタを使って変数にアクセスしない 式の評価 文字列処理 STR31-C 文字データとnull 終端文字を格納するために十分な領域を確保する STR32-C 文字列はnull 終端させる FIO31-C 同一のファイルを同時に複数回開かない FIO37-C 読み取られたデータが文字データであると思い込まない FIO42-C 不要になったファイルは正しくクローズする ファイルI/O MSC30-C 疑似乱数の生成にrand() 関数を使用しない MSC32-C 乱数生成器は適切なシード値を与えて使う EXP39-C 適合しない型のポインタを使って変数にアクセスしない MSC34-C 廃止予定の関数や古い関数を使用しない ERR33-C 標準ライブラリのエラーを検出し、対処する ENV33-C コマンドプロセッサが必要ない場合はsystem() を呼び出さない POS36-C 権限は正しい順序で破棄する POS37-C 権限の破棄は確実に行う その他
  44. 44. CERT-C をサポートするコード解析ツール ルールをサポートする解析ツールは「自動検出」セクションにまとめ られている ツール名 Copyright©2014JPCERT/CC All rights reserved. 43 対応状況の補足説明
  45. 45. ツール毎のCERT-Cサポート率 Copyright©2014JPCERT/CC All rights reserved. 44 ソースコード解析ツールCERT-C全体ICS-CERT Compass/ROSE 40.3% 59.1% LDRA tool suite 39.0% 45.5% PRQA QA-C 36.7% 36.4% ECLAIR 21.3% 4.5% Coverity 15.7% 40.9% Fortify SCA 15.7% 40.9% Klocwork 12.5% 38.6% Splint 8.5% 15.9% GCC 7.2% 4.5% EDG 1.0% 0.0% ツールのサポート率66.6% ※1 81.8% ※2 ※1 CERT-C 全305ルール中203のルールがいずれかのツールで検出できる ※2 ICS-CERT アドバイザリで公表された脆弱性に関連する44ルール中、36ルールはツールで検出できる
  46. 46. CERT Rosecheckers Copyright©2014JPCERT/CC All rights reserved. 45 Ubuntu VM + ROSE Compiler infrustructure + フロントエンド(EDG) + Rosecheckers ISO/IEC TS 17961 – Programming languages, their environments and system software interfaces – C Secure Coding Rules •https://github.com/SEI-CERT/scvs
  47. 47. まとめと推奨事項 Copyright©2014JPCERT/CC All rights reserved. 46
  48. 48. まとめ ICS-CERT アドバイザリで取り上げられた制御システム 用ソフトウェアの脆弱性は、IT全般の脆弱性よりも脅威 度が高い傾向にある 22個のCERT-Cコーディングルールを活用することで、 これらの脆弱性を低減することができる Copyright©2014JPCERT/CC All rights reserved. 47
  49. 49. 推奨事項 • 社内のコーディング規約が22/44個のルールをカバーしているか確認 → カバーしていないルールの採用を検討 • 発注時の要求事項として、ルール遵守を開発者に求める • 解析ツールがルールの違反を検出できるか確認する • 解析ツールを新規導入する場合、ルールのサポート状況を考慮する • ルールや脆弱性について学ぶ機会をプログラマに提供する Copyright©2014JPCERT/CC All rights reserved. 48
  50. 50. セキュアコーディングに関するお問合せ Copyright©2014JPCERT/CC All rights reserved. 49 JPCERTコーディネーションセンター 脆弱性解析チーム —Email:secure-coding@jpcert.or.jp —Tel:03-3518-4600 — https://www.jpcert.or.jp/
  51. 51. 参考URL CERT C コーディングスタンダード — https://www.jpcert.or.jp/sc-rules/ C/C++ セキュアコーディングセミナー「ROSE」 — https://www.jpcert.or.jp/research/materials.html#rose CERT Rosecheckers — http://rosecheckers.sourceforge.net/ R7-2014-06 Disclosure: CVE-2014-3888 Yokogawa CENTUM CS 3000 BKFSim_vhfd.exe Buffer Overflow — https://community.rapid7.com/community/metasploit/blog/2014/07/07/r7-2014-06- disclosure-yokogawa-centum-cs-3000-bkfsimvhfdexe-buffer-overflow 『制御用システムソフトウェアの脆弱性対策に有効なCERT C コー ディングルールの調査』 — https://www.jpcert.or.jp/research/ics-codingrule.html Copyright©2014JPCERT/CC All rights reserved. 50
  52. 52. BACKUP Copyright©2014JPCERT/CC All rights reserved. 51
  53. 53. 脆弱性ランキング(HMI) Copyright©2014JPCERT/CC All rights reserved. 52 261件 1位CWE-119 バッファエラー 2位CWE-79 クロスサイトスクリプティング 3位CWE-20 不適切な入力確認 4位CWE-22 パストラバーサル 5位CWE-121 スタックバッファオーバーフロー
  54. 54. 脆弱性ランキング(コントローラ製品) Copyright©2014JPCERT/CC All rights reserved. 53 52件 1位CWE-20 不適切な入力確認 2位不明 3位CWE-119 バッファエラー 4位CWE-284 不適切なアクセス制御 5位CWE-912 隠れた機能
  55. 55. 脆弱性ランキング(ネットワーク機器) Copyright©2014JPCERT/CC All rights reserved. 54 31件 1位CWE-264 認可・権限・アクセス制御 2位CWE-331 不十分なエントロピー 3位CWE-119 バッファエラー 4位CWE-287 不適切な認証 5位CWE-310 暗号に関する問題
  56. 56. 脆弱性ランキング(その他の製品) Copyright©2014JPCERT/CC All rights reserved. 55 101件 1位CWE-20 不適切な入力確認 2位CWE-119 バッファエラー 3位CWE-22 パストラバーサル 4位CWE-121 スタックバッファオーバーフロー 5位CWE-264 認可・権限・アクセス制御

×