CVCアタックに対してStripeでどう戦うか

技術ネタ

先日のShifterキックオフのときの会場がStripeだったので、PayPay事件の話題をお話させていただきました❗
遅くなりましたが、まとめてシェアしようと思います。

スポンサーリンク

結論


“支払い”(Chargeなど)はStripeのみで防げる

ただし、CVCアタック対策はアプリで作り込みが必要

まず、最初に断っておきますがStripeはとても素晴らしい決済コンポーネントなので、是非使ってください❗
今回はやりたいこととマッチしなかった、それだけの話しでありセキュリティとしても十分高いです。

尚、ClientはElementsを使用してます。
もちろん現段階での話なので、今後のStripeに期待です。

”支払い”は防げる

支払いについては、StripeRadarで防げます。
Radarについては次の単元で詳しく話します、これで防げるのは支払いが発生する場合に限ります。

やりたいこと

確かにStripeを使うことで、Stripe経由の支払いは防げます。
それにElementsを使えば、署名欄もありますし入力された名前もStripe側で持てます。

ただ今回のCVCアタックで問題になったのは、CVCを総当たりでクレジットカード情報が取得できてしまうことだったので、Elementsで複数回CVC入力をされたカードについてはCustomerやそれに紐づくCardを作成することまで防ぎたい。

StripeRadar

Radarでも不正はいろいろ防げる

Radarで十分不正支払いはブロックできます。
こちらルール追加の画面ですが、パット見何書いてあるかわからないかもです。
ですが、一度【+ルールの追加】ボタンを押してみてください。

こんな画面が出るのですが、を押すと指定できるルールが日本語でちゃんと出てきます。

今回のようにCVCの入力間違いで支払いを止めたい場合は、デフォルトでBlock if CVC verification failsというルールで弾かれてます。

ほかにも:blocks_per_card_number_daily:を使えばCardが24時間以内に支払いブロックされた回数を絞る事ができます。

Block if :blocks_per_card_number_daily: > 10
(24時間以内に同じcardで10回以上支払いブロックされた場合は支払いブロック)

同じような方法で:charge_attempts_per_customer_daily:を使えば同じCustomerが24時間以内に支払いで使える回数も絞れます。

:declines_per_customer_daily:を使うと、Customerの拒否された回数も拾ったりできます。

永久ブロック

ただ、ルールについては24時間以内に〜とか1時間以内に〜とか支払いが発生したときに弾くため支払い時にルールに当てはまらないと通ります

だけど、すでに怪しいので前もって弾きたい場合があります。
それがリストになります。

default List

例えばcardを永久ブロックしたい場合は、Card fingerprint block listに対象CardObjectのfingerprintを登録すればOKです。

fingerprint

ただ、こちらは手動登録なのでRadarのブロック対象になったからリストに自動追加という機能は今の所はないとのことでした。

まぁ、なんでも自動判定で入れてしまうと機会損失に繋がる可能性もありますしね・・・

回数チェックは有料

Radarのルール追加はRadar for Teamsという追加機能になるため有料です。
料金は”支払い”が発生するたびに2円、これは支払いの成功・失敗にかかわらずです。

テスト環境は触りたい放題なので、遊ぶことは可能です。
Stripeでの不正支払を本格的に弾く場合はRadarの追加機能を検討したほうがよいのかなと思います。

十分弾いてくれるんじゃない?

Chargeを弾く

Radar相当便利なので、セキュリティ的にも十分対応出来ると思います。
最初に書いたとおり、支払いが発生する場合についてはRadarでかなり防げます。

例えばElementsで作成されたCVCが間違ってるtokenを、そのままサーバーサイドの支払い処理(たとえばCharge)のSourceに割り当てれば、card object作成段階で支払い失敗としてカウントされます。
こちらは公式サポートから頂いた回答です。

「CVCの入力回数に上限を設定する」などの決済またはcard object作成時の試行回数を一時間以内に10回まで制限する場合は、以下のルールをご追加ください。

Block if : charge_attempts_per_card_number_hourly > 10

こちらはCVCチェックに失敗した回数ではなく、試行回数の総数に回数制限がかかることをご留意ください。

以上の場合、決済試行時及びcard objectが作成される際にご利用のクレジットカードをブロックします。決済を短時間内に頻繁に試行して失敗した人(customer)をブロックされたい場合は、同じIPアドレスからの確定時間内の試行回数に制限をご設定ください。

Stripe Support


1時間以内に同じカードでCharge試行したのが10回以上あったら、ブロック対象として上げますよって感じです。
また、同じように同一IPでのアクセスでも弾けますよって感じです。

ただ・・・カード情報登録と支払いが別トランザクションだった場合どうでしょうか?

カード登録のみは弾けない

こちらサポートから頂いたRadar仕様の回答

スクリーニングはChargeがベースでございます為、Token作成やCustomer登録の際にはRadarは動いておりません。

Stripe Support


そうなんです、Radarは支払いが発生してるときのみ動作してるんです。

なのでElementsからCVCが間違ってるクレジットカード情報tokenをStripeに飛ばして、CustomerとCardを作成するだけの場合はこうなります。

Exceptionが返ってきちゃうんですね。
Stripe側には402エラーとしてのログが残りますが、CustomerもCardも作られません

なのでStripe側の制御だけでは、

「支払が発生しない場合、CVC回数上限を設けてCard作成の試行は防げない」

ということになっちゃいます。

カード登録は作り込み

とは言っても、Exceptionは返してくれてるのでアプリ側で制御はできそうです。
例えばアカウントとException回数紐づけて、アカウントブロックくらいはできそうです。

カードをブロックしたいですが、Elementsを使ってる段階でカード関連情報をアプリ側で持つことはできないですね。
というか、持ちたくないからElementsを使ってるので・・・w

アカウント複数作成とかされちゃうと詰みそうですが💦

今後に期待

今回はクレジットカード情報の登録と、支払い(Charge)が別の場合に起こり得ることなので、サブスクリプションとか他の支払方法ではどうなるかわからないです💦

もっと他にやり方があって、こうすればいいよーってのがあったら教えてください❗

あとはFront側で呼び出すJSが怪しい挙動は拾ってくれるような感じらしいので、一応どのページにもあるといいと聞きました。
SPA系なら下記のコードをindex.htmlとかに挿しておけば良さそう

<script src="https://checkout.stripe.com/checkout.js"></script>
<script src="https://js.stripe.com/v3/"></script>



理想はCard作成がExceptionなのは全然OKなんですが、同一カード番号からの作成試行を制御出来るようになったら嬉しいなって思います。

Stripeならきっとそのうちやってくれると思ってますw

コメント