tohokuaikiのチラシの裏

技術的ネタとか。

ConfluenceのプラグインでXWork/WebWork2の仕組みを使ってComplex Parametersを使う時の注意点

前回ConfluenceのプラグインでXWork/WebWork2の仕組みを使ってプログラムを書く(1) - tohokuaikiのチラシの裏の続き。

もう少し細かい設定については、XWork Plugin Complex Parameters and Security - Confluence Development - Atlassian Developer Documentationの内容を参考にする。

XWorkXWorkのActionObjectに様々な方法でパラメータを与えることができる。
たとえば、URLパラメータにformData.name=Charlesと入れると、それはXWorkのAction内では、getFormData().setName("Charles")とすることになる。

この機能は強力すぎて脆弱性のもととなったことがある。2008年のConfluence2.9での脆弱性だ。これは2.10で徹底的に対策されているが、この対策のためにプラグイン開発者はちょっと余計な手数が必要になった。それを以下に記す。

Complex Parameterっていうのが良く出てくるんだけど、まあこれはごちゃっとしたパラメータで、ある特定の方法でActionObjectの中に入り込めるパラメータくらいに考えている。たとえば、PHPで言うところのregister globals的なもの。よい日本語訳が見つからなかった。

@ParameterSafe アノテーション

Confluence2.10からはComplex Parametersの内で使えるのは、このアノテーションが付いたものだけになっている。

  1. getterに@ParameterSafeが付く場合
  2. classに@ParameterSafeが付く場合。

の2パターンがある。
前者が、

@ParameterSafe
public FormData getFormData() {
   return formData;
}

後者が

@ParameterSafe
public class FormData {
   ...
}

このアノテーションが付くということは・・・

このアノテーションがついた変数については、Developperは以下のことに注意しているということを宣言していることになる。注意しなければ、脆弱性に繋がる。・・・といっても、下記の3つはよくわからなかった。多分、@ParameterSafeアノテーションがついたメソッドがreturnするものについてなんだろうけど。

  • 永続化Objectを直接戻り値にしないこと。悪意のあるユーザーがパラメータの変更を通してこのObjectにアクセスすることでデータベースにその値が保存されてしまう。*1
  • setterメソッドがアクセサブルなObjectを戻り値にしないこと。URLのパラメータをInjectして中のデータを覗けてしまう。
  • Spring-managed beans、 live components、 hibernate objectsといったObjectを持っているObjectを戻り値にしないこと。

*1: Hibernate persistent objectsっていうのがよくわからなかった。 Ref: http://stackoverflow.com/questions/14025136/what-does-persistence-object-means-in-hibernate-architecture