Scroll to top

トレーディング基盤ペネトレーションテスト ― 無認証APIから不正管理者へ

Penetration testing a trading platform
Network and infrastructure testing

プロジェクト概要

あるフィンテック企業(機密)より、実資金を扱う前段階のトレーディング基盤に対するテストをご依頼いただきました。対象はGraphQLのコアAPI、注文のルーティングとマッチングを担う.NETサービス群、そして運用担当者がユーザー承認やポジション操作を行う社内コンソールです。本番同等のミラー環境に対し、グレーボックスでのペネトレーションテストとして実施しました。結果は個別の衛生問題の羅列ではなく、ひと続きの攻撃チェーンでした。特権的なGraphQLクエリはトークンなしで応答し、アカウント作成経路はクライアントから送られたロール項目を信用していたため、通常のサインアップがそのまま有効な管理者を生み出しました。初期投入アカウントは環境をまたいで同一のパスワードを共有し、署名鍵とデータベース認証情報はリポジトリにコミットされたうえ公開済みコンテナイメージ内でも読み取れる状態で、注文取り込みサービスはメッセージ本文から攻撃者の影響下にある型を復元していました。各段階は非破壊的に実証し、CVSSで評価し、再現手順を添えて文書化し、修正適用後に再テストを行いました。

課題

  1. 実資金が動く注文経路を、実際の取引を発注・変更・取消することなくテストすること。
  2. GraphQLのコアAPI、.NETの注文サービス群、運用コンソールという性質の異なる3つのスタックを、限られた期間で網羅すること。
  3. マスアサインメントを理論上の指摘として報告するのではなく、権限昇格をエンドツーエンドで実証すること。
  4. 本当に認証が欠落している箇所と、リクエスト経路の別の場所で実施されている制御とを切り分けること。
  5. 規制上の期限に向けて開発を進めるチームが、実際に実行できる修正順序を提示すること。

アプローチ

  1. イントロスペクションでGraphQLスキーマを把握し、ベアラートークンなしで到達できるリゾルバーをすべて列挙しました。
  2. 権限昇格のチェーンは本番ミラー上で構築し、実証の時点で停止して、稼働中の注文フローには一切触れていません。
  3. Git履歴と公開済みコンテナイメージを監査し、残置された鍵・認証情報・設定を洗い出しました。
  4. すべての指摘をCVSSで評価し、再現手順を添付したうえで、修正をデプロイ可能な3つの段階に整理しました。
  5. 修正後に再テストを行い、各チェーンが一箇所で塞がれただけでなく、完全に成立しなくなったことを確認しました。

テストで判明した内容

何が修正につながったか

認証はリゾルバーごとに再実装するのではなく、単一のゲートウェイで強制する方式に移行し、開発環境以外ではイントロスペクションを無効化しました。ロールの割当はサーバー側のみで行うようになり、登録時のペイロードは信頼できない入力として扱われます。初期投入された認証情報はすべてローテーションし、露出した鍵は失効・再発行のうえ、コンテナイメージはクリーンなレイヤーから再構築して旧い値が出荷されないようにしました。デシリアライズの受け口は、型の明示的な許可リスト方式に置き換えています。再テストでは、チェーンがどの段階でも成立しないことを確認しました。そして何より重要だったのは、チームがその後に構築したサービスでもゲートウェイ方式を継続したことです。

スコープ概要