19577人のカナダ人の個人データを公開しない方法


数ヶ月前、私はポルシェパスで発見された多額のセキュリティ欠陥の概要を説明するためにCBC newsと話しました.カナダ人にワクチンのデジタル証明をもたらす試み.その記事がより広い聴衆のために意味される間、今日、私はそこにすべての開発者のために技術的な展望から彼らのセキュリティ欠陥を概説します.

マイ・バックグラウンド


私の名前はリダf ' kih、私は21歳のカナダのソフトウェア開発者&リバースエンジニアMaxRewards.です
私の開発の旅は、リバースエンジニアリングからscammer vigilantismにして、Webとモバイル開発に子供たちにコーディングを教える15から始まりました.

何がportpassですか?


PortPassは地元のカルガリアンの起業家によってカナダ人にワクチンパスポートをもたらすために個人的な試みだった.

何が悪いのか


まず、マーフィーの法則に精通しなければならない.

Murphy’s law is an adage or epigram that is typically stated as: “Anything that can go wrong will go wrong."

— Wikipedia, Murphy’s Law


私は、PortPassがユーザーの視点からマーフィーの法則の縮図であると主張します、そして、これらの問題の後の彼らの無力のため、その創造主に代わって刑事過失は明るみに出されました.

リスクデータ


リスクのデータは軽いものではなかった.
PortPass個人的なデータの負荷を収集するビジネス要件は、政府のIDの写真を収集し、健康カード番号、検証、完全な名前、出生の日付、血液型、および詳細を選択します.
PortPassのデータは社会工学の危険にさらされるのに十分であるか、あるいは、あなたの名前で開かれる金融口座さえ持っています.

脆弱性


プライマリの脆弱性は「不適切なアクセス制御」と呼ばれています.そして、それはソフトウェアとハードウェア弱さのコミュニティの開発されたリストとして「ソフトウェアがそれを制限しないか、無許可の俳優でなければならないものから資源へのアクセスを制限しない」と言いました
適切に管理され作成されたエンドポイントを記述する擬似コードは次のように表示される場合があります.
import express from "express";
import { loggedInUser } from "@/utils/authentication";
import { getUserInfo } from "@/utils/users";

const app = express();

app.get("/user/:userId", (request, response) => {
  const { userId } = request.params;
  const authenticatedUserId = loggedInUser(request);

   if (!authenticatedUserId  || authenticatedUserId !== userId)
     return response.status(401).send("Unauthorized");
   else
     return response.status(200).json(getUserInfo(userId));
});
ここでは、私たちが/user/[userId]にGET要求を送って、我々が要求している同じユーザに認証されるならば、ユーザデータを返します.
不十分に建築エンドポイントは、次のようにコード化されるかもしれません.
app.get("/user/:userId", (request, response) => {
 const { userId } = request.params;
 if (!loggedInUser(request))
  response.status(401).send("Unauthorized");
 else
  response.status(200).json(getUserInfo(userId));
});
ここでは、ユーザが認証された場合にのみ認証されます.このように、認証されたユーザは、それらに属していなくても、どんなリソースも要求できます.公的なポストのために、これは適切です、政府発行の写真ID、健康管理カードと確認肖像画のような個人情報のために、これは大きな傷です.

普通弱数列挙 触媒


シーケンシャルユーザID


ポートパスユーザはシーケンシャルユーザIDを使用してリソースを要求した.これは、最初のユーザがサービスにサインアップした場合、あなたのIDは1となります.もし2番目なら、2などでしょう.
彼らはUUIDv 4のような暗号化のソリューションを使用していたユーザー情報を盗むことはかなり困難だったでしょうが、この場合、すべての登録されたユーザーデータを収集するためのスクリプトを定式化するのは些細で、何かのように見えます.
/**
 * Gets the user profile from the PortPass API.
 * @param {number|string} userId The user ID of the target user.
 * @returns {Promise<any>} A user object.
 */
const getUserProfile = async (userId) => {
  const profile = await axios
    .get(USER_PROFILE_URI + userId.toString())
    .then((response) => response?.data)
    .catch(() => ({}));

  return profile;
};

for (let i = 0; i < 19577; i++)
  getUserProfile(i + 1).then(saveUserData);

いいえSSL


SportPassはSSL証明書を持っていなかったので、デバイスが送信または受信するパケットを変更または遮断することができました.ウェブサイトでは、その簡単な“ロックのアイコン”を見つけることによって、安全なウェブサイトを識別するのは簡単ですが、しかし、アプリケーションと少しあいまいな.

開発者ツールの公開


PortPassのバックエンドは、あなたのブラウザからのエンドポイントをテストすることができますインターフェイスを持っているDJangoを使用して作成された郵便配達人、または不眠症のような残りのツールを使用することなく.
最適に、PortPassは彼らの経路を確保したので、彼らの経路を知ることは追加機能を提供しないでしょう、しかし、彼らはそうしませんでした.

結論


我々は皆、そこに我々のプロジェクトを得たいです、しかし、我々が基本的なセキュリティ問題に対応するために必要な経験を持っていないならば、あなたのコードを見直しているか、セキュリティの基礎を学ぶことは良いオプションと考えられなければなりません.畝
この場合、非技術的な創業者は急いでそこで製品を得たかったので、彼らはコードの品質を評価する能力なしで海外から開発者を雇いました.畝
私は彼らの助けのためにCBCに非常に感謝しています.最終的にはPortPass責任者の作者を持つことができます.
あなたは または私のMediumにこの記事を読むことができます.
あなたがこの内容を楽しむならば、私の上で以下を考慮してください!