SlideShare a Scribd company logo
1 of 56
ICS脆弱性の調査および 
その対策としてのCERT Cコーディングルール 
2014年10月15日 
JPCERT コーディネーションセンター 
脆弱性解析チーム 
久保正樹
アジェンダ 
ICS-CERT アドバイザリに見る脆弱性の傾向 
最近の事例 
対策に有効なCERT-C コーディングルール 
Copyright©2014JPCERT/CC All rights reserved. 
1
ICS-CERT アドバイザリにみる 
脆弱性の傾向 
Copyright©2014JPCERT/CC All rights reserved. 
2
ICS-CERT アドバイザリ 
米国土安全保障省の産業制御システムセキュリティ担当機関が提供 
する制御製品の脆弱性情報 
— http://ics-cert.us-cert.gov/advisories 
Copyright©2014JPCERT/CC All rights reserved. 
3 
2010年〜2013年末までに公開さ 
れたアドバイザリを対象にデータ 
を収集し、調査を行った
データ収集対象のICS-CERTアドバイザリ 
Copyright©2014JPCERT/CC All rights reserved. 
4 
件数 
アドバイザリの件数242 
脆弱性の件数445 
1アドバイザリ当たりの脆弱性件数1.8 
期間: 2010年〜2013年末
月別・種別の脆弱性公表件数 
ICS-CERT アドバイザリの「BACKGROUND」などから製品種別をHMI、コントローラー、ネット 
ワーク機器、その他の4分類とし、製品種別ごとの脆弱性の公開傾向を下図に示す 
製品種別ごとの脆弱性の内訳月別・製品種別ごとの脆弱性公開件数 
Copyright©2014JPCERT/CC All rights reserved. 
5 
HMIの脆弱性が全体の約60%弱を占め、年月に関わらず 
万遍なく公表されている 
242件
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
脆弱性の深刻度(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を 
各々変換した値
脆弱性の深刻度(ICS-CERT vs. 脆弱性全般) 
脆弱全般(CVE 19,012件)とICS-CERTアドバイザリ(422件) のCVSS Vector String 
Copyright©2014JPCERT/CC All rights reserved. 
8 
※ 左が脆弱性全般、右がICS-CERTアドバイザリの脆弱性
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.
脆弱性ランキング(全体) 
Copyright©2014JPCERT/CC All rights reserved. 
10 
422件 
1位CWE-119 
バッファエラー 
2位CWE-20 
不適切な入力確認 
3位CWE-79 
クロスサイトスクリプティング 
4位CWE-22 
パストラバーサル 
5位CWE-121 
スタックバッファオーバーフロー 
その他
脆弱性ランキング(製品種別) 
Copyright©2014JPCERT/CC All rights reserved. 
順 
位 
11 
全体HMI コントローラ 
ネットワーク機 
器 
その他 
1 バッファエラーバッファエラー不適切な入力確認 
認可・認証・アクセ 
ス制御 
不適切な入力確 
認 
2 不適切な入力確認XSS 不明 
不十分なエントロ 
ピー 
バッファエラー 
3 XSS 不適切な入力確認バッファエラーバッファエラー 
パストラバーサ 
ル 
4 パストラバーサルパストラバーサル 
不適切なアクセス 
制御 
不適切な認証 
スタックバッ 
ファオーバーフ 
ロー 
5 
スタックバッファ 
オーバーフロー 
スタックバッファ 
オーバーフロー 
隠れた機能暗号に関する問題 
認可・権限・ア 
クセス制御
CWE 
CWE (共通脆弱性タイプ一覧) 
ソフトウェアのセキュリティ上の弱点(脆弱性)の分類学 
Copyright©2014JPCERT/CC All rights reserved. 
12 
CWE-74 
インジェクション 
CWE-79 
XSS 
CWE-94 
コードインジェクション 
CWE-78 
OSコマンドインジェクション 
CWE-89 
SQLインジェクション 
CWE-134 
コマンドインジェクション
脆弱性の分類 
CWEを上位の階層で集約した場合の脆弱性の割合 
Copyright©2014JPCERT/CC All rights reserved. 
13 
1位CWE-20 
不適切な入力確認 
2位CWE-118 
範囲エラー 
3位CWE-264 
認可・権限・アクセス制御 
4位CWE-399 
リソース管理の問題 
5位CWE-255 
証明書・パスワードの管理 
422件
脆弱性ランキング 
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アドバイザリで特定された 
脆弱性とその件数
ICS-CERT アドバイザリの脆弱性 
• 全体の30%がバッファオーバーフロー関連 
→ 大部分はC/C++で書かれたプログラム 
→ 古典的な脆弱性が繰り返されている 
• 12% がCWE-20 “Improper Input Validation” 
→ 脆弱性の根本原因は不明 
• PoC/攻撃コードが公開されている脆弱性は36%と高い割合 
• IT 全般の脆弱性よりも脅威度が高い傾向 
Copyright©2014JPCERT/CC All rights reserved. 
15
最近の事例 
Copyright©2014JPCERT/CC All rights reserved. 
16
最近の研究事例 
Copyright©2014JPCERT/CC All rights reserved. 
17
攻撃のシナリオ– 任意のコード実行– 
〜拡張テスト機能起動中〜 
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
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.
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:書式指定文字列 
• 残りの引数:外部から入力され 
た値を使用
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 に格納する
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. 
可変引数を扱うための 
ローカル変数
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 で 
指し示すためのおまじない
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 終端文字を入 
れているようだ
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. 
書式指定文字列の大きさを 
調べている? 
※正しくは、組み立てた後 
の文字列の長さを調べるべ 
きでは?
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 に収まるのか?
Format として使われる書式指定文字列 
ERROR:HealthFromUDP():GetHostTblPosByName(hostname=%s) rtnno=%d 
ERROR:HealthFromUDP():GetHostTblPosByName(hostname=ホスト名) rtnno=整数 
Copyright©2 27 014JPCERT/CC All rights reserved. 
書式指定子(文字列) 
書式指定子(整数) 
*sprintf() で文字列を組み立てると… 
組み立てた文字列は当然Format 自身よりも長くなる 
ホスト名はどこからやってくる?
死活監視のため、HISステーションと 
FCSの間ではハートビートパケット 
をやりとりしている 
Copyright©2 28 014JPCERT/CC All rights reserved.
ハートビートパケットのフォーマット 
最初の16バイト:ヘッダ 
第16バイト目:パケットの残りのサイズ(0〜255) 
ホスト名文字列(null 終端文字列らしい) 
最後の4バイト:末端のしるし 
ということはホスト名の最大長は 
255 – 4 == 251バイト!? 
Copyright©2 29 014JPCERT/CC All rights reserved.
ERROR:HealthFromUDP():GetHostTblPosByName(hostname=ホスト名) rtnno=整数 
書式指定文字列部分: 59バイト 
ホスト名: <=251バイト 
整数: ??? 
組み立てられる文字列は310 + α バイト。 
一方、その文字列を格納する変数Dest は260バイト。 
細工したハートビートパ 
ケットでバッファオーバフ 
ローの可能性!! 
Copyright©2 30 014JPCERT/CC All rights reserved.
Copyright©2 31 014JPCERT/CC All rights reserved. 
STR31-C: 
文字データとnull終端文字を格納するために 
十分な領域を確保する 
データをバッファにコピーする際、データを保 
持する十分な大きさがバッファにないと、バッ 
ファオーバフローが発生する。
違反コード 
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 バイトを超えると 
バッファオーバフローが発生する
適合コード 
#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()を使い、書き出す文字列長を制限
対策に有効な 
CERT C コーディングルール 
Copyright©2014JPCERT/CC All rights reserved. 
34
CERT C コーディングスタンダード 
CERT-C のルール 
Copyright©2014JPCERT/CC All rights reserved. 
35 
CERT-C ルールには、違反コードや適合 
コードのサンプルやリスク評価など様々な脆 
弱性を作り込まないために遵守すべき内容が 
記載されている。 
① 対応する脆弱性(CWE) 
② ルールをサポートする静的解析ツール 
といった補足情報も
CERT-C の特徴 
誕生のきっかけは2006年春のC言語規格の標準化会議 
— 言語規格書:コンパイラ屋向け 
—Secure Coding Standard:プログラマ向け 
C言語のエキスパートを含む開発コミュニティによって作られ、 
日々メンテナンスされている 
—1500人以上のcontributor 
Copyright©2014JPCERT/CC All rights reserved. 
36
脆弱性とコーディングルールの対応 
各ルールの「関連するガイドライン」から 
関連するCWE (脆弱性) を抽出できる 
Copyright©2014JPCERT/CC All rights reserved. 
37
脆弱性とコーディングルールのマッピング 
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 
•…
マッピング上の留意点 
制御システム製品すべてがC言語で開発されているわけ 
ではない 
—Ex. XSSの脆弱性を作り込んだ製品 
開発言語は多くの場合不明。一方で、脆弱性の3割が 
C/C++の代表的コーディングエラー(CWE-119) 
→ 残りの7割やいかに? 
マッピングはあくまでCで開発されていた場合を仮定し 
て行った 
Copyright©2014JPCERT/CC All rights reserved. 
39
22の推奨ルール 
Copyright©2014JPCERT/CC All rights reserved. 
40
44個のルールが445件の脆弱性に関連 
そのうち22個のルールが必須項目 
Copyright©2014JPCERT/CC All rights reserved. 
41
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 権限の破棄は確実に行う 
その他
CERT-C をサポートするコード解析ツール 
ルールをサポートする解析ツールは「自動検出」セクションにまとめ 
られている 
ツール名 
Copyright©2014JPCERT/CC All rights reserved. 
43 
対応状況の補足説明
ツール毎の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ルールはツールで検出できる
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
まとめと推奨事項 
Copyright©2014JPCERT/CC All rights reserved. 
46
まとめ 
ICS-CERT アドバイザリで取り上げられた制御システム 
用ソフトウェアの脆弱性は、IT全般の脆弱性よりも脅威 
度が高い傾向にある 
22個のCERT-Cコーディングルールを活用することで、 
これらの脆弱性を低減することができる 
Copyright©2014JPCERT/CC All rights reserved. 
47
推奨事項 
• 社内のコーディング規約が22/44個のルールをカバーしているか確認 
→ カバーしていないルールの採用を検討 
• 発注時の要求事項として、ルール遵守を開発者に求める 
• 解析ツールがルールの違反を検出できるか確認する 
• 解析ツールを新規導入する場合、ルールのサポート状況を考慮する 
• ルールや脆弱性について学ぶ機会をプログラマに提供する 
Copyright©2014JPCERT/CC All rights reserved. 
48
セキュアコーディングに関するお問合せ 
Copyright©2014JPCERT/CC All rights reserved. 
49 
JPCERTコーディネーションセンター 
脆弱性解析チーム 
—Email:secure-coding@jpcert.or.jp 
—Tel:03-3518-4600 
— https://www.jpcert.or.jp/
参考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
BACKUP 
Copyright©2014JPCERT/CC All rights reserved. 
51
脆弱性ランキング(HMI) 
Copyright©2014JPCERT/CC All rights reserved. 
52 
261件 
1位CWE-119 
バッファエラー 
2位CWE-79 
クロスサイトスクリプティング 
3位CWE-20 
不適切な入力確認 
4位CWE-22 
パストラバーサル 
5位CWE-121 
スタックバッファオーバーフロー
脆弱性ランキング(コントローラ製品) 
Copyright©2014JPCERT/CC All rights reserved. 
53 
52件 
1位CWE-20 
不適切な入力確認 
2位不明 
3位CWE-119 
バッファエラー 
4位CWE-284 
不適切なアクセス制御 
5位CWE-912 
隠れた機能
脆弱性ランキング(ネットワーク機器) 
Copyright©2014JPCERT/CC All rights reserved. 
54 
31件 
1位CWE-264 
認可・権限・アクセス制御 
2位CWE-331 
不十分なエントロピー 
3位CWE-119 
バッファエラー 
4位CWE-287 
不適切な認証 
5位CWE-310 
暗号に関する問題
脆弱性ランキング(その他の製品) 
Copyright©2014JPCERT/CC All rights reserved. 
55 
101件 
1位CWE-20 
不適切な入力確認 
2位CWE-119 
バッファエラー 
3位CWE-22 
パストラバーサル 
4位CWE-121 
スタックバッファオーバーフロー 
5位CWE-264 
認可・権限・アクセス制御

More Related Content

What's hot

Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介
Hiroshi Tokumaru
 
Packet と向き合う夏 VRRP Advertisement編
Packet と向き合う夏 VRRP Advertisement編Packet と向き合う夏 VRRP Advertisement編
Packet と向き合う夏 VRRP Advertisement編
@ otsuka752
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
JPCERT Coordination Center
 
安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014
Hiroshi Tokumaru
 
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
Hiroshi Tokumaru
 

What's hot (13)

とある診断員とSQLインジェクション
とある診断員とSQLインジェクションとある診断員とSQLインジェクション
とある診断員とSQLインジェクション
 
Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介
 
V6 unix vol.2 in okinawa
V6 unix vol.2 in okinawaV6 unix vol.2 in okinawa
V6 unix vol.2 in okinawa
 
Packet と向き合う夏 VRRP Advertisement編
Packet と向き合う夏 VRRP Advertisement編Packet と向き合う夏 VRRP Advertisement編
Packet と向き合う夏 VRRP Advertisement編
 
20151228_マイナンバー対応、情報漏洩対策にアクセスコントロールとカラムベースのデータ暗号化ソリューション by 株式会社インサイトテクノロジー 森田俊哉
20151228_マイナンバー対応、情報漏洩対策にアクセスコントロールとカラムベースのデータ暗号化ソリューション by 株式会社インサイトテクノロジー 森田俊哉20151228_マイナンバー対応、情報漏洩対策にアクセスコントロールとカラムベースのデータ暗号化ソリューション by 株式会社インサイトテクノロジー 森田俊哉
20151228_マイナンバー対応、情報漏洩対策にアクセスコントロールとカラムベースのデータ暗号化ソリューション by 株式会社インサイトテクノロジー 森田俊哉
 
4章 Linuxカーネル - 割り込み・例外 4
 4章 Linuxカーネル - 割り込み・例外 4 4章 Linuxカーネル - 割り込み・例外 4
4章 Linuxカーネル - 割り込み・例外 4
 
Webアプリ開発者のためのHTML5セキュリティ入門
Webアプリ開発者のためのHTML5セキュリティ入門Webアプリ開発者のためのHTML5セキュリティ入門
Webアプリ開発者のためのHTML5セキュリティ入門
 
4章 Linuxカーネル - 割り込み・例外 3
4章 Linuxカーネル - 割り込み・例外 34章 Linuxカーネル - 割り込み・例外 3
4章 Linuxカーネル - 割り込み・例外 3
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
 
とあるイルカのバーボンハウス
とあるイルカのバーボンハウスとあるイルカのバーボンハウス
とあるイルカのバーボンハウス
 
安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014
 
Exome解析入門
Exome解析入門Exome解析入門
Exome解析入門
 
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
 

Viewers also liked

PT - Siemens WinCC Flexible Security Hardening Guide
PT - Siemens WinCC Flexible Security Hardening GuidePT - Siemens WinCC Flexible Security Hardening Guide
PT - Siemens WinCC Flexible Security Hardening Guide
qqlan
 
ICS/SCADA/PLC Google/Shodanhq Cheat Sheet
ICS/SCADA/PLC Google/Shodanhq Cheat SheetICS/SCADA/PLC Google/Shodanhq Cheat Sheet
ICS/SCADA/PLC Google/Shodanhq Cheat Sheet
qqlan
 

Viewers also liked (20)

Internet Accessible ICS in Japan (English)
Internet Accessible ICS in Japan (English)Internet Accessible ICS in Japan (English)
Internet Accessible ICS in Japan (English)
 
Accelerating OT - A Case Study
Accelerating OT - A Case StudyAccelerating OT - A Case Study
Accelerating OT - A Case Study
 
Incubation of ICS Malware (English)
Incubation of ICS Malware (English)Incubation of ICS Malware (English)
Incubation of ICS Malware (English)
 
S4xJapan Closing Keynote
S4xJapan Closing KeynoteS4xJapan Closing Keynote
S4xJapan Closing Keynote
 
Vulnerability Inheritance in ICS (English)
Vulnerability Inheritance in ICS (English)Vulnerability Inheritance in ICS (English)
Vulnerability Inheritance in ICS (English)
 
ICS Security Training ... What Works and What Is Needed (Japanese)
ICS Security Training ... What Works and What Is Needed (Japanese)ICS Security Training ... What Works and What Is Needed (Japanese)
ICS Security Training ... What Works and What Is Needed (Japanese)
 
Active Directory in ICS: Lessons Learned From The Field
Active Directory in ICS: Lessons Learned From The FieldActive Directory in ICS: Lessons Learned From The Field
Active Directory in ICS: Lessons Learned From The Field
 
Should I Patch My ICS?
Should I Patch My ICS?Should I Patch My ICS?
Should I Patch My ICS?
 
API Training 10 Nov 2014
API Training 10 Nov 2014API Training 10 Nov 2014
API Training 10 Nov 2014
 
Unidirectional Security Appliances to Secure ICS
Unidirectional Security Appliances to Secure ICSUnidirectional Security Appliances to Secure ICS
Unidirectional Security Appliances to Secure ICS
 
Windows Service Hardening
Windows Service HardeningWindows Service Hardening
Windows Service Hardening
 
The RIPE Experience
The RIPE ExperienceThe RIPE Experience
The RIPE Experience
 
Attacking and Defending Autos Via OBD-II from escar Asia
Attacking and Defending Autos Via OBD-II from escar AsiaAttacking and Defending Autos Via OBD-II from escar Asia
Attacking and Defending Autos Via OBD-II from escar Asia
 
Dynamic Zoning Based On Situational Activity in ICS (Japanese)
Dynamic Zoning Based On Situational Activity in ICS (Japanese)Dynamic Zoning Based On Situational Activity in ICS (Japanese)
Dynamic Zoning Based On Situational Activity in ICS (Japanese)
 
Remote Control Automobiles at ESCAR US 2015
Remote Control Automobiles at ESCAR US 2015Remote Control Automobiles at ESCAR US 2015
Remote Control Automobiles at ESCAR US 2015
 
Hacker Halted 2016 - How to get into ICS security
Hacker Halted 2016 - How to get into ICS securityHacker Halted 2016 - How to get into ICS security
Hacker Halted 2016 - How to get into ICS security
 
PT - Siemens WinCC Flexible Security Hardening Guide
PT - Siemens WinCC Flexible Security Hardening GuidePT - Siemens WinCC Flexible Security Hardening Guide
PT - Siemens WinCC Flexible Security Hardening Guide
 
Monitoring ICS Communications
Monitoring ICS CommunicationsMonitoring ICS Communications
Monitoring ICS Communications
 
ICS Network Security Monitoring (NSM)
ICS Network Security Monitoring (NSM)ICS Network Security Monitoring (NSM)
ICS Network Security Monitoring (NSM)
 
ICS/SCADA/PLC Google/Shodanhq Cheat Sheet
ICS/SCADA/PLC Google/Shodanhq Cheat SheetICS/SCADA/PLC Google/Shodanhq Cheat Sheet
ICS/SCADA/PLC Google/Shodanhq Cheat Sheet
 

Similar to Survey and Analysis of ICS Vulnerabilities (Japanese)

Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
JPCERT Coordination Center
 
2010 04クラウド技術講座
2010 04クラウド技術講座2010 04クラウド技術講座
2010 04クラウド技術講座
sisawa
 

Similar to Survey and Analysis of ICS Vulnerabilities (Japanese) (20)

脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
 
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
 
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
 
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
 
MBSD_Cybersecurity_Challenges_2017_最終審査会_発表スライド
MBSD_Cybersecurity_Challenges_2017_最終審査会_発表スライドMBSD_Cybersecurity_Challenges_2017_最終審査会_発表スライド
MBSD_Cybersecurity_Challenges_2017_最終審査会_発表スライド
 
Osc2017 tokyo spring_soss_sig
Osc2017 tokyo spring_soss_sigOsc2017 tokyo spring_soss_sig
Osc2017 tokyo spring_soss_sig
 
Buffer overflow
Buffer overflowBuffer overflow
Buffer overflow
 
Scis2015 ruo ando_2015-01-20-01
Scis2015 ruo ando_2015-01-20-01Scis2015 ruo ando_2015-01-20-01
Scis2015 ruo ando_2015-01-20-01
 
Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備
 
Statically detecting vulnerability under memory pressure using exhaustive search
Statically detecting vulnerability under memory pressure usingexhaustive searchStatically detecting vulnerability under memory pressure usingexhaustive search
Statically detecting vulnerability under memory pressure using exhaustive search
 
Reconf 201901
Reconf 201901Reconf 201901
Reconf 201901
 
IDAの脆弱性とBug Bounty by 千田 雅明
IDAの脆弱性とBug Bounty by 千田 雅明IDAの脆弱性とBug Bounty by 千田 雅明
IDAの脆弱性とBug Bounty by 千田 雅明
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
 
RECOMMENDER for Web security engineers - 中級編 -
RECOMMENDER for Web security engineers - 中級編 -RECOMMENDER for Web security engineers - 中級編 -
RECOMMENDER for Web security engineers - 中級編 -
 
2015 0228 OpenStack swift; GMO Internet Services
2015 0228 OpenStack swift; GMO Internet Services2015 0228 OpenStack swift; GMO Internet Services
2015 0228 OpenStack swift; GMO Internet Services
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
2010 04クラウド技術講座
2010 04クラウド技術講座2010 04クラウド技術講座
2010 04クラウド技術講座
 
IETF94 M2M Authentication関連報告
IETF94 M2M Authentication関連報告IETF94 M2M Authentication関連報告
IETF94 M2M Authentication関連報告
 
P2Pって何?
P2Pって何?P2Pって何?
P2Pって何?
 

More from Digital Bond

PLC Code Protection
PLC Code ProtectionPLC Code Protection
PLC Code Protection
Digital Bond
 

More from Digital Bond (13)

The Future of ICS Security Products
The Future of ICS Security ProductsThe Future of ICS Security Products
The Future of ICS Security Products
 
Lessons Learned from the NIST CSF
Lessons Learned from the NIST CSFLessons Learned from the NIST CSF
Lessons Learned from the NIST CSF
 
Assessing the Security of Cloud SaaS Solutions
Assessing the Security of Cloud SaaS SolutionsAssessing the Security of Cloud SaaS Solutions
Assessing the Security of Cloud SaaS Solutions
 
Havex Deep Dive (English)
Havex Deep Dive (English)Havex Deep Dive (English)
Havex Deep Dive (English)
 
Unsolicited Response - Getting BACnet Off of the Internet (Japanese)
Unsolicited Response - Getting BACnet Off of the Internet (Japanese)Unsolicited Response - Getting BACnet Off of the Internet (Japanese)
Unsolicited Response - Getting BACnet Off of the Internet (Japanese)
 
Using Assessment Tools on ICS (English)
Using Assessment Tools on ICS (English)Using Assessment Tools on ICS (English)
Using Assessment Tools on ICS (English)
 
Sharing Plant Data with Phones, Tablets and the Cloud (Englsh)
Sharing Plant Data with Phones, Tablets and the Cloud (Englsh)Sharing Plant Data with Phones, Tablets and the Cloud (Englsh)
Sharing Plant Data with Phones, Tablets and the Cloud (Englsh)
 
Application Whitelisting and DPI in ICS (English)
Application Whitelisting and DPI in ICS (English)Application Whitelisting and DPI in ICS (English)
Application Whitelisting and DPI in ICS (English)
 
Industrial Wireless Security (Japanese)
Industrial Wireless Security (Japanese)Industrial Wireless Security (Japanese)
Industrial Wireless Security (Japanese)
 
S4x14 Session: You Name It; We Analyze It
S4x14 Session: You Name It; We Analyze ItS4x14 Session: You Name It; We Analyze It
S4x14 Session: You Name It; We Analyze It
 
Writing ICS Vulnerability Analysis
Writing ICS Vulnerability AnalysisWriting ICS Vulnerability Analysis
Writing ICS Vulnerability Analysis
 
HART as an Attack Vector
HART as an Attack VectorHART as an Attack Vector
HART as an Attack Vector
 
PLC Code Protection
PLC Code ProtectionPLC Code Protection
PLC Code Protection
 

Survey and Analysis of ICS Vulnerabilities (Japanese)

  • 1. ICS脆弱性の調査および その対策としてのCERT Cコーディングルール 2014年10月15日 JPCERT コーディネーションセンター 脆弱性解析チーム 久保正樹
  • 2. アジェンダ ICS-CERT アドバイザリに見る脆弱性の傾向 最近の事例 対策に有効なCERT-C コーディングルール Copyright©2014JPCERT/CC All rights reserved. 1
  • 3. ICS-CERT アドバイザリにみる 脆弱性の傾向 Copyright©2014JPCERT/CC All rights reserved. 2
  • 4. ICS-CERT アドバイザリ 米国土安全保障省の産業制御システムセキュリティ担当機関が提供 する制御製品の脆弱性情報 — http://ics-cert.us-cert.gov/advisories Copyright©2014JPCERT/CC All rights reserved. 3 2010年〜2013年末までに公開さ れたアドバイザリを対象にデータ を収集し、調査を行った
  • 5. データ収集対象のICS-CERTアドバイザリ Copyright©2014JPCERT/CC All rights reserved. 4 件数 アドバイザリの件数242 脆弱性の件数445 1アドバイザリ当たりの脆弱性件数1.8 期間: 2010年〜2013年末
  • 6. 月別・種別の脆弱性公表件数 ICS-CERT アドバイザリの「BACKGROUND」などから製品種別をHMI、コントローラー、ネット ワーク機器、その他の4分類とし、製品種別ごとの脆弱性の公開傾向を下図に示す 製品種別ごとの脆弱性の内訳月別・製品種別ごとの脆弱性公開件数 Copyright©2014JPCERT/CC All rights reserved. 5 HMIの脆弱性が全体の約60%弱を占め、年月に関わらず 万遍なく公表されている 242件
  • 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. 脆弱性の深刻度(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. 脆弱性の深刻度(ICS-CERT vs. 脆弱性全般) 脆弱全般(CVE 19,012件)とICS-CERTアドバイザリ(422件) のCVSS Vector String Copyright©2014JPCERT/CC All rights reserved. 8 ※ 左が脆弱性全般、右がICS-CERTアドバイザリの脆弱性
  • 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. 脆弱性ランキング(全体) Copyright©2014JPCERT/CC All rights reserved. 10 422件 1位CWE-119 バッファエラー 2位CWE-20 不適切な入力確認 3位CWE-79 クロスサイトスクリプティング 4位CWE-22 パストラバーサル 5位CWE-121 スタックバッファオーバーフロー その他
  • 12. 脆弱性ランキング(製品種別) Copyright©2014JPCERT/CC All rights reserved. 順 位 11 全体HMI コントローラ ネットワーク機 器 その他 1 バッファエラーバッファエラー不適切な入力確認 認可・認証・アクセ ス制御 不適切な入力確 認 2 不適切な入力確認XSS 不明 不十分なエントロ ピー バッファエラー 3 XSS 不適切な入力確認バッファエラーバッファエラー パストラバーサ ル 4 パストラバーサルパストラバーサル 不適切なアクセス 制御 不適切な認証 スタックバッ ファオーバーフ ロー 5 スタックバッファ オーバーフロー スタックバッファ オーバーフロー 隠れた機能暗号に関する問題 認可・権限・ア クセス制御
  • 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. 脆弱性の分類 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. 脆弱性ランキング 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. ICS-CERT アドバイザリの脆弱性 • 全体の30%がバッファオーバーフロー関連 → 大部分はC/C++で書かれたプログラム → 古典的な脆弱性が繰り返されている • 12% がCWE-20 “Improper Input Validation” → 脆弱性の根本原因は不明 • PoC/攻撃コードが公開されている脆弱性は36%と高い割合 • IT 全般の脆弱性よりも脅威度が高い傾向 Copyright©2014JPCERT/CC All rights reserved. 15
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. Format として使われる書式指定文字列 ERROR:HealthFromUDP():GetHostTblPosByName(hostname=%s) rtnno=%d ERROR:HealthFromUDP():GetHostTblPosByName(hostname=ホスト名) rtnno=整数 Copyright©2 27 014JPCERT/CC All rights reserved. 書式指定子(文字列) 書式指定子(整数) *sprintf() で文字列を組み立てると… 組み立てた文字列は当然Format 自身よりも長くなる ホスト名はどこからやってくる?
  • 30. ハートビートパケットのフォーマット 最初の16バイト:ヘッダ 第16バイト目:パケットの残りのサイズ(0〜255) ホスト名文字列(null 終端文字列らしい) 最後の4バイト:末端のしるし ということはホスト名の最大長は 255 – 4 == 251バイト!? Copyright©2 29 014JPCERT/CC All rights reserved.
  • 31. ERROR:HealthFromUDP():GetHostTblPosByName(hostname=ホスト名) rtnno=整数 書式指定文字列部分: 59バイト ホスト名: <=251バイト 整数: ??? 組み立てられる文字列は310 + α バイト。 一方、その文字列を格納する変数Dest は260バイト。 細工したハートビートパ ケットでバッファオーバフ ローの可能性!! Copyright©2 30 014JPCERT/CC All rights reserved.
  • 32. Copyright©2 31 014JPCERT/CC All rights reserved. STR31-C: 文字データとnull終端文字を格納するために 十分な領域を確保する データをバッファにコピーする際、データを保 持する十分な大きさがバッファにないと、バッ ファオーバフローが発生する。
  • 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. 適合コード #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. 対策に有効な CERT C コーディングルール Copyright©2014JPCERT/CC All rights reserved. 34
  • 36. CERT C コーディングスタンダード CERT-C のルール Copyright©2014JPCERT/CC All rights reserved. 35 CERT-C ルールには、違反コードや適合 コードのサンプルやリスク評価など様々な脆 弱性を作り込まないために遵守すべき内容が 記載されている。 ① 対応する脆弱性(CWE) ② ルールをサポートする静的解析ツール といった補足情報も
  • 37. CERT-C の特徴 誕生のきっかけは2006年春のC言語規格の標準化会議 — 言語規格書:コンパイラ屋向け —Secure Coding Standard:プログラマ向け C言語のエキスパートを含む開発コミュニティによって作られ、 日々メンテナンスされている —1500人以上のcontributor Copyright©2014JPCERT/CC All rights reserved. 36
  • 38. 脆弱性とコーディングルールの対応 各ルールの「関連するガイドライン」から 関連するCWE (脆弱性) を抽出できる Copyright©2014JPCERT/CC All rights reserved. 37
  • 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. マッピング上の留意点 制御システム製品すべてがC言語で開発されているわけ ではない —Ex. XSSの脆弱性を作り込んだ製品 開発言語は多くの場合不明。一方で、脆弱性の3割が C/C++の代表的コーディングエラー(CWE-119) → 残りの7割やいかに? マッピングはあくまでCで開発されていた場合を仮定し て行った Copyright©2014JPCERT/CC All rights reserved. 39
  • 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. CERT-C をサポートするコード解析ツール ルールをサポートする解析ツールは「自動検出」セクションにまとめ られている ツール名 Copyright©2014JPCERT/CC All rights reserved. 43 対応状況の補足説明
  • 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. 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
  • 48. まとめ ICS-CERT アドバイザリで取り上げられた制御システム 用ソフトウェアの脆弱性は、IT全般の脆弱性よりも脅威 度が高い傾向にある 22個のCERT-Cコーディングルールを活用することで、 これらの脆弱性を低減することができる Copyright©2014JPCERT/CC All rights reserved. 47
  • 49. 推奨事項 • 社内のコーディング規約が22/44個のルールをカバーしているか確認 → カバーしていないルールの採用を検討 • 発注時の要求事項として、ルール遵守を開発者に求める • 解析ツールがルールの違反を検出できるか確認する • 解析ツールを新規導入する場合、ルールのサポート状況を考慮する • ルールや脆弱性について学ぶ機会をプログラマに提供する Copyright©2014JPCERT/CC All rights reserved. 48
  • 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. 参考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. BACKUP Copyright©2014JPCERT/CC All rights reserved. 51
  • 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. 脆弱性ランキング(コントローラ製品) Copyright©2014JPCERT/CC All rights reserved. 53 52件 1位CWE-20 不適切な入力確認 2位不明 3位CWE-119 バッファエラー 4位CWE-284 不適切なアクセス制御 5位CWE-912 隠れた機能
  • 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. 脆弱性ランキング(その他の製品) Copyright©2014JPCERT/CC All rights reserved. 55 101件 1位CWE-20 不適切な入力確認 2位CWE-119 バッファエラー 3位CWE-22 パストラバーサル 4位CWE-121 スタックバッファオーバーフロー 5位CWE-264 認可・権限・アクセス制御

Editor's Notes

  1. JPCERTチームは、US ICS-CERTから公開された242のアドバイザリーを調査し、445の脆弱性を特定した。CWEやCVSSのスコア、エクスプロイトコードの存在有無等の情報を収集し、分類している。さらに、特定された脆弱性を対策するため、CERTのCコーディングルールを確認した。CWEをコーディングルールに対してマッピングし、どのルールがどの脆弱性の対策に効果があるかをまとめた。ここでは、マッピング結果と、開発者が再確認すべき非常に重要な約20のルールを紹介する。また、これらのコーディングルールからの逸脱を見つけられる静的なツールも紹介する。 http://www.cvent.com/events/s4xjapan/custom-18-cd16bc12af9f4e098096f466b9e49a65.aspx
  2. 2010年から2013年にかけてハンドリングされた242件のアドバイザリから445件の脆弱性を抽出 ちなみに2014年に入ってからは、10月1日現在、83件のアドバイザリが公開されている。
  3. 平均値 = 合計値の累計 ÷ 度数の累計 中央値 = データを小さい順に並べたとき、ちょうど中央にくる値 最頻値 = 度数が一番大きい値
  4. 36%の脆弱性にPoC/攻撃コードが存在する 
  5. Confidential
  6. CWE = Common Weakness Enumeration 図は「インジェクション」の階層構造の例
  7. Confidential
  8. BKFSim_vhfd.exe の説明:http://cdn2.us.yokogawa.com/GS33K10D60-50E.pdf
  9. 客観的データに基づいたマッピングが可能 機械的に作成 恣意性を排除
  10. ルールには、CERT-C への準拠に必須の rule と、それ以外の recommendation の2種類が存在する。太字の脆弱性低減に特に重要な22個のルールは、前者の rule のカテゴリに関するもの。
  11. TS 17961 として CERT-C のルールのサブセットがまとめられている