ホモグラフ攻撃とは直訳で人間的図形攻撃です。具体的に何をするかというと、視覚的に似た別の文字を用いてユーザの想定と異なる動作を誘発させます。特に重要で代表的な例はURLにおける攻撃で次例です。
https://www.аррӏе.com/
https://www.apple.com/
上の二つのURLは異なるURLです。上の側だけ英語小文字に似た文字でドメイン名を記述してあります。これでユーザを誤ったURLへ飛ばし、飛び先のページで実行されるコードに悪意あるコードを仕込むことによって本格的な攻撃をします。
この攻撃はユーザの運用によって完璧に防ぐことは困難です。いちいち文字コードや言語情報をチェックしていたらとても耐えられない不便をこうむります。この点、ブラウザがいくらか対策してくれています。例えばGoogle Chromeはο(オミクロン)を使ったgoogle.comへのアクセスを次の様に止めてくれます。
PHPはホモグラフ攻撃の対策(主に踏み台にされないため)としてホモグラフ攻撃用文字列を検出するためのクラスSpoofcheckerを持っています。これを使えば怪しげな投稿やメールアドレスの多くを弾けます。
PHP:Spoofchecker-マニュアル
簡単な使い方は次です。
public function isSafe($value){ $checker = new Spoofchecker(); $checker->setRestrictionLevel(Spoofchecker::制限レベル);// PHPリファレンスに記述はない(!?)が実装されている $checker->setChecks(Spoofchecker::チェックルール); return !$checker->isSuspicious($value);// isSuspicious関数は疑わしい時にtrueを返す }
制限レベルはPHP:Spoofchecker-マニュアルの定義済み定数の内のASCIIからSINGLE_SCRIPT_RESTRICTIVEまで、チェックルールはSINGLE_SCRIPT_CONFUSABLE以下です。デフォルトレベルはHIGHLY_RESTRICTIVE、デフォルトルールはSINGLE_SCRIPTです。詳しい各ルールの説明ドキュメントはPHPリファレンス内に存在しません。
雑に使ってもそれなりに役に立つのですが、せっかくなのでルールの詳細が知りたいです。C言語で構築されたPHPのSpoofcheckerの実装は次です。これを読めば多少わかります。
php-src/ext/intl/spoofchecker at 49a4e695845bf55e059e7f88e54b1111fe284223 · php/php-src
このディレクトリの内部を読むとC言語のuspoof機能を使っていることがわかります。C言語のuspoof機能のリファレンスは次です。
ICU 64.2: uspoof.h File Reference
両方を参照すると制限レベル、チェックルールの二段階設定であることがわかります。
制限レベルはICU 64.2: uspoof.h File Reference#URestrictionLevelで説明されています。日本で使うサービスとしてはデフォルト制限レベルであるHIGHLY_RESTRICTIVEがふさわしいでしょう。HIGHLY_RESTRICTIVEは日本語セット、中国語セット、韓国語セットのいずれのセットの中に納まらない文字列を怪しい文字列として疑うレベルです。
チェックルールはICU 64.2: uspoof.h File Reference#USpoofChecksで説明されています。制限レベルをそのまま適用するRESTRICTION_LEVELが扱いやすそうです。PHPのデフォルト設定はSINGLE_SCRIPTですが、SINGLE_SCRIPTは既に非推奨でRESTRICTION_LEVELに置き換えられます。
リファレンスが不親切で実装まで調査しましたが単に次のように使えばよさそうです。
public function isSafe($value){ $checker = new Spoofchecker(); return !$checker->isSuspicious($value);// isSuspicious関数は疑わしい時にtrueを返す }
ちなみに各制限、各ルールで最上部の例のapple.comが安全ならtrue,違うならfalseにする関数でテストしたところ次結果になりました。読みづらいのは申し訳ないですがコピペとか見ている画面のデザイン変更で対応していただきたいです。
SINGLE_SCRIPT_CONFUSABLE | MIXED_SCRIPT_CONFUSABLE | WHOLE_SCRIPT_CONFUSABLE | ANY_CASE | SINGLE_SCRIPT | INVISIBLE | CHAR_LIMIT | |
---|---|---|---|---|---|---|---|
HIGHLY_RESTRICTIVE | true | true | true | true | false | true | true |
MODERATELY_RESTRICTIVE | true | true | true | true | false | true | true |
MINIMALLY_RESTRICTIVE | true | true | true | true | true | true | true |
UNRESTRICTIVE | true | true | true | true | true | true | true |
SINGLE_SCRIPT_RESTRICTIVE | true | true | true | true | false | true | true |