GRADUATION
GraphQL 特有の穴が、見えるようになりました。
スキーマを丸ごと明かすintrospection、リゾルバの所有者チェック漏れ(BOLA)、権限チェック漏れ(BFLA)、そして入力を丸ごと信じるmass assignment。sec-authzで学んだ認可の視点を、GraphQLという1つのエンドポイントに集まる世界に当てはめました。
おつかれさまでした。
持ち帰るもの
- 1つのエンドポイントに、全機能が集まるREST なら分かれていたエンドポイントが、GraphQL では1つに集まります。だから認可チェックは、URLではなく各フィールド(リゾルバ)ごとに要ります。
- introspection は、地図を渡すスキーマの全体が丸見えになると、隠しておきたいフィールドやミューテーションまで攻撃者に知られます。本番では基本的に無効にします。
- 入力は、フィールド単位の許可リストで受け取る更新用の入力オブジェクトを丸ごとマージ(Object.assign)しない。書き換えてよいフィールドだけを、明示的に選んで適用します。
次にやるといいこと
- 次は「ビジネスロジックと競合状態」。GraphQL のミューテーションでも、価格改ざんやTOCTOUは同じ形で起こりえます。
- このコースで見た「1エンドポイントに機能が集まる」設計は、sec-auditのソースコード診断でリゾルバを1つずつ確認する着眼点にもなります。