BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース CWE/SANS プログラミングエラー トップ25

CWE/SANS プログラミングエラー トップ25

原文(投稿日:2010/03/19)へのリンク

アメリカ国土安全保障省の後援のもと戦略的に行われた、共通脆弱性列挙(CWE)プロジェクトは 2010年版 CWE/SANS もっとも危険なプログラムエラートップ 25 (PDF)を刊行した。これは、著者達の意見での、最悪のソフトウェア脆弱性を招く、25のコードエラー一覧表である。

InfoQに示されたOWASPトップ10リストは、Webアプリケーションのセキュリティリスクに焦点をあてていたが、 CWE 上位25は、有名な バッファーオーバーラン脆弱性を含む、幅広い問題をカバーしている。CWEは、また、プログラマーが安全なソースコードを書くために必要な、より詳細な点も提供している。

このリストは、 SANS InstituteMITRE, と “アメリカとヨーロッパの多数のトップクラスのソフトウェアセキュリティの専門家たち”の共同作業の結果である。CWEウェブサイトは、800以上のプログラミング、設計、アーキテクチャーのエラーのカタログを持つが、CWE文書は、まず最初に、プログラマーがより安全なソースコードを書くのを手助けする事を強調した、上位25項目に限っている。 しかし この文書はまた、 発生しうる脆弱性や適切な措置を取ることを知るべきである、ソフトウェアデザイナー、アーキテクト、CIO達さえにとっても利用することができる。

CWEによると、クロスサイトスクリプティング(XSS)とSQL インジェクションがソフトウェアの最脆弱点であり、バッファーオーバーフローが第3位であると考えられる。

順位 名称
1 Web ページ構造の保全障害 ('クロスサイト スクリプティング')
2 SQL コマンド中の、特別な要素の不適切なサニタイズ ('SQL インジェクション')
3 入力サイズチェックなしでのバッファーコピー ('古典的バッファーオーバーフロー')
4 クロスサイト・リクエスト・フォージェリ(CSRF)
5 不適当なアクセスコントロール (権限)
6 セキュリティ決定での信頼できない入力に対する依存
7 制限されたディレクトリへのパス名の不適当な規制('パス トラバーサル')
8 危険な型のファイルの無制限なアップロード
9 OS コマンド中の、特別な要素の不適切なサニタイズ ('OSコマンド インジェクション ')
10 極秘データ暗号化ミス
11 ハードコードされた認証証明書の使用
12 不正確なサイズでのバッファーアクセス
13 PHPプログラムのInclude/Require文のファイル名の不適当なコントロール ('PHP File Inclusion')
14 配列添え字の間違った妥当性確認
15 通常ではない、あるいは、例外条件の不適切なチェック。
16 エラーメッセージによる情報の露呈
17 整数オーバーフローや丸め
18 不正確なバッファーサイズ計算
19 重大な機能に対する認証の欠落
20 整合性チェックなしのファイルダウンロードk
21 クリティカルなリソースへの不正確な許可割り当て
22 制限や絞り無しのリソース割り当て
23 信頼できないサイトへのURLリダイレクション ('オープン リダイレクト')
24 破られたあるいは危険な暗号化アルゴリズム使用
25 競合条件

著者たちはこのリストが固定的ではなく、独自の判断基準に基づき、各組織が固有のリストを作成することを推奨する。この資料は多くの “焦点をあてる側面”を示しており、そのうちの一つが、 “プログラミング言語による脆弱性”である。

C/C++ Java PHP Perl CWE Entry
CWE-22:制限されたディレクトリへのパス名の不適当な規制 ('パス トラバーサル')
  言語に依存しないが、サンドボックス環境では流行を少なくできる。
CWE-78: OS コマンド中の、特別な要素の不適切なサニタイズ ('OS コマンドインジェクション')
CWE-79:Webページ構造保存失敗 ('クロスサイトスクリプティング')
CWE-89: SQL コマンド中の、特別な要素の不適切なサニタイズ ('SQL インジェクション')
      CWE-98:PHPプログラムのInclude/Require文のファイル名の不適当なコントロール ('PHP File Inclusion')
  技術的にはこの型の問題は大部分のインタープリ―タ型言語で発生しうるが、PHPで最も顕著に発生しているようである。
CWE-120: 入力サイズチェックなしでのバッファーコピー ('古典的バッファーオーバーフロー')
  インタープリ―タと、しばしばC/C++で作成されたネイティブコードのインターフェースでは、"安全."と思えるのとは別の方法で 高水準言語機構からバッファーオーバーフローが発生するかもしれない
CWE-129: 配列添え字の間違った妥当性確認
  技術的には多くの言語で発生しうるが、C/C++プログラムでは、ほとんどの場合セキュリティ関連問題となる。
CWE-131: バッファーサイズ計算の不正確さ
  簡単なバッファーオーバーフロー除去としてはうまくいくが、インタープリ―タと、しばしばC/C++で作成されたネイティブコードのインターフェースでは、"安全."と思えるのとは別の方法で 高水準言語機構からバッファーオーバーフローが発生するかもしれない
CWE-190:整数のオーバーフローや丸め
  技術的には多くの言語で発生しうるが、C/C++プログラムでは、ほとんどの場合セキュリティ関連問題となる
CWE-209: エラーメッセージからの情報露呈
  言語に依らないが、Web ベース環境で、エラーレポートが自動的に外部に出される言語では頻繁に発生
CWE-285: 不適当なアクセス制御(権限)
CWE-306:重大な機能に対する認証の欠落
  Webベース環境で蔓延
CWE-311:極秘データ暗号化ミス
CWE-327:破られたあるいは危険な暗号化アルゴリズム使用
  ある言語では、暗号化が備わってなかったり、確立したライブラリィがないので、開発者は自分自身で作成したり、統合が必要な状況におかれる。
CWE-352: クロスサイト・リクエスト・フォージェリ(CSRF)
  言語非依存でWebベースの問題
CWE-362: 競合条件
  スレッドや、OSの資源とやり取り行う機構をもついかなる言語においても発生しうる潜在的な問題。
CWE-434: 危険な型のファイルの無制限なアップロード
CWE-494: 整合性検査なしのコードダウンロード
  自分自身をアップグレードするいかなるソフトウェアには潜在的に起こりうるが、モバイルのコードで最も頻繁にあてはまる
CWE-601:信頼できないサイトへのURLリダイレクション ('オープンリダイレクト')
  言語非依存でWebベースの問題。多くのWeb アプリケーションはリダイレクト機能を使用しない。
CWE-732: 重要なリソースへの不適当なアクセス許可割り当て。
CWE-754: 通常ではない、あるいは、例外条件の不適切なチェック
  例外発生の処理を強制する言語では流行が少ない。
CWE-770制限や絞り無しのリソース割り当て
  リソースマネジメントが備わっている環境では問題となることがすくない。
CWE-798:ハードコードされた認証証明書の使用
      CWE-805:正しくない長さでのバッファーアクセス
  インタープリ―タと、しばしばC/C++で作成されたネイティブコードのインターフェースでは、"安全."と思えるのとは別のコードで、バッファーオーバーフローが発生するかもしれない
CWE-807セキュリティ決定での信頼できない入力に対する依存
  言語に依らないが、Webアプリケーションで流行している。

各脆弱性に対して、著者たちは、順位付け、スコアサマリー、防御軽減コスト、関連する攻撃パターン、攻撃頻度、容易な検知法、修復コストやその他情報など、種々の情報を提供する。この文書の大部分は、技術的な詳細、コードサンプルと アーキテクチャ、デザイン、実装、運用の各レベルで行うべき防御策を含む、各脆弱性の詳細な記述に費やしている。 例えば、リスト中の#1の脆弱性については、著者から以下の抜粋が提供されている。

Web ページ構造の保全障害 ('クロスサイトスクリプティング') - “ソフトウエアが、ユーザーが制御できる入力を、他のユーザーにサービスしているサーバーのWebページとして、アウトプットに含める前に、十分に 検証、フィルター、除去、エンコードしない。”

脆弱性 蔓延度 結果 コード実行、セキュリティ対策の迂回
修正費用 安価 検知の容易さ 容易
攻撃頻度 頻繁 攻撃者の自覚 高い

3つの主要なタイプのクロスサイトスクリプティング(XSS)である、繰返し型 XSS (非永続的)、蓄積型XSS (永続的)とDOM-Based XSSを含めて技術的詳細を詳しく述べている。

コードサンプル, このJSP例の様な

<% String eid = request.getParameter("eid"); %>

...

Employee ID: <%= eid %>

自動化された静的解析や、ブラックボックステストの様な検出方法

各脆弱点について、著者たちはいくつかの防止対策をあげている。その一つはこの様なものである。

データが使用されるであろうコンテキストや想定通りにエンコードされる事を理解しなさい。これは、異なったコンポーネント間でのデータ転送時や、Webページやマルチパートメッセージの様に、同時に多重のエンコーディングを含むアウトプットを生成する時には、特に重要である。 全ての想定されるコミュニケーションプロトコルや、要求されるエンコーディング方式が決定するデータ表現を調査しなさい。

他のWeb ページに出力されるいかなるデータ、特に外部入力からのいかなるデータについては、全ての非英数字文字に適切なエンコーディングを用いなさい。

同じアウトプットドキュメントの部分でも、以下のようなアウトプットの何処にあるかによリ、異なったエンコーディングを必要とするかもしれない.

HTML ボディ

要素属性( src="XYZ"の様な)

URI

JavaScript セクション

CSSとスタイル属性

等々。HTML要素属性エンコーディングは、HTMLボディにとってのみ適切である事に注意しなさい。

必要なエンコーディングやエスケープのタイプの詳細については、クロスサイトスクリプト(XSS)防御クイックリファレンスシート[REF-16]を参考にしなさい。

The 2010年版 CWE/SANS最も危険なプログラミングエラー上位25リスト は、上位25の脆弱性を選んだ際の判断基準を、2009年に作成された同じリストや、 OWASP 2010トップ10候補, Web アプリケーションセキュリティ脆弱性トップ10リストと、比較して詳しく述べている。

この記事に星をつける

おすすめ度
スタイル

BT