文書番号 44298 最終更新日 2002-10-10 公開区分 一般公開 文書タイプ PROBLEM
製品名(バージョン)[コンポーネント] Oracle Server - Enterprise Edition (9.0.1.0 - 9.0.1.3) [RDBMS]
プラットフォーム(バージョン) すべてのプラットフォーム ( - )
関連文書 39237  
概要 ANSI結合構文を使用すると権限のない表を閲覧できる問題
内容:
問題
~~~~
ANSI結合構文を使用すると、ユーザがSELECT権限を持っていない表の内容を閲覧すること
ができてしまいます。

影響のある製品
~~~~~~~~~~~~~~
Oracle9i Database Release 1 (9.0.1)

影響のあるリリース
~~~~~~~~~~~~~~~~~~
リリース 9.0.1.0 - 9.0.1.2 (すべてのプラットフォーム)
リリース 9.0.1.3 (HP OpenVMS Alpha 以外のすべてのプラットフォーム)
(Oracle8iまでのリリースではANSI結合構文はサポートされていないため、この問題は発
生しません。)


修正されたリリース
~~~~~~~~~~~~~~~~~~
PSR 9.0.1.4 で修正されています。
(HP OpenVMS Alpha のみ PSR 9.0.1.3 にて修正済みです。)

影響のあるプラットフォーム
~~~~~~~~~~~~~~~~~~~~~~~~~~
全てのプラットフォーム

原因
~~~~
Oracle9iより導入されたANSI結合の不具合により発生しています。
SELECT権限を与えられていない表に対するアクセスは ORA-00942 のエラーが発生して失
敗するのが正常な動作ですが、この不具合により、ANSI結合を使用している場合にはエラ
ーが発生することなく、権限のない任意の表に対するアクセスが可能となります。

回避策
~~~~~~
回避策はみつかっておりません。

対処
~~~~
以下のプラットフォーム/リリースでパッチのご提供をしております。
http://support.oracle.co.jp/rdbms/bug2121935.html よりダウンロードして適用してく
ださい。

  SUN Solaris 32bit     R9.0.1.3
  SUN Solaris 64bit     R9.0.1.3
  HP OpenVMS Alpha  R9.0.1.0
  HP Tru64 UNIX     R9.0.1.3
  HP-UX 11.0/11i 64bit  R9.0.1.3
  IBM RS6000 AIX 64bit  R9.0.1.3
  Intel Linux           R9.0.1.3
  Windows NT for Intel  R9.0.1.3

誠に申し訳ありませんが、HP OpenVMS Alpha を除き Oracle9i の R9.0.1.3 以外の
リリース(すなわち、R9.0.1.0 - 9.0.1.2)でのパッチ提供の予定はございません。お手
数ですが、PSR9.0.1.3 を適用の上、本パッチを適用してください。


PSR 9.0.1.4 適用後の注意事項
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
本問題は PSR 9.0.1.4 にて修正されていますが、PSR 適用前に既にこの問題を
含むビューが作成されていた場合、修正を有効にするためには問題のあるビューを
再コンパイルしていただく必要があります。

つきましては、PSR 9.0.1.4 適用後に、以下の手順を実行してください。
(9.0.1.3 に対するパッチの適用後にも、同等の手順を実行していただく必要が
ございます)

1. ANSI結合構文を使用したビューをSYSユーザでリコンパイルします。
   以下が実行スクリプトです。

        ----------スクリプト開始----------
        connect / as sysdba
        set echo on
        set serveroutput on

        DECLARE
          v_target1 varchar2(32767);
          v_target2 varchar2(32767);
          v_target3 varchar2(32767);
          cursor1   integer;
          ret       integer;
          cursor check_cursor is select owner, view_name, text from dba_views;
        BEGIN
          for cur in check_cursor LOOP
            v_target1 := substrb (cur.text, 1, 32767);
            v_target2 := substrb (cur.text, 32765, 32767);
            v_target3 := substrb (cur.text, 65529, 32767);
            if instrb(upper(v_target1),'JOIN')>0 or
               instrb(upper(v_target2),'JOIN')>0 or
               instrb(upper(v_target3),'JOIN')>0 then
              BEGIN
                cursor1 := dbms_sql.open_cursor;
                dbms_sql.parse (cursor1, 'alter view ' || cur.owner || '.' ||
                                cur.view_name || ' compile', dbms_sql.NATIVE);
                ret := dbms_sql.execute(cursor1);
                dbms_sql.close_cursor(cursor1);
                dbms_output.put_line ('Processed ' || cur.owner || '.' || cur.view_name);
              EXCEPTION
                when others then
                  dbms_output.put_line ('Manual recompile required for ' || cur.owner ||
                                        '.' || cur.view_name);
              END;
            end if;
          end loop;
        END;
        /
        ----------スクリプト終了----------

2. 上記のスクリプトを実行して「Manual recompile required」と表示されたビューは
   権限情報や依存オブジェクトの問題により正常にコンパイルできなかったビューです。
   必要に応じてビューのオーナーで手動コンパイルを行ってください。

        alter view <ビュー名> compile;

   本不具合により権限を持たない表に対して作成されていたビューは、ビュー・オーナー
   による手動コンパイルもエラーになります。手動コンパイルがエラーになった場合は
   権限を確認してください。


参考資料
~~~~~~~~
ANSI結合構文についてはマニュアル『Oracle9i SQLリファレンス リリース1(9.0.1)』
(J04117-01) p.17-4「SELECT」の節、特に p.17-16 'joined_table' の説明をご参照くだ
さい。


KROWN#39237 ではこの構文の使用例をご紹介しております。


良くある質問とその回答
~~~~~~~~~~~~~~~~~~~~~~
Q. どのようなSQLを記述するとSELECTできないはずのデータがSELECTできるのでしょうか。
   具体的な再現方法を教えて下さい。
A. セキュリティの問題ですので、弊社から再現方法をご案内差し上げるのは遠慮させて
   頂いております。何卒ご了承下さい。


更新履歴
~~~~~~~~
2002/10/10 「PSR 9.0.1.4 適用後の注意事項」を追加
2002/09/25 PSR 9.0.1.4にて 「修正予定」 -> 「修正」 に変更
2002/05/29 HP OpenVMS Alpha での PSR での修正を確認したので追記。
2002/04/26 Windows NT for Intel でのパッチが提供可能になったので追記。
2002/04/23 HP OpenVMS Alpha でのパッチが提供可能になったので追記。一般公開。
2002/04/19 6プラットフォームでのパッチが提供可能になったのでURL追記。