サービスに関するお問い合わせ

緊急対応 専用窓口

セキュリティの緊急事態が発生したらご遠慮なくお問い合わせください。ご相談は無料です。

セキュリティの
学び場

SHIFT SECURITY セキュリティの学び場 用語・国際規格 マス・アサインメント脆弱性とは

マス・アサインメント脆弱性とは

マス・アサインメント脆弱性とは
目次
  • マス・アサインメント脆弱性を解説
  • マス・アサインメント脆弱性を防ぐには

マス・アサインメント脆弱性を解説

マス・アサインメント脆弱性は、プログラミング言語の持つ機能である一括代入(マス・アサインメント;Mass Assignment)を濫用することにより起きる脆弱性です。

一括代入(マス・アサインメント;Mass Assignment)というのは、複数のデータを内部に持つ「オブジェクト」の値を一括してコピーする機能です。例えば、「ユーザー」というオブジェクトには「姓」「名」「住所」があるとしたら、ユーザーAをユーザーBに「代入」すると、ユーザーBはユーザーAの「姓」「名」「住所」をそれぞれコピーした値を持つようになります。

この便利な機能は、Webアプリケーションフレームワーク(多くのWebアプリケーションを作成する仕組み)で活用されています。例えば、このユーザー情報を入力するフォームがあったとき、Webブラウザからはサーバー側に、これら3つの値を持つ「POSTリクエスト」が送信されます。WebアプリケーションフレームワークはこのPOSTリクエストを受けて、プログラムで指定されたオブジェクト変数に値を一括代入します。これによって、POSTリクエストから値を取り出して、一つ一つ個別に管理するという手間が省けます。

しかし、「ユーザー」オブジェクトにもう一つ、「管理者かどうか」を示す値が入っている場合はどうでしょう。これが真なら当該のユーザーは管理者機能を利用することができ、偽なら利用できない、という意味の値です。ここで、ユーザー情報を入力するフォームは変わらず「姓」「名」「住所」を入力値として取るようにします。Webアプリケーションフレームワークが提供する一括代入の仕組みでは、入力値に存在しない値は上書きされないため、このフォームによるPOSTリクエストでは「管理者かどうか」の値は書き換わりません。一見、うまくいっているように見えますね。

ところが、悪意のある攻撃者はブラウザの開発者モードなどを用いて、フォームの実装に関わらず、POSTリクエストを改ざんして発行できます。ですので、攻撃者が「管理者かどうか」の値を差し込むことは容易に行えるのです。これによって、管理者権限を持っていない攻撃者が、自分のアカウントを管理者として扱わせることができてしまいます。

これがマス・アサインメント脆弱性です。

マス・アサインメント脆弱性を防ぐには

マス・アサインメント脆弱性はよく知られた脆弱性であるため、その対策も複数用意されています。二つをご紹介します。

オブジェクトを分離する
フォームから値を受け取るためのオブジェクトと、内部でデータを管理するオブジェクトを分離することです。上の例でいえば、フォームには「姓」「名」「住所」の三つの要素しかないわけですから、これを受け取る専用の「ユーザーフォーム」といったオブジェクトを別途用意します。そして、内部でユーザーを管理する「ユーザー」に対して値をコピーしていきます。このようにすれば、POSTメソッドの改ざんにより「管理者かどうか」の値を上書きされることは原理的にありません。一括代入の便利さは一部損なわれますが、わかりやすく確実な対策です。
外部からの上書きを不可にする
Webアプリケーションフレームワークとして「この値は外部からの入力値によって上書きされない」という指定ができることがあるので、この機能を用いることです。ここでいえば「管理者かどうか」を上書き不可にすることでPOSTメソッドが改ざんされても値を上書きされることはなくなります。こちらについては各Webアプリケーションフレームワークの仕様によるので、それぞれの公式ドキュメントを参考にしてみてください。
この記事の著者 小笠原徳彦

2015年より株式会社SHIFTにてソフトウェアテスト自動化の顧客導入支援・プラットフォーム開発に従事。加えてSHIFT SECURITY設立に兼務で参画し、初期の標準化や教育などを担当。2019年に同社専任になってからは、開発者向けのソフトウェアセキュリティサービス、スマートフォンアプリ診断手法および社内ツール開発などを主な業務とする。個人としては主にデスクトップ領域のオープンソースソフトウェアの愛好家であり、翻訳やバグ報告、雑誌やWeb媒体への執筆、イベントへの登壇なども行う。隠れた趣味はリバーカヤック。

\ 記事をシェアする /

サービスに関するお問い合わせ