情報処理安全確保支援士過去問題 令和4年春期 午後Ⅰ 問2

⇄問題文と設問を画面2分割で開く⇱問題PDF

出題趣旨

IoT機器の普及に伴い,利用者が専門知識なしに容易に機器を設置できるようになる中,開発者がセキュリティを考慮していなかったり,利用者が脆弱性修正プログラムを適用していなかったりするケースが増えている。本問では,ルータやNASを題材として,IoT機器のインターネット接続に使われる技術,仕組みを理解するとともに,脆弱性を作り込んでしまうことの多いWeb機能についてセキュリティの観点から正しく実装する能力を問う。

設問1

    • a: ア
    • b: エ
    • 外部からLAN側への通信の許可設定が変更される。
    • PCからのファイル操作ではアクセスできない領域のファイルが暗号化されたから
  • aについて〕
    問題文では「Z社のDNSサーバの設定でホスト名nas-aに割り当てているIPアドレスを変更するためにaレコードを更新する」とあります。ホスト名からIPアドレスを引く処理を正引きといい、このときDNSサーバは「ホスト名とIPアドレスの対応関係」を記録したレコードを参照します。IPv4アドレスとの対応を記録するレコードをAレコードと呼びます。例えば、ホスト名 nas-a.z-sha.co.jp をIPアドレス 192.168.0.1 に対応付ける場合、DNSサーバには
    nas-a.z-sha.co.jp. IN A 192.168.0.1
    という形でAレコードが登録されます。したがって空欄aのリソースレコード名には「A」が入ります。

    a=ア:A

    bについて〕
    問題文では「そのレコードのbは300秒に設定されていた」とあります。DNSには、負荷軽減を目的として、DNSクエリの結果をサーバ上で一時的に保持するDNSキャッシュの仕組みがあります。このキャッシュの有効期限を設定するのが、TTL(Time to Live)です。TTLは秒単位でAレコードやNSレコードに対して設定します。以下は300秒に設定した例です。
    nas-a.z-sha.co.jp. 300 IN A 192.168.0.1
    したがって、空欄bには「TTL」が入ります。

    b=エ:TTL

    なお、MXはそのドメインのメールサーバを指定するレコード、TXTは任意のテキストを登録するためのレコードです(SPF、DKIMその他様々な用途に使用されます)。

  • 本文と表の記載内容を確認します。NAS-AにはUPnP設定要求機能があります。UPnP機能は、本来はインターネット側から直接アクセスできないLAN内の機器が、自分に必要なポート開放や転送設定をルータに要請することで、外部との通信を行えるようにするものです。表1の設定内容では、外部からのHTTPS通信(Web操作機能、Web管理機能用)をNAS-Aに転送するように依頼しています。

    表2では、ルータ-AのUPnP機能はLAN側のみ有効であり、LAN側の機器から受け付けた要求に基づいて、ポートフォワーディングとファイアウォール機能の設定を変更する仕様とわかります。WAN側については「本機能を有効にできない仕様」とされており、インターネット側からUPnP設定要求を送られても受け付けない設定内容です。

    ここで、もし設問の条件のようにWAN側でもUPnP機能を有効にできる仕様だった場合を考えます。表1の注1)にもあるとおり、UPnPは認証なしでリクエストを受け付けるプロトコルのため、インターネット上の攻撃者は、UPnP機能を悪用し、ルータ-Aのポートフォワーディング設定やファイアウォール設定を自由に変更することができます。これにより、管理者の意図しないポートが開放され、外部からLAN側への通信が許されてしまう結果となります。

    したがって、ルータ-AがWAN側からのUPnP要求を受け付ける場合のセキュリティリスクとしては、「外部からLAN側への通信の許可設定が変更される」と解答するのが適切です。

    ∴外部からLAN側への通信の許可設定が変更される。

  • 本問では、ランサムウェアによりNAS-A上のデータが暗号化されています。

    表1から、A社のPCからNAS-A上のファイルにアクセスする方法として、ファイル共有機能と操作機能であることがわかります。もしA社のPCがランサムウェアに感染していた場合でも、NAS-Aに対して行えるのは、これらの機能を通じたファイル操作に限られます。その場合、PCからアクセス可能な領域のファイルは暗号化できますが、PCからはそもそもアクセスできない領域のファイルを直接暗号化することはできません。

    しかし、K氏の調査結果には「ファイル共有機能でもWeb操作機能でもアクセスできない/rootディレクトリ配下のファイルも暗号化されていた」とあります。/root配下はNAS-A上のOSから直接アクセスする領域であり、A社のPCから通常のファイル共有やWeb操作で触れることはできません。その領域のファイルまで暗号化されていたということは、暗号化処理がNAS-A内部で実行されていたと考えるのが妥当です。

    ∴PCからのファイル操作ではアクセスできない領域のファイルが暗号化されたから

設問2

    • c: パストラバーサル
    • d: OSコマンドインジェクション
    • e: ア
    • f: ウ
    • g: イ
  • cについて〕
    図2の脆弱性1では、本来は認証が必要なファイルに対して、意図しないディレクトリ経由で不正アクセスできてしまう点が問題になっています。本文では「URLに"..%2f"を使用した攻撃手法である」と述べられており、この文字列が手口の核心です。

    URLの中では、一部の文字はそのまま記述できず、%記号と16進数で表現します。これはパーセントエンコーディングと呼ばれる仕組みです。ここで出てくる%2fは、スラッシュ/に相当します。したがって、問題文にある
    http://192.168.0.1/images/..%2fstatus.cgi
    というURLは、デコードすると
    http://192.168.0.1/images/../status.cgi
    と同じ意味になります。

    ファイルパスにおいて../は一つ上のディレクトリを表します。つまり、上記のパスは最終的に
    http://192.168.0.1/status.cgi
    と同じ場所を指すことになります。本来、/status.cgiは認証が必要なディレクトリ配下にあり、直接アクセスさせてはいけません。しかし、この仕組みでは/imagesを除外リストに入れて認証なしアクセスを許可している一方で、その配下のパスの正規化が不十分なため、/images/../status.cgiという形で/imagesディレクトリを経由することで、その外側にあるstatus.cgiに認証なしで到達できてしまいます。

    このように../などを用いてパスをたどり、本来アクセスできないディレクトリやファイルに不正アクセスする攻撃手法をパストラバーサル(ディレクトリトラバーサル)といいます。図2の脆弱性1は、このパストラバーサルを許してしまっている実装上の問題です。

    c=パストラバーサル

  • dについて〕
    図2の脆弱性2では、NAS-AのWeb管理機能にあるping用のCGIに対して、HTTPリクエストのパラメータaddrで指定した文字列をそのままpingコマンドの引数として渡しています。本来はIPアドレスだけが入ることを想定していますが、本文の例ではaddr=127.0.0.1;whoamiという値が指定されています。127.0.0.1;whoamiの部分が攻撃者はWeb管理機能のフォームに入力した文字列です。

    シェルでは、セミコロン;はコマンドの区切りとして扱われます。このため、addrの値がそのままシェルに渡されると、次の2つのコマンドが実行されます。(whoamiは現在の実行ユーザー名を表示するコマンドです。)
    ping 127.0.0.1
    whoami
    この例から、攻撃者はping.cgiの入力値に任意のOSコマンドを付け足して、実行させられることがわかります。このように、本来想定していない文字列を入力パラメータに混入させることで、サーバ側で任意のOSコマンドを不正に実行させる攻撃を「OSコマンドインジェクション」と呼びます。

    d=OSコマンドインジェクション

  • efgについて〕
    パストラバーサル対策として、処理e、f、gに何を行わせるべきかを答えます。

    脆弱性1では、URL中に含まれる..%2fが除外リストをすり抜けてしまったことが原因で、相対パスによるディレクトリ移動が行われました。これを防ぐには、実際にアクセスしようとするパスを確定したうえで除外リストとの比較を行う必要があります。

    具体的には次の手順となります。
    1. まずURLデコードを行って..%2f../に変換し、パスとして評価できるようにします(空欄e)。
    2. その相対パス記法を解釈して、/images/../status.cgi/status.cgiのように、相対パス記法を含まない形にパス名を正規化します(空欄f)。
    3. そのうえで、正規化後の最終的なパスと除外リストとを比較します(空欄g)。
    この手順に従えば、実際にアクセスしようとしているのが/status.cgiであり、除外リストに含まれないため認証が必要であると正しく判断できます。

    e=ア:URLデコード
     f=ウ:パスの正規化
     g=イ:除外リストとの比較

設問3

    • POSTメソッドで送信したボディがアクセスログに残っていなかったから
    • sudoコマンドの設定ファイルで,tarコマンドのオプションを受け付けないように設定する。
  • 本文中では「GETメソッドを使用して実行されたOSコマンドの内容は分かったが,POSTメソッドを使用して実行されたOSコマンドの内容は分からなかった」とあります。GETとPOSTではパラメータの受渡し方法に違いがあります。
    GET
    ○○.php?mode=new&uid=34632847 というようにURLの後ろに付加して送信される
    POST
    パラメータはHTTPリクエストのメッセージボディ部に格納された状態で送信される
    一般的なWebサーバのアクセスログには、メソッドとパスなどを含むリクエスト行は記録されますが、リクエストボディの中身までは記録されません。表3のアクセスログでも、shell.cgiへのリクエストのうちPOSTメソッドの分に関しては、shell.cgiについてはパラメータが記録されていません。このため、shell.cgiにどのようなパラメータが渡され、どのOSコマンドが実行されたのかを、アクセスログだけから特定することはできません。

    ∴POSTメソッドで送信したボディがアクセスログに残っていなかったから

  • sudoコマンドは一般ユーザーに一時的に管理者権限を与え、指定されたコマンドをroot権限で実行させるための仕組みです(sudo:superuser-do)。その設定は/etc/sudoersに記述します。本文中では設定ファイルの内容として以下の一文があります。
    www ALL=NOPASSWD: /bin/tar
    これは、ユーザーwwwがパスワード無しでtarコマンドをroot権限で実行できる権限が付与されていることを示します。

    製品Xでは、このtarコマンドに任意のOSコマンドを実行できるオプションが存在することが問題になっています。図5にあるように、tarに対してcheckpoint系のオプションを指定すると、そのチェックポイントのタイミングでexecに指定したコマンド(例ではwhoami)が実行されます。sudo経由でroot権限のtarを実行できる状態でこのオプションを使われると、攻撃者にroot権限で任意コマンドを実行されてしまいます。

    一方で、本文には「ファームウェアのアップデート時にこのオプションは使用していない」とあります。つまり、製品Xの正規の処理ではこの危険なオプションを使う必要がなく、禁止しても運用に支障が出ないと判断できます。したがって、sudoの設定ファイルで、tarコマンドを実行する際に危険なオプションを受け付けないようにすれば、業務に支障を与えずに、攻撃を防ぐことができます。具体的には、引数を限定したり、!演算子で権限の引き算をしたりします。
    //引数なしに限定
    www ALL=NOPASSWD: /bin/tar ""
    //--checkpointを含むsudoを禁止
    www ALL=NOPASSWD: /bin/tar, !/bin/tar *--checkpoint*
    ∴sudoコマンドの設定ファイルで,tarコマンドのオプションを受け付けないように設定する。

設問4

    • h: ・noindex
      ・none
hについて〕
HTMLのmetaタグでは、name属性にrobotsを指定すると、検索エンジンのクローラに対してそのページをどのように扱うかを指示できます。指示内容はcontent属性にキーワードとして記述します。

robots指定でよく使われる値として、次のようなものがあります。
  • noindex - 検索エンジンのインデックスに登録させない。検索結果に表示させないために指定する
  • nofollow - ページ内のリンク先URLをたどらせない。リンク先を評価対象に含めないために指定する
  • none - noindex + nofollow
本問の目的である「インターネットの検索エンジンで検索されないようにする」ためには、noindex又はnoneの指定が適切です(noindex,nofollowでも可)。具体的にはHTMLのheadタグ内に以下のmetaタグを含めることで対策します。
<meta name="robots" content="noindex">
又は
<meta name="robots" content="none">
したがって、空欄gには「noindex」又は「none」が当てはまります。

h=noindex 又は none

Pagetop