MassAssignment脆弱性に関するアンチパターン例と対策

Programming

PHPを使ってWebサービスを開発していた時、いわゆるMassAssignment脆弱性に該当するセキュリティホールを発見してしまいました。
初心者エンジニアはついつい飛ばしてしまいがちなセキュリティですが、その重要性を改めて認識しました。

MassAssignment脆弱性とは

そもそもMassAssignment脆弱性とは、悪意を持ったリクエストによって更新されるべきではないカラムが更新されてしまうことです。
いまいち危険性がよくわからないかと思うので、具体的に実際起こった事例を見ていきましょう。

実際の事例

前提

作っていたWebサービスは、いわゆるフリマ系サービス
メルカリのようなイメージで、一般のユーザーにはモバイルアプリのインターフェースを提供。バックエンド側はPHPで構成されており、モバイルアプリにAPIを提供すると共に管理ユーザーには管理画面のインターフェースも提供。
今回の事例はバックエンドのPHPプログラムの方。

実現したい内容

管理画面からユーザーが登録した情報(住所や出品の取り消しなど)を更新したい。

コード内容

リクエストで渡ってきた情報を全て取得し、エンティティを作り直した上でパッチを当てるような形で更新する。

問題点

リクエストに入っている情報を全て取得してエンティティを作り直してしまうため、idやpriceなどのカラムを書き換えたリクエストを送ることで、なりすましや金額の改竄が可能になってしまう(フロントエンド(モバイルアプリ側)ではバリデーションがかかっていたものの、直接APIを叩くことなど容易なので危険)

解決方法

  1. ControllerもしくはModelにおいてなんらかの条件を指定して、変更できるフィールドを制限する
  2. リクエストから取得する情報を制限する

普通にフレームワークを使っていただけではこの脆弱性を無意識下に回避することはできないので、特に決済が絡むようなサービスの開発においては常日頃から頭に入れておくといいと思います。

参考サイト:

CakePHP3で意図しないフィールドの変更を防ぐ | 株式会社エイミー 中小企業向け システム開発
弊社ではPHP開発の際のフレームワークとしてCakePHP3を採用しております。 CakePHP3は非常に柔軟でありながらセキュアな開発を行うことが可能ですが、インターネット上にあるサンプルコードなどを容易に参考にすると脆弱なアプリケーションとなることがあります。

コメント

タイトルとURLをコピーしました