tag:crieit.net,2005:https://crieit.net/tags/7pay/feed 「7pay」の記事 - Crieit Crieitでタグ「7pay」に投稿された最近の記事 2019-07-05T21:31:27+09:00 https://crieit.net/tags/7pay/feed tag:crieit.net,2005:PublicArticle/15207 2019-07-05T21:13:50+09:00 2019-07-05T21:31:27+09:00 https://crieit.net/posts/7pay 7payの不正アクセスについての考察 <p>2019年7月はじめ、Twitter上で7payにて不正利用があったことがささやかれはじめた。7payというのはセブンイレブンで簡単にチャージできて簡単に支払いが行えるという最近流行りのQRコード式決済のうちの一つ。それについて色々と考察してみる。</p> <p>ちなみに会社名やサービス名など、細かい部分を把握する余裕がないため事実どうこうよりも考察メインにとどめる。</p> <h2 id="何があったのか"><a href="#%E4%BD%95%E3%81%8C%E3%81%82%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">何があったのか</a></h2> <p>自分以外の誰かが勝手にチャージを行い、勝手に支払いを行ってしまうという、不正アクセスによる窃盗が行える状態だった。7payは7/1から開始したため開始から割とすぐに発生した。</p> <h2 id="原因はなにか"><a href="#%E5%8E%9F%E5%9B%A0%E3%81%AF%E3%81%AA%E3%81%AB%E3%81%8B">原因はなにか</a></h2> <p>オムニ7という通販サイトがあり、そのユーザーアカウントが7pay利用のために使用されている。Twitterで話題になったため多くの人が知っていることではあるが、そのオムニ7のパスワードリマインダーにて、メールの送信先を設定できる入力欄があったため、その他の入力欄の内容が分かってしまえば誰でもパスワードを変更して乗っ取る事ができる状態であった。</p> <h2 id="問題になったこと"><a href="#%E5%95%8F%E9%A1%8C%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">問題になったこと</a></h2> <p>これらの現象や会見の内容など、様々なことが今回多くの人によって問題提起された。そのあたりをいくつか考察してみる。</p> <h3 id="display: none 問題"><a href="#display%3A+none+%E5%95%8F%E9%A1%8C">display: none 問題</a></h3> <p>今回問題となったのがパスワードリマインダー機能でメールアドレスを指定できることだった。そのため、オムニ7上のその入力欄が削除されていた。しかし、誰かが調べたところ削除していたわけではなく単に<code>display: none</code>のスタイルを追加して非表示にしていただけだった。つまり、ChromeのDevTools等でそのスタイルを無効にすれば普通に同様の不正利用ができるままだった可能性があった。この初動対応が問題視された。</p> <h4 id="なぜその様な対処をしたのか?"><a href="#%E3%81%AA%E3%81%9C%E3%81%9D%E3%81%AE%E6%A7%98%E3%81%AA%E5%AF%BE%E5%87%A6%E3%82%92%E3%81%97%E3%81%9F%E3%81%AE%E3%81%8B%EF%BC%9F">なぜその様な対処をしたのか?</a></h4> <p>Webシステムの開発をしたことがある方であれば経験があると思うが、入力欄を一つ削除する、という対処は必ずしも簡単なことではない。そのパラメータが来る前提でシステムが作られていればフォームを実行した際にエラーになってしまう可能性がある。その場ですぐエラーにならなくとも、その後にデータの不整合によって別の箇所でエラーが出はじめる可能性もある。</p> <p>単に非表示にすることにより、ただたまたまその任意入力欄が空でフォームを実行した時と同じ状態になるようにしておけば、入力欄を削除してしまう場合に比べ問題の出る可能性がかなり小さくなる。そのためこの対応を行ったのだろうと思われる。</p> <h4 id="この対応は実際どうだったのか"><a href="#%E3%81%93%E3%81%AE%E5%AF%BE%E5%BF%9C%E3%81%AF%E5%AE%9F%E9%9A%9B%E3%81%A9%E3%81%86%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">この対応は実際どうだったのか</a></h4> <p>永久にこの対処だけだったら問題だろうが、とりあえず一瞬でリリースできる初動対応としては大きな効果がある。普通のユーザーには何もわからないだろうし、不正利用者も画面を見て「あ、もう対処されたのか」と諦める可能性もある。</p> <p>もちろん同じタイミングで入力欄削除までできていたら良かったのだろうとは思うが、大きな会社のシステムのため諸々の確認のバケツリレーと承認が多くて難しかったのだろう。</p> <p>これも実務経験があればわかると思うが、とにかくWebエンジニアが勝手にちょちょいと修正してしまうと、不具合がでて別の問題が出てしまったりする。実際にどう対処するか、対処した後問題がでていないか、みんなで確認していかなければならない。組織や会社が大きければ大きいほど、ちょっとした修正でもすごく大変なのである。</p> <p>一応現時点では入力欄まで削除されている。</p> <h3 id="この仕様でOKになってしまった"><a href="#%E3%81%93%E3%81%AE%E4%BB%95%E6%A7%98%E3%81%A7OK%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%A3%E3%81%9F">この仕様でOKになってしまった</a></h3> <p>実務で何かしらの開発を行ったことがある人であれば普通に考えてこの仕様がヤバイことはリリースして問題が発覚する前から分かる。パスワードリマインダーで通知先のメールアドレスを入力させてはいけない。ではなぜこのような仕様になっていたのか?</p> <p>可能性の一つとしてあげられるのがエンジニアやプロジェクトマネージャー、仕様策定者等、関わる全員の知識が実務経験がほとんどないレベルの人間だったということ。ただ、その可能性は低いだろう。前述の通り多くの人が関わっているわけなので、全員がわからないという可能性は低そう。</p> <p>これも分かる人は多いと思うが、多分最終的な物事の是非を決める人間にそのあたりの知識がなく、指摘されても仕様を変更するという決断をしなかったこと。もしくは、その可能性があるということを現場の誰もが経験上よく知っていて、「どうせ言っても変わらないだろうし…もう知らね…」と考えて指摘すらする気力が起きなかったこと。記者会見も悲惨だったので、このあたりは色々と体制の闇があったのではないかということが想像できる。</p> <p>全て想像だが、このあたりは簡単にエンジニアのスキルがどうのこうのという話ではなさそうに思う。組織がやばそう。</p> <h3 id="記者会見が悲惨"><a href="#%E8%A8%98%E8%80%85%E4%BC%9A%E8%A6%8B%E3%81%8C%E6%82%B2%E6%83%A8">記者会見が悲惨</a></h3> <p>記者会見がとにかく悲惨だった。</p> <h4 id="二段階認証を知らない"><a href="#%E4%BA%8C%E6%AE%B5%E9%9A%8E%E8%AA%8D%E8%A8%BC%E3%82%92%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84">二段階認証を知らない</a></h4> <p>社長が二段階認証を知らないことがわかった。ただ、実際社長全員が知っているものなのかどうかはよく知らない。社長はあくまでも経営者であり技術的な専門知識を持っているわけではない。(とはいえ最近は二段階認証も一般的になっていると思うが、まだ違うのだろうか。そういう操作は知っているが名称は知らないなど?)</p> <p>そもそもなんで社長が出てくるんだ、という気持ちもあるが技術的な話をするだけではないし問題も大きいため社長が出てくるのはうなずける話ではある。実際に作業しているプログラマーやプロジェクト管理をしている人間は保護されるべきであるので出してはいけないと思うが、せめてもうすこし話の分かる広報担当者などが出てくればよかったのかもしれない。</p> <h4 id="セキュリティチェック済み"><a href="#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E6%B8%88%E3%81%BF">セキュリティチェック済み</a></h4> <p>これでセキュリティチェック済みだったという。まあこれはもう複数の会社にまたがる話のようなのでなんとも言えない。そもそもチェック以前に内部で握りつぶされている話なのではという気がしなくもない。</p> <h4 id="サービスを停止しない"><a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%81%9C%E6%AD%A2%E3%81%97%E3%81%AA%E3%81%84">サービスを停止しない</a></h4> <p>チャージは停止したがサービス自体は停止していない。まあこれは問題が出ている箇所がチャージということだし外の人間としては何も言えない。</p> <p>開発者の立場、ユーザーの立場、会社の立場で考えると色々なことが異なってくる。大きな企業となると、割とモラルにとことん拘るというよりも、費用的にどうか、というところの判断も大きいのではないかと思う。被害額がおおよそ5500万ということで恐らく補填が可能な範囲という認識なのではないかと思うため、一番の原因を停止し被害額の増加が収束している状況であれば継続という判断を行う企業は普通にあるのではないかと思う。</p> <p>まあそもそも会見自体は自分たちが被害者的な考えで話していたようなのでそもそも何を考えているのか、理解しているのかは何もわからないが。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>とにかく総合して何が問題だったのかというと、古い人間が多い組織の闇という部分が大きいのではないかという気がする。全部想像を元にした考察だが。なにか間違ってる事を書いていたらごめんなさい。</p> だら@Crieit開発者