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