大規模なWebサイト構築を行っている方ならF5にお世話になっている方も多いでしょう。F5のブログで私と全く同じ意見のブログ – Why it’s so hard to secure JavaScriptを見つけたので紹介します。
Webクライアント側でのページフィルタリングは有用なのか?でシグニチャベースのページフィルタリングは有用では無いと書きましたが、WAF(Web Application Firewall)を販売しているF5の方も同じ考えです。
As we learned from preventing SQL injection and XSS, attackers are easily able to avoid detection by these systems by simply adding white space, removing white space, using encoding tricks, and just generally finding a new permutation of their code.
「スペースを足したり、引いたり、エンコーディングのトリックと使ったり、新しい形の攻撃コードを見つけ、攻撃者はSQLインジェクションとXSSを防ぐシステムを簡単に回避してしまいます。」
この部分はWAFでの経験を紹介しているものと思われます。
Parsing is, of course, the best answer.
「もちろんパースするのが最善の解決策です」
その通りです。SQLにしても、XMLにしても、JavaScriptにして、実際に行われる処理を攻撃を検出するデバイスで行う方法が最も最適です。この方法はクライアント型ならなんとかなりますが、プロキシ型ではパフォーマンスの問題は大きな問題となります。
While almost all web application security solutions – ours included – are capable of finding specific attacks like XSS and SQL injection that are hidden within JavaScript, none are able to detect and prevent JavaScript code-based exploits unless they can be identified by a specific signature or pattern.
「ほとんどのWebアプリケーションソリューション、我々(F5)のソリューションを含め、JavaScriptに隠された特定のXSSとSQLインジェクション検出できます。しかし、特定のシグニチャかパターンによって検出できなければ、どのソリューションもJavaScriptコードベースの攻撃を検出・防御できません。」
パース(実行)していない、のですから当たり前の事です。
Webクライアント側でのページフィルタリングは有用なのか?ではクライアントサイドのセキュリティソリューションとしてページフィルタリングの有効性と限界について紹介しました。このフィルタリングの有効性と限界は全く原理で動作しているWAF(Web Application Firewall)にも当てはまります。極端な例ですが、Webクライアント側でのページフィルタリングは有用なのか?で紹介したようなJavaScriptコードをWAFで検出するのは至難の技です。
start();
function z_sa(o,p,v){ o.setAttribute(p,v); }
function start(){
var z = document.createElement(‘object’); z_sa(z,’id’,’z’);
z_sa(z,’classid’,”cjlWsTiWdI:HBWDH9T6jCT5T5H6T-T6I5IAj3j-”
“W1W1IDH0I-W9H8W3HAT-I0T0WCH0W4jFICW2T9TEI3T6T”.replace(/[WHjIT]/g, ”));
ブログなどでJavaScriptの貼り付けを許可する場合、WAFで守るのではなくアプリケーションで守らないと無防備でいるのと変わりません。
サーバ側の開発者は取り合えず自分のサイトだけ安全性を確保すれば良いので、セキュリティを考慮して開発すれば何とかなりますが、クライアント側の対策は難しいです。プロキシ等でJavaScriptを利用した攻撃からクライアントを守っているつもりの企業も、JavaScriptを利用した攻撃には、現状では、ほとんど無防備な状態と変わらない事を知る必要があります。
シグニチャベース(ブラックリスト型)のセキュリティソリューションは無用ではありませんが、その限界を正しく知るべきです。
今のところNoScript等で選択的にJavaScriptを実行する方法がJavaScriptの攻撃から最も効果的に守るソリューションです。
関連:
NoScriptの使い方 - ちょっと古いです。近日中に更新版を書こうと思います。
安全にInternet(ブラウザ)を利用する為のTips