56
ICS 脆脆脆脆脆脆脆脆脆 脆脆脆脆脆脆脆脆 CERT C 脆脆脆脆脆脆脆脆脆 2014 年 10 年 15 年 JPCERT 年年年年年年年年年年年年年 年年年年年年年年 年年 年年

Survey and Analysis of ICS Vulnerabilities (Japanese)

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: Survey and Analysis of ICS Vulnerabilities (Japanese)

ICS 脆弱性の調査およびその対策としての CERT C コーディングルール

2014 年 10 月 15 日

JPCERT コーディネーションセンター脆弱性解析チーム久保 正樹

Page 2: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

アジェンダ

ICS-CERT アドバイザリに見る脆弱性の傾向

最近の事例

対策に有効な CERT-C コーディングルール

2

Page 3: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性の傾向ICS-CERT アドバイザリにみる

3

Page 4: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

ICS-CERT アドバイザリ米国土安全保障省の産業制御システムセキュリティ担当機関が提供する制御製品の脆弱性情報— http://ics-cert.us-cert.gov/advisories

4

2010 年〜 2013 年末までに公開されたアドバイザリを対象にデータを収集し、調査を行った

Page 5: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

データ収集対象の ICS-CERT アドバイザリ

5

  件数

アドバイザリの件数 242

脆弱性の件数 445

1 アドバイザリ当たりの脆弱性件数 1.8

期間 : 2010 年〜 2013 年末

Page 6: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

月別・種別の脆弱性公表件数ICS-CERT アドバイザリの「 BACKGROUND 」などから製品種別を HMI 、コントローラー、ネットワーク機器、その他の4分類とし、製品種別ごとの脆弱性の公開傾向を下図に示す

6

HMI の脆弱性が全体の約 60% 弱を占め、年月に関わらず万遍なく公表されている

製品種別ごとの脆弱性の内訳 月別・製品種別ごとの脆弱性公開件数

242件

Page 7: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

CVSS

脆弱性の深刻度評価のための統一的指標

7

基本値 (base metrics) の評価軸 説明

AV

攻撃元区分 (Access Vector) 脆弱性はどこから攻撃可能であるか

AC

攻撃条件の複雑さ (Access Complexity)

脆弱性を攻撃する際に必要な条件の複雑さ

Au

攻撃前の認証要否 (Authentication) 脆弱性を攻撃するためにシステムの認証は必要か

C 機密性 (Confidentiality) への影響 機密情報漏えいの度合い

I 完全性 (Integrity) への影響 システム内の情報改ざんの程度

A 可用性 Availability) への影響 システムの遅延・停止の度合い

レベルⅢ ( 危険 )

レベルⅡ ( 警告 )

レベルⅠ ( 注意 )

深刻度 Base Score

7.0~10.0

4.0~6.9

0.0~3.9

Page 8: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

■ 脆弱性全般 ■ ICS-CERT

脆弱性の深刻度 (ICS-CERT vs. 脆弱性全般 )

脆弱性全般 (CVE 19,012 件 ) と ICS-CERT アドバイザリ (422 件 ) の CVSS Base Score

8

全般 ICS-CERT

平均値 6.3 7.5

中央値 5.0 6.2

最頻値 4.3 10.0

縦軸は度数の合計が 100 になるように全体と ICS-CERTを各々変換した値

Page 9: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性の深刻度 (ICS-CERT vs. 脆弱性全般 )

脆弱全般 (CVE 19,012 件 ) と ICS-CERT アドバイザリ (422 件 ) の CVSS Vector String

9

※ 左が脆弱性全般、右が ICS-CERT アドバイザリの脆弱性

Page 10: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

PoC/ 攻撃コードが存在する脆弱性の割合

10

445件

■ Web 上に PoC/ 攻撃コードが公開されていることを確認

■ アドバイザリに※ 2) の記載あり

■ アドバイザリに記載なし、もしくは※ 1) の記載あり

※1)

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.

36%に攻撃コードが存在

Page 11: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性ランキング(全体)

11

422件

1 位 CWE-119 バッファエラー

2 位 CWE-20 不適切な入力確認

3 位 CWE-79 クロスサイトスクリプティング

4 位 CWE-22 パストラバーサル

5 位 CWE-121 スタックバッファオーバーフロー

その他

Page 12: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性ランキング ( 製品種別 )

12

順位 全体 HMI コントローラ ネットワーク機

器 その他

1 バッファエラー バッファエラー 不適切な入力確認認可・認証・アクセス制御

不適切な入力確認

2 不適切な入力確認 XSS 不明不十分なエントロピー

バッファエラー

3 XSS 不適切な入力確認 バッファエラー バッファエラーパストラバーサル

4 パストラバーサル パストラバーサル不適切なアクセス制御

不適切な認証スタックバッファオーバーフロー

5スタックバッファオーバーフロー

スタックバッファオーバーフロー

隠れた機能 暗号に関する問題認可・権限・アクセス制御

Page 13: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

CWE

CWE (共通脆弱性タイプ一覧 )

ソフトウェアのセキュリティ上の弱点(脆弱性)の分類学

13

CWE-74インジェクション

CWE-79XSS

CWE-94コードインジェクション

CWE-78OS コマンドインジェクション

CWE-89SQL インジェクション

CWE-134コマンドインジェクション

Page 14: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

CWE を上位の階層で集約した場合の脆弱性の割合

脆弱性の分類

14

1 位 CWE-20 不適切な入力確認

2 位 CWE-118 範囲エラー

3 位 CWE-264 認可・権限・アクセス制御

4 位 CWE-399 リソース管理の問題

5 位 CWE-255 証明書・パスワードの管理

422件

Page 15: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性ランキング

15

順位 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-264CWE-89

認可・権限・アクセス制御SQL インジェクション

13

9 CWE-122CWE-284

ヒープバッファオーバーフロー不適切なアクセス制御

12

11 CWE-259 パスワードのハードコーディング 8

12 CWE-200CWE-427

情報漏洩ファイル検索パスの制御不備

7

14 CWE-399CWE-190CWE-255CWE-331CWE-400CWE-476

リソース管理エラー整数オーバーフローとラップアラウンド証明書やパスワードの管理不十分なエントロピーリソース枯渇NULL ポインタ参照

5

20 CWE-23CWE-798CWE-311CWE-352CWE-592CWE-912

相対パストラバーサル認証情報のハードコーディングセンシティブなデータを暗号化しないクロスサイトリクエストフォージェリー (CSRF)認証バイパス隠れた機能

4

26 CWE-94CWE-125CWE-134CWE-189CWE-306CWE-416CWE-425

コードインジェクション境界外読取り書式文字の制御に不備数値処理の問題重要な機能に対する認証の欠如解放済みメモリ使用リクエストの直接送信 ('Forced Browsing’)

3

33 CWE-78CWE-120CWE-91CWE-261CWE-269CWE-285CWE-310CWE-330CWE-388CWE-538CWE-618CWE-471CWE-321

OS コマンドインジェクション古典的バッファオーバーフローXML インジェクションパスワードの暗号化の強度不足不適切な権限管理不適切な認証暗号に関する問題強度の不十分な乱数の使用エラー処理ファイルやディレクトリ情報の漏洩危険な ActiveX メソッドの公開不変であるべきデータの改変 (MAID)暗号化鍵のハードコーディング

2

46 CWE-114CWE-601CWE-123CWE-28CWE-319CWE-21CWE-40CWE-73CWE-113CWE-118CWE-219CWE-248CWE-250CWE-262CWE-294CWE-307CWE-315CWE-320CWE-326CWE-338CWE-362CWE-389CWE-404CWE-410CWE-415CWE-521CWE-522CWE-611CWE-680CWE-703CWE-732CWE-749CWE-755CWE-763CWE-788CWE-835

プロセスコントロールオープンリダイレクトWrite-what-where 条件パストラバーサル : '..\filedir’センシティブな情報の平文送信パストラバーサルと同値エラーパストラバーサル : ‘\\UNC\share\name\’ (Windows UNC Share)ファイル名やパス名の外部制御HTTP レスポンス分割範囲エラーWeb ルートにセンシティブなデータキャッチされない例外必要の無い権限による実行パスワードに有効期限を設定しない認証バイパス (Capture-replay)認証処理に対する回数制限や時間制限の未設定センシティブな情報をクッキーに平文で保存する鍵管理エラー不適切な暗号強度暗号学的に強度の足りない PRNG の使用競合状態エラー条件、戻り値、ステータスコード不適切なリソースのシャットダウンやリリース不十分なリソースプール二重解放弱いパスワードを設定できる認証情報の不十分な保護XML 外部要素参照 (‘XXE’) の不適切な制限整数オーバーフローからバッファオーバーフローにつながる例外条件の不適切なチェックや処理重要なリソースに不適切なパーミッションを付与する危険なメソッドや機能の公開例外条件の不適切な処理無効なポインタや参照の解放バッファの終端外のメモリへのアクセス無限ループ

1

ICS-CERT アドバイザリで特定された脆弱性とその件数

Page 16: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

ICS-CERT アドバイザリの脆弱性• 全体の 30% がバッファオーバーフロー関連 → 大部分は C/C++ で書かれたプログラム → 古典的な脆弱性が繰り返されている

• 12% が CWE-20 “Improper Input Validation”

  → 脆弱性の根本原因は不明

• PoC/ 攻撃コードが公開されている脆弱性は 36% と高い割合

• IT 全般の脆弱性よりも脅威度が高い傾向

16

Page 17: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

最近の事例

17

Page 18: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

最近の研究事例

18

修正済み

Page 19: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

攻撃のシナリオ – 任意のコード実行 –

19

http://www.yokogawa.co.jp/dcs/products/cs/system-overview/dcs-cs-0201ja.htm

〜拡張テスト機能起動中〜

BKFSim_vhfd.exe Port 20010/UDP

攻撃者

0010010001001010100010101000111….

1. 攻撃者は細工した攻撃パケットをCENTUM がインストールされた PC

の 20010番ポートに送信する

任意のコード実行

2. CENTUM を実行するユーザの権限で任意のコードが実行される

Page 20: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.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); ……..

Page 21: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.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); ……..

ログメッセージを書き出す関数

• Format:書式指定文字列• 残りの引数:外部から入力さ

れた値を使用

Page 22: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.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); ……..

Dest は 260 バイトの配列

vsprintf() でログメッセージを組み立てて Dest に格納する

Page 23: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.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); ……..

可変引数を扱うためのローカル変数

Page 24: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.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); ……..

Format の次の引数を va で指し示すためのおまじない

Page 25: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.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); ……..

あらかじめ null 終端文字を入れているようだ

Page 26: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.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); ……..

書式指定文字列の大きさを調べている ?

※ 正しくは、組み立てた後の文字列の長さを調べるべきでは ?

Page 27: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.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); ……..

Dest への文字列書き込み .

書き込む文字列の長さは Dest に収まるのか ?

Page 28: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.28

ERROR:HealthFromUDP():GetHostTblPosByName(hostname=%s) rtnno=%d

Format として使われる書式指定文字列

ERROR:HealthFromUDP():GetHostTblPosByName(hostname=ホスト名 ) rtnno=整数

書式指定子 (文字列 )

書式指定子 (整数 )

*sprintf() で文字列を組み立てると…

組み立てた文字列は当然 Format 自身よりも長くなる

ホスト名はどこからやってくる ?

Page 29: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.29

死活監視のため、 HIS ステーションと FCS の間ではハートビートパケッ

トをやりとりしている

Page 30: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.30

ハートビートパケットのフォーマット

最初の 16 バイト:ヘッダ第 16 バイト目 :パケットの残りのサイズ (0 〜255)ホスト名文字列 (null 終端文字列らしい )最後の 4 バイト :末端のしるし

ということはホスト名の最大長は255 – 4 == 251 バイト !?

Page 31: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.31

ERROR:HealthFromUDP():GetHostTblPosByName(hostname=ホスト名 ) rtnno=整数

書式指定文字列部分 : 59 バイトホスト名 : <=251 バイト

整数 : ???

細工したハートビートパケットでバッファオーバフローの可能性 !!

組み立てられる文字列は 310 + α バイト。一方、その文字列を格納する変数 Dest は 260 バイト。

Page 32: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.32

STR31-C:文字データと null終端文字を格納するため

に十分な領域を確保する

データをバッファにコピーする際、データを保持する十分な大きさがバッファにないと、

バッファオーバフローが発生する。

Page 33: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

違反コード

33

#include <stdio.h>void func(const char *name) { char filename[128]; sprintf(filename, “%s.txt”, name);}

null終端文字 (1 バイト ) + “.txt” (4 バイト ) == 5 バイト

name 引数の長さが 123 バイトを超えるとバッファオーバフローが発生する

Page 34: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

適合コード

34

#include <stdio.h>void func(const char *name) { char filename[128]; sprintf(filename, “%.123s.txt”, name);}

書式指定子のフィールド長で文字列長を制限

snprintf(filename, sizeof(filename), “%s.txt”, name);

snprintf() を使い、書き出す文字列長を制限

Page 35: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

対策に有効なCERT C コーディングルール

35

Page 36: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

CERT C コーディングスタンダードCERT-C のルール

36

  CERT-C ルールには、違反コードや適合コードのサンプルやリスク評価など様々な脆弱性を作り込まないために遵守すべき内容が記載されている。

 ① 対応する脆弱性 (CWE) ② ルールをサポートする静的解析ツール

といった補足情報も

Page 37: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

CERT-C の特徴誕生のきっかけは 2006 年春の C言語規格の標準化会議—言語規格書:コンパイラ屋向け—Secure Coding Standard:プログラマ向け

C言語のエキスパートを含む開発コミュニティによって作られ、日々メンテナンスされている—1500人以上の contributor

37

Page 38: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性とコーディングルールの対応各ルールの「関連するガイドライン」から関連する CWE ( 脆弱性 ) を抽出できる

38

Page 39: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性とコーディングルールのマッピングCWE と CERT-C の対応表を作成

39

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

•…

Page 40: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

マッピング上の留意点

制御システム製品すべてが C言語で開発されているわけではない—Ex. XSS の脆弱性を作り込んだ製品

開発言語は多くの場合不明。一方で、脆弱性の 3 割がC/C++ の代表的コーディングエラー (CWE-119)

  → 残りの 7 割やいかに?

マッピングはあくまで C で開発されていた場合を仮定して行った

40

Page 41: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

22 の推奨ルール

41

Page 42: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

44個のルールが 445 件の脆弱性に関連

そのうち 22個のルールが必須項目

42

Page 43: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.43

INT30-C 符号無し整数の演算結果がラップアラウンドしないようにする

INT32-C 符号付き整数演算がオーバーフローを引き起こさないことを保証する

INT35-C 整数式をより大きなサイズの整数に対して比較や代入をする際には、事前に演算後のサイズで評価する

整数関連

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 権限の破棄は確実に行う

その他

Page 44: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

CERT-C をサポートするコード解析ツール

ルールをサポートする解析ツールは「自動検出」セクションにまとめられている

44

ツール名

対応状況の補足説明

Page 45: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

ツール毎の CERT-C サポート率

45

ソースコード解析ツール 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 ルールはツールで検出できる

Page 46: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

CERT Rosecheckers

46

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

Page 47: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

まとめと推奨事項

47

Page 48: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

まとめ

ICS-CERT アドバイザリで取り上げられた制御システム用ソフトウェアの脆弱性は、 IT 全般の脆弱性よりも脅威度が高い傾向にある

22個の CERT-C コーディングルールを活用することで、これらの脆弱性を低減することができる

48

Page 49: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

推奨事項• 社内のコーディング規約が 22/44個のルールをカバーしているか確

認  → カバーしていないルールの採用を検討

• 発注時の要求事項として、ルール遵守を開発者に求める

• 解析ツールがルールの違反を検出できるか確認する

• 解析ツールを新規導入する場合、ルールのサポート状況を考慮する

• ルールや脆弱性について学ぶ機会をプログラマに提供する

49

Page 50: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

セキュアコーディングに関するお問合せ

50

JPCERT コーディネーションセンター脆弱性解析チーム

—Email: [email protected]—Tel: 03-3518-4600—https://www.jpcert.or.jp/

Page 51: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

参考 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

51

Page 52: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

BACKUP

52

Page 53: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性ランキング( HMI )

53

261件

1 位 CWE-119 バッファエラー

2 位 CWE-79 クロスサイトスクリプティング

3 位 CWE-20 不適切な入力確認

4 位 CWE-22 パストラバーサル

5 位 CWE-121 スタックバッファオーバーフロー

Page 54: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性ランキング(コントローラ製品)

54

52 件

1 位 CWE-20 不適切な入力確認

2 位 不明

3 位 CWE-119 バッファエラー

4 位 CWE-284 不適切なアクセス制御

5 位 CWE-912 隠れた機能

Page 55: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性ランキング(ネットワーク機器)

55

31 件

1 位 CWE-264 認可・権限・アクセス制御

2 位 CWE-331 不十分なエントロピー

3 位 CWE-119 バッファエラー

4 位 CWE-287 不適切な認証

5 位 CWE-310 暗号に関する問題

Page 56: Survey and Analysis of ICS Vulnerabilities (Japanese)

Copyright©2014JPCERT/CC All rights reserved.

脆弱性ランキング(その他の製品)

56

101件

1 位 CWE-20 不適切な入力確認

2 位 CWE-119 バッファエラー

3 位 CWE-22 パストラバーサル

4 位 CWE-121 スタックバッファオーバーフロー

5 位 CWE-264 認可・権限・アクセス制御