Git Hubの脆弱性とMass Asssignment

(Last Updated On: 2018年8月13日)

Git HubがMass Assignment脆弱性に脆弱で他のレポジトリが見れる状態だったらしい。問題は既に修正されています。

この脆弱性はRailsに限った事ではないし、古くからPHPを使っているユーザにとってはある意味懐かしい脆弱性でもあると思ったのでエントリを書いてみました。

Mass Assignment脆弱性はRuby on Rails Security Guidesにも記載されている脆弱性でActiveRecordの値をハッシュで一度に設定できる機能の脆弱性です。具体的には以下のようなコードが問題となります。

def signup
params[:user] # => {:name => “ow3ned”, :admin => true}
@user = User.new(params[:user])
end

userががハッシュとして渡されていてその中の変数がプロパティとして設定される、という便利な機能です。

Userオブジェクトがadminプロパティを持っている場合

params[:user] # => {:name => “ow3ned”, :admin => true}

などと user.adminがtrueとなってしまう様に設定すると普通のユーザが管理者権限を持ってしまうと、といった感じでセキュリティ問題となります。対策は簡単です。

attr_protected :admin

としてプロパティを保護するように指定するだけです。

古くからのPHPユーザにはregister_globalsが有効だった頃の脆弱性と全く同じ、と懐かしく思った方も多いかも知れません。今時、register_globals=onで運用しているシステムは非常に少ないと思います。もうこの脆弱性はPHPユーザには関係ない、と思うかも知れませんがそうはいきません。

このMass Assignmentと呼ばれる脆弱性はRailsの限った脆弱性では有りません。オブジェクトのプロパティを一度に変更できるような物は脆弱になる可能性があります。ActiveRecordのようなORM全般に見られる脆弱性なのでPHPでORMやオブジェクトのプロパティを一度に変更できるような仕組みを使う場合もMass Assignment脆弱性に注意が必要です。

この脆弱性に気づく事はそれほど難しくないと思います。便利な機能にはリスクがあることが多いので、使う前にどんなリスクがあるのかな?と少し考えてみると落とし穴を避けることができると思います。

追記:オブジェクトのプロパティを配列などから一度にアサインするような場合にセキュリティ問題が起きるのですが、おかしな説明だったので多少修正。基本的に配列やハッシュなどから一度に何かを変更できるような物にはMass Assignment脆弱性の問題が発生する可能性があるので注意が必要です。

投稿者: yohgaki