e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第85回 「PL/SQLソースコードの不明瞭化」

2014.02.06

こんにちは。インストラクターの蓑島です。

寒い日が続きますね。昨日は東京でも雪が降りました。
最近は極端な気候ですが体調に気を配り、風邪などひかぬように気を付けましょう。

さて、今回はタイトルにあるように、「PL/SQLソースコードの不明瞭化」について解説します。
この機能はプロシージャや、ファンクション、パッケージなどのストアドプログラムのソースコードを不明瞭にして判読不能とするものです。ソースコードが判読できなくなるのでプログラム内の処理を第三者に隠しておきたいときに便利です。
セキュリティの向上に役立つわけですね。

ではその具体的な方法ですが、二つの方法があります。
一つは、DBMS_DDLパッケージを使う方法であり、もう一つはOSのコマンドラインからWRAPユーティリティを使う方法です。
今回は簡単な方法ということで、後者のWRAPユーティリティをご紹介します。

では、実際に操作しながら説明しましょう。

まず、データベースサーバーマシンに直接ログインします。私の手元にある環境はLinuxサーバなのですが、Windowsのサーバーでも操作は同じです。
そして、プロシージャやファンクションなどのCREATE文をテキストファイルに用意します。

例えば、今回、PROC85という名前のプロシージャのCREATE OR REPLACE文を input.sql というファイルに記述しました。
以下はinput.sqlファイルの中身です。

1
2
3
4
5
6
CREATE OR REPLACE PROCEDURE PROC85
IS
BEGIN
   DBMS_OUTPUT.PUT_LINE( 'こんにちは。今日は寒いですね' );
END ;
/

このように「こんにちは。今日は寒いですね」というメッセージを画面表示するプロシージャです。

ここで大事なことは、実際にこのファイル(input.sql)を実行して正常にコンパイルされてプロシージャが作成できることを確認しておいてください。
例えばSQL*Plusのコマンドラインから「@input.sql」と実行します。

1
2
3
4
5
SQL> show user
ユーザーは "SCOTT" です。
SQL> @input.sql
 
プロシージャが作成されました。

もしも、コンパイルエラーがあれば「show errors」でエラーを確認し、修正して必ず正しくコンパイルされるようにしておいてください。

では正しくコンパイルできることを確認したら、次にこのファイルをWRAPユーティリティの入力にして、不明瞭化されたCREATE文をテキストファイルに出力します。今回はoutput.sqlという名前のファイルに出力したいと思います。
以下のようにOSのコマンドラインから実行します。SQL*Plusではなく、OSのコマンドラインから実行します。

1
wrap iname=input.sql oname= output .plb

これにより、「Processing input.sql to output.sql」というメッセージが表示されればinput.sqlファイルをもとにoutput.sqlファイルが生成されたわけです。

wrapユーティリティのパラメータですが、もうお分かりのように、入力ファイルを指定するパラメータが「iname」であり、出力ファイルを指定するパラメータが「oname」です。ここでonameパラメータの指定は省略できるのですが、その場合は inameで指定したファイル名の拡張子が「.plb」という名前で出力されます。ですから今回の場合であれば、onameを省略すると、input.plbというファイル名で出力されます。
なお、パラメータ指定の「=」の前後に空白があるとエラーとなりますので注意してください。

ではこのoutput.sqlファイルの中身を確認します。以下のような内容です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE OR REPLACE PROCEDURE PROC85 wrapped
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
65 ae
90a14as7r9Gqp77sXNjrOP87wr8wg5nnm7+fMr2ywFznpsJWWb561r5ucVUAc1OOjnFuz9aG
c4SE4eaE0qlXGcbrclyEc1KGXcYutyx44j9oU6VShpLGsi6un78AE7yOhT9FPyWG1KfG8Nks
eP/PaFMrTOvs2T1ylez7pjjW1ZE=
 
/

このように、最初の「CREATE OR REPLACE PROCEDURE PROC85」までは普通に読めますが、その後ろに「wrapped」というキーワードがあり、それより後ろの部分は人間には判読できない文字の羅列となっています。

ではこのように不明瞭化されたCREATE文が用意できたら最後にSQL*Plusのコマンドラインなどからこのファイルを実際に読み込んでプロシージャを不明瞭化されたソースコードでコンパイルします。

1
2
3
4
5
SQL> show user
ユーザーは "SCOTT" です。
SQL> @ output .sql
 
プロシージャが作成されました。

これでPROC85という名前のプロシージャが不明瞭化されたソースコードでコンパイルされたわけです。不明瞭化されたソースコードであってもコンパイルした結果は普通のソースコードでコンパイルした場合とまったく同じです。
では実際に実行してみましょう。

1
2
3
4
5
SQL> set serveroutput on      -- 画面表示を有効にして
SQL> exec proc85              -- 実行する
こんにちは。今日は寒いですね      -- メッセージが表示される
 
PL/SQLプロシージャが正常に完了しました。

ご覧のようにソースコードが不明瞭化されていても正しく実行できましたね。

では、データベースに格納されたソースコードを確認してみましょう。
以下はデータディクショナリを問い合わせてPROC85プロシージャのソースコードを確認している様子です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SQL> SELECT TEXT FROM USER_SOURCE                    -- データディクショナリを問い合わす
   WHERE NAME = 'PROC85' AND TYPE = 'PROCEDURE'
   ORDER BY LINE
   4  /
 
TEXT               -- 以下はPROC85プロシージャのソースコード(不明瞭化されている)
--------------------------------------------------------------------------------
PROCEDURE PROC85 wrapped
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
65 ae
90a14as7r9Gqp77sXNjrOP87wr8wg5nnm7+fMr2ywFznpsJWWb561r5ucVUAc1OOjnFuz9aG
c4SE4eaE0qlXGcbrclyEc1KGXcYutyx44j9oU6VShpLGsi6un78AE7yOhT9FPyWG1KfG8Nks
eP/PaFMrTOvs2T1ylez7pjjW1ZE=

このようにデータベースに格納されたソースコードが不明瞭化されていることがわかります。これによりプログラムの内容を他者に知られることがなくなるわけですね。

一般的にはソースコードの不明瞭化はパッケージ本体で行うことが多いといえます。
パッケージはパッケージ仕様とパッケージ本体の二つでワンセットですが、利用者(ユーザー)にとって必要なインターフェイスの情報は仕様にあり、実行に必要なプログラムロジックは本体にあります。本体を不明瞭化することで、ユーザが知る必要のないプログラムロジックを隠蔽することができるわけです。
(バックナンバー 第28回 「パッケージ化の意味と作成構文」を参照)

もちろん、上記のようにプロシージャでも、そしてファンクションでも不明瞭化できますが、データベーストリガーは不明瞭化できないので注意してください。もしデータベーストリガーの処理を隠蔽したければ、トリガーの処理をプロシージャに配置して、そのプロシージャを不明瞭化することで対応できます。

また不明瞭化したソースコードを直接修正することはできなので、修正する場合はもとの不明瞭化されていないソースコードを修正して、再度、不明瞭化する必要があります。したがって、もとのソースコードのファイルは失くさないように管理する必要があります。

WRAPユーティリティの不明瞭化はセキュリティ的に万全とは言えない場合もあります。不明瞭化されたソースコード内に判読可能な重要な記述が残っていないことも確認するようにしてください。

いかがですか?とても簡単にソースコードを不明瞭化できますね。

それでは今回はここまでにいたします。また次回、ご期待ください。

先頭へ戻る