情報セキュリティ

基本情報技術者試験OSコマンドインジェクション」の問題

情報セキュリティ情報セキュリティ難易度:hard
あるWebアプリは、利用者が入力したホスト名に対してサーバ上でネットワーク疎通確認コマンドを実行し、その結果を画面に表示する。入力値をコマンド文字列に連結してシェル経由で実行しているため、特定の記号を含む入力でサーバ上の任意コマンドが実行される脆弱性が指摘された。根本対策として、最も適切なものはどれか。
コマンド名と各引数を分けて起動する方式に改め、入力値はシェルを通さず引数としてのみ渡す。
実行結果を画面に出す処理を見直し、エラー時にはその表示を省いて外部に漏れる情報量を減らす。
コマンドを動かすサーバのCPUとメモリを増強し、処理性能と余裕を確保するようにする。
利用者がホスト名を入力できる時間帯を業務時間内のみに限り、それ以外は受付を停止する。
正解
コマンド名と各引数を分けて起動する方式に改め、入力値はシェルを通さず引数としてのみ渡す。

脆弱性の原因は、入力をコマンド文字列に連結しシェル経由で実行するため、セミコロンやパイプ等の記号がコマンドの区切りとして解釈される点にある。コマンド名と各引数を分けて起動し、入力値はシェルを通さず引数の一つとしてのみ渡せば、記号は単なるデータとして扱われ別コマンドの実行が成立しなくなる。これがOSコマンドインジェクションの根本対策である。

?選択肢ごとの解説

イ ○脆弱性の原因は、入力をコマンド文字列に連結しシェル経由で実行するため、セミコロンやパイプ等の記号がコマンドの区切りとして解釈される点にある。コマンド名と各引数を分けて起動し、入力値はシェルを通さず引数の一つとしてのみ渡せば、記号は単なるデータとして扱われ別コマンドの実行が成立しなくなる。これがOSコマンドインジェクションの根本対策である。
ア ×結果表示の省略は得られる情報を減らすだけで、入力がコマンドとして実行される動作そのものは残るため脆弱性は解消しない。
ウ ×CPUやメモリの増強は処理性能の話であり、任意コマンドが実行される注入脆弱性とは無関係である。
エ ×入力可能な時間帯の限定は攻撃機会を多少狭めるだけで、その時間内であれば注入は成立するため根本対策にならない。

くわしく

OSコマンドインジェクションもSQLインジェクション同様『データと命令の混同』が本質である。最も確実なのは外部コマンド呼出しでシェルを経由させず、コマンド名と引数を構造的に分離するAPIを用いること、あるいはそもそも外部コマンドに頼らず言語標準の機能で代替することである。

本番での押さえどころ

試験のコツ

『入力をコマンド文字列に連結しシェルで実行』はOSコマンドインジェクション。対策はシェルを介さない引数分離(または外部コマンドを使わない)。

覚え方

SQLは値を箱に、OSコマンドも『引数を箱に分けて渡す』。混ぜて文字列にしない。

よくある誤り

表示制御や運用制限で防げると考えがちだが、入力がコマンドとして解釈される構造を断たない限り任意コマンド実行は止まらない。

情報セキュリティの他の問題

この問題を、AIの8-ways解説つきで。

基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。

無料ではじめる →

ukamiru 過去問 · 基本情報技術者試験 · fe-b-sec-0102

【基本情報技術者試験】OSコマンドインジェクションの問題 — 解答・解説|ukamiru 過去問