説明
マスアサインメントは、クライアントから受け取ったJSONなどの入力を検証せず、Object.assign などでオブジェクトにマージすると発生します。攻撃者が変更を許可されていないフィールドを上書きし、権限、設定、データを管理する重要なプロパティを操作できるおそれがあります。
想定される影響
- ユーザーの権限や権限レベルの不正な変更
- 内部プロパティや設定の上書きによる機密情報の漏えい・改ざん、サービス動作の変更
対処方法
Object.assignなどで入力をマージする前に、許可するフィールドだけを選んでください。- サーバー側で承認したプロパティの許可リストを使い、各値の型や業務上の条件も検証してください。
- 権限など、サーバーが管理する重要なフィールドをクライアント入力で変更しないでください。
例
変更前
データベースの取得・保存関数の実装は省略しています。
javascript
// 変更前
function updateUser(untrustedInput) {
let user = getUserFromDB();
// 検証していない入力をマージ
Object.assign(user, JSON.parse(untrustedInput));
saveUserToDB(user);
}
変更後
javascript
// 変更後
function updateUser(untrustedInput) {
let user = getUserFromDB();
const allowed = ['nickname', 'email'];
const data = JSON.parse(untrustedInput);
// 許可したフィールドだけをマージ
for(const key of allowed) {
if(data[key] !== undefined) {
user[key] = data[key];
}
}
saveUserToDB(user);
}
解説:
- 変更前: ユーザー入力をそのまま
Object.assignに渡すため、管理者権限などのシステムプロパティまで上書きされるおそれがあります。 - 変更後: 許可リストにあるフィールドだけをマージし、それ以外の重要なプロパティの不正な変更を防いでいます。