「世界最悪のログイン処理コード」を解説してみた

「世界最悪のログイン処理コード」を解説してみた


「世界最悪のログイン処理コード」を解説してみた


概要

 ところでこのツイートを見てほしい。このソースコードをどう思う?

世界最悪のログイン処理コード。
実際のサービスで可動していたものだとか……https://www.google.co.nz/amp/s/amp.reddit.com/r/programminghorror/comments/66klvc/this_javascript_code_powers_a_1500_user_intranet/ 

はっしー@海外プログラマ社畜 (@hassy_nz)











 すごく……セキュリティーホールです……

 一応は動いていますが、あまりに問題がありすぎるため、Twitterでも話題になっていました。

 問題点は片手に入り切らないぐらいある気がしますが、一つづつ解説していきます。


問題点リスト


1. クライアント上のJavaScriptで書かれている

 他の問題点を全部ぶっ飛ばすぐらいの重大な不具合です。

 クライアントと言うのはこの場合、サイトにWebブラウザ等でアクセスするユーザーのことを指します。

 こういったJavaScriptはHTMLやCSSと一緒にサーバーから送られてきますので、当然ユーザーに読まれます。

 すると、わざわざサーバーをハッキングせずともログイン処理の全容がバレバレということになります。


2. Cookieに書き込む認証情報がザル過ぎる

 1.により、568行目で「(jQueryにより)Cookieに『loggedin』キーに『yes』値を保存している」ことがバレます。

 つまり、「手動でCookieに同じ値をセットすればパスワードを調べずともログインしたことにできる」ことがバレます。

 それこそWebブラウザのInspectorで観測すれば一発でバレるクソ要素ですが、1.が無ければ発見が遅れたことでしょう。

 ……ちなみに真っ当なログイン処理の場合、書き込む情報をランダムなログインIDにしたりJSON Web Token(JWT)にしたりします。


3. 任意のSQLを実行できてしまう

 1.によって露見してしまった、超重大な脆弱性です。

 544〜546行から「apiService.sqlメソッドで任意のSQLを実行できる」ことが分かります。

 また、メソッド名から察するに、accoutsはSQLの実行結果を「連想配列の配列」で受け取れるのでしょう。

 つまり、JavaScriptデバッグコンソールからデータベースに対して任意のSQLを送れます

※「任意」と言いましたがその範囲は想像以上に広く、単に「usersテーブルから全部のデータを取り出せる」他、有名なRDBのコマンドを送って応答を見ることでどのRDBを使用しているかまで察せられます。すると、他のテーブルの情報も根こそぎ取られるだけでなく、ユーザー情報を弄って完全に支配を奪ってしまうことも可能かもしれません。アカン……


4. パスワードを平文で保存している

 平文とは、暗号化されていない文のことです。つまり、データベースにパスワードの文字列がそのまま保存されています。

 すると、データベースがハッキングされた際、ユーザーが入力したパスワードが全部漏れてしまうことになります。

 一般的なWebサイトだと、そうならないようにパスワードをハッシュ関数で暗号化することにより、仮にデータベースをハッキングされてもパスワードがバレないようにしますが、この場合はそうじゃないということですね。

 さてここで1.と3.を思い出してください。これらを合わせると、「apiService.sql("SELECT username, password FROM users");」とすれば全ユーザーのユーザー名とパスワードが取得できます


5. なぜかユーザー情報を全部取得している

 4.までならまだ、「SQL count(username) FROM users WHERE username=${username} AND password=${password}」とでもすればユーザーの存在有無は判定できるでしょう。しかし今回の場合、毎回全ユーザーの全情報を取得しています。

 ユーザー名とパスワードが一致したデータだけ取り出せばいいので全ユーザーを取得する必要はないですし、ユーザー名とパスワードしか見ていないので全情報を取得する必要もないです。

 おまけに、1.により上記処理がクライアント(Webブラウザ)で実行されますので、ユーザーに無駄なメモリを使わせることにも繋がります。ゾッとしますね……。


その他のおかしな点

  • SQLを直接文字列を入力して実行→今回のケースではSQLインジェクションすらできないほどクソだったのでさほど影響はないですが、一般的に、「SQLに任意の文字列を入力できる」はバグの温床です

  • if ("true" == "true")if (authenticated === true)も相当トチ狂っていますが、重大な脆弱性ってほどでもないかと……
  • どこからどこまでもクソコードな癖に、「===」演算子を使うことで暗黙の型変換をキッチリ回避しているのがです


まとめ

 問題点1.が無くても簡単にハッキングできるログイン処理でしたが、問題点1.が全部持っていった感があります。

 また、問題点5.の処理が「あまりに脳筋なためにSQLインジェクションできない」といった意味不明な結果になったのは笑いましたw

 なお、元のソースコードをマシになるように手直ししていくと、たぶん原形を留めなくなるので省略します。

実はAmazonは面接のためにどのような準備をすれば良いのか全て公開している - GIGAZINE

実は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Amazon">Amazon</a>は面接のためにどのような準備をすれば良いのか全て公開している - <a class="keyword" href="http://d.hatena.ne.jp/keyword/GIGAZINE">GIGAZINE</a>


実はAmazonは面接のためにどのような準備をすれば良いのか全て公開している




優秀な人材を求めるAmazonでは、面接では何が重要視されるのか、何を準備しておくべきか、さらにはどのような回答が求められているのかについて、非常に具体的なアドバイスを公開しています。このAmazonが求める回答方法に沿って面接の準備をしておくことは、実はAmazonが求める人材としてふさわしい経験や考え方を身に着ける大きな手助けにもなっています。



In-person interview - Amazon.jobs

https://www.amazon.jobs/en/landing_pages/in-person-interview



Amazonの文化

どんな企業でもそうですが、「企業文化」というものがあります。企業文化を知ることは、その企業の面接に向けての準備の第一歩。Amazonでは「about Amazon(Amazonについて)」ページだけでなく、「Amazonの1日」というムービーを公開しており、面接に臨む前に理解することを求めています。



Amazon 2017 – 365 Days of Day 1 - YouTube

またAmazonですでに働いている「Amazonian」を知ることも、Amazonの企業文化を理解する助けになるとのこと。

◆リーダーシップの原則

Amazonでは新しいプロジェクトについて議論したり、問題解決の最良の方法を決めたりするときなど、あらゆる場面で「リーダーシップの原則」を使っているとのこと。この原則はAmazon独自のもので、すべての候補者はリーダーシップの原則に基づいて評価されます。面接に臨むにあたっては、これまでの職歴の中でリーダーシップの原則をどれだけ適用してきたかをしっかり考えておくべきだとのこと。

リーダーシップの原則に考慮すべき項目は以下の通りです。



・徹底的に顧客と向き合うこと

・リーダーとはチームの所有者であり、すべてのチームの仕事はリーダーの仕事

・多様な視点を受け入れつつ、強い判断力と良い規範を持つこと

・好奇心旺盛で学習に熱心であること

・リーダーとはリーダーを育てるもの

・最高の水準を常に求めること

・物事を長期的視点で考え、結果を求めて大胆な方向性を作り出すこと

・リスクを計算し、臨機応変に対応すること

・信頼を勝ち取ること

・信念を持ち、揺るがないこと。チームの結束に対して妥協しないこと

・結果を出すこと



◆経験に基づく質問と回答

上記のリーダーシップの原則は、すべて過去に直面した状況についての具体的な「行動」ベースで質問されます。Amazonによると、「マンハッタンにいくつの窓があると思いますか?」などの論理的思考力を問うような類の問いはまったく信頼できないとのこと。Amazonで成功できるかどうかは、すべて過去の行動や対応を基準として判断するそうです。

質問の例としては、



・可能な解決法がいくつかある問題に直面したときの行動について。問題は何で、どのように行動し、経過に応じて対応したか?選んだ策の結果はどうだったか?

・いくつのリスクを負い、間違いを犯し、失敗したか。それに対してどのように応答し、そこから何を得て、成長したか?

・戦略立案のためにどのようにデータを活用したか?



などが問われるとのこと。



◆STAR式回答

Amazonでは、上記の行動ベースの質問に対して、以下のSTAR式回答法が有効だとアドバイスしています。STARとはそれぞれ、



SITUATION(状況)

TASK(課題)

ACTION(行動)

RESULT(結果)



であり、リーダーシップの原則にまつわる過去の失敗と成功の体験談は、状況・課題・行動・結果を具体的に実証するのが良いとのこと。Amazonは「失敗は確信にとって必要なもの」と考えており、早期に失敗し、それを正すまで繰り返すことが大切だと考えているそうで、失敗談もSTAR式回答によってしっかりと分析して将来に生かせるまで消化できていれば、高く評価されるようです。

◆模範的な回答のためのヒント

インタビューで高評価を得るためのポイントは以下の通りだとのこと。



・リーダーシップの原則を取り入れて、行動ベースの質問にSTAR式回答法で答える練習をすること

・それぞれの回答には、「始まり」と「終わり」があるのを意識して、問題・状況・採った行動・結果を説明すること

・状況についての説明は簡潔にしつつ、フォローアップの質問に対してより詳細に答えられるよう準備をすること。独自のスキルを強調できる例を選択すべし

・具体的な事例を出して、リスクを持ちつつ成功したり失敗したりして、成長したことを証明すること

・具体的であることが重要。一般化や抽象化は避けること。各質問に対しては、1つの状況を詳しく説明し、データや指標を使って具体的な例を補強すべし

・具体的である方が簡単なもの。ストーリーの一部を着飾ったり省略したりしないのが大切



◆技術的な面接への準備

ソフトウェア開発エンジニアやテクニカルプログラムマネージャーなどの技術職への面接の準備に対しては、特別に以下のページを用意しています。プログラミング言語、データ構造、アルゴリズムオブジェクト指向、データベースなど、各技術項目に関してAmazonが求めること、求めないことが書かれています。



Software development topics - Amazon.jobs

https://www.amazon.jobs/jp/landing_pages/in-software-development-topics



◆面接前の心構え

Amazonの目的は、頭がよく、思慮深く、顧客に奉仕できる人を雇うことだとのこと。「なぜAmazonを選んだのか?」というのは普通の問いですが、何がAmazonへの合流を促したのかという事実は、Amazonが候補者がどのような人物かを理解できる良い材料なので、自身の考え方のプロセスを共有できるように準備をしておくべきだとのこと。具体的なアドバイスは以下の通り。



・応募する役職、チームについて興味を持っていることを説明する準備をしておく

・質問に答えるときは簡潔でありつつ詳細であること

・確かな回答をするのに十分な情報が与えられていないと感じた場合、より多くの情報を求めるのを恥ずかしがらないこと



◆面接当日

面接当日の行動についても具体的に提示しています。



・15分早く到着し、面接に臨む。写真付きの身分証を用意しておく。

・面接会場のAmazonオフィスは犬にフレンドリーな環境なので、アレルギーがある場合は事前に伝えておくべき



Meet some of the cutest dogs at Amazon - YouTube

・快適でカジュアルな装いであること。ほとんどのAmazonオフィスは普段着の人であふれているとのこと。Amazonが興味があることは、「何を着ているのか」ではなく「あなたがすべきこと」

・面接担当者は2〜7人。すべての面接担当者は、「背景と技術が要求をどれだけ満たしているかだけでなく、そのポジションを超えて成長していく可能性を、リーダーシップの原則の観点で評価する。面接担当者に応じて回答を調整すべきではなく、すべての面接担当者に対して同じ方針で臨むのが良い

・各インタビューの時間は45分から1時間

・履歴書は自分用にコピーを持ってきてもOK

・面接が昼時の場合、ランチが提供される。食事の好みがあれば、事前に伝えておいてOK

NDA(秘密保持契約書)へのサインが求められる

・バーチャルインタビューを求められた場合、Amazon Chimeをダウンロードしておくべき



◆面接についての補足

・オンラインでの「実演」を求める場合があり、その場合は通知がされる

・面接に宿泊が必要な場合、旅行の手配を求めればOK。旅行代理店に手配してもらえる

・必要経費は面接後に提出すること

・面接後のメールでのアンケートには迅速に応じること

・結果は面接から5営業日以内に行われるので、万一遅れている場合は急かしてOK。