文書番号 40486 最終更新日 2004-06-03 公開区分 一般公開 文書タイプ PROBLEM
製品名(バージョン)[コンポーネント] Oracle Server - Enterprise Edition (8.1 - 8.1) [その他のデータベース管理]
Oracle Server - Enterprise Edition (9.0.1 - 9.0.1) [その他のデータベース管理]
Oracle Server - Enterprise Edition (8.0 - 8.0) [その他のデータベース管理]
プラットフォーム(バージョン) すべてのプラットフォーム ( - )
関連文書  
概要 外部プロシージャにおける潜在的なセキュリティに関する脆弱性
内容:
外部プロシージャにおける潜在的なセキュリティに関する脆弱性

製品概要
~~~~~~~~
外部プロシージャは動的リンク・ライブラリに格納されているルーチンを意味します。
例えば、Oracle の PL/SQL パッケージは実行時にライブラリを動的にロードし、
このルーチンを PL/SQL のサブプログラムであるかのようにコールすることができます。

Oracle の「Typical」もしくは「Minimal」インストールの場合、
「Custom」インストールで最小構成にご設定いただいた場合にも
外部プロシージャが使用可能な環境となります。
しかし、実際に使用するには外部プロシージャを実行可能にするための
設定が必要となります(《関連文書》: KROWN 14244 外部プロシージャの設定方法)。


問題
~~~~
外部プロシージャエージェントは権限に関係なくライブラリをロードすることが可能です。
このためリモートホストから権限のないユーザが、TCP プロトコルアドレスで構成された
外部プロシージャ用のリスナーを利用して Oracle サーバやサーバが稼動しているマシン
に対して不正にアクセスする可能性があります。


対象リリース
~~~~~~~~~~~~~
問題が発生するリリース  :Oracle Database (8.0、8.1、9.0.1)
 (Oracle e-Business Suite Release 11iのOracle Databaseを含む)
問題を修正したリリース  :Oracle9i Database Release2(9.2) 
問題を修正したPSR       :なし 


影響のあるプラットフォーム
~~~~~~~~~~~~~~~~~~~~~~~~
全プラットフォーム (Unix、Linux、Windows)


回避策
~~~~~~
[外部プロシージャを使用していない場合]

   1. 以下のファイルに icache_extrpoc、PLSExtproc、extproc のエントリが存在する場合、
      削除してください。

      - tnsnames.ora
      - listener.ora

      通常上記ファイルは環境変数 TNS_ADMIN で指定したディレクトリや $ORACLE_HOME/network/admin
      以下にあります。しかし、OS やOracleリリース毎に位置が異なることがあります。
      詳細は下記 KROWNをご参照ください。

     《関連文書》
      KROWN 17265 tnsnames.ora sqlnet.ora listener.ora の使用される(読み込まれる)順序はどうなっていますか。
      KROWN 17407 ローカルバージョンの TNSNAMES.ORA SQLNET.ORA について


   2. 実行モジュール extproc を削除します。

      % cd $ORACLE_HOME/bin
      % rm -i extproc  または  % mv extproc extproc.backup 


[外部プロシージャを使用している場合]

   1. リスナーをデータベース接続用、外部プロシージャ接続用に2つ作成します。

   ◆ プロトコルが IPC の場合

      a) データベース接続用のリスナーには extproc の記述は含めません。
         外部プロシージャ用には IPC プロトコルアドレスの記述のみ含めます。

         (例)

        【DB 接続用リスナー】

         LISTENER =
	     (ADDRESS_LIST =
	        (ADDRESS = (PROTOCOL = TCP)(HOST = <host name>)(PORT = XXXX))
	     )

         SID_LIST_LISTENER =
	     (SID_LIST =
	        (SID_DESC =
	           (ORACLE_HOME = <$ORACLE_HOME>) 
                   (SID_NAME = <$ORACLE_SID>)
	        )
	      )

        【外部プロシージャ用リスナー】

         LIS_EXT =
             (ADDRESS_LIST =
                (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
             )

         SID_LIST_LIS_EXT =
             (SID_LIST =
                (SID_DESC =
                   (SID_NAME = PLSExtProc)
                   (ORACLE_HOME = <$ORACLE_HOME>)
                   (PROGRAM = extproc)
                )
              )


    ◆ プロトコルが TCP の場合

      a) データベース接続用リスナー、外部プロシージャ用リスナーで
         それぞれ別のポート番号を使用します。

        (例)

       【DB 接続用リスナー】

        LISTENER =
            (ADDRESS_LIST =
               (ADDRESS = (PROTOCOL = TCP)(HOST = <host name>)(PORT = 1111))
            )

        SID_LIST_LISTENER = ... 

       【外部プロシージャ用リスナー】

        LIS_EXT =
           (ADDRESS_LIST =
	      (ADDRESS = (PROTOCOL = TCP)(HOST = <host name>)(PORT = 2222)) 
           )                                                         ~~~~
                                                                      別のポート番号を使用します。
        SID_LIST_LIS_EXT = ...

      b) 外部プロシージャ用に作成したリスナーは権限の低い OS ユーザにて起動します。
         例えば、UNIX の場合は nobody 等、Windows の場合は「Logon as a service」権限を
         付与したユーザで起動します。Windows の場合の起動方法は下記 KROWN をご参照ください。

        《関連文書》
         KROWN 40569 Windows NT にて外部プロシージャ(extproc)用の
                     Listenerサービスを権限の低いユーザで起動する方法  

      c) 外部プロシージャ用リスナーは、特定のホストからのみアクセスが可能となるように、
         以下の設定をします。この設定は、マシン固有の IP アドレスによってネットワーク
         クライアントから Oracle サーバープロセスへのアクセスを許すか、あるいは拒否
         するかを判断するものです。Oracle のリリースにより設定するファイルが異なります。
  
         Oracle 9i                 : sqlnet.ora
         Oracle 8i 以前のバージョン : protocol.ora

         * Oracle 8.1.5、Oracle 8.1.6.1 は、.protocol.ora になります。

         設定するパラメータ
         tcp.validnode_checking = YES
         tcp.invited_nodes = {list of IP addresses}

         アクセス制限は、外部プロシージャ用のリスナーに対してのみ行ないます。
         外部プロシージャ用の listener.ora と protocol.ora (sqlnet.ora) は、
         データベース接続用のリスナーとは別のディレクトリに作成し、
         そのディレクトリを TNS_ADMIN に設定して起動します。
         外部プロシージャは Oracle で使用される場合にはローカルのサーバから
         のみ起動されますので、ローカルサーバのみアクセスを許可するよう指定します。 

         (例)

        【DB 接続用リスナー】

         TNS_ADMIN = $ORACLE_HOME/network/admin
         - listener.ora

        【外部プロシージャ用リスナー】

         TNS_ADMIN = $ORACLE_HOME/network/admin_ext
         - listener.ora
         - sqlnet.ora  ... (*)


         (*) の sqlnet.ora に以下の記述を加えます。
      
         tcp.validnode_checking = YES
         tcp.invited_nodes = (list of IP addresses)
                              ~~~~~~~~~~~~~~~~~~~~
                              Oracle サーバの稼動しているマシンの IP アドレス

         * Windows NT の場合は別ディレクトリの listener.ora を使用して
            リスナーを起動する方法が異なりますので下記 KROWN をご参照ください。
         
        《関連文書》
         KROWN 28650 特定のクライアントからの接続を許可または拒否する方法について
         KROWN 18661 protocol.ora のパラメータが有効になりません。
         KROWN 40579 Windows NT にて 別ディレクトリの listener.ora を使用して
                     Listener を起動する方法


   2. listener.ora の OS レベルでの権限を 640 または 644 とします。

      * listener.ora を一般 OS ユーザーに書き換えられないようにしても、 
         リスナーにパスワードを設定していなければ、リモートから任意の
         listener.ora をリロードされる可能性があります。
         リスナーのパスワード設定方法は、以下の KROWN をご参照ください。

     《関連文書》
      Krown 23456 リスナーを別のマシンから停止させない方法 


   3. パッケージやライブラリの作成権限をもつデータベースユーザアカウントのパスワードが
      Oracleソフトウェア初期導入時のデフォルト値であれば変更します。
      また、データベース内で使用されていないユーザアカウントはロックするか期限切れとします。



文章中の KROWN 情報は弊社サポートのホームページにて確認できます。
ご利用方法は以下の通りです。

 アドレス: http://support.oracle.co.jp

 1.技術情報(一般公開版)より「ORACLE 製品FAQ 」を選択します。
 2.キーワードに文書番号を入力します(例:「17265」)。
 3.「検索開始」を選択します。
 4.検索された文書を選択します。



[更新履歴]
2004/06/03 文書管理情報を更新
2003/08/13 9.2で修正されていることを追加しました(対象リリース)
2002/07/26 誤字を修正しました。
2002/07/12 誤字を修正しました。
2002/06/06 影響のある製品に EBS を追加しました。 
2002/03/11 外部プロシージャは「Typical」でない場合(例:「Custom」で最小構成とした場合)
           にもコンポーネントに依存せず、使用可能となることを追記しました。
2002/02/25 誤字を修正しました。
2002/02/18 Windows NT 固有の設定に関する KROWN を追加しました。(KROWN#40569、40579)
2002/02/15 公開区分をサポート契約なしに変更しました。
2002/02/14 公開区分をサポート契約ありに変更しました。