このブログは未経験からのエンジニア転職やプログラミングの勉強方法などを発信する、現役エンジニアによるエンジニアのためのトータル技術ブログです。ブログとご一緒にSNSのフォローもよろしくお願いします。

Twitterをフォローする

現役セキュリティエンジニアが語る。PayPay から学ぶセキュリティ対策

つぶやき
スポンサーリンク
わんぽち
わんぽち

PayPay の20%還元キャンペーンはすごかったわん!

きつね先生
きつね先生

そうですね。ですがいいことがある裏では必ず悪い人が動くもので悲しいです。

にゃんみ
にゃんみ

今回は不正利用があったみたいだけどそんな簡単にできるものなのかにゃ?

きつね先生
きつね先生

セキュリティは1つでも穴があるとそこからいくらでも被害は拡大してしまうものです。安全なサイト運営のために今日はセキュリティに関して学んでいきましょう!

 

にゃんみ
にゃんみ

はい!

わんぽち
わんぽち

はい!

こんにちは!!あっきーです!

みなさん PayPay の20%還元のキャンペーンでなにかお買い物したりしましたか?
本当にものすごい勢いでネットニュースや Twitter は大賑わいでしたね!

ぼくはとくにほしいものが出てこなく完璧に波に乗れなかった勢です(笑)

そんな勢いもつかの間、こんどは不正利用の報告のニュースがあとを絶えず。。。

出る杭は打たれるというのか、やっぱり世間を騒がすできごとが起きると絶対といっていいほど悪いひとが動きます。

ちょっと前でいうと NEM の580億円流出とか典型的なパターンで数日で一気に価格が高騰したそのあとすぐの出来事でしたね。

あの時ぼくも仮想通貨に結構つぎこんでたのでなかなかに痛い目に遭いました(笑)

そんなことはさておき!

流行りすたれの早い昨今の IT 業界では早くリリースして走りながら整えていくビジネススタイルが多いと感じます。

そのリリース当初のセキュリティ対策が万全でない段階で被害はおきるものなのかなぁと思ったりします。

ということで、今日は現役セキュリティエンジニアが語る PayPay から学ぶセキュリティ観点という話題で話していこうと思いますのでよろしくお願いします。

スポンサーリンク

PayPay 不正利用の原因

今回この記事を書く経緯に至ったさいに参考にさせていただいた記事です。

不正利用された原因や、それに対する対策を非常に丁寧に説明していただいてますので PayPay でお買い物をされたユーザーさんはぜひ読んでください。

https://dokoiku.me/paypay-unauthorized-use/

原因はクレジットカード情報が流出したのが大元の理由ではありますが、その前に登録の段階や決済時のセキュリティ対策もガバガバだったのも起因してるみたいですね。

こんな感じだったみたいです。

・クレジットカード情報登録の記入項目

1.クレジットカード番号
2.有効期限
3.セキュリティコード

上記3項目のみで登録が可能だったそうです。

登録時のパスワード入力、2段階認証の機能すら存在しなかったみたいです。

この時点でだいぶびっくりしたのですが、さらにセキュリティコードなどの入力ミスにたいするアカウントロック機能の不備、さらに同一カード情報の登録が可能ともうセキュリティホールガバガバの仕様だったようです。

この感じですと推測ですが、多重ログインなども許可していたのかなと思います。

他サイトのセキュリティ不備も原因

PayPay 自体は「情報流出した事実ない」と発表しているようです。

ですが、 PayPay だけがそういってもどうしようがないのがセキュリティの難しいところです。

他の商品を販売していた家電量販店さん側が原因かもしれませんし、実際どこがおおもとの原因が調べるのは困難です。

どんなに堅牢なサイトであろうと小さい1つの穴があればそこを突破口をに不正アクセスなどは行われます。
全体的に良くても提携している企業も含め、セキュリティの最も弱い部分がサイト全体のセキュリティレベルになってしまいます。

脆弱性の種類と対策指針

ここからはエンジニアのかたを対象に今回の PayPay の不正利用の原因として潜んでいた脆弱性の種類と対策指針を話していこうと思います。

※あくまで推測や可能性の話ですので事実かどうかはわかりません

脆弱性の多くはプログラムの不備に起因しています。

今後開発に携わっていく人たちはセキュリティを考慮した実装をできることは大前提です。

今回は細かい対策などは割愛し大枠の部分を説明していきますが、この記事で少しでもセキュリティのイメージやどんな脆弱性からどんな被害が起きるかということをイメージしてもらえたらと思います!

SQL インジェクション

まず、今回の原因の大元になったクレジットカード情報の流出についてです。

これは SQL インジェクションによる脆弱性の典型かと思います。

Web に関してニュースレベルで問題になる事件にはだいたいこいつがつきものです。

まず一番に対策したい脆弱性の1つです。

SQL インジェクションは名前の通りデータベースに関する脆弱性です。

Web アプリケーションの多くはデータベースを利用し、テーブル内のデータを検索、追加、削除、編集などの処理を行っていきます。

SQL の呼び出し方に不備があった場合、ユーザー任意の SQL 文を挿入するすることでその構文が SQL の組み立てに使用されてしまい、意図しないデータベースの実行が行われてしまいます。

その結果として以下のような被害に遭います。

1.データベース内のデータの不正な閲覧や改ざん、情報流出
2.認証の回避
3.データベースサーバーを経由したプログラムの実行

今回はテーブル内のクレジット情報が流出したことが原因で引き起こったと推測できます。

対策

1.特殊文字(& < > " ')のエスケープ
2.文字、数値リテラルの入力値をチェックし文字の混合をさせない
3.プレースホルダ―による SQL 分の組み立て

アクセス制御

他のユーザーからクレジット決済が可能であったことからアクセス制御に不備があった可能性が考えられます。

アクセス制御とは、認証後(ログイン後)のユーザーのみにしか権限がない処理(今回だと決済処理)を他のユーザによって実行されてしまう脆弱性の事を指します。

原因としてはセッション管理に不備があることがほとんどです。

この脆弱性があると以下のようなことができてしまいます。

1.他人のセッションでのアクセスや処理が可能
2.管理者とユーザーで使用が違う時に権限を超えた処理が実行可能
3.未認証(未ログイン)でのアクセスや処理が可能

被害は一概に言えないですが、他人にアカウントを乗っ取られたような状態ですのでさまざまな大きな問題をもたらします。

対策

・認証機能に加えて認可制御を実装する

混合しやすいのですが認証と認可は別物です。

認証とは、ユーザを一意に特定すること。
認可とは、認証済みユーザに対して、サービスの利用やリソースへのアクセスを行なえる権限を与えることです。

この認可制御を実装することで、ログイン中の利用者が他人になりすましてアクセスするなどのアクセス制御による脆弱性は対策することができます。

ですので、これから開発を行っていく方はどのユーザーにどんな、どこまでの処理を許可するかを制御するということを設計の段階で定義することを意識したらいいと思います。

CSRF

SQL インジェクションとアクセス制御に不備があったことから CSRF による脆弱性もあった可能性が考えられます。

CSRFは認証後(ログイン後)のコミット処理(データベースに処理を加えるアクション)時に起きる脆弱性です。

フィッシングによる第三者からのリクエストの強制を行われ、知らぬうちにユーザー情報への書き換えなどがおこなわれます。

これにより以下のような被害に遭います。

1.利用者のパスワードやメールアドレスの設定変更
2.利用者のアカウントによる商品の購入や大会処理

CSRFは攻撃に被害者の介在が必要な受動的攻撃に分類されるため、今回に関しては CSRF による被害で引き起こされたわけではないと思いますが、潜在的な脆弱性として可能性があることから説明させていただきました。

対策

1.トークンなどによる副次的な認証情報のチェックを行う
2.Referer ヘッダのチェックを行いドメインやパスに違いがないがチェックする
3.重要情報の処理時には再認証や本人確認などの処理を実装する。

 

ブルートフォースアタック

セキュリティコードなどの入力ミスにたいするアカウントロックの機能がなかったことからブルートフォースアタックの被害に遭う可能性があります。

ブルートフォースアタックは「総当たり攻撃」とも呼ばれる、パスワードを破る手法のひとつです。
総当たりという言葉からも想像できるように、パスワードに使われていると推測される文字列を1つずつ
変えながら片っ端から試していき、正解に当たるまで試し続ける手法です。

クレジットカードのセキュリティコードは3桁でかつ数値のみですのでブルートフォースアタックをされたらわりと
すぐに番号の解読をされてしまいます。

以下の図でブルートフォースアタックによるパスワード解読までの所要時間を参照してください。

対策

本来ログイン画面での脆弱性ですので、パスワードの長さや文字の組み合わせによるパスワードの強固かがあげられますがクレジットカードのセキュリティコードは3桁の数値なので、

・10回以上間違えたらアカウントロックをする

などが妥当なのかと思います。

その他にもパスワードの再入力や本人認証などを組み合わせることで今回のような事件は防げたかもしれません。

ユーザーとのギャップに生じるセキュリティレベルの低下

PayPay を例にいろいろとセキュリティの話をしましたが、実は IPA によるセキュリティの基準などは定められていて、それに沿って設計すればそこそこ堅牢なサイトは構築できます。

なのになぜ、セキュリティ事故は絶えず起きるのでしょうか。

おそらく提供者とユーザーとのギャップによるセキュリティの甘さが原因にもあると思います。

正直つかう側としては何かとパスワード入力したり、チェックの多いサイトってたぶんうざいですよね。

たぶんそれが原因でユーザー離れが起きることも多々あるかと思います。

提供者もそれを十分に理解しているからこそついつい UI 重視の設計にしてしまいセキュリティレベルを妥協してしまっているところもあるでしょう。

ですが、結局それが原因でお互いにとってよくない結果を招いてしまっています。

こればっかしはたぶんなくならない気もします笑
なので落としどころを明確に定義しておく必要があります。

またはセキュリティエンジニアが不足していることも起因しているのかもしれません。

エンジニアとしては1人1人のセキュリティレベルの底上げをし、ユーザーも開発者はそういう
ところも気にかけてつくっているということを認識して多少めんどくさい処理も自分たちのためでもあるということを理解して寛大な心でサービスを利用していただけたらこういう事件も減っていくかもしれませんね。

個人でできること

最後に個人的に思った対策です。

対策というより完璧リスクヘッジですが(笑)

単純にクレジットカードではなくデビットカードで予め上限額を決めてしまうといいのではないかと思いました。

上限額が大きいほどリスクは高いのでリスクヘッジとして僕はオンラインではデビットカードを今後は使っていこうと思いました。

なにがおきるかわからないのでちょっとした工夫と対策、まめにクレジット明細などを確認するようにして被害を最小限に抑えていきましょう!

さいごに

最後まで読んでいただきありがとうございます。

まだまだ発展する IT 業界で、これからもセキュリティに関する事故は無くならないと思います。

今回の記事でこれから開発者になる人たちはセキュリティを考慮した開発を心掛けてくれたらさいわいです。

それではまた次の記事でお会いしましょう!

スポンサーリンク
あっきー

元キャバクラ店長から未経験でエンジニアに転職した異端児。

自分の経験を元に、エンジニア転職や未経験からでも挫折しないプログラミングの勉強方法の発信をしてます。

あっきーをフォローする
つぶやきセキュリティ
\良い記事だったらシェアしてね!/
スポンサーリンク
駆け出しエンジニアのつぶやき