X

戸締りと金庫とセキュリティ

(Last Updated On: 2018年8月8日)

ずっと感じてきたことですが、ブログにしていませんでした。具体的には

戸締りする前に、金庫を買うセキュリティ対策

です。

IT技術者以外の方向けに書いています。最近問題だ、と話題のStruts2というソフトウェアを引き合いに書いていますが、技術的なことはほとんど書いてありません。

戸締りが先か?金庫か先か?

「本気の泥棒が相手なら、戸締りなんて無駄だ。だから金庫を買うべき」という考え方はあり得ます。さらに進んで「戸締りは無駄だ。だから必要ない」という考え方まであり得ます。「金庫を買うことこそが”真”のセキュリティなのだ!他はオマケである!」と考える人も。

「本気の泥棒に、戸締りなんてナンセンス!」

ソフトウェアに言い換えると

「本気の泥棒に、入力バリデーション(戸締り)なんてナンセンス!」

という感じではないでしょうか?

本当でしょうか?

 

実際に犯罪者が行う攻撃

物を盗む泥棒もですが、ネット上で情報を盗み/改ざんする泥棒も、不用心なターゲットを標的にします。

インターネットでは、実世界と異り、「ドアをノックする」コストは限り無くゼロに近いです。

Struts2(ざっくり言うと、公官丁や大企業がよく使うWebサーバー)の脆弱性で現在多数の被害が報告されています。(※1※2※3など)

この種の脆弱性は「開いているドア」と言えます。「ドアをノックするコストがゼロ」のインターネットでは「開いているドア」を探すことが、ほぼコストゼロで行えます。

 

金庫は役に立つのか?

金庫は役立ちます!

Struts2への攻撃も「金庫を買っておけば一部の被害」を防げました。例えば、金庫としてのSELinux(ざっくり言うとソフトウェアが操作できる範囲を制限するソフトウェア)です。アプリケーションサーバーがSELinuxの管理下にあれば、SELinuxで守っている範囲外への被害、を大幅に軽減できたはずです。

金庫は「金庫の中身」しか守れません。被害を”軽減”しかできないのは仕方ありません。家中を荒らされたとしても、少なくとも「金庫の中身」を守れるだけでも十分に役立ちます。

しかし、「本気の泥棒に、戸締りなんてナンセンス!」と同じで、金庫を買っても「本気の泥棒が相手なら、金庫は無駄だ」という考え方も成り立ちます。

一般に売られている”金庫”は、大抵大人2人も居れば運べます。1人でも運べる金庫も多いです。普通の金庫はそれなりの腕を持つ錠前士にかかれば開錠できます。しかも普通の金庫は耐火性は十分でも、バールで無理矢理こじ開けることが簡単だったりします。

例えば、金庫としてのSELinuxは完璧でしょうか?私もSELinuxは大好きで、普段使いのLinuxでも有効にしているくらいです。でも、完璧ではありません。2015年にはコード実行の脆弱性も見つかっています。本当に本気の攻撃者なら、未知の脆弱性を使って攻撃できるかも知れません。

参考: NSAはアンチウィルスソフトウェアを利用

因みにSELinuxはNSAが元々開発していました。誰も気がついていないバックドアを入れていてもおかしくありません。NSAはソフトウェアの脆弱性を利用(※1)していることも明らかになっています。無いほうがおかしいかも知れません。

参考:気付く事が不可能なloginバックドア  (Thompson hackでページ内を検索)

 

金庫の前に戸締りをしていたのか?

現在問題になっているStruts2のセキュリティ問題は「戸締り」で対応できたか?

  • 答えは「YES」です。

ではStruts2は「戸締り」をしていたか?

  • 答えは「NO」です。

Struts2はフレームワークとして「戸締り」をしていませんでした。少しだけ技術的な話をすると、Struts2は「Content-Type」と呼ばれるブラウザからの入力を「戸締り無し」で受け入れていました。

「ソフトウェアの戸締り」は、「家庭の戸締り」とは少し違います。ソフトウェアは、貴方が送ったデータを受け入れ、何らかの処理を行い、返答を返します。ソフトウェアは「家の戸締り」のように全て戸を締めることは出来ません。代わりに「特定の決まったモノ」だけ受け入れるようにします。鍵を掛けた「玄関ドア」に「郵便受け」があるような感じです。

「金庫」の中に「財布」をいれていなくても、「戸締り」をした家の中なら、大抵の場合は問題ありません。「戸締り」をしていた場合、中に多少の問題(金庫に財布を入れないなど)があっても、問題とならないことが多いです。

ソフトウェアも同じです。

わざわざドアや窓を解放した上で「金庫だけ」で泥棒対策をしているような状態、が良いはずがありません。

ソフトウェアの戸締り?

ソフトウェアも「戸締り」をしていると、中に多少の問題(実際にStruts2の中にも問題があった)があっても問題にならないケースが、数えきれないくらいあります。

「戸締り」が現実の生活で有効なように、ソフトウェアでも有効です。セキュアコーディング(ざっくり言うとセキュリティ専門家が考えた安全なソフトウェアの作り方)では「戸締り」つまり「全ての入力が妥当であるか検証する」ことを求めています。

「全ての入力が妥当であるか検証する」とは「特定の形のモノだけ受け入れる」ということです。家でいうと「玄関のドアを開けておくのではなく、郵便受けに入るモノだけ受け入れる」です。

セキュリティ専門家は「戸締り」、すこし専門用語を使うと「入力バリデーション」、をしましょう!できる限り厳重に戸締りをしましょう!と少なくとも四半世紀くらいは言っています。21世紀になってからは「国際ITセキュリティ標準」として「ソフトウエアの戸締り」を推奨しています。

 

ソフトウェア開発者は戸締りをしているのか?

専門家や国際標準で「戸締りを推奨」しているのだから当然戸締りをしているはず、と思うかも知れません。

残念ながら大多数のソフトウェア開発者は戸締りをしていません。大企業や公官庁で利用されているようなStruts2でさえ戸締りをしていません。

「本気の泥棒に、戸締りなんてナンセンス!」

これを、ソフトウェアに言い換えて

「本気の泥棒に、入力バリデーションなんてナンセンス!」

だから

「個別の問題をそれぞれ根本的に解決すれば良い!」(それぞれに金庫を買って大切なモノを入れるように)

と考えている開発者が多いからでしょう。

「戸締りなし」で問題が起きていないか?というと、そうではありません。多くのソフトウェアが多かれ少なかれStruts2のような問題を抱えています。

 

なぜ戸締りをしないのか?

システム開発に関わっていない方なら「セキュリティ専門家が何十年も推奨しているのに何故?!」と思うかも知れません。

理由は簡単です。昔から「ソフトウェアは戸締りしないで作っていた」からです。インターネットが当たり前になる以前、コンピューターは物理的またはネットワーク的に完全に分離されていました。このため習慣的に戸締りをせず、個別に盗まれたり/壊されたりしないように作ってきました。「戸締りしなさい」と言われる何十年も前から、戸締りなしのソフトウェア開発が受け継がれてきたのです。

こういうモノはなかなか変わりません。習慣もありますが、今まで作ってきた物も否定することになるからです。誰しも自分が苦労し、長年作ってきた物を否定されるのは快い物ではありません。

しかも、周りで「戸締り」をする人が少ない(と言うよりほとんど居ない)状況だと

「みんなも戸締りなんかしていない。」

「今まで作ってきた物、やり方は間違っていないんだ!(少なくとも、変えなくても安全な物が作れるんだ!)」

という気持ちなるのは仕方ないでしょう。

さらに、にわかには信じられないかも知れませんが、世の中には「国際ITセキュリティ標準」や「米軍のITセキュリティコンサルティングをしているような組織」が推奨するセキュリティ対策である「戸締り」を真っ向から否定したり、効果は薄い、セキュリティ対策とは言えない、と言ったりするセキュリティ専門家も居るのです。

「セキュリティ専門家も、戸締りは必要ない、と言っているのだから」

とソフトウェア開発者が思ってしまっても仕方がないかも知れません。

ソフトウェアを完璧にするのは、不可能なくらい難しいです。

まずは「戸締り」しませんか?

玄関ドアを閉めて「郵便受け」で受け取れば、より安心です。

実際、Struts2のセキュリティ問題は「金庫」を作ったつもりで役立たずで戸締りなしで被害にあった事例です。こういう例は枚挙にいとまがないです。

ソフトウェアの世界は現実の世界とは異り、窓やドアを破ったりすることは出来ません。戸締りはとても有効です。

おまけ – 厳重な金庫を買ったつもりでボロボロ、それが現実。。

金庫がマトモな金庫だったらまだ良いのですが、完璧な金庫のつもりで実は簡単に壊せるボロボロな金庫だったら困ります1 ソフトウェアセキュリティにはそんな実例が沢山あります。

「SQLインジェクション対策にはプリペアードクエリ/プレイスホルダ(簡単で完璧な金庫)”だけ”使っておけば良い!エスケープ(手間のかかる金庫)なんて要らない!」これでは全然ダメな対策です。今、コード検査で見つかる大半のSQLインジェクション脆弱性はこのダメな対策を信じてしまった開発者によって作られています。

詳しくは以下のエントリをご覧ください。(技術者向け)


  1. WAF (Web Application Firewall) は家を丸ごと金庫に入れるような防御壁を作る機能です。でも「戸締り」をしていないWAFでは大穴明けながら、ドアと窓を解放しているような状態です。
yohgaki:
Related Post
Leave a Comment