2024年05月09日
【第22回】具体的な記述例が見えない脆弱性
静的解析/コンパイラ技術
前回まで、具体的なソースプログラム例を確認したのは6つの脆弱性タイプでした。黄色の部分です。
今回はそれ以外の脆弱性について、見てみます。
CWEサイトにはどのような説明があるか、ごく簡単にまとめました。気になる箇所についてはぜひCWEサイトの情報を確認してください。
CWE-20(入力データに対する不適切な検証)
説明では、外から与えられたデータのチェックが不十分であるため、例えば値の上限チェックがあるのに下限のチェックが漏れているため、想定外のマイナスデータを取り込んで処理してしまう例が書かれています。
CWE-22(パス トラバーサル)
説明では、外から与えられたファイル名の検証が不十分であるため、ファイル名に相対パス(../等)や絶対パスが含まれると、想定外のファイルをアクセスされてしまう例が書かれています。
CWE-77(コマンド インジェクション)、CWE-78(OSコマンド インジェクション)
説明では、外から与えられたファイル名の検証が不十分なときに想定外のコマンドを発行してしまう例が書かれています。たとえば、’a.txt’ というファイル名であれば、cat a.txt という内容表示コマンドを発行するだけであっても、’a.txt ; rm -r *’ というファイル名を入力してしまうと、cat a.txt ; rm -r * というコマンドを発行し、配下のファイルをすべて削除してしまうというようなことです。
CWE-79(クロスサイト スクリプティング)
説明では、外から与えられたパラメタを埋め込んで表示するwebアプリで、パラメタの内容検証が不十分であるとき、パラメタに埋め込まれたスクリプトを実行してしまうという例が書かれています。
CWE-89(SQL インジェクション)
説明では、外から与えられたパラメタを使用するSQLクエリで、パラメタの内容検証が不十分であるとき、パラメタ内に仕込まれた別のクエリを発行させられてしまう例が書かれています。
CWE-94(コード インジェクション)
説明では、外から与えられたパラメタを使用するPHPやPerlで、パラメタの内容検証が不十分であるとき、パラメタ内に仕込まれた別のコードを実行してしまう例が書かれています。
CWE-200(権限のないアクセスへの機密情報の開示)
説明では、アカウント名とパスワードを求める処理が、アカウント名が無い時とパスワードが違う時に異なるメッセージを出すことで、攻撃者はアカウントの存在を知ることができると書かれています。防御のためには同じメッセージを出すべきであると。
CWE-269(不適切な権限管理)
説明では、ある処理を行うために動作権限を一時的に上げ、直後に権限を元に戻しても、その処理中に例外がスローされた場合には権限を戻す処理が動作しない例が書かれています。
CWE-276(デフォルト権限設定の誤り)
具体例はありませんが、一般的に、インストール中にディレクトリ、ファイル、またはその他のオブジェクトに意図しないアクセス許可を設定することがあるとしています。
CWE-287(不適切な認証)
説明では、Cookieによるログイン状況の判定と認証後のタスク実行等について、攻撃者がCookieを設定することにより認証を回避することができる例が書かれています。
CWE-295(不適切な認証評価)
説明では、OpenSSLによる証明書の内容確認について、有効性および使用方法の誤りに関する例が書かれています。
CWE-306(重要な機能に対する認証漏れ)
説明では、権限の確認をせずに本来権限が必要な処理(銀行口座を作成する等)を行う例が書かれています。
CWE-352(CSRF)
説明では、ユーザから送られてきたリクエストの検証が不十分であるために、Webサーバが正規リクエストとして処理してしまう例が書かれています。
CWE-362(共有リソースを使用した不適切な同期による同時実行)
説明では、pthread_mutex_lock()の戻り値チェック漏れのために、エラーリターン時にも共有リソースをアクセスしてしまう例が書かれています。
CWE-400(無制限のリソース消費)
説明では、回数上限のないfork()発行、ファイル出力、データ受信、等の例が書かれています。
CWE-426(信頼できない検索パス)
説明では、プログラムが発行するコマンドがフルパス指定ではないために、攻撃者が用意した偽のフォルダの同名コマンドを実行させられる例が書かれています。
CWE-434(危険なタイプのファイルの無制限アップロード)
説明では、写真をアップロードするWebアプリ・サーバーがファイルタイプのチェックをせずに .phpファイルをアップロードさせ、URL指定により直接コマンド実行できるようになる例が書かれています。
CWE-502(信頼できないデータのデシリアライズ)
説明では、内容の検証をせずにファイルからオブジェクトへのデシリアライズを行うことで発生する問題の例が書かれています。
CWE-522(認証情報の保護が不十分)
説明では、ユーザ名やパスワードを生データや既知の圧縮アルゴリズムで保存することにより秘匿性が損なわれる例が書かれています。
CWE-611(XML外部エンティティ参照の不適切な制限)
具体例はありませんが、一般的には、XMLエンティティの定義が可能なDTD(ドキュメントタイプ定義)を含むXMLドキュメントを使用し、処理アプリケーションにローカルファイルの内容を読み取らせることができる等の説明があります。
CWE-732(重要なリソースに対する不適切なアクセス許可割り当て)
説明では、ファイル生成時のumask(0)指定によりパーミッション制限の設定が不十分になってしまう例が書かれています。
CWE-772(有効期間後のリソース解放漏れ)
説明では、エラー発生時のファイルハンドルクローズ漏れの例をあげており、ファイルハンドル不足に陥る可能性について書かれています。
CWE-798(ハードコードされた認証情報の使用)
説明では、ハードコーディングされたパスワードはコードアクセスできる人にもアクセスできること、配布後の変更が困難である等の例が書かれています。
CWE-862(権限のチェック漏れ)
説明では、チェック漏れによる不当なSQLクエリ送信、非認証相手へのメッセージ送信等の例が書かれています。
CWE-863(権限チェックの誤り)
説明では、Cookieの保存値による認証承認管理を行っていると、攻撃者がCookie値を設定することにより、認証を回避できる例が書かれています。
CWE-918(SSRF)
脆弱性の具体例をマッピングするための抽象化レベルであり、具体例はありません。一般的には、公開サーバを経由して非公開の内部サーバを攻撃する手法に関する脆弱性を指すと考えられます。
これらの脆弱性について、CWEサイトにはC言語プログラム以外の例による説明も多いのですが、参考になる情報はあります。例えばこのようなことです。
・多くの場合、外部から与えられた情報の検証不足によって脆弱性が作られる。
・上限値はチェックしても下限値をチェックせず、特に想定外のマイナス値を見逃している。
・丁寧なメッセージが、逆に攻撃者にヒントを与えてしまう。
・うまく対策しているようでも、異常時のルートでは対策処理を通過しないことがある。
次回は、これらのことを含めて、ルールチェッカーや静的解析ツールにできそうなことを考えます。
筆者紹介
浅野 昌尚(あさの まさなお)
ガイオ・テクノロジー株式会社
開発1部 QTXグループ
1980年代から30年以上にわたり汎用構造のCコンパイラ開発に従事し、その間に8ビットマイコンからRISC・VLIW・画像処理プロセッサまで、さまざまなCPU向けのクロスCコンパイラを開発。