SlideShare a Scribd company logo
1 of 61
Download to read offline
セキュアなソフトウェアをつくるために……
CERT コーディングスタンダードご紹介
JPCERT コーディネーションセンター
情報流通対策グループ リードアナリスト
⼾⽥ 洋三
2017年1⽉28⽇(⼟)
Copyright ©2017 JPCERT/CC All rights reserved.
本⽇の話題
ü ⾃⼰紹介
ü セキュアコーディングスタンダードって?
ü 中⾝を⾒てみよう
ü コーディングスタンダードの活⽤
ü まとめ
ü 参考情報など
2
Copyright ©2017 JPCERT/CC All rights reserved.
http://www.tomo.gr.jp/root/e9706.html
JPCERT/CC
情報流通対策グループ
リードアナリスト ⼾⽥ 洋三
脆弱性情報分析, セキュアコーディ
ング普及啓発活動……
に努めています
3
⾃⼰紹介
Copyright ©2017 JPCERT/CC All rights reserved.
JPCERT Coordination Center
日本における情報セキュリティ対策
活動の向上に取り組んでいる組織
4
Copyright ©2017 JPCERT/CC All rights reserved.
過去のOSC参加履歴 (セミナーを⾏ったもの)
5
•OSC2016@Hokkaido
•OWASP ASVS と Cheat Sheet(日本語版)のご紹介
•OSC2015@Hokkaido
•CSRF 脆弱性とその対策について
•OSC2014@Fukuoka
•Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
•OSC2013@Kyoto
•~ヒトの振り見て我が振り直せ~脆弱性事例に学ぶJavaセキュアコーディング
•OSC2012@Fukuoka
•Androidセキュアコーディング~安全なAndroidアプリ開発のための心得~
•OSC2011@Nagoya: セキュアコーディングノススメ(JAVA編)
•OSC2010@Hokkaido: あなたのコードにセキュアコーディングスタンダード
•OSC2009@Fukuoka: セキュアコーディングノススメ
•OSC2008@Tokyo/Spring: セキュアコーディングノススメ
•OSC2007@Fukuoka: セキュアコーディングノススメ
•OSC2007@Niigata: ソフトウェア脆弱性を取り巻く状況と対策
•OSC2007@Kansai: ソフトウェア脆弱性情報流通のこれまでとこれから
•OSC2005@Tokyo/Fall: ソフトウェア脆弱性情報流通への取り組み
Copyright ©2017 JPCERT/CC All rights reserved.
JPCERT/CC の活動
重要インフラ、重要情報インフラ事業者等の特定組織向け情報発信早期警戒情報
海外のNational-CSIRTや企業内のセキュリティ対応組織の構築・運⽤⽀援CSIRT構築⽀援
脆弱性情報ハンドリング
Ø 未公開の脆弱性関連情報を製品開発者へ提供し、
対応依頼
Ø 関係機関と連携し、国際的に情報公開⽇を調整
Ø セキュアなコーディング⼿法の普及
Ø 制御システムに関する脆弱性関連情報の適切な
流通
マルウエア(不正プログラム)等の攻撃⼿法の分析、解析アーティファクト分析
各種業務を円滑に⾏うための海外関係機関との連携国際連携
インシデントの予測と捕捉インシデント予防 発⽣したインシデントへの対応
制御システムに関するインシデントハンドリング、情報収集・分析発信制御システムセキュリティ
⽇本シーサート協議会、フィッシング対策協議会の事務局運営等国内外関係者との連携
Ø マルウエアの接続先等の攻撃関連サイト等の閉
鎖等による被害最⼩化
Ø 攻撃⼿法の分析⽀援による被害可能性の確認、
拡散抑⽌
Ø 再発防⽌に向けた関係各関の情報交換及び情報
共有
インシデントハンドリング
(インシデント対応調整⽀援)
情報収集・分析・発信
定点観測(TSUBAME)
Ø ネットワークトラフィック情報の収集分析
Ø セキュリティ上の脅威情報の収集、分析、必要
とする組織への提供
6
Copyright ©2017 JPCERT/CC All rights reserved.7
JPCERT/CC の主な活動
Copyright ©2017 JPCERT/CC All rights reserved.
JPCERT/CC セキュアコーディングのコンテンツ
8
www.jpcert.or.jp/securecoding/
Copyright ©2017 JPCERT/CC All rights reserved.
slideshare にも講演資料やセミナコンテンツ置いてます
9
www.slideshare.net/jpcert_securecoding/presentations
Copyright ©2017 JPCERT/CC All rights reserved.
セキュアコーディングスタンダードって?
10
Copyright ©2017 JPCERT/CC All rights reserved.
脆弱性の数
実際の数は不明
脆弱性の共通識別⼦ (CVE) が割り振られたものは⽶国 NIST が
データを提供している (2015年は6488件)
11
https://nvd.nist.gov/ の statistics から
Copyright ©2017 JPCERT/CC All rights reserved.
JVN: Japan Vulnerability Notes
12
https://jvn.jp/ http://jvndb.jvn.jp/
Copyright ©2017 JPCERT/CC All rights reserved.
セキュアなソフトウェア開発
13
セキュアデザイン
動的コード解析
セキュアな実⾏環境
静的コード解析
デザイン コーディング テスト 実⾏
セキュアコーディング
スタンダード
セキュアコーディング
スタンダード
Copyright ©2017 JPCERT/CC All rights reserved.
プログラミング⾔語Cの問題
14
C⾔語の精神:
プログラマを信頼し、やりたいことができるように
⾔語仕様には未規定、未定義、処理系定義事項が存在する
⾔語仕様の詳細を知らないプログラマが
未定義動作などの問題のあるコードを書き、
脆弱性を作り込む
セキュアなコードを書くための
道しるべ・ガイドラインが必要!
Copyright ©2017 JPCERT/CC All rights reserved.
GNU coding standards
https://www.gnu.org/prep/standards/
FLEX SDK coding conventions and best practices
https://sourceforge.net/adobe/flexsdk/wiki/Coding%20Conventions/
Zend Framework PHP 標準コーディング規約
https://framework.zend.com/manual/2.4/en/ref/coding.standard.html
組込みソフトウェア開発向けコーディング作法ガイド[C⾔語版]
https://www.ipa.go.jp/sec/publish/tn13-001.html
The NetBSD source code style guide
http://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style?rev=HEAD
コーディングスタイル
Developer’s Guide to oracle Solaris 11 Security
Appendix A (Secure Coding Guidelines for Developers)
https://docs.oracle.com/cd/E26502_01/html/E29016/scode-1.html
などなど…
JPL Institutional Coding Standard for the C Programming Language
http://lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf
MISRA C:2012
Guidelines for the Use of the C Language in Critical Systems
コーディング規約
Google Style Guides
https://github.com/google/styleguide
ガイドラインって?
15
Programming Style
https://en.wikipedia.org/wiki/Programming_style
Copyright ©2017 JPCERT/CC All rights reserved.16
SEI CERT (セキュア)コーディングスタンダード集
https://www.securecoding.cert.org/
Copyright ©2017 JPCERT/CC All rights reserved.17
CERT (セキュア)コーディングスタンダード集
Copyright ©2017 JPCERT/CC All rights reserved.
CERT コーディングスタンダード
18
セキュアなソフトウェアをつくる
ためのコーディングガイドライン集
- 攻撃可能な脆弱性を作り込まない
- コードの保守性向上
= プログラマが理解しやすい
= 移植性向上
対象:
ソフトウェア開発やメンテナンスに携わる⼈々
Copyright ©2017 JPCERT/CC All rights reserved.
- コンパイラ作者向けでなくCプログラマ向け
-第⼀⽬的: 今後の開発に役⽴つガイドライン
=第⼆⽬的: 既存のレガシーコードのメンテナンスに役⽴つ
ガイドライン
- できるだけOSや実⾏環境に依存しない
= 環境依存な⽅法に⾔及する場合、おもに
POSIX(Unix)およびWindowsにおけるコード例を⽰す
- C99およびC11に基づく
19
CERT C コーディングスタンダード
Copyright ©2017 JPCERT/CC All rights reserved.
開発に携わる⼈々
20
CERT Secure Coding Initiative
言語仕様関係者、コンパイラベンダ、開発者など、
多様な人々を含むコミュニティベースでの議論と開発
CMU/SEI CERT division のWikiサイト上で開発中
https://www.securecoding.cert.org/
実際に発⾒された脆弱性を反映
商⽤ソースコード解析ツールも対応
Coverity, Fortify, Klocwork, LDRA, ...
JPCERT/CC にて⽇本語版を提供
https://www.jpcert.or.jp/sc-rules/
https://www.jpcert.or.jp/java-rules/
Copyright ©2017 JPCERT/CC All rights reserved.
セキュアコーディングスタンダード⽇本語版
21
Copyright ©2017 JPCERT/CC All rights reserved.
セキュアコーディングスタンダード⽇本語版
22
Copyright ©2017 JPCERT/CC All rights reserved.
中⾝を⾒てみよう
23
Copyright ©2017 JPCERT/CC All rights reserved.
中⾝を⾒てみよう
C コーディングスタンダード日本語版
(https://www.jpcert.or.jp/sc-rules/)
•カテゴリ一覧
•ルールとレコメンデーション
•各ページの構成
(説明, 違反コード, 適合コード, リスク評価, 参考情報)
C コーディングスタンダード
カテゴリ: 16
ガイドライン: 302 (必須118, 推奨184)
24
Copyright ©2017 JPCERT/CC All rights reserved.
中⾝を⾒てみよう: カテゴリ⼀覧
01.プリプロセッサ(PRE)
02. 宣言と初期化(DCL)
03. 式(EXP)
04. 整数(INT)
05. 浮動小数点(FLP)
06. 配列(ARR)
07. 文字と文字列(STR)
08. メモリ管理(MEM)
09. 入出力(FIO)
10. 環境(ENV)
11. シグナル(SIG)
12. エラー処理(ERR)
13. Application Programming Interface(API)
14. 並行性(CON)
49. 雑則(MSC)
50. POSIX(POS)
内容に応じて分類
25
Copyright ©2017 JPCERT/CC All rights reserved.
☆ レコメンデーション (推奨)
☆ ルール (必須)
中⾝を⾒てみよう: 「ルール」と「レコメンデーション」
○ コーディング作法への違反が、攻撃可能な脆弱性を生み出す
セキュリティ上の欠陥につながる可能性がある。
○ コーディング作法へ適合しているかどうかを、自動解析、
形式的方法、手作業によるソースコード検査などを通じて
確認することができる。
https://www.jpcert.or.jp/sc-rules/00.introduction.html
○ コーディング作法を適用することで、システムのセキュリティが
高まる可能性がある。
○ コーディング作法がルールと見なされるための要件を、一つ以上
満たすことができない。
26
Copyright ©2017 JPCERT/CC All rights reserved.
☆ レコメンデーション (推奨)
☆ ルール (必須)
中⾝を⾒てみよう: 「ルール」と「レコメンデーション」
○ コーディング作法への違反が、攻撃可能な脆弱性を生み出す
セキュリティ上の欠陥につながる可能性がある。
○ コーディング作法へ適合しているかどうかを、自動解析、
形式的方法、手作業によるソースコード検査などを通じて
確認することができる。
○ コーディング作法を適用することで、システムのセキュリティが
高まる可能性がある。
○ コーディング作法がルールと見なされるための要件を、一つ以上
満たすことができない。
セキュリティを確保するために必ず適用すべきもの
○ スタンダード準拠の必須項目
○ 適合していることを確認できる
セキュリティを向上させるガイドライン、提案
○ スタンダード準拠には必須ではない
○ 必ずしも攻撃につながらない、適合の確認が難しい、など
https://www.jpcert.or.jp/sc-rules/00.introduction.html
27
Copyright ©2017 JPCERT/CC All rights reserved.
中⾝を⾒てみよう: 各ガイドラインの構成(1)
識別番号とタイトル
説明
違反コード
適合コード
(例外)
リスク評価
参考情報
カテゴリ名 番号-C 例: INT01-C, EXP32-C
C スタンダードの場合、
0〜29までの番号はレコメンデーション
30以降の番号はルール
28
Copyright ©2017 JPCERT/CC All rights reserved.
中⾝を⾒てみよう: 各ガイドラインの構成(2)
識別番号とタイトル
説明
違反コード
適合コード
(例外)
リスク評価
参考情報
内容の説明
「〜すべきである」「〜すべきでない」
簡単な違反コード例
違反コードの修正例や別の適切なアプローチ
のコード例など
このガイドラインにしたがう必要のない状況に
ついての説明
29
Copyright ©2017 JPCERT/CC All rights reserved.
中⾝を⾒てみよう: 各ガイドラインの構成(3)
識別番号とタイトル
説明
違反コード
適合コード
例外
リスク評価
参考情報
この評価値により、準拠すべき
ガイドラインに優先順位をつけられる
https://www.jpcert.or.jp/sc-rules/00.introduction.html
深刻度、攻撃可能性、修正コスト
の観点から評価
⾔語仕様の関連セクション、
解説記事、
関連するCWE番号など
30
Copyright ©2017 JPCERT/CC All rights reserved.
例: MEM30-C: 解放済みメモリにアクセスしない (1/8)
算術演算のオペランドとしての逆参照または動作、型のキャスト、または代入の右手側としてのポインタ
の使用を含め、動的記憶域に割り当てられていたブロックがメモリ管理関数によって解放された後、解放
されたメモリを指すポインタは評価しない。
C 標準によれば、free() または realloc() 関数の呼び出しによって解放された領域を指すポインタの値を
使用しているプログラム動作は未定義である。 (附属書 J 「未定義の動作」の 177 を参照。)
解放されたメモリを指すポインタの値を読み取ると、ポインタ値は不定であり、さらにトラップ表現の場合
があるため、未定義の動作となる。 後者の場合、それによってハードウェアトラップを引き起こす可能性
がある。
一度解放されたメモリにアクセスすると、ヒープの管理に使用されているデータ構造を壊す可能性がある。
割り当てを解除されたメモリを参照するポインタはダングリングポインタと呼ばれる。 ダングリングポイン
タにアクセスすると、攻撃可能な脆弱性を引き起こす可能性がある。
メモリが解放されても、メモリの内容がそのまま残りアクセス可能な場合がある。これは、解放されたブ
ロックをいつ再割り当てし再使用するかは、メモリマネージャが決定するためである。解放された位置に
あるデータは有効であるかのように見えるかもしれない。しかし、このデータは予期せず変更される可能
性があり、意図しないプログラム動作を引き起こしうる。そのため、一度解放したメモリへの書き込みや、
メモリの読み取りを行わないことを保証する必要がある。
31
Copyright ©2017 JPCERT/CC All rights reserved.
例: MEM30-C: 解放済みメモリにアクセスしない (2/8)
違反コード
K & R [Kernighan 1988](邦題:『プログラミング言語C』)のこの例では、リンクリストから項目を削除する
誤った手法と正しい手法の両方を示している。 誤った手法は、p->next が参照される前に p を解放して
おり、p->next はすでに解放されたメモリを読み取るため、本の中でも明白に誤りだと記されている。
for (p = head; p != NULL; p = p->next)
free(p);
適合コード
K & Rは正しい解決法も示している。 このエラーを修正するために、p を解放する前に p->next への参
照を q に格納している。
for (p = head; p != NULL; p = q) {
q = p->next;
free(p);
}
head = NULL;
32
Copyright ©2017 JPCERT/CC All rights reserved.
例: MEM30-C: 解放済みメモリにアクセスしない (3/8)
違反コード
以下のコード例では、buff が解放されたあとに、buff への書き込みが行われている。 この手の脆弱性の
悪用は容易であり、脆弱なプロセスの権限で任意のコードが実行される可能性があるが、この例ほどわ
かりやすいことはまれである。一般に、割り当てと解放が行われる場所は遠く離れており、問題に気付き
原因をつきとめることはむずかしい。
int main(int argc, const char *argv[]) {
char *buff;
buff = (char *)malloc(BUFFERSIZE);
if (!buff) {
/* エラー条件の処理 */
}
/* ... */
free(buff);
/* ... */
strncpy(buff, argv[1], BUFFERSIZE-1);
}
33
Copyright ©2017 JPCERT/CC All rights reserved.
例: MEM30-C: 解放済みメモリにアクセスしない (4/8)
適合コード
以下の解決法では、メモリが不要になってからメモリを解放している。
int main(int argc, const char *argv[]) {
char *buff;
buff = (char *)malloc(BUFFERSIZE);
if (!buff) {
/* エラー条件の処理 */
}
/* ... */
strncpy(buff, argv[1], BUFFERSIZE-1);
/* ... */
free(buff);
}
34
Copyright ©2017 JPCERT/CC All rights reserved.
例: MEM30-C: 解放済みメモリにアクセスしない (5/8)
違反コード
libwmf バージョン 0.2.8.4 の以下のコード例 (CVE-2009-1364) では、返り値 gdRealloc (im->clip->list が
指す領域を再割り当てするシンプルなラップアラウンド realloc) は more に設定される。ただし、im->clip-
>list の値は後から直接コードで使用され、C 標準では realloc が指す領域を移動した場合、元の領域は解
放されると規定されている。 攻撃者は、再割り当て (十分な im->clip->count) を強制的に実行し、解放され
たメモリにアクセスすることで任意のコードを実行できる [xorl 2009]。
void gdClipSetAdd(gdImagePtr im,gdClipRectanglePtr rect) {
gdClipRectanglePtr more;
if (im->clip == 0) {
...
}
if (im->clip->count == im->clip->max) {
more = gdRealloc (im->clip->list,(im->clip->max + 8) * sizeof (gdClipRectangle));
if (more == 0) return; // if the realloc fails, then we have not lost the im->clip->list value
im->clip->max += 8;
}
im->clip->list[im->clip->count] = (*rect);
im->clip->count++;
35
Copyright ©2017 JPCERT/CC All rights reserved.
例: MEM30-C: 解放済みメモリにアクセスしない (6/8)
適合コード
適合コードでは、realloc を呼び出した後、im->clip->list を値 more に再割り当てする。
void gdClipSetAdd(gdImagePtr im,gdClipRectanglePtr rect) {
gdClipRectanglePtr more;
if (im->clip == 0) {
...
}
if (im->clip->count == im->clip->max) {
more = gdRealloc (im->clip->list,(im->clip->max + 8) * sizeof (gdClipRectangle));
if (more == 0) return;
im->clip->max += 8;
im->clip->list = more;
}
im->clip->list[im->clip->count] = (*rect);
im->clip->count++;
36
Copyright ©2017 JPCERT/CC All rights reserved.
例: MEM30-C: 解放済みメモリにアクセスしない (7/8)
解放済みのメモリを読み取ると、プログラムの異常終了やサービス運用妨害(DoS)攻撃を引き
起こす可能性がある。解放済みのメモリに書き込むと、バッファオーバーフローや、脆弱なプロ
セスの権限を使った任意のコード実行につながる可能性がある。
ルール 深刻度 可能性 修正コスト 優先度 レベル
MEM30-C 高 高 中 P18 L1
自動検出
ツール バージョン チェッカー 説明
Compass/ROSE
Coverity 6.5 USE_AFTER_FREE
メモリが複数回解放されるか、または解放
されたポインタの対象に対して読み取り/書
き込みを⾏う特定の事例を検出できる。
Fortify SCA 5.0
Klocwork 9.1
UFM.DEREF.MIGHT
UFM.DEREF.MUST
UFM.RETURN.MIGHT
UFM.RETURN.MUST
UFM.USE.MIGHT
UFM.USE.MUST
LDRA tool suite 8.5.4 51 D 実装済み
splint 3.1.1
リスク評価
37
Copyright ©2017 JPCERT/CC All rights reserved.
例: MEM30-C: 解放済みメモリにアクセスしない (8/8)
関連するガイドライン
CERT C++ Secure Coding Standard MEM30-CPP. Do not access freed memory
ISO/IEC TR 24772:2013
Dangling References to Stack Frames [DCM]
Dangling Reference to Heap [XYK]
ISO/IEC TS 17961 (ドラフト) Accessing freed memory [accfree]
MISRA-C Rule 17.6
MITRE CWE CWE-416, Use after free
参考資料
[Kernighan 1988] Section 7.8.5, "Storage Management"
[OWASP Freed Memory]
[Seacord 2013] Chapter 4, "Dynamic Memory Management"
[Viega 2005] Section 5.2.19, "Using Freed Memory"
[xorl 2009] CVE-2009-1364: LibWMF Pointer Use after free()
翻訳元
これは以下のページを翻訳したものです。
MEM30-C. Do not access freed memory (revision 122)
38
Copyright ©2017 JPCERT/CC All rights reserved.
中⾝を⾒てみよう(Javaコーディングスタンダード)
Java コーディングスタンダード日本語版
(https://www.jpcert.or.jp/sc-rules/)
•カテゴリ一覧
•ルールとレコメンデーション
•各ページの構成
(説明, 違反コード, 適合コード, リスク評価, 参考情報)
Java コーディングスタンダード
カテゴリ数: 17
ルール数: 158 (レコメンデーションは未訳)
39
Copyright ©2017 JPCERT/CC All rights reserved.
中⾝を⾒てみよう: カテゴリ⼀覧(Javaコーディングスタンダード)
00. 入力値検査とデータの無害化(IDS)
01. 宣言と初期化(DCL)
02. 式(EXP)
03. 数値型とその操作(NUM)
04. オブジェクト指向(OBJ)
05. メソッド(MET)
06. 例外時の動作(ERR)
07. 可視性とアトミック性(VNA)
08. ロック(LCK)
09. スレッドAPI(THI)
10. スレッドプール(TPS)
11. スレッドの安全性に関する雑則(TSM)
12. 入出力(FIO)
13. シリアライズ(SER)
14. プラットフォームのセキュリティ(SEC)
15. 実行環境(ENV)
49. 雑則(MSC)
内容に応じて分類
40
Copyright ©2017 JPCERT/CC All rights reserved.
GNU Coding Standards との⽐較
41
GNU Coding Standards
- GNUシステムをクリーンに、⼀貫性のある、
インストールしやすいものにするため
("to make the GNU system clean, consistent, and easy to install")
- ポータブルで頑丈で⾼信頼性なプログラムを書くためのガイドにもなる
("also be read as a guide to writing portable, robust, and reliable programs")
CERT C セキュアコーディングスタンダード
- C を使う全ての⼈のために
- 攻撃に使われるような脆弱性を作り込まないようにするためのガイドライン
ポータブル、頑丈、⾼信頼性と重なる部分あり
Copyright ©2017 JPCERT/CC All rights reserved.
MISRA-C:2012 との⽐較
42
MISRA-C:2012
(Guidelines for the use of the C language in critical
systems)
- 組み込みや重要インフラ系システムにおけるC使⽤に関するガイドライン
- 安全性、移植性、信頼性向上のため
- C90およびC99に基づく
CERT C セキュアコーディングスタンダード
- OSや実⾏環境などを特定せずC を使う全ての⼈のために
- 脆弱性をつくりこまないように → 安全性、移植性、信頼性と重なる
- C99およびC11に基づく
MISRA-C:2012
ルール数: 143
(義務10, 必須101, 推奨32)
CERT C コーディングスタンダード
カテゴリ数: 17
ルール数: 306 (必要120, 推奨186)
Copyright ©2017 JPCERT/CC All rights reserved.
ソースコード解析ツール (C)
https://www.securecoding.cert.org/confluence/x/uoFuCQ
43
Copyright ©2017 JPCERT/CC All rights reserved.
ソースコード解析ツール (Java)
https://www.securecoding.cert.org/confluence/x/xIJuCQ
44
Copyright ©2017 JPCERT/CC All rights reserved.
CERT C と国際標準化
ISO/IEC TS 17961
C Secure Coding Rules
—CERT C コーディングスタンダードをベースに国際標準化され
たセキュアコーディングルール集
ルール:検出(diagnose)されるべきコーディング
— 例: “Accessing an object through a pointer to an incompatible type
(other than unsigned char) shall be diagnosed”
根拠(rationale):⾔語仕様書の典拠
違反コード例
45
JTC1/SC22/WG14 - C
コンパイルは通っても安全な動作が保証されな
いケースをまとめた⾔語仕様書の副読本
参考: ISO/IEC TS 17961 C Secure Coding Rules
(https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=140705863)
参考: Secure Coding Validation Suite (https://github.com/SEI-CERT/scvs)
Copyright ©2017 JPCERT/CC All rights reserved.
コーディングスタンダードの活⽤
46
Copyright ©2017 JPCERT/CC All rights reserved.
セキュアコーディングスタンダードの活⽤
●セキュアコーディングの学習に
●開発チーム内の認識共有
●製品のセキュリティ関連仕様の明確化
47
Copyright ©2017 JPCERT/CC All rights reserved.
活⽤: セキュアコーディングの学習資料として(1)
セキュアコーディングを学ぶ教材として
使う
●「セキュアコーディングってなに?」
●「こんなトピック知ってる?」
社内での研修や勉強会の教材に
●違反コード・適合コードでクイズ形式
48
Copyright ©2017 JPCERT/CC All rights reserved.
活⽤: セキュアコーディングの学習資料として(2)
コード解析ツールを活⽤するための補助資料
検出結果を理解するために
ツールの説明よりも分かりやすく
別の観点での説明
49
Copyright ©2017 JPCERT/CC All rights reserved.
活⽤: セキュアコーディングの学習資料として(3)
コード解析ツールを活⽤するための補助資料
検出結果の対応を検討するために
どのように修正すべきなの?
ホントに修正すべきなの?
セカンドオピニオンとして...
50
Copyright ©2017 JPCERT/CC All rights reserved.
活⽤: 開発チーム内の認識共有(1)
コーディングの良し悪しの判断基準
セキュリティ確保のための⽬標を具体化
●「ルールXXとYYには準拠しよう! 」
セキュリティ品質向上の⼿段として活⽤
51
Copyright ©2017 JPCERT/CC All rights reserved.
活⽤: 開発チーム内の認識共有(2)
⾃社のコーディング規約の⼟台として
●既存の内容に不⾜がないかチェック
●命名規則やコーディングスタイルなどは独⾃に
決める必要がある
52
Copyright ©2017 JPCERT/CC All rights reserved.
活⽤: セキュリティ仕様明確化(1)
品質チェックの具体的な項⽬の洗い出しに
⼊⼒値チェックはきちんとやってるか
⾮推奨な関数使ってないか
可搬性の問題はないか
......
53
Copyright ©2017 JPCERT/CC All rights reserved.
活⽤: セキュリティ仕様明確化(2)
要求仕様として提⽰
●コーディング規約XXを遵守すること
●レベルL1のルールを遵守すること
●レベルL2までのルールを全て遵守すること
など
あいまいだったセキュリティ
⾯の仕様の内容について、
より明確な基準で議論できる
54
Copyright ©2017 JPCERT/CC All rights reserved.
活⽤: セキュリティ仕様明確化(3)
実装仕様として提⽰
●コーディング規約XXを遵守してます
●レベルL1のルールを遵守してます
●レベルL2までのルールを全て遵守してます
など
あいまいだったセキュリティ
⾯の仕様の内容について、
より明確な基準で議論できる
55
Copyright ©2017 JPCERT/CC All rights reserved.
まとめ
56
SEI CERT コーディングスタンダード
—セキュアなソフトウェアをつくるためのコーディング
ガイドライン集
—C, Java, C++, Perl, Android
—解説、違反コード例、適合コード例
想定読者層: ソフトウェア開発やメンテナンスに携わ
る⼈々⼀般
⽇本語版もあるから活⽤してね!
—https://www.jpcert.or.jp/sc-rules/
—https://www.jpcert.or.jp/java-rules/
Copyright ©2017 JPCERT/CC All rights reserved.
おまけ: おすすめリーディングマップ
04. 整数(INT)
07. 文字と文字列(STR)
05. 浮動小数点(FLP)
11. シグナル(SIG)
12. エラー処理(ERR)
13. (API)
50. POSIX(POS)
06. 配列(ARR)
08. メモリ管理(MEM)
基本データ型について
しっかりおさえよう!
01. プリプロセッサ(PRE)
02. 宣言と初期化(DCL)
03. 式(EXP)
10. 環境(ENV)
09. 入出力(FIO)
重要なデータ構造として、
配列と動的メモリ管理を
チェック!
57
Copyright ©2017 JPCERT/CC All rights reserved.
コーディングスタンダードの協⼒者募集中!
CERTコーディングスタンダード⽇本語版の
整備に協⼒してくれる⽅を求めています。
—Java, Android, C, C++, ……
—既存の⽇本語へのコメント、改善案
—英語原⽂へのコメント、改善案
—さらに編集も…
58
Copyright ©2017 JPCERT/CC All rights reserved.
関連リソース
59
CERT C コーディングスタンダード
(https://www.jpcert.or.jp/sc-rules/)
Java コーディングスタンダード CERT/Oracle 版
(https://www.jpcert.or.jp/sc-rules/)
CERT Secure Coding Standards
(https://www.securecoding.cert.org/)
CERT/CC Secure Coding
(https://www.cert.org/secure-coding/)
Copyright ©2017 JPCERT/CC All rights reserved.
関連リソース
【改訂版】組込みソフトウェア開発向けコーディング作法ガイド[C言語版]
(http://www.seshop.com/product/detail/7950/)
MISRA-C:2004 ガイドブック
(http://www.sessame.jp/workinggroup/WorkingGroup3/MISRA-C_GuigeBook2004.htm)
組込み現場の「C」プログラミング標準コーディングガイドライン
(http://gihyo.jp/book/2007/978-4-7741-3254-9)
60
Copyright ©2017 JPCERT/CC All rights reserved.
セキュアコーディングに関するお問合せ、インシデント対応のご依頼は
61
JPCERTコーディネーションセンター
̶Tel:03-3518-4600
̶https://www.jpcert.or.jp/
セキュアコーディングに関するお問い合わせ
̶Email:secure-coding@jpcert.or.jp
̶https://www.jpcert.or.jp/securecoding/
インシデントの報告
̶Email:info@jpcert.or.jp
̶https://www.jpcert.or.jp/form/

More Related Content

What's hot

WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』JPCERT Coordination Center
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性JPCERT Coordination Center
 
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~JPCERT Coordination Center
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)JPCERT Coordination Center
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性JPCERT Coordination Center
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性JPCERT Coordination Center
 
Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性JPCERT Coordination Center
 
2019 1214 io_t_sec_jp_06_kawano_slideshare
2019 1214 io_t_sec_jp_06_kawano_slideshare2019 1214 io_t_sec_jp_06_kawano_slideshare
2019 1214 io_t_sec_jp_06_kawano_slideshareShinichiro Kawano
 
2020 0221 f-secure_jaws-ug_sapporo_25_slideshare
2020 0221 f-secure_jaws-ug_sapporo_25_slideshare2020 0221 f-secure_jaws-ug_sapporo_25_slideshare
2020 0221 f-secure_jaws-ug_sapporo_25_slideshareShinichiro Kawano
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見Yosuke HASEGAWA
 
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012Hiroshi Tokumaru
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性JPCERT Coordination Center
 

What's hot (20)

WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
 
Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
 
なぜ今、セキュリティ人材の育成が叫ばれているのか
なぜ今、セキュリティ人材の育成が叫ばれているのかなぜ今、セキュリティ人材の育成が叫ばれているのか
なぜ今、セキュリティ人材の育成が叫ばれているのか
 
Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性
 
CEH(認定ホワイトハッカー)公式トレーニングのご紹介
CEH(認定ホワイトハッカー)公式トレーニングのご紹介CEH(認定ホワイトハッカー)公式トレーニングのご紹介
CEH(認定ホワイトハッカー)公式トレーニングのご紹介
 
なぜ今、セキュリティ人材の育成がこんなにも叫ばれているのだろうか?
なぜ今、セキュリティ人材の育成がこんなにも叫ばれているのだろうか?なぜ今、セキュリティ人材の育成がこんなにも叫ばれているのだろうか?
なぜ今、セキュリティ人材の育成がこんなにも叫ばれているのだろうか?
 
CND(認定ネットワークディフェンダー / Certified Network Defender)公式トレーニングのご紹介
CND(認定ネットワークディフェンダー / Certified Network Defender)公式トレーニングのご紹介CND(認定ネットワークディフェンダー / Certified Network Defender)公式トレーニングのご紹介
CND(認定ネットワークディフェンダー / Certified Network Defender)公式トレーニングのご紹介
 
【セミナー講演資料】CND(認定ネットワークディフェンダー)公式トレーニング紹介
【セミナー講演資料】CND(認定ネットワークディフェンダー)公式トレーニング紹介【セミナー講演資料】CND(認定ネットワークディフェンダー)公式トレーニング紹介
【セミナー講演資料】CND(認定ネットワークディフェンダー)公式トレーニング紹介
 
2019 1214 io_t_sec_jp_06_kawano_slideshare
2019 1214 io_t_sec_jp_06_kawano_slideshare2019 1214 io_t_sec_jp_06_kawano_slideshare
2019 1214 io_t_sec_jp_06_kawano_slideshare
 
CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介
CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介
CEH(Certified Ethical Hacker:認定ホワイトハッカー)のご紹介
 
2020 0221 f-secure_jaws-ug_sapporo_25_slideshare
2020 0221 f-secure_jaws-ug_sapporo_25_slideshare2020 0221 f-secure_jaws-ug_sapporo_25_slideshare
2020 0221 f-secure_jaws-ug_sapporo_25_slideshare
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見
 
CND(Certified Network Defender:認定ネットワークディフェンダー)のご紹介
CND(Certified Network Defender:認定ネットワークディフェンダー)のご紹介CND(Certified Network Defender:認定ネットワークディフェンダー)のご紹介
CND(Certified Network Defender:認定ネットワークディフェンダー)のご紹介
 
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性
 

Similar to CERT コーディングスタンダードご紹介 (OSC2017@Osaka)

Dangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすDangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすShunsuke Maeda
 
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるRancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるMichitaka Terada
 
6万行の TypeScript 移行とその後
6万行の TypeScript 移行とその後6万行の TypeScript 移行とその後
6万行の TypeScript 移行とその後Shingo Sasaki
 
Alteryxの空間分析で学ぶ、最寄りの指定緊急避難場所と低水位地帯 Developers.IO Tokyo 2019
Alteryxの空間分析で学ぶ、最寄りの指定緊急避難場所と低水位地帯 Developers.IO Tokyo 2019Alteryxの空間分析で学ぶ、最寄りの指定緊急避難場所と低水位地帯 Developers.IO Tokyo 2019
Alteryxの空間分析で学ぶ、最寄りの指定緊急避難場所と低水位地帯 Developers.IO Tokyo 2019Yuji Kanemoto
 
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善Works Applications
 
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐CODE BLUE
 
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1Takeshi Hirosue
 
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -Tomoya Kabe
 
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
アイデアを形にする  ③3時間でアプリ公開!ゼロからのプログラミング講座アイデアを形にする  ③3時間でアプリ公開!ゼロからのプログラミング講座
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座DIVE INTO CODE Corp.
 
Openstack ceph 20171115 vtj
Openstack ceph 20171115 vtjOpenstack ceph 20171115 vtj
Openstack ceph 20171115 vtjTakehiro Kudou
 
そろそろSELinux を有効にしてみませんか?
そろそろSELinux を有効にしてみませんか?そろそろSELinux を有効にしてみませんか?
そろそろSELinux を有効にしてみませんか?Atsushi Mitsu
 
Railsやるやる_セキュリティ小話
Railsやるやる_セキュリティ小話Railsやるやる_セキュリティ小話
Railsやるやる_セキュリティ小話Naoki Ishibashi
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部Kiyoshi Ogawa
 
初めてのWebプログラミング講座
初めてのWebプログラミング講座初めてのWebプログラミング講座
初めてのWebプログラミング講座DIVE INTO CODE Corp.
 
Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]MasaruOinaga
 
共有、自動化、計測 - DevOps ツール考察 -
共有、自動化、計測 - DevOps ツール考察 -共有、自動化、計測 - DevOps ツール考察 -
共有、自動化、計測 - DevOps ツール考察 -Chie Sasaki
 
AI/MLシステムにおけるビッグデータとの付き合い方
AI/MLシステムにおけるビッグデータとの付き合い方AI/MLシステムにおけるビッグデータとの付き合い方
AI/MLシステムにおけるビッグデータとの付き合い方Shota Suzuki
 
2018年度新入社員研修実績紹介
2018年度新入社員研修実績紹介2018年度新入社員研修実績紹介
2018年度新入社員研修実績紹介CASAREAL, Inc.
 
初めてのWebプログラミング講座
初めてのWebプログラミング講座初めてのWebプログラミング講座
初めてのWebプログラミング講座DIVE INTO CODE Corp.
 

Similar to CERT コーディングスタンダードご紹介 (OSC2017@Osaka) (20)

Dangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすDangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らす
 
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるRancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
 
6万行の TypeScript 移行とその後
6万行の TypeScript 移行とその後6万行の TypeScript 移行とその後
6万行の TypeScript 移行とその後
 
Alteryxの空間分析で学ぶ、最寄りの指定緊急避難場所と低水位地帯 Developers.IO Tokyo 2019
Alteryxの空間分析で学ぶ、最寄りの指定緊急避難場所と低水位地帯 Developers.IO Tokyo 2019Alteryxの空間分析で学ぶ、最寄りの指定緊急避難場所と低水位地帯 Developers.IO Tokyo 2019
Alteryxの空間分析で学ぶ、最寄りの指定緊急避難場所と低水位地帯 Developers.IO Tokyo 2019
 
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
 
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
 
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
 
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -
 
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
アイデアを形にする  ③3時間でアプリ公開!ゼロからのプログラミング講座アイデアを形にする  ③3時間でアプリ公開!ゼロからのプログラミング講座
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
 
Openstack ceph 20171115 vtj
Openstack ceph 20171115 vtjOpenstack ceph 20171115 vtj
Openstack ceph 20171115 vtj
 
そろそろSELinux を有効にしてみませんか?
そろそろSELinux を有効にしてみませんか?そろそろSELinux を有効にしてみませんか?
そろそろSELinux を有効にしてみませんか?
 
Railsやるやる_セキュリティ小話
Railsやるやる_セキュリティ小話Railsやるやる_セキュリティ小話
Railsやるやる_セキュリティ小話
 
Klocworkのご紹介
Klocworkのご紹介Klocworkのご紹介
Klocworkのご紹介
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
 
初めてのWebプログラミング講座
初めてのWebプログラミング講座初めてのWebプログラミング講座
初めてのWebプログラミング講座
 
Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]
 
共有、自動化、計測 - DevOps ツール考察 -
共有、自動化、計測 - DevOps ツール考察 -共有、自動化、計測 - DevOps ツール考察 -
共有、自動化、計測 - DevOps ツール考察 -
 
AI/MLシステムにおけるビッグデータとの付き合い方
AI/MLシステムにおけるビッグデータとの付き合い方AI/MLシステムにおけるビッグデータとの付き合い方
AI/MLシステムにおけるビッグデータとの付き合い方
 
2018年度新入社員研修実績紹介
2018年度新入社員研修実績紹介2018年度新入社員研修実績紹介
2018年度新入社員研修実績紹介
 
初めてのWebプログラミング講座
初めてのWebプログラミング講座初めてのWebプログラミング講座
初めてのWebプログラミング講座
 

More from JPCERT Coordination Center

Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...JPCERT Coordination Center
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルJPCERT Coordination Center
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JPCERT Coordination Center
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)JPCERT Coordination Center
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)JPCERT Coordination Center
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JPCERT Coordination Center
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性JPCERT Coordination Center
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習JPCERT Coordination Center
 

More from JPCERT Coordination Center (13)

Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
 
Android Secure Coding
Android Secure CodingAndroid Secure Coding
Android Secure Coding
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説
 
Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
 

CERT コーディングスタンダードご紹介 (OSC2017@Osaka)

  • 2. Copyright ©2017 JPCERT/CC All rights reserved. 本⽇の話題 ü ⾃⼰紹介 ü セキュアコーディングスタンダードって? ü 中⾝を⾒てみよう ü コーディングスタンダードの活⽤ ü まとめ ü 参考情報など 2
  • 3. Copyright ©2017 JPCERT/CC All rights reserved. http://www.tomo.gr.jp/root/e9706.html JPCERT/CC 情報流通対策グループ リードアナリスト ⼾⽥ 洋三 脆弱性情報分析, セキュアコーディ ング普及啓発活動…… に努めています 3 ⾃⼰紹介
  • 4. Copyright ©2017 JPCERT/CC All rights reserved. JPCERT Coordination Center 日本における情報セキュリティ対策 活動の向上に取り組んでいる組織 4
  • 5. Copyright ©2017 JPCERT/CC All rights reserved. 過去のOSC参加履歴 (セミナーを⾏ったもの) 5 •OSC2016@Hokkaido •OWASP ASVS と Cheat Sheet(日本語版)のご紹介 •OSC2015@Hokkaido •CSRF 脆弱性とその対策について •OSC2014@Fukuoka •Lessons (to be) Learned from Handling OpenSSL Vulnerabilities •OSC2013@Kyoto •~ヒトの振り見て我が振り直せ~脆弱性事例に学ぶJavaセキュアコーディング •OSC2012@Fukuoka •Androidセキュアコーディング~安全なAndroidアプリ開発のための心得~ •OSC2011@Nagoya: セキュアコーディングノススメ(JAVA編) •OSC2010@Hokkaido: あなたのコードにセキュアコーディングスタンダード •OSC2009@Fukuoka: セキュアコーディングノススメ •OSC2008@Tokyo/Spring: セキュアコーディングノススメ •OSC2007@Fukuoka: セキュアコーディングノススメ •OSC2007@Niigata: ソフトウェア脆弱性を取り巻く状況と対策 •OSC2007@Kansai: ソフトウェア脆弱性情報流通のこれまでとこれから •OSC2005@Tokyo/Fall: ソフトウェア脆弱性情報流通への取り組み
  • 6. Copyright ©2017 JPCERT/CC All rights reserved. JPCERT/CC の活動 重要インフラ、重要情報インフラ事業者等の特定組織向け情報発信早期警戒情報 海外のNational-CSIRTや企業内のセキュリティ対応組織の構築・運⽤⽀援CSIRT構築⽀援 脆弱性情報ハンドリング Ø 未公開の脆弱性関連情報を製品開発者へ提供し、 対応依頼 Ø 関係機関と連携し、国際的に情報公開⽇を調整 Ø セキュアなコーディング⼿法の普及 Ø 制御システムに関する脆弱性関連情報の適切な 流通 マルウエア(不正プログラム)等の攻撃⼿法の分析、解析アーティファクト分析 各種業務を円滑に⾏うための海外関係機関との連携国際連携 インシデントの予測と捕捉インシデント予防 発⽣したインシデントへの対応 制御システムに関するインシデントハンドリング、情報収集・分析発信制御システムセキュリティ ⽇本シーサート協議会、フィッシング対策協議会の事務局運営等国内外関係者との連携 Ø マルウエアの接続先等の攻撃関連サイト等の閉 鎖等による被害最⼩化 Ø 攻撃⼿法の分析⽀援による被害可能性の確認、 拡散抑⽌ Ø 再発防⽌に向けた関係各関の情報交換及び情報 共有 インシデントハンドリング (インシデント対応調整⽀援) 情報収集・分析・発信 定点観測(TSUBAME) Ø ネットワークトラフィック情報の収集分析 Ø セキュリティ上の脅威情報の収集、分析、必要 とする組織への提供 6
  • 7. Copyright ©2017 JPCERT/CC All rights reserved.7 JPCERT/CC の主な活動
  • 8. Copyright ©2017 JPCERT/CC All rights reserved. JPCERT/CC セキュアコーディングのコンテンツ 8 www.jpcert.or.jp/securecoding/
  • 9. Copyright ©2017 JPCERT/CC All rights reserved. slideshare にも講演資料やセミナコンテンツ置いてます 9 www.slideshare.net/jpcert_securecoding/presentations
  • 10. Copyright ©2017 JPCERT/CC All rights reserved. セキュアコーディングスタンダードって? 10
  • 11. Copyright ©2017 JPCERT/CC All rights reserved. 脆弱性の数 実際の数は不明 脆弱性の共通識別⼦ (CVE) が割り振られたものは⽶国 NIST が データを提供している (2015年は6488件) 11 https://nvd.nist.gov/ の statistics から
  • 12. Copyright ©2017 JPCERT/CC All rights reserved. JVN: Japan Vulnerability Notes 12 https://jvn.jp/ http://jvndb.jvn.jp/
  • 13. Copyright ©2017 JPCERT/CC All rights reserved. セキュアなソフトウェア開発 13 セキュアデザイン 動的コード解析 セキュアな実⾏環境 静的コード解析 デザイン コーディング テスト 実⾏ セキュアコーディング スタンダード セキュアコーディング スタンダード
  • 14. Copyright ©2017 JPCERT/CC All rights reserved. プログラミング⾔語Cの問題 14 C⾔語の精神: プログラマを信頼し、やりたいことができるように ⾔語仕様には未規定、未定義、処理系定義事項が存在する ⾔語仕様の詳細を知らないプログラマが 未定義動作などの問題のあるコードを書き、 脆弱性を作り込む セキュアなコードを書くための 道しるべ・ガイドラインが必要!
  • 15. Copyright ©2017 JPCERT/CC All rights reserved. GNU coding standards https://www.gnu.org/prep/standards/ FLEX SDK coding conventions and best practices https://sourceforge.net/adobe/flexsdk/wiki/Coding%20Conventions/ Zend Framework PHP 標準コーディング規約 https://framework.zend.com/manual/2.4/en/ref/coding.standard.html 組込みソフトウェア開発向けコーディング作法ガイド[C⾔語版] https://www.ipa.go.jp/sec/publish/tn13-001.html The NetBSD source code style guide http://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style?rev=HEAD コーディングスタイル Developer’s Guide to oracle Solaris 11 Security Appendix A (Secure Coding Guidelines for Developers) https://docs.oracle.com/cd/E26502_01/html/E29016/scode-1.html などなど… JPL Institutional Coding Standard for the C Programming Language http://lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf MISRA C:2012 Guidelines for the Use of the C Language in Critical Systems コーディング規約 Google Style Guides https://github.com/google/styleguide ガイドラインって? 15 Programming Style https://en.wikipedia.org/wiki/Programming_style
  • 16. Copyright ©2017 JPCERT/CC All rights reserved.16 SEI CERT (セキュア)コーディングスタンダード集 https://www.securecoding.cert.org/
  • 17. Copyright ©2017 JPCERT/CC All rights reserved.17 CERT (セキュア)コーディングスタンダード集
  • 18. Copyright ©2017 JPCERT/CC All rights reserved. CERT コーディングスタンダード 18 セキュアなソフトウェアをつくる ためのコーディングガイドライン集 - 攻撃可能な脆弱性を作り込まない - コードの保守性向上 = プログラマが理解しやすい = 移植性向上 対象: ソフトウェア開発やメンテナンスに携わる⼈々
  • 19. Copyright ©2017 JPCERT/CC All rights reserved. - コンパイラ作者向けでなくCプログラマ向け -第⼀⽬的: 今後の開発に役⽴つガイドライン =第⼆⽬的: 既存のレガシーコードのメンテナンスに役⽴つ ガイドライン - できるだけOSや実⾏環境に依存しない = 環境依存な⽅法に⾔及する場合、おもに POSIX(Unix)およびWindowsにおけるコード例を⽰す - C99およびC11に基づく 19 CERT C コーディングスタンダード
  • 20. Copyright ©2017 JPCERT/CC All rights reserved. 開発に携わる⼈々 20 CERT Secure Coding Initiative 言語仕様関係者、コンパイラベンダ、開発者など、 多様な人々を含むコミュニティベースでの議論と開発 CMU/SEI CERT division のWikiサイト上で開発中 https://www.securecoding.cert.org/ 実際に発⾒された脆弱性を反映 商⽤ソースコード解析ツールも対応 Coverity, Fortify, Klocwork, LDRA, ... JPCERT/CC にて⽇本語版を提供 https://www.jpcert.or.jp/sc-rules/ https://www.jpcert.or.jp/java-rules/
  • 21. Copyright ©2017 JPCERT/CC All rights reserved. セキュアコーディングスタンダード⽇本語版 21
  • 22. Copyright ©2017 JPCERT/CC All rights reserved. セキュアコーディングスタンダード⽇本語版 22
  • 23. Copyright ©2017 JPCERT/CC All rights reserved. 中⾝を⾒てみよう 23
  • 24. Copyright ©2017 JPCERT/CC All rights reserved. 中⾝を⾒てみよう C コーディングスタンダード日本語版 (https://www.jpcert.or.jp/sc-rules/) •カテゴリ一覧 •ルールとレコメンデーション •各ページの構成 (説明, 違反コード, 適合コード, リスク評価, 参考情報) C コーディングスタンダード カテゴリ: 16 ガイドライン: 302 (必須118, 推奨184) 24
  • 25. Copyright ©2017 JPCERT/CC All rights reserved. 中⾝を⾒てみよう: カテゴリ⼀覧 01.プリプロセッサ(PRE) 02. 宣言と初期化(DCL) 03. 式(EXP) 04. 整数(INT) 05. 浮動小数点(FLP) 06. 配列(ARR) 07. 文字と文字列(STR) 08. メモリ管理(MEM) 09. 入出力(FIO) 10. 環境(ENV) 11. シグナル(SIG) 12. エラー処理(ERR) 13. Application Programming Interface(API) 14. 並行性(CON) 49. 雑則(MSC) 50. POSIX(POS) 内容に応じて分類 25
  • 26. Copyright ©2017 JPCERT/CC All rights reserved. ☆ レコメンデーション (推奨) ☆ ルール (必須) 中⾝を⾒てみよう: 「ルール」と「レコメンデーション」 ○ コーディング作法への違反が、攻撃可能な脆弱性を生み出す セキュリティ上の欠陥につながる可能性がある。 ○ コーディング作法へ適合しているかどうかを、自動解析、 形式的方法、手作業によるソースコード検査などを通じて 確認することができる。 https://www.jpcert.or.jp/sc-rules/00.introduction.html ○ コーディング作法を適用することで、システムのセキュリティが 高まる可能性がある。 ○ コーディング作法がルールと見なされるための要件を、一つ以上 満たすことができない。 26
  • 27. Copyright ©2017 JPCERT/CC All rights reserved. ☆ レコメンデーション (推奨) ☆ ルール (必須) 中⾝を⾒てみよう: 「ルール」と「レコメンデーション」 ○ コーディング作法への違反が、攻撃可能な脆弱性を生み出す セキュリティ上の欠陥につながる可能性がある。 ○ コーディング作法へ適合しているかどうかを、自動解析、 形式的方法、手作業によるソースコード検査などを通じて 確認することができる。 ○ コーディング作法を適用することで、システムのセキュリティが 高まる可能性がある。 ○ コーディング作法がルールと見なされるための要件を、一つ以上 満たすことができない。 セキュリティを確保するために必ず適用すべきもの ○ スタンダード準拠の必須項目 ○ 適合していることを確認できる セキュリティを向上させるガイドライン、提案 ○ スタンダード準拠には必須ではない ○ 必ずしも攻撃につながらない、適合の確認が難しい、など https://www.jpcert.or.jp/sc-rules/00.introduction.html 27
  • 28. Copyright ©2017 JPCERT/CC All rights reserved. 中⾝を⾒てみよう: 各ガイドラインの構成(1) 識別番号とタイトル 説明 違反コード 適合コード (例外) リスク評価 参考情報 カテゴリ名 番号-C 例: INT01-C, EXP32-C C スタンダードの場合、 0〜29までの番号はレコメンデーション 30以降の番号はルール 28
  • 29. Copyright ©2017 JPCERT/CC All rights reserved. 中⾝を⾒てみよう: 各ガイドラインの構成(2) 識別番号とタイトル 説明 違反コード 適合コード (例外) リスク評価 参考情報 内容の説明 「〜すべきである」「〜すべきでない」 簡単な違反コード例 違反コードの修正例や別の適切なアプローチ のコード例など このガイドラインにしたがう必要のない状況に ついての説明 29
  • 30. Copyright ©2017 JPCERT/CC All rights reserved. 中⾝を⾒てみよう: 各ガイドラインの構成(3) 識別番号とタイトル 説明 違反コード 適合コード 例外 リスク評価 参考情報 この評価値により、準拠すべき ガイドラインに優先順位をつけられる https://www.jpcert.or.jp/sc-rules/00.introduction.html 深刻度、攻撃可能性、修正コスト の観点から評価 ⾔語仕様の関連セクション、 解説記事、 関連するCWE番号など 30
  • 31. Copyright ©2017 JPCERT/CC All rights reserved. 例: MEM30-C: 解放済みメモリにアクセスしない (1/8) 算術演算のオペランドとしての逆参照または動作、型のキャスト、または代入の右手側としてのポインタ の使用を含め、動的記憶域に割り当てられていたブロックがメモリ管理関数によって解放された後、解放 されたメモリを指すポインタは評価しない。 C 標準によれば、free() または realloc() 関数の呼び出しによって解放された領域を指すポインタの値を 使用しているプログラム動作は未定義である。 (附属書 J 「未定義の動作」の 177 を参照。) 解放されたメモリを指すポインタの値を読み取ると、ポインタ値は不定であり、さらにトラップ表現の場合 があるため、未定義の動作となる。 後者の場合、それによってハードウェアトラップを引き起こす可能性 がある。 一度解放されたメモリにアクセスすると、ヒープの管理に使用されているデータ構造を壊す可能性がある。 割り当てを解除されたメモリを参照するポインタはダングリングポインタと呼ばれる。 ダングリングポイン タにアクセスすると、攻撃可能な脆弱性を引き起こす可能性がある。 メモリが解放されても、メモリの内容がそのまま残りアクセス可能な場合がある。これは、解放されたブ ロックをいつ再割り当てし再使用するかは、メモリマネージャが決定するためである。解放された位置に あるデータは有効であるかのように見えるかもしれない。しかし、このデータは予期せず変更される可能 性があり、意図しないプログラム動作を引き起こしうる。そのため、一度解放したメモリへの書き込みや、 メモリの読み取りを行わないことを保証する必要がある。 31
  • 32. Copyright ©2017 JPCERT/CC All rights reserved. 例: MEM30-C: 解放済みメモリにアクセスしない (2/8) 違反コード K & R [Kernighan 1988](邦題:『プログラミング言語C』)のこの例では、リンクリストから項目を削除する 誤った手法と正しい手法の両方を示している。 誤った手法は、p->next が参照される前に p を解放して おり、p->next はすでに解放されたメモリを読み取るため、本の中でも明白に誤りだと記されている。 for (p = head; p != NULL; p = p->next) free(p); 適合コード K & Rは正しい解決法も示している。 このエラーを修正するために、p を解放する前に p->next への参 照を q に格納している。 for (p = head; p != NULL; p = q) { q = p->next; free(p); } head = NULL; 32
  • 33. Copyright ©2017 JPCERT/CC All rights reserved. 例: MEM30-C: 解放済みメモリにアクセスしない (3/8) 違反コード 以下のコード例では、buff が解放されたあとに、buff への書き込みが行われている。 この手の脆弱性の 悪用は容易であり、脆弱なプロセスの権限で任意のコードが実行される可能性があるが、この例ほどわ かりやすいことはまれである。一般に、割り当てと解放が行われる場所は遠く離れており、問題に気付き 原因をつきとめることはむずかしい。 int main(int argc, const char *argv[]) { char *buff; buff = (char *)malloc(BUFFERSIZE); if (!buff) { /* エラー条件の処理 */ } /* ... */ free(buff); /* ... */ strncpy(buff, argv[1], BUFFERSIZE-1); } 33
  • 34. Copyright ©2017 JPCERT/CC All rights reserved. 例: MEM30-C: 解放済みメモリにアクセスしない (4/8) 適合コード 以下の解決法では、メモリが不要になってからメモリを解放している。 int main(int argc, const char *argv[]) { char *buff; buff = (char *)malloc(BUFFERSIZE); if (!buff) { /* エラー条件の処理 */ } /* ... */ strncpy(buff, argv[1], BUFFERSIZE-1); /* ... */ free(buff); } 34
  • 35. Copyright ©2017 JPCERT/CC All rights reserved. 例: MEM30-C: 解放済みメモリにアクセスしない (5/8) 違反コード libwmf バージョン 0.2.8.4 の以下のコード例 (CVE-2009-1364) では、返り値 gdRealloc (im->clip->list が 指す領域を再割り当てするシンプルなラップアラウンド realloc) は more に設定される。ただし、im->clip- >list の値は後から直接コードで使用され、C 標準では realloc が指す領域を移動した場合、元の領域は解 放されると規定されている。 攻撃者は、再割り当て (十分な im->clip->count) を強制的に実行し、解放され たメモリにアクセスすることで任意のコードを実行できる [xorl 2009]。 void gdClipSetAdd(gdImagePtr im,gdClipRectanglePtr rect) { gdClipRectanglePtr more; if (im->clip == 0) { ... } if (im->clip->count == im->clip->max) { more = gdRealloc (im->clip->list,(im->clip->max + 8) * sizeof (gdClipRectangle)); if (more == 0) return; // if the realloc fails, then we have not lost the im->clip->list value im->clip->max += 8; } im->clip->list[im->clip->count] = (*rect); im->clip->count++; 35
  • 36. Copyright ©2017 JPCERT/CC All rights reserved. 例: MEM30-C: 解放済みメモリにアクセスしない (6/8) 適合コード 適合コードでは、realloc を呼び出した後、im->clip->list を値 more に再割り当てする。 void gdClipSetAdd(gdImagePtr im,gdClipRectanglePtr rect) { gdClipRectanglePtr more; if (im->clip == 0) { ... } if (im->clip->count == im->clip->max) { more = gdRealloc (im->clip->list,(im->clip->max + 8) * sizeof (gdClipRectangle)); if (more == 0) return; im->clip->max += 8; im->clip->list = more; } im->clip->list[im->clip->count] = (*rect); im->clip->count++; 36
  • 37. Copyright ©2017 JPCERT/CC All rights reserved. 例: MEM30-C: 解放済みメモリにアクセスしない (7/8) 解放済みのメモリを読み取ると、プログラムの異常終了やサービス運用妨害(DoS)攻撃を引き 起こす可能性がある。解放済みのメモリに書き込むと、バッファオーバーフローや、脆弱なプロ セスの権限を使った任意のコード実行につながる可能性がある。 ルール 深刻度 可能性 修正コスト 優先度 レベル MEM30-C 高 高 中 P18 L1 自動検出 ツール バージョン チェッカー 説明 Compass/ROSE Coverity 6.5 USE_AFTER_FREE メモリが複数回解放されるか、または解放 されたポインタの対象に対して読み取り/書 き込みを⾏う特定の事例を検出できる。 Fortify SCA 5.0 Klocwork 9.1 UFM.DEREF.MIGHT UFM.DEREF.MUST UFM.RETURN.MIGHT UFM.RETURN.MUST UFM.USE.MIGHT UFM.USE.MUST LDRA tool suite 8.5.4 51 D 実装済み splint 3.1.1 リスク評価 37
  • 38. Copyright ©2017 JPCERT/CC All rights reserved. 例: MEM30-C: 解放済みメモリにアクセスしない (8/8) 関連するガイドライン CERT C++ Secure Coding Standard MEM30-CPP. Do not access freed memory ISO/IEC TR 24772:2013 Dangling References to Stack Frames [DCM] Dangling Reference to Heap [XYK] ISO/IEC TS 17961 (ドラフト) Accessing freed memory [accfree] MISRA-C Rule 17.6 MITRE CWE CWE-416, Use after free 参考資料 [Kernighan 1988] Section 7.8.5, "Storage Management" [OWASP Freed Memory] [Seacord 2013] Chapter 4, "Dynamic Memory Management" [Viega 2005] Section 5.2.19, "Using Freed Memory" [xorl 2009] CVE-2009-1364: LibWMF Pointer Use after free() 翻訳元 これは以下のページを翻訳したものです。 MEM30-C. Do not access freed memory (revision 122) 38
  • 39. Copyright ©2017 JPCERT/CC All rights reserved. 中⾝を⾒てみよう(Javaコーディングスタンダード) Java コーディングスタンダード日本語版 (https://www.jpcert.or.jp/sc-rules/) •カテゴリ一覧 •ルールとレコメンデーション •各ページの構成 (説明, 違反コード, 適合コード, リスク評価, 参考情報) Java コーディングスタンダード カテゴリ数: 17 ルール数: 158 (レコメンデーションは未訳) 39
  • 40. Copyright ©2017 JPCERT/CC All rights reserved. 中⾝を⾒てみよう: カテゴリ⼀覧(Javaコーディングスタンダード) 00. 入力値検査とデータの無害化(IDS) 01. 宣言と初期化(DCL) 02. 式(EXP) 03. 数値型とその操作(NUM) 04. オブジェクト指向(OBJ) 05. メソッド(MET) 06. 例外時の動作(ERR) 07. 可視性とアトミック性(VNA) 08. ロック(LCK) 09. スレッドAPI(THI) 10. スレッドプール(TPS) 11. スレッドの安全性に関する雑則(TSM) 12. 入出力(FIO) 13. シリアライズ(SER) 14. プラットフォームのセキュリティ(SEC) 15. 実行環境(ENV) 49. 雑則(MSC) 内容に応じて分類 40
  • 41. Copyright ©2017 JPCERT/CC All rights reserved. GNU Coding Standards との⽐較 41 GNU Coding Standards - GNUシステムをクリーンに、⼀貫性のある、 インストールしやすいものにするため ("to make the GNU system clean, consistent, and easy to install") - ポータブルで頑丈で⾼信頼性なプログラムを書くためのガイドにもなる ("also be read as a guide to writing portable, robust, and reliable programs") CERT C セキュアコーディングスタンダード - C を使う全ての⼈のために - 攻撃に使われるような脆弱性を作り込まないようにするためのガイドライン ポータブル、頑丈、⾼信頼性と重なる部分あり
  • 42. Copyright ©2017 JPCERT/CC All rights reserved. MISRA-C:2012 との⽐較 42 MISRA-C:2012 (Guidelines for the use of the C language in critical systems) - 組み込みや重要インフラ系システムにおけるC使⽤に関するガイドライン - 安全性、移植性、信頼性向上のため - C90およびC99に基づく CERT C セキュアコーディングスタンダード - OSや実⾏環境などを特定せずC を使う全ての⼈のために - 脆弱性をつくりこまないように → 安全性、移植性、信頼性と重なる - C99およびC11に基づく MISRA-C:2012 ルール数: 143 (義務10, 必須101, 推奨32) CERT C コーディングスタンダード カテゴリ数: 17 ルール数: 306 (必要120, 推奨186)
  • 43. Copyright ©2017 JPCERT/CC All rights reserved. ソースコード解析ツール (C) https://www.securecoding.cert.org/confluence/x/uoFuCQ 43
  • 44. Copyright ©2017 JPCERT/CC All rights reserved. ソースコード解析ツール (Java) https://www.securecoding.cert.org/confluence/x/xIJuCQ 44
  • 45. Copyright ©2017 JPCERT/CC All rights reserved. CERT C と国際標準化 ISO/IEC TS 17961 C Secure Coding Rules —CERT C コーディングスタンダードをベースに国際標準化され たセキュアコーディングルール集 ルール:検出(diagnose)されるべきコーディング — 例: “Accessing an object through a pointer to an incompatible type (other than unsigned char) shall be diagnosed” 根拠(rationale):⾔語仕様書の典拠 違反コード例 45 JTC1/SC22/WG14 - C コンパイルは通っても安全な動作が保証されな いケースをまとめた⾔語仕様書の副読本 参考: ISO/IEC TS 17961 C Secure Coding Rules (https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=140705863) 参考: Secure Coding Validation Suite (https://github.com/SEI-CERT/scvs)
  • 46. Copyright ©2017 JPCERT/CC All rights reserved. コーディングスタンダードの活⽤ 46
  • 47. Copyright ©2017 JPCERT/CC All rights reserved. セキュアコーディングスタンダードの活⽤ ●セキュアコーディングの学習に ●開発チーム内の認識共有 ●製品のセキュリティ関連仕様の明確化 47
  • 48. Copyright ©2017 JPCERT/CC All rights reserved. 活⽤: セキュアコーディングの学習資料として(1) セキュアコーディングを学ぶ教材として 使う ●「セキュアコーディングってなに?」 ●「こんなトピック知ってる?」 社内での研修や勉強会の教材に ●違反コード・適合コードでクイズ形式 48
  • 49. Copyright ©2017 JPCERT/CC All rights reserved. 活⽤: セキュアコーディングの学習資料として(2) コード解析ツールを活⽤するための補助資料 検出結果を理解するために ツールの説明よりも分かりやすく 別の観点での説明 49
  • 50. Copyright ©2017 JPCERT/CC All rights reserved. 活⽤: セキュアコーディングの学習資料として(3) コード解析ツールを活⽤するための補助資料 検出結果の対応を検討するために どのように修正すべきなの? ホントに修正すべきなの? セカンドオピニオンとして... 50
  • 51. Copyright ©2017 JPCERT/CC All rights reserved. 活⽤: 開発チーム内の認識共有(1) コーディングの良し悪しの判断基準 セキュリティ確保のための⽬標を具体化 ●「ルールXXとYYには準拠しよう! 」 セキュリティ品質向上の⼿段として活⽤ 51
  • 52. Copyright ©2017 JPCERT/CC All rights reserved. 活⽤: 開発チーム内の認識共有(2) ⾃社のコーディング規約の⼟台として ●既存の内容に不⾜がないかチェック ●命名規則やコーディングスタイルなどは独⾃に 決める必要がある 52
  • 53. Copyright ©2017 JPCERT/CC All rights reserved. 活⽤: セキュリティ仕様明確化(1) 品質チェックの具体的な項⽬の洗い出しに ⼊⼒値チェックはきちんとやってるか ⾮推奨な関数使ってないか 可搬性の問題はないか ...... 53
  • 54. Copyright ©2017 JPCERT/CC All rights reserved. 活⽤: セキュリティ仕様明確化(2) 要求仕様として提⽰ ●コーディング規約XXを遵守すること ●レベルL1のルールを遵守すること ●レベルL2までのルールを全て遵守すること など あいまいだったセキュリティ ⾯の仕様の内容について、 より明確な基準で議論できる 54
  • 55. Copyright ©2017 JPCERT/CC All rights reserved. 活⽤: セキュリティ仕様明確化(3) 実装仕様として提⽰ ●コーディング規約XXを遵守してます ●レベルL1のルールを遵守してます ●レベルL2までのルールを全て遵守してます など あいまいだったセキュリティ ⾯の仕様の内容について、 より明確な基準で議論できる 55
  • 56. Copyright ©2017 JPCERT/CC All rights reserved. まとめ 56 SEI CERT コーディングスタンダード —セキュアなソフトウェアをつくるためのコーディング ガイドライン集 —C, Java, C++, Perl, Android —解説、違反コード例、適合コード例 想定読者層: ソフトウェア開発やメンテナンスに携わ る⼈々⼀般 ⽇本語版もあるから活⽤してね! —https://www.jpcert.or.jp/sc-rules/ —https://www.jpcert.or.jp/java-rules/
  • 57. Copyright ©2017 JPCERT/CC All rights reserved. おまけ: おすすめリーディングマップ 04. 整数(INT) 07. 文字と文字列(STR) 05. 浮動小数点(FLP) 11. シグナル(SIG) 12. エラー処理(ERR) 13. (API) 50. POSIX(POS) 06. 配列(ARR) 08. メモリ管理(MEM) 基本データ型について しっかりおさえよう! 01. プリプロセッサ(PRE) 02. 宣言と初期化(DCL) 03. 式(EXP) 10. 環境(ENV) 09. 入出力(FIO) 重要なデータ構造として、 配列と動的メモリ管理を チェック! 57
  • 58. Copyright ©2017 JPCERT/CC All rights reserved. コーディングスタンダードの協⼒者募集中! CERTコーディングスタンダード⽇本語版の 整備に協⼒してくれる⽅を求めています。 —Java, Android, C, C++, …… —既存の⽇本語へのコメント、改善案 —英語原⽂へのコメント、改善案 —さらに編集も… 58
  • 59. Copyright ©2017 JPCERT/CC All rights reserved. 関連リソース 59 CERT C コーディングスタンダード (https://www.jpcert.or.jp/sc-rules/) Java コーディングスタンダード CERT/Oracle 版 (https://www.jpcert.or.jp/sc-rules/) CERT Secure Coding Standards (https://www.securecoding.cert.org/) CERT/CC Secure Coding (https://www.cert.org/secure-coding/)
  • 60. Copyright ©2017 JPCERT/CC All rights reserved. 関連リソース 【改訂版】組込みソフトウェア開発向けコーディング作法ガイド[C言語版] (http://www.seshop.com/product/detail/7950/) MISRA-C:2004 ガイドブック (http://www.sessame.jp/workinggroup/WorkingGroup3/MISRA-C_GuigeBook2004.htm) 組込み現場の「C」プログラミング標準コーディングガイドライン (http://gihyo.jp/book/2007/978-4-7741-3254-9) 60
  • 61. Copyright ©2017 JPCERT/CC All rights reserved. セキュアコーディングに関するお問合せ、インシデント対応のご依頼は 61 JPCERTコーディネーションセンター ̶Tel:03-3518-4600 ̶https://www.jpcert.or.jp/ セキュアコーディングに関するお問い合わせ ̶Email:secure-coding@jpcert.or.jp ̶https://www.jpcert.or.jp/securecoding/ インシデントの報告 ̶Email:info@jpcert.or.jp ̶https://www.jpcert.or.jp/form/