Perl Perl_2
Perl 「 モジュール 」 CGI.pm ファイルアップロード 実用的なコード 00 (0x10d)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x10d 回。
CGI.pm で、実用的なファイルアップロードの処理を確認する。その 00 回。Perl コマンドスイッチ「 -T 」と、ファイルに対する「 setuid 」「 setgid 」の設定について。
実用的なファイルアップロードの処理
実用的なファイルアップロードの処理とは、(0x10a) で確認した基本的な処理に、入力文字列の「 汚染チェック 」や、エラー処理を追加したものです。
Cgi upload - perlmeme.org を引き続き参照して、そのコードと動作を確認します。
プログラム冒頭
実用的なコードの冒頭部分を確認します。
#!/usr/bin/perl -T
use strict;
use warnings;
use CGI;
# 本番で削除する
use CGI::Carp qw(fatalsToBrowser);
# アップロードファイルの最大サイズを 100k に設定
$CGI::POST_MAX = 1024 * 100;
# ファイル保存のためのサブルーチンを呼び出し
# 関数プロトタイプに $ ( スカラコンテキスト ) を 1 つ指定。
sub save_file($);
この中から、今回は、コマンドスイッチ「 -T 」を確認します。
Perl コマンドスイッチ「 -T 」
プログラム冒頭から、僕にとっては未知の機能が登場します。それは、シェバン ( shebang ) 行 ( (0xba) で確認 ) に指定された、コマンドスイッチ「 -T 」です。
#!/usr/bin/perl -T
コマンドスイッチ「 -T 」は、perlrun "Perl インタプリタの起動方法" - perldoc.jp に解説がありました。コマンドスイッチ「 -T 」は、「 汚染チェックをオンにしてテスト出来る様にする 」と言います。
「 通常このチェックは setuid や setgid のスクリプトを実行するときに行う 」と言う訳です。
setuid と setgid
「 setuid 」と「 setgid 」は、(0x10b) と (0x10c) で確認した、UNIX 系システムのファイル ( ディレクトリ ) に対するパーミッション ( 許可 ) フラグの 1 種です。
「 setuid 」は、ファイルの所有者 ( user クラス) でないユーザに対して、ファイルの所有者として実行する特権を与える特殊な実行許可フラグです。
setuid がセットされたファイルのパーミッションをコマンド ls -l で確認すると、次の様になっています。所有者クラスの実行権限が「 x 」ではなく「 s 」になっていることが確認出来ます。
-rwsr-xr-x
「 setgid 」は、ファイルのグループユーザではないユーザに対して、グループユーザ ( group クラス ) として実行する特権を与えます。
setgid がセットされたファイルのパーミッションは次の様になっています。グループクラスの実行権限が「 x 」ではなく「 s 」になっていることが確認出来ます。
-r-xr-sr-x
通常 setuid/setgid は、必要に応じる形で一般ユーザに特権を与えるために利用されますが、その機能は、悪意あるプロセスを、特権下で実行させる危険も孕みます。
Note: ディレクトリに対する setuid/setgid の設定は、ファイルに対するものとやや挙動が異なる ( setuid の設定をディレクトリ配下のファイルに継承する等 )。
Memo: setuid は、コマンド chmod 4000 で、setgid はコマンド chmod 2000 で設定可能。同時に設定する場合は、 chmod 6000 で設定する。
Memo: 実行権限のないファイルに対して setuid/setgid を付与すると、設定のエラーを意味する大文字の「 S 」が設定される。前もって通常の実行権限を付与してから setuid/setgid を付与すると正常な設定を意味する小文字の「 s 」が設定される。
Ref: Secure Programming for Linux and Unix HOWTO - linuxjf.sourceforge.jp
スイッチ「 -T 」と setuid/setgid
前述の通り setuid/setgid は、ファイルの実行に際して、便利な機能を提供する反面、大きな危険を孕みますが、Perl のコマンドスイッチ「 -T 」は、seuid/setgid を含む権限でファイルが実行された際、自動的に「 汚染モード 」( taint mode ) と呼ばれるセキュリティチェックを開始する機能を提供します。
「 汚染モード 」のセキュリティチェックが有効になるのは、次の ID でファイルが実行された場合です。
異なる実ユーザ ID
異なる実行ユーザ ID
異なる実グループ ID
異なる実行グループ ID
setuid/setgid が設定されていなくとも、例えば、サーバプログラムや CGI スクリプトの様な、「 他の誰か 」が実行するプログラムには、コマンドスイッチ「 -T 」を設定することが強く推奨されています。「 他の誰か 」に対しては常に疑いを持たなければいけません。
ですから、今回確認している、ファイルアップロードのための "実用的な" Perl CGI プログラムには、コマンドスイッチ「 -T 」を設定している訳です。
Note: 「 疑い 」そのものは悪いことではない。
コマンドスイッチ「 -T 」および、「 汚染モード 」のセキュリティチェックの詳細は、以下を参照してください。
perlsec "Perl のセキュリティ" - perldoc.jp
0x10d -> 0x10e へ
コマンドスイッチ「 -T 」の具体的な動作については、これから理解を深めます。次回は、「 CGI::Carp 」を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)