ネット・セキュリティとサンタさん

ミクシィの[イノベーション・センター](https://www.facebook.com/mixiinnovationcenter)で社内新規事業インキュベーション、そして[人事部](https://www.facebook.com/mixihr)で新卒採用支援をやっている[もりもと](https://about.me/morimoto)です。こんにちは。
この投稿は[mixiグループ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/mixi)の23日目の記事です。

[Advent Calendar](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%88%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC)はクリスマスにちなんだ企画です。せっかくですから、ミッションスクールに12年通った私としては、今日はクリスマス寄せで書きます。

* * *

コンピュータ・ネットワークといえば、いまやセキュリティの知識と対策は切り離せません。
大勢のみなさんのプライバシーをお預かりするSNS mixiを開発・運営しているミクシィでは、これは一層もちろんのこと。「__本物そっくりのmixi.jpを擬似攻撃してやっつけちゃえ!__」というWeb脆弱性攻略体験イベント[Scrap Challenge](http://alpha.mixi.co.jp/entry/2015/07/14/110538)も、毎年シーズンを重ね、すでにかれこれ11回開催しているぐらいです。
もちろん来年度もやるよ! __ALL YOUR MIXI ARE BELONG TO US!__

# 1. おおらかな時代

とはいえ、Web技術が世に出てきた1990年代前半は、ネットワークとセキュリティの組み合わせの重要性、いやそもそもの必要性、通信路の暗号化や改竄防止なども、まだ周知や認識が薄い時代でした。

例えば、ネットワーク越しのログインを実現するtelnetは、ログイン時のユーザ名とパスワードのやりとりも含め、サーバ・クライアント間で平文で情報をやりとりしていました。
同様に、ネットワーク越しのログインやファイルコピーといった、リモートでの各種操作を実現するBSD由来のrloginコマンド一族 (rlogin, rcp, rsh) も通信路は平文のままでした。
当然ながらftpもそうでした。
21世紀の現在すっかり普及したsshは、1995年に最初の実装が提供されたものの、その後クローズドなソフトウェアになったり、そこから枝分かれしたフリーソフトウェア版ともプロトコルや機能のせめぎあいの時期があったりで、誰でも自由に満足して使えるOpenSSH 2.0でsshの普及が加速したのは2000年を迎えてからでした。


サーバとなるホストやソフトウェアを投入したら、セキュリティに留意した設定をしなきゃダメだよ、
いや「サーバマシン」とか言わず、そもそもネットワークにあなたのコンピュータを接続した時点で、ネットセキュリティは大事なんだよ。
そんなことすら当時は誰もあまりピンと来ておらず、ピンと来ていないぐらいですから、いまここにあるホストのどこが弱点で、何を直すべきかすら、みんなサッパリでした。

そんな状況に、こりゃまずいと、「現状把握→対応」の見える化に向けて手を動かしたハッカーがふたりいました。当時Silicon Graphics, Inc.にいた[Dan Farmer](https://en.wikipedia.org/wiki/Dan_Farmer)と、IBMのThomas J. Watson研究所にいた[Wietse Venema博士](https://en.wikipedia.org/wiki/Wietse_Venema)です。

# 2. お巡りが来た!

Dan Farmerは、まだパーデュー大学にいた1989年に、UNIX系ホストのセキュリティ設定の弱いところを自動チェックする脆弱性検出ソフトウェアを書いています。名前を[Computer Oracle and Password System](https://github.com/zenfish/cops)といいます。略称COPS.

COPSは、どんな脆弱性を検出してくれるんでしょう?
[README](https://github.com/zenfish/cops/blob/master/README.1)からWhat is COPS?のところを簡単に抜粋します。原文は結構ゆるい感じで書いてあり、なるべくその雰囲気を壊さず訳してみます。

> UNIXセキュリティで問題ありそうないろんな所に突っ込みを入れるプログラムが1ダースほど入ってる。これがCOPSの肝だ (実際には1ダースよりちょびっと多いけど、ダースって言っちゃったほうがなんか感じいいよね)。
> COPSに内蔵されてるプログラムがチェックしてくれるのは、こんなところかな (実際にはもうちょいやってくれるけど、これ以下ってことはないかな)。
> 
> * ファイルやディレクトリ、デバイスのパーミッションとモード
> * ぬるいパスワード
> * /etc/password と /etc/group の中身とフォーマット、セキュリティ
> * /etc/rc* とcron(tab)ファイルで実行されるプログラムとファイル
> * rootにSUIDされたファイルがあるかどうか、その書き込み許可、そしてそれらがshell scriptであるか否か
> * 重要なバイナリやキーとなるファイルをCRCチェックし、変更があれば報告
> * ユーザのホームディレクトリと起動ファイル (.profileとか.cshrcとか) の書き込み許可チェック
> * anonymous ftpの設定
> * 制限かかってないtftp, 何かデコードしようとするsendmailのalias, 言われたとおりにSUIDなファイルを作っちゃうお気楽uudecodeコマンド, inetd.confに隠されたシェル・スクリプト, 同じくinetd.confから呼び出されるrexd
> * いろんなroot関連チェック. サーチパスにカレント・ディレクトリが入ってないか、/etc/host.equiv に + が入ってないか, 無制限のNFSマウント, /etc/ftpusersにrootが入ってるか, など
> * CERTアドバイザリの日付と、システム上のファイルとのチェック。CERTから出てるいろんなバグやセキュリティ・ホール報告の日付と、関連するシステム上のファイルの日付とを比較する。日付比較だけでバグの有無が確実に分かるわけじゃもちろんないけど、アドバイザリのどれを見るべきか、どのファイルをどう更新すべきかのヒントにはなるよね。もちろん当たり前だが、チェックが通ったからって、システムに穴がないってわけじゃない。単にアドバイザリが出た後に、別の理由でファイルが更新されただけかも知れないし (単にtouchした、とかね)
> * ルールセットに基いて、乗っ取られてる可能性を調べるKuangエキスパート・システム

localhostに対する脆弱性スキャンとはいえ、当時としてはいろいろ調べてくれようとしたんだなぁと思います。と同時に、anon ftp, tftpとかuuencode, rexdとか、セキュリティ的にのどかだった時代のコマンドやデーモンにも時代を感じます。

ところで、こいつのネーミングですが、フルネームだと
「計算機 予言・パスワードシステム」
さっぱり、腹落ちしない名前ですね。おそらく、先にCOPS (やべぇ、お巡りだ!) の略称を思いついちゃって、あとづけで単語の並びを考えたのでしょう。よくあることです。

* * *

そんな、まだのどかだった90年代初頭ですが、ユーザや管理者のスキルや意識以前に、OS側の守るための機能もまだまだでした。たとえば、TCP/IPネットワークにおいて、何らかのアクセスのsource ipを見てallow/denyを行う機構は極めて当たり前のものですが (ip spoofingに対する有効さは一旦おきます)、このような「基本のキ」にあたる防御機構が備わっていないサーバプログラムも数々ありました。このような機構は、個々のdaemonに対して実装していってもいいのですが、それぞれの開発コスト・更新導入コスト・運用コストを考えると面倒です。この手の問題は、どこかのレイヤで一網打尽、ワンストップで解決したいですよね。
まさにそれを行ってくれる __tcp wrapper__ を書いたのが、オランダの大学で物理学、数学、そしてコンピュータサイエンスをやっていたWietse Venema博士です。安全性・運用性・拡張性, いずれも優れるオープンソースMTA (メールサーバ・ソフトウェア) である __Postfixを書いた人__ と言ったほうが通りがよいかも知れません。

Dan FarmerがCOPSを書いたのが1989年、Wietse Venemaがtcp wrapperを書いたのが1990年。
コンピュータ・セキュリティに対する良きツールをほぼ同時期に開発した両者にどのようなシンクロニシティが生じたのかわかりませんが、その後ふたりは、ネットワーク脆弱性に対する自動検出スキャナを共同開発します。[Security Administrator Tool for Analyzing Networks](https://en.wikipedia.org/wiki/Security_Administrator_Tool_for_Analyzing_Networks), 略称 __SATAN__ です。

# 3. 悪魔が来たりて

SATANは、ネットワーク上のホストに対して脆弱性検査を行ってくれるフリーソフトウェアでした。
http://www.porcupine.org/satan/

また、当時としては割とモダンな造りのソフトウェアでした。
(当時)新進気鋭のスクリプト言語Perlで書かれており、さらに、そのユーザインタフェースはCGIとして実装され、 __なんとWebブラウザから操作__ できました。SATANをインストールしたホストに対して、Lynxや、GUI端末が使えるならNCSA Mosaic (最近流行りの高機能W3ブラウザNetscape Navigatorを使うのもオシャレかもしれませんね!) でアクセスし、擬似攻撃対象、おっと、というか、調査対象のホストを指定すれば、既知のセキュリティ・ホールをチェックするスクリプト群が相手に対してネットワーク経由でスキャンを開始し、その結果と対処方法がブラウザ画面に表示されたのです。

SATANがチェックしていたのはこんな脆弱性です。

* 任意のホストに公開されっぱなしのNFS
* portmapper経由で公開されてるNFS
* 任意のホストからアクセスできちゃうNIS/YPパスワード
* 古いsendmailの稼働
* 任意のホストからアクセスできちゃうrexd
* アクセス・コントロールされてないXサーバ
* 任意のファイルにアクセスできちゃうtftpd
* 任意のホストから動かせるリモート・シェル
* 書き込み可能なままのanonymous ftpホーム・ディレクトリ

* * *

COPSと同じく、もちろんSATANも、先に略称を思いついちゃって、後から、こんどは割とノリノリで単語をつなげたのでしょう。あるあるですね。

SATANは、そのコンセプトの斬新さ、しかしどちらかと言えば、その「諸刃の剣」、善と悪を併せ持つ位置づけの是非を、雑誌や新聞で採り上げられました。
それまでのクラッキング・ツールは、良かれ悪しかれ、高度な知識を持つものにしか扱えない代物でした。しかしSATANは、インストールさえしてあれば、ホスト名を記入してクリックしかできないような坊やにさえイタズラを開始可能なのです。いわゆるscript kiddy (スクリプト小僧) は大喜びです。
脆弱性を検知するツールは、悪用すればそのままクラッカー向けツールになります。__おまけに名前がサタン(悪魔)です__。黒みがかったユーモアは優れたハッカーの特質のひとつですが、誰にでも洒落が通じるわけではありません。SATANは, 米国司法省から安全への脅威であると見做されました。そしてついに、[Dan Farmerは勤務先をクビ](http://www.apnewsarchive.com/1995/Designer-of-Satan-Software-Gets-New-Job/id-fc57bd48d1ff215be9b289cf4a9a0395
)にまでなってしまいました。

これが当時のSATANのアイコンです。なんだかこわいですね!
![satan.gif](https://qiita-image-store.s3.amazonaws.com/0/36428/530937be-c626-73d7-3fb6-2ee291b78a7c.gif)

# 4. 悔い改めよ!

さらに地元の新聞に「神を冒涜する恐ろしいプログラムSATAN」という記事が掲載されるに及んで、DanとWietseは1995年3月、SATANのソースコード群に、 __あるスクリプト__ を追加しました。

```lang:perl
:
#
# Change SATAN to SANTA.  Do this *before* you type make...
#
# version 1, Fri Mar 24  2:25:29 1995, last mod by zen
#

# if we see an md5 file, we'll assume they have already done a make...
if test -f bin/md5 ; then
	echo Run this before doing a \"make\", or run \"make clean\" and then run it...
	exit 1
	fi

#
# Change the file names from "*satan*" ==> "*santa*"
echo Finding all the file names
find . \! -name "satan*.gif" -print | while read old_name
	do
	new_name=`echo $old_name | sed 's/satan/santa/'`
	if test $new_name != $old_name ; then
		mv $old_name $new_name
		fi
	done

#
# Nuke the inline and acronym stuff in everything but the binaries...
echo Now changing all "SATAN" occurances to "SANTA"... please wait...
find . -type f \! -name "*.gif" -print |
	grep -v see_the_light.pl | xargs \
	perl -pi -e 's/SATAN/SANTA/g; s/satan/santa/g; s/Security Administrator Tool for Analyzing Networks/Security Analysis Network Tool for Administrators/'

echo linking santa...
ln html/images/santa.gif html/images/santa-almost-full.gif
ln html/images/santa.gif html/images/santa-full.gif

#
# one last switch...
perl -pi -e 's/"SANTA"/"SATAN"/; s/you can run the/but you shouldnt have run the/' html/name.html

echo Done!
```

SATANをビルド (make) する前に、このスクリプトを走らせます。
すると、SATANを構成するほぼ全てのファイルに、変化が起こります。
スクリプトを走らせたその端末は、次第に光輝き、そしてSATANの全身は……

```lang:Terminal
$ ./repent
Finding all the file names
Now changing all SATAN occurances to SANTA... please wait...
linking santa...
Done!
```

そうです。
それまでSecurity Administrator Tool for Analyzing Networksだったそれは、このスクリプト一発で名前が __Security Analysis Network Tool for Administrators__ と入れ替わり、そして __SATAN(悪魔)__ は __S A N T A__ ＼サンタ／ へと清められるのです!

この聖なるスクリプトの名前は「__repent__ (悔い改めよ)」です。

repentは実際にどんなことをするのか。悪魔がサンタに変身する瞬間を[githubのpull request](https://github.com/mrmt/repent/pull/1)に仕立ててみました。[変更差分ビュー](https://github.com/mrmt/repent/pull/1/files)もどうぞ。

つまり、悪魔-サタンが気になる人は、この「悔い改めよ」スクリプトを使い、サンタさんに変身させてあげて。というネタです。日本でも、「罪を悔い改めよ!」という黒い看板がたまに横丁や踏切脇に立ってたりしますよね。repent! はまさにソレで、英語圏でそういう看板によく出てくる決まり文句なアレです。

![2519850088.jpg](https://qiita-image-store.s3.amazonaws.com/0/36428/70fcb21e-0a02-9bd0-9eec-db4b626461c8.jpeg)
image appears from https://www.flickr.com/photos/eatacrayon/2519850088/
via [Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0)](https://creativecommons.org/licenses/by-sa/2.0/)

12年前ぼくは、2003年に大阪で開かれた[Linux Conference 2003 + 関西オープンソース・フリーウェア2003](http://lc.linux.or.jp/lc2003/)というイベントで、講演をしてくださったWietse Venemaさんに[SANTAについて質問した](http://blog.mrmt.net/entry/2003/12/05/000000)ことがあります。

> ぼく: SATANって、リリースされてしばらくしてから、なんかrepentというちっちゃなスクリプトが添付されるようになった記憶があるんですが、(さっそくWietseさん、うわぁ、がっくん。という感じでおどける) そのあたりについて何か面白いお話があればお聞かせ願えますか?
>
> Wietse: あぁ。私とDanがSATANをリリースしてしばらくしてから、「その名前は神を冒涜するものだ! 不敬な! けしからん!」なんて批判記事が新聞に載ったりして、いろいろ非難の矢面に立たされたりしたんだ。これは困ったなぁ…… と思っていたら、ある日Danからメールが届いて、その中身が、その小さなスクリプトだったんだ。それは何をするものかというと、SATANの配布物に入っている (SATANの) 名前を、白ヒゲの、とんがり帽子をかぶった、ほら、わかるでしょ、あのおじいさんの名前に全部変更するものだったんだよ。

はい、こちらが、悔い改めたあとのSANTAのアイコンです。かわいいですね!

![santa.gif](https://qiita-image-store.s3.amazonaws.com/0/36428/9ed12b18-d1ec-c050-9fe7-62c24e8e690b.gif)

* * *

というわけでSANTAは、 __あとづけで略称をもう一個思いついて、音速でスクリプトを書いた__ という珍しい例だと思います。

SATAN/SANTAは1995年にリリースされ、その後は徐々にメンテナンスされなくなり、[nmap](https://ja.wikipedia.org/wiki/Nmap)や[Nessus](http://www.tenable.com/products/nessus-vulnerability-scanner)といった後継者にその役割を引き継いでいます。後継者のひとつが[SAINT](https://en.wikipedia.org/wiki/SAINT_(software))です。SAINTはSATAN/SANTAのコードを基にしており、のちに商用化され、[SAINT Corporation](http://www.saintcorporation.com/)として法人化もされました。SAINTは __Security Administrator’s Integrated Network Toolの略__ です。__あぁ、またこういうやーつだ__……
ご存知の通り、SAINTは聖書に出てくる聖人という意味です。まず先にSAINTという略称ネタを思いついちゃったので、SATANからソースコードを引き継ぐ決心をし、起業の意思を固め、投資家を説得した、みたいな流れだったら面白いですね。

明日はhiroyuki-setoさんが「ノハナ社のAndroid開発に関する何か」について書く予定です。