動的CSS・JSによるブルートフォース対策
認証破りの最も基本的、かつ原始的とされる、ブルートフォース攻撃(以下BF攻撃)ですが、コンピュータの処理制度の向上によってかなり脅威になっています。
以下の図は、パスワードの強度とBF攻撃成功にかかる時間の関係を表しています。
※画像は「IPA」より
う~~~ん。
半角英数字+記号を使用すれば、「1千年」ですので、大丈夫そうですね、、、
って、お~~~い!!!
これ、「2008年」の記事でした、、、
今はどうなんだろう、、、
じゃ~~~ん!!!!
リンク先に投稿禁止文字がある???とのことで、リンクを貼れません。
「reddit password」を検索して下さい。
あらら、「8時間」で突破されちゃうの!?
「ムーアの法則」、恐るべし!!!
もはや、パスワード8桁神話なんて過去のものですね、、、
だからといって、パスワード16桁なんてまず覚えられないし、、、
認証成功可否を難しく!!!
長くなりました。
申し訳ないですが、まだ本題ではありません、、、
既に述べた通り、パスワードは「8桁」では不十分。
しかしながら、これ以上パスワードを増やすのは、現実的ではないという問題があります。
解決策として、パスワードレス認証が近年盛り上がっています。
この方法は確かに直接的にはパスワードによる認証を防ぐことで、BF対策になっていますが、まだまだ問題だらけです。
実際、僕が勤務している企業でも「脱パスワード」を目指してはいますが、パスワードそのものは使われ続けています。
また、パスワードレス認証でも根底にはパスワードを使用していることが多くあります。
パスワードレス認証はユーザにとって手間になることも多く、必ずしもパスワードレスを廃止するべきとは言えません。
セキュリティを高めることだけを意識して、ユーザビリティを損なうことは許されませんので、、、
動的JS・CSS
ここからがようやく本題です。
ということで、僕が運営しているサイト(秘密)で近年取り入れているセキュリティ技術として、BF攻撃時に認証成功・失敗の判定をしにくくするという実装をしています。
おそらく、BF攻撃者はHTTPレスポンスから「ログインに失敗しました。」的な文言の有無で、認証成功・失敗を判定していると思われます。
あるいは、成功時と失敗時に返ってくるデータを見極めてより精密な判定を行っているかもしれません。
いずれにせよ、この判定をしにくくすることはかなり有効なBF対策になると僕は思います。
これを実現するため、僕が行っている実装を紹介します。
- 認証成功時と失敗時に返すデータはほとんど同じ
- ユーザ表示に関しては「JS」「CSS」で対応
- 読み込んでいる「JS」「CSS」によって判断されないように、これらは動的にかつ、ランダムな処理を混ぜて生成
例えば、CSSに関しては
/* 認証成功時に「エラー」の文言を非表示に */
.random1 {
display: none;
}
/* ... */
.random2 {
color: red;
}
/* ... */
.random3 {
color: blue;
}
的な感じです。
さらに、これらのセレクタに関しても、ランダムで「ID」指定や「クラス」指定を変化させます。
CSSだけだとパースして対応することも可能ですので、「JS」でユーザ用表示を切り替えることもあります。
document.getElementById("random1").classList.Add("hidden");
// or
document.getElementsByClassName("random1")[0].classList.Add("hidden");
//or
const obj = document.querySelectorAll("random1.random2")[0];
obj.style.position = "absolute";
obj.style.inset = "-999 -999 999 999";
// or
...
「opacity」を「0」にしたり、「z-index」を「-999」に設定して一番下に配置したり、そのまま「remove」してもいいですね♪
このように「CSS」「JS」ファイルに関しても毎回内容をすこしずつ変えて出力すれば、判断もかなり困難になります。
問題点
この方法は利点だけではなく、問題点も当然あります。
- コードが複雑に
- 標的型攻撃には弱い
「1」に関して、
外枠さえ作ってしまえば、そこまで複雑になることもありません。
出力内容を決めてしまえば、あとはテンプレートエンジンを使用して簡単に作成可能です。
「2」に関して、
動的JS・CSSだけに限って話ではありませんが、確かに対策されると攻撃が成功する危険性も高まります。
これに関しては、それ以外の基本的なセキュリティ事項(定期的変更・最低桁数・etc...)も正しく満たせば、そこまで問題にはなりません。
さらに、簡単に出力内容を変更して攻撃者の攻撃意欲をそぐことができれば、十分とも思えます。
まとめに
以上、僕が実装したBF対策でした。
個人のサイトでの実装であり、実際に攻撃を受けたこともないのでその有効性は実感していませんが、攻撃者の手法を考えるとかなり効果的な対策だと思われます。
最後まで読んで下さりありがとうございます。
このセキュリティ技術に関する意見がある方は、ぜひコメントお願いします。